Browse Source

Add our qt 5.7 patch

Unfortunately, this is patch as we use it on the CI, and I didn't find
any git-format-patch style patches with commit messages and author
information.
Vincent Lang 8 years ago
parent
commit
c4e9666fd2
1 changed files with 316 additions and 0 deletions
  1. 316 0
      qt-patches/qt5-5.7.0.patch

+ 316 - 0
qt-patches/qt5-5.7.0.patch

@@ -0,0 +1,316 @@
+--- qtwebengine/src/core/renderer/web_channel_ipc_transport.cpp
++++ qtwebengine/src/core/renderer/web_channel_ipc_transport.cpp
+@@ -153,6 +153,8 @@ content::RenderView *WebChannelTransport::GetRenderView(v8::Isolate *isolate)
+ 
+ WebChannelIPCTransport::WebChannelIPCTransport(content::RenderView *renderView)
+     : content::RenderViewObserver(renderView)
++    , m_installed(false)
++    , m_installedWorldId(0)
+ {
+ }
+ 
+@@ -162,6 +164,8 @@ void WebChannelIPCTransport::installWebChannel(uint worldId)
+     if (!webView)
+         return;
+     WebChannelTransport::Install(webView->mainFrame(), worldId);
++    m_installed = true;
++    m_installedWorldId = worldId;
+ }
+ 
+ void WebChannelIPCTransport::uninstallWebChannel(uint worldId)
+@@ -170,6 +174,7 @@ void WebChannelIPCTransport::uninstallWebChannel(uint worldId)
+     if (!webView)
+         return;
+     WebChannelTransport::Uninstall(webView->mainFrame(), worldId);
++    m_installed = false;
+ }
+ 
+ void WebChannelIPCTransport::dispatchWebChannelMessage(const std::vector<char> &binaryJSON, uint worldId)
+@@ -217,6 +222,13 @@ void WebChannelIPCTransport::dispatchWebChannelMessage(const std::vector<char> &
+     frame->callFunctionEvenIfScriptDisabled(callback, webChannelObjectValue->ToObject(), argc, argv);
+ }
+ 
++void WebChannelIPCTransport::DidCreateDocumentElement(blink::WebLocalFrame* frame)
++{
++    blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame();
++    if (m_installed && frame == main_frame)
++        WebChannelTransport::Install(frame, m_installedWorldId);
++}
++
+ bool WebChannelIPCTransport::OnMessageReceived(const IPC::Message &message)
+ {
+     bool handled = true;
+--- qtwebengine/src/core/renderer/web_channel_ipc_transport.h
++++ qtwebengine/src/core/renderer/web_channel_ipc_transport.h
+@@ -58,7 +58,11 @@ class WebChannelIPCTransport : public content::RenderViewObserver {
+     void dispatchWebChannelMessage(const std::vector<char> &binaryJSON, uint worldId);
+     void installWebChannel(uint worldId);
+     void uninstallWebChannel(uint worldId);
++    virtual void DidCreateDocumentElement(blink::WebLocalFrame* frame) override;
+     virtual bool OnMessageReceived(const IPC::Message &message) Q_DECL_OVERRIDE;
++
++    bool m_installed;
++    uint m_installedWorldId;
+ };
+ 
+ } // namespace
+--- qtwebengine/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
++++ qtwebengine/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
+@@ -37,6 +37,7 @@ private Q_SLOTS:
+     void scriptModifications();
+     void webChannel_data();
+     void webChannel();
++    void noTransportWithoutWebChannel();
+ };
+ 
+ void tst_QWebEngineScript::domEditing()
+@@ -180,13 +181,17 @@ class TestObject : public QObject
+ void tst_QWebEngineScript::webChannel_data()
+ {
+     QTest::addColumn<int>("worldId");
+-    QTest::newRow("MainWorld") << static_cast<int>(QWebEngineScript::MainWorld);
+-    QTest::newRow("ApplicationWorld") << static_cast<int>(QWebEngineScript::ApplicationWorld);
++    QTest::addColumn<bool>("reloadFirst");
++    QTest::newRow("MainWorld") << static_cast<int>(QWebEngineScript::MainWorld) << false;
++    QTest::newRow("ApplicationWorld") << static_cast<int>(QWebEngineScript::ApplicationWorld) << false;
++    QTest::newRow("MainWorldWithReload") << static_cast<int>(QWebEngineScript::MainWorld) << true;
++    QTest::newRow("ApplicationWorldWithReload") << static_cast<int>(QWebEngineScript::ApplicationWorld) << true;
+ }
+ 
+ void tst_QWebEngineScript::webChannel()
+ {
+     QFETCH(int, worldId);
++    QFETCH(bool, reloadFirst);
+     QWebEnginePage page;
+     TestObject testObject;
+     QScopedPointer<QWebChannel> channel(new QWebChannel(this));
+@@ -205,6 +210,11 @@ void tst_QWebEngineScript::webChannel()
+     page.scripts().insert(script);
+     page.setHtml(QStringLiteral("<html><body></body></html>"));
+     waitForSignal(&page, SIGNAL(loadFinished(bool)));
++    if (reloadFirst) {
++        // Check that the transport is also reinstalled on navigation
++        page.triggerAction(QWebEnginePage::Reload);
++        waitForSignal(&page, SIGNAL(loadFinished(bool)));
++    }
+     page.runJavaScript(QLatin1String(
+                                 "new QWebChannel(qt.webChannelTransport,"
+                                 "  function(channel) {"
+@@ -218,6 +228,17 @@ void tst_QWebEngineScript::webChannel()
+         QCOMPARE(evaluateJavaScriptSync(&page, "qt.webChannelTransport"), QVariant(QVariant::Invalid));
+ }
+ 
++void tst_QWebEngineScript::noTransportWithoutWebChannel()
++{
++    QWebEnginePage page;
++    page.setHtml(QStringLiteral("<html><body></body></html>"));
++
++    QCOMPARE(evaluateJavaScriptSync(&page, "qt.webChannelTransport"), QVariant(QVariant::Invalid));
++    page.triggerAction(QWebEnginePage::Reload);
++    waitForSignal(&page, SIGNAL(loadFinished(bool)));
++    QCOMPARE(evaluateJavaScriptSync(&page, "qt.webChannelTransport"), QVariant(QVariant::Invalid));
++}
++
+ QTEST_MAIN(tst_QWebEngineScript)
+ 
+ #include "tst_qwebenginescript.moc"
+--- qtbase/src/plugins/platforms/cocoa/qnswindowdelegate.mm.orig	2016-06-10 08:48:56.000000000 +0200
++++ qtbase/src/plugins/platforms/cocoa/qnswindowdelegate.mm	2016-06-20 13:57:36.000000000 +0200
+@@ -115,4 +115,7 @@
+     return YES;
+ }
+ 
++- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions {
++    return NSApplicationPresentationFullScreen | NSApplicationPresentationHideMenuBar | NSApplicationPresentationHideDock;
++}
+ @end
+--- qtwebengine/src/core/web_engine_context.cpp.ori	2016-06-20 13:58:31.000000000 +0200
++++ qtwebengine/src/core/web_engine_context.cpp	2016-06-20 13:59:52.000000000 +0200
+@@ -292,6 +292,10 @@
+         parsedCommandLine->AppendSwitchASCII(switches::kProfilerTiming, switches::kProfilerTimingDisabledValue);
+     }
+ 
++    parsedCommandLine->AppendSwitch(switches::kEnableViewport);
++    parsedCommandLine->AppendSwitch(switches::kDisableGpu);
++    parsedCommandLine->AppendSwitch(switches::kDisableWebSecurity);
++
+     GLContextHelper::initialize();
+ 
+     if (usingANGLE() || usingSoftwareDynamicGL() || usingQtQuick2DRenderer()) {
+
+--- qtbase/src/gui/kernel/qsurfaceformat.cpp
++++ qtbase/src/gui/kernel/qsurfaceformat.cpp
+@@ -108,6 +108,7 @@ public:
+     int major;
+     int minor;
+     int swapInterval;
++    QSurfaceFormat::OrientationFlags orientationFlags;
+ };
+ 
+ /*!
+@@ -734,6 +735,16 @@ int QSurfaceFormat::swapInterval() const
+     return d->swapInterval;
+ }
+ 
++QSurfaceFormat::OrientationFlags QSurfaceFormat::orientationFlags() const
++{
++    return d->orientationFlags;
++}
++
++void QSurfaceFormat::setOrientationFlags(QSurfaceFormat::OrientationFlags orientationFlags)
++{
++    d->orientationFlags = orientationFlags;
++}
++
+ Q_GLOBAL_STATIC(QSurfaceFormat, qt_default_surface_format)
+ 
+ /*!
+--- qtbase/src/gui/kernel/qsurfaceformat.h
++++ qtbase/src/gui/kernel/qsurfaceformat.h
+@@ -55,7 +55,8 @@ public:
+         StereoBuffers            = 0x0001,
+         DebugContext             = 0x0002,
+         DeprecatedFunctions      = 0x0004,
+-        ResetNotification        = 0x0008
++        ResetNotification        = 0x0008,
++        UseOptimalOrientation    = 0x0010
+     };
+     Q_DECLARE_FLAGS(FormatOptions, FormatOption)
+ 
+@@ -79,6 +80,11 @@ public:
+         CompatibilityProfile
+     };
+ 
++    enum OrientationFlag {
++        MirrorVertically = 0x0001,
++    };
++    Q_DECLARE_FLAGS(OrientationFlags, OrientationFlag)
++
+     QSurfaceFormat();
+     /*implicit*/ QSurfaceFormat(FormatOptions options);
+     QSurfaceFormat(const QSurfaceFormat &other);
+@@ -139,6 +145,9 @@ public:
+     int swapInterval() const;
+     void setSwapInterval(int interval);
+ 
++    QSurfaceFormat::OrientationFlags orientationFlags() const;
++    void setOrientationFlags(QSurfaceFormat::OrientationFlags orientationFlags);
++
+     static void setDefaultFormat(const QSurfaceFormat &format);
+     static QSurfaceFormat defaultFormat();
+ 
+--- qtbase/src/plugins/platforms/windows/qwindowseglcontext.cpp
++++ qtbase/src/plugins/platforms/windows/qwindowseglcontext.cpp
+@@ -282,11 +282,25 @@ QWindowsOpenGLContext *QWindowsEGLStaticContext::createContext(QOpenGLContext *c
+     return new QWindowsEGLContext(this, context->format(), context->shareHandle());
+ }
+ 
+-void *QWindowsEGLStaticContext::createWindowSurface(void *nativeWindow, void *nativeConfig, int *err)
++void *QWindowsEGLStaticContext::createWindowSurface(void *nativeWindow, void *nativeConfig, const QSurfaceFormat format, int *err)
+ {
+     *err = 0;
++
++    std::vector<EGLint> attrib_list;
++#ifdef EGL_ANGLE_surface_orientation
++    if (format.testOption(QSurfaceFormat::UseOptimalOrientation)) {
++        EGLint surfaceOrientation = 0;
++        libEGL.eglGetConfigAttrib(m_display, nativeConfig, EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE, &surfaceOrientation);
++        if (surfaceOrientation & EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) {
++            attrib_list.push_back(EGL_SURFACE_ORIENTATION_ANGLE);
++            attrib_list.push_back(EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE);
++        }
++    }
++#endif
++    attrib_list.push_back(EGL_NONE);
+     EGLSurface surface = libEGL.eglCreateWindowSurface(m_display, nativeConfig,
+-                                                       static_cast<EGLNativeWindowType>(nativeWindow), 0);
++                                                       static_cast<EGLNativeWindowType>(nativeWindow),
++                                                       &attrib_list[0]);
+     if (surface == EGL_NO_SURFACE) {
+         *err = libEGL.eglGetError();
+         qWarning("%s: Could not create the EGL window surface: 0x%x", __FUNCTION__, *err);
+@@ -335,6 +349,14 @@ QSurfaceFormat QWindowsEGLStaticContext::formatFromConfig(EGLDisplay display, EG
+     format.setStereo(false);
+     format.setSwapInterval(referenceFormat.swapInterval());
+ 
++#ifdef EGL_ANGLE_surface_orientation
++    if (referenceFormat.testOption(QSurfaceFormat::UseOptimalOrientation)) {
++        EGLint surfaceOrientation = 0;
++        libEGL.eglGetConfigAttrib(display, config, EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE, &surfaceOrientation);
++        format.setOrientationFlags((surfaceOrientation & EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) ? QSurfaceFormat::MirrorVertically : QSurfaceFormat::OrientationFlags());
++    }
++#endif
++
+     // Clear the EGL error state because some of the above may
+     // have errored out because the attribute is not applicable
+     // to the surface type.  Such errors don't matter.
+@@ -430,7 +452,7 @@ QWindowsEGLContext::QWindowsEGLContext(QWindowsEGLStaticContext *staticContext,
+             }
+         }
+         m_format.setProfile(QSurfaceFormat::NoProfile);
+-        m_format.setOptions(QSurfaceFormat::FormatOptions());
++        m_format.setOptions(m_format.options() & QSurfaceFormat::UseOptimalOrientation);
+         QWindowsEGLStaticContext::libEGL.eglMakeCurrent(prevDisplay, prevSurfaceDraw, prevSurfaceRead, prevContext);
+     }
+     QWindowsEGLStaticContext::libEGL.eglDestroySurface(m_eglDisplay, pbuffer);
+--- qtbase/src/plugins/platforms/windows/qwindowseglcontext.h
++++ qtbase/src/plugins/platforms/windows/qwindowseglcontext.h
+@@ -121,7 +121,7 @@ public:
+     void *moduleHandle() const Q_DECL_OVERRIDE { return libGLESv2.moduleHandle(); }
+     QOpenGLContext::OpenGLModuleType moduleType() const Q_DECL_OVERRIDE { return QOpenGLContext::LibGLES; }
+ 
+-    void *createWindowSurface(void *nativeWindow, void *nativeConfig, int *err) Q_DECL_OVERRIDE;
++    void *createWindowSurface(void *nativeWindow, void *nativeConfig, const QSurfaceFormat format, int *err) Q_DECL_OVERRIDE;
+     void destroyWindowSurface(void *nativeSurface) Q_DECL_OVERRIDE;
+ 
+     QSurfaceFormat formatFromConfig(EGLDisplay display, EGLConfig config, const QSurfaceFormat &referenceFormat);
+--- qtbase/src/plugins/platforms/windows/qwindowsopenglcontext.h
++++ qtbase/src/plugins/platforms/windows/qwindowsopenglcontext.h
+@@ -62,7 +62,7 @@ public:
+ 
+     // If the windowing system interface needs explicitly created window surfaces (like EGL),
+     // reimplement these.
+-    virtual void *createWindowSurface(void * /*nativeWindow*/, void * /*nativeConfig*/, int * /*err*/) { return 0; }
++    virtual void *createWindowSurface(void * /*nativeWindow*/, void * /*nativeConfig*/, const QSurfaceFormat /*format*/, int * /*err*/) { return 0; }
+     virtual void destroyWindowSurface(void * /*nativeSurface*/) { }
+ 
+ private:
+--- qtbase/src/plugins/platforms/windows/qwindowswindow.cpp
++++ qtbase/src/plugins/platforms/windows/qwindowswindow.cpp
+@@ -2458,7 +2458,7 @@ void *QWindowsWindow::surface(void *nativeConfig, int *err)
+ #else
+     if (!m_surface) {
+         if (QWindowsStaticOpenGLContext *staticOpenGLContext = QWindowsIntegration::staticOpenGLContext())
+-            m_surface = staticOpenGLContext->createWindowSurface(m_data.hwnd, nativeConfig, err);
++            m_surface = staticOpenGLContext->createWindowSurface(m_data.hwnd, nativeConfig, m_format, err);
+     }
+ 
+     return m_surface;
+--- qtdeclarative/src/quick/items/qquickwindow.cpp
++++ qtdeclarative/src/quick/items/qquickwindow.cpp
+@@ -458,7 +458,13 @@ void QQuickWindowPrivate::renderSceneGraph(const QSize &size)
+             renderer->setDeviceRect(rect);
+             renderer->setViewportRect(rect);
+         }
+-        renderer->setProjectionMatrixToRect(QRect(QPoint(0, 0), size));
++        QRectF projRect(QPoint(0, 0), size);
++        bool mirrorVertically = QOpenGLContext::currentContext()->format().orientationFlags() & QSurfaceFormat::MirrorVertically;
++        QRectF mirrored(projRect.left(),
++                        mirrorVertically ? projRect.bottom() : projRect.top(),
++                        projRect.width(),
++                        mirrorVertically ? -projRect.height() : projRect.height());
++        renderer->setProjectionMatrixToRect(mirrored);
+         renderer->setDevicePixelRatio(devicePixelRatio);
+ 
+         context->renderNextFrame(renderer, fboId);
+--- qtdeclarative/src/quick/scenegraph/qsgcontext.cpp
++++ qtdeclarative/src/quick/scenegraph/qsgcontext.cpp
+@@ -476,6 +476,8 @@ QSurfaceFormat QSGContext::defaultSurfaceFormat() const
+     static bool enableDebug = qEnvironmentVariableIsSet("QSG_OPENGL_DEBUG");
+     format.setDepthBufferSize(useDepth ? 24 : 0);
+     format.setStencilBufferSize(useStencil ? 8 : 0);
++    // XXX: Uncomment to enable application-side Y-coordinates-flipping by default
++    // format.setOption(QSurfaceFormat::UseOptimalOrientation);
+     if (enableDebug)
+         format.setOption(QSurfaceFormat::DebugContext);
+     if (QQuickWindow::hasDefaultAlphaBuffer())