--- qtwebengine/src/core/web_engine_context.cpp +++ qtwebengine/src/core/web_engine_context.cpp @@ -376,6 +376,13 @@ parsedCommandLine->AppendSwitchASCII(switches::kProfilerTiming, switches::kProfilerTimingDisabledValue); } + parsedCommandLine->AppendSwitch(switches::kEnableViewport); +#if defined(Q_OS_WIN) + parsedCommandLine->AppendSwitch(switches::kDisableGpu); +#endif + parsedCommandLine->AppendSwitch(switches::kDisableWebSecurity); + + GLContextHelper::initialize(); const char *glType = 0; --- qtbase/src/plugins/platforms/cocoa/qnsview.mm +++ qtbase/src/plugins/platforms/cocoa/qnsview.mm @@ -584,7 +584,7 @@ return NO; if ([self isTransparentForUserInput]) return NO; - return YES; + return NO; } - (NSView *)hitTest:(NSPoint)aPoint --- qtbase/src/gui/kernel/qsurfaceformat.cpp +++ qtbase/src/gui/kernel/qsurfaceformat.cpp @@ -110,6 +110,7 @@ int major; int minor; int swapInterval; + QSurfaceFormat::OrientationFlags orientationFlags; }; /*! @@ -736,6 +737,16 @@ 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 @@ -57,7 +57,8 @@ StereoBuffers = 0x0001, DebugContext = 0x0002, DeprecatedFunctions = 0x0004, - ResetNotification = 0x0008 + ResetNotification = 0x0008, + UseOptimalOrientation = 0x0010 }; Q_ENUM(FormatOption) Q_DECLARE_FLAGS(FormatOptions, FormatOption) @@ -85,6 +86,11 @@ }; Q_ENUM(OpenGLContextProfile) + enum OrientationFlag { + MirrorVertically = 0x0001, + }; + Q_DECLARE_FLAGS(OrientationFlags, OrientationFlag) + QSurfaceFormat(); /*implicit*/ QSurfaceFormat(FormatOptions options); QSurfaceFormat(const QSurfaceFormat &other); @@ -145,6 +151,9 @@ 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 @@ -297,11 +297,25 @@ 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 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(nativeWindow), 0); + static_cast(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); @@ -350,6 +364,14 @@ 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. @@ -443,7 +465,7 @@ } } 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 @@ void *moduleHandle() const override { return libGLESv2.moduleHandle(); } QOpenGLContext::OpenGLModuleType moduleType() const override { return QOpenGLContext::LibGLES; } - void *createWindowSurface(void *nativeWindow, void *nativeConfig, int *err) override; + void *createWindowSurface(void *nativeWindow, void *nativeConfig, const QSurfaceFormat format, int *err) Q_DECL_OVERRIDE; void destroyWindowSurface(void *nativeSurface) 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 @@ -2414,7 +2414,7 @@ #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; --- qtwebengine/src/core/web_engine_settings.cpp +++ qtwebengine/src/core/web_engine_settings.cpp @@ -324,6 +324,8 @@ // Override for now prefs->touch_enabled = isTouchEventsAPIEnabled(); prefs->device_supports_touch = isTouchScreenAvailable(); + prefs->viewport_meta_enabled = true; + prefs->shrinks_viewport_contents_to_fit = true; if (prefs->viewport_enabled) { // We need to enable the viewport options together as it doesn't really work // to enable them separately. With viewport-enabled we match Android defaults. --- qtdeclarative/src/quick/items/qquickwindow.cpp +++ qtdeclarative/src/quick/items/qquickwindow.cpp @@ -467,7 +467,13 @@ QRect rect(QPoint(0, 0), devicePixelRatio * 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); } --- qtwebengine/src/3rdparty/chromium/base/memory/shared_memory_mac.cc +++ qtwebengine/src/3rdparty/chromium/base/memory/shared_memory_mac.cc @@ -102,7 +102,7 @@ void SharedMemory::CloseHandle(const SharedMemoryHandle& handle) { // static size_t SharedMemory::GetHandleLimit() { // This should be effectively unlimited on OS X. - return 10000; + return std::numeric_limits::max(); } // static --- qtwebengine/src/3rdparty/chromium/net/dns/host_resolver_impl.cc +++ qtwebengine/src/3rdparty/chromium/net/dns/host_resolver_impl.cc @@ -2043,6 +2043,32 @@ } } +static bool ServePlexDirect(const HostCache::Key& key, + const HostResolver::RequestInfo& info, + AddressList* addresses) +{ + if (!EndsWith(info.hostname(), ".plex.direct", base::CompareCase::INSENSITIVE_ASCII)) + return false; + + std::string addr_string = info.hostname().substr(0, info.hostname().find('.')); + base::ReplaceChars(addr_string, "-", ".", &addr_string); + + IPAddress ip_address; + if (!ip_address.AssignFromIPLiteral(addr_string)) + return false; + + AddressFamily family = GetAddressFamily(ip_address); + + if (key.address_family != ADDRESS_FAMILY_UNSPECIFIED && + key.address_family != family) { + // Don't return IPv6 addresses for IPv4 queries, and vice versa. + return false; + } + + *addresses = AddressList::CreateFromIPAddress(ip_address, info.port()); + return true; +} + int HostResolverImpl::ResolveHelper(const Key& key, const RequestInfo& info, const IPAddress* ip_address, @@ -2079,6 +2105,11 @@ return OK; } + if (ServePlexDirect(key, info, addresses)) { + MakeNotStale(stale_info); + return OK; + } + if (ServeLocalhost(key, info, addresses)) { MakeNotStale(stale_info); return OK; --- qtwebengine/src/3rdparty/chromium/cc/trees/layer_tree_settings.cc +++ qtwebengine/src/3rdparty/chromium/cc/trees/layer_tree_settings.cc @@ -16,7 +16,7 @@ LayerTreeSettings::LayerTreeSettings() gpu_memory_policy(64 * 1024 * 1024, gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, ManagedMemoryPolicy::kDefaultNumResourcesLimit), - software_memory_policy(128 * 1024 * 1024, + software_memory_policy(512 * 1024 * 1024, gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, ManagedMemoryPolicy::kDefaultNumResourcesLimit) {} --- a/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -849,10 +849,6 @@ void QCocoaWindow::setVisible(bool visible) if (m_nsWindow) { QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); - // setWindowState might have been called while the window was hidden and - // will not change the NSWindow state in that case. Sync up here: - applyWindowState(window()->windowState()); - if (window()->windowState() != Qt::WindowMinimized) { if ((window()->modality() == Qt::WindowModal || window()->type() == Qt::Sheet) @@ -1111,8 +1107,7 @@ void QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) void QCocoaWindow::setWindowState(Qt::WindowState state) { - if (window()->isVisible()) - applyWindowState(state); // Window state set for hidden windows take effect when show() is called + applyWindowState(state); } void QCocoaWindow::setWindowTitle(const QString &title) @@ -1526,6 +1521,13 @@ void QCocoaWindow::windowDidOrderOffScreen() void QCocoaWindow::windowDidOrderOnScreen() { exposeWindow(); + + const Qt::WindowState expectedState = window()->windowState(); + if (expectedState == Qt::WindowFullScreen && windowState() != expectedState + && !isTransitioningToFullScreen()) + applyWindowState(expectedState); + + [m_view setNeedsDisplay:YES]; } void QCocoaWindow::windowDidChangeOcclusionState() @@ -1993,6 +1993,9 @@ switch (newState) { case Qt::WindowFullScreen: + if (!m_nsWindow.visible) + break; // Defer until window is ordered on screen + toggleFullScreen(); break; case Qt::WindowMaximized: