summaryrefslogtreecommitdiffstats
path: root/src/core/api/qtwebenginecoreglobal.cpp
blob: d5112ccb3425570b68e9ba102dd35536f8c8f3f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "qtwebenginecoreglobal_p.h"

#include <QGuiApplication>
#if QT_CONFIG(opengl)
# include <QOpenGLContext>
#endif
#include <QThread>
#include <QQuickWindow>
#include "web_engine_context.h"
#include "web_engine_library_info.h"

#include "base/base_paths.h"
#include "base/i18n/icu_util.h"
#include "base/path_service.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"

#if QT_CONFIG(opengl) && !defined(Q_OS_MACOS)
QT_BEGIN_NAMESPACE
Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context);
Q_GUI_EXPORT QOpenGLContext *qt_gl_global_share_context();
QT_END_NAMESPACE
#endif

namespace QtWebEngineCore {
#if QT_CONFIG(opengl) && !defined(Q_OS_MACOS)
static QOpenGLContext *shareContext;

static void deleteShareContext()
{
    if (qt_gl_global_share_context() == shareContext)
        qt_gl_set_global_share_context(nullptr);
    delete shareContext;
    shareContext = 0;
}

#endif
// ### Qt 6: unify this logic and Qt::AA_ShareOpenGLContexts.
// QtWebEngineQuick::initialize was introduced first and meant to be called
// after the QGuiApplication creation, when AA_ShareOpenGLContexts fills
// the same need but the flag has to be set earlier.

Q_WEBENGINECORE_EXPORT void initialize()
{
#if QT_CONFIG(opengl) && !defined(Q_OS_MACOS)
#ifdef Q_OS_WIN32
    qputenv("QT_D3DCREATE_MULTITHREADED", "1");
#endif
    auto api = QQuickWindow::graphicsApi();
    if (api != QSGRendererInterface::OpenGL
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
        && api != QSGRendererInterface::Vulkan && api != QSGRendererInterface::Metal
        && api != QSGRendererInterface::Direct3D11
#endif
    )
        QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
    // No need to override the shared context if QApplication already set one (e.g with Qt::AA_ShareOpenGLContexts).
    if (!qt_gl_global_share_context()) {

        QCoreApplication *app = QCoreApplication::instance();
        if (!app) {
            qFatal("QtWebEngineQuick::initialize() but no core application instance.");
            return;
        }

        // Bail out silently if the user did not construct a QGuiApplication.
        if (!qobject_cast<QGuiApplication *>(app))
            return;

        if (app->thread() != QThread::currentThread()) {
            qFatal("QtWebEngineQuick::initialize() must be called from the Qt gui thread.");
            return;
        }

        if (shareContext)
            return;

        shareContext = new QOpenGLContext;
        QSurfaceFormat format = QSurfaceFormat::defaultFormat();

        shareContext->setFormat(format);
        shareContext->create();
        qAddPostRoutine(deleteShareContext);
        qt_gl_set_global_share_context(shareContext);

        // Classes like QOpenGLWidget check for the attribute
        app->setAttribute(Qt::AA_ShareOpenGLContexts);
    }

#endif // QT_CONFIG(opengl) && !defined(Q_OS_MACOS)
}

bool closingDown()
{
    return WebEngineContext::closingDown();
}

} // namespace QtWebEngineCore

#if defined(Q_OS_WIN)
namespace QtWebEngineSandbox {
sandbox::SandboxInterfaceInfo *staticSandboxInterfaceInfo(sandbox::SandboxInterfaceInfo *info)
{
    static sandbox::SandboxInterfaceInfo *g_info = nullptr;
    if (info) {
        Q_ASSERT(g_info == nullptr);
        g_info = info;
    }
    return g_info;
}
} //namespace
#endif
static void initialize()
{
#if QT_CONFIG(opengl) && !defined(Q_OS_MACOS)
    // QCoreApplication is not yet instantiated, ensuring the call will be deferred
    qAddPreRoutine(QtWebEngineCore::initialize);
#endif // QT_CONFIG(opengl)
}

QT_BEGIN_NAMESPACE

QString qWebEngineGetDomainAndRegistry(const QUrl &url) {
    base::FilePath icuDataPath;
    // Let's assume that ICU is already initialized if DIR_QT_LIBRARY_DATA is set.
    if (!base::PathService::Get(base::DIR_QT_LIBRARY_DATA, &icuDataPath)) {
        icuDataPath = WebEngineLibraryInfo::getPath(base::DIR_QT_LIBRARY_DATA);
        if (!base::PathService::OverrideAndCreateIfNeeded(base::DIR_QT_LIBRARY_DATA, icuDataPath, false, false))
            qWarning("Failed to set ICU data path.");
        base::i18n::InitializeICU();
    }

    const QString host = url.host();
    const std::string domain = net::registry_controlled_domains::GetDomainAndRegistry(host.toStdString(), net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
    return QString::fromStdString(domain);
}

QT_END_NAMESPACE

Q_CONSTRUCTOR_FUNCTION(initialize)