summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-10-06 12:56:50 +0200
committerLiang Qi <liang.qi@qt.io>2017-10-06 12:56:50 +0200
commit20fa19f0e267cc184d410d274a1b35946607cb5b (patch)
treea56608ed4cfa7d5c5ad404fc38fe3be153511d7c
parent9642bc462f4ce6422b46a3426d34a21c18a9750d (diff)
parentc11c2c8981e647c1eb2c6753ce77d436b92fff87 (diff)
Merge remote-tracking branch 'origin/5.9.2' into 5.9
-rw-r--r--dist/changes-5.9.272
-rw-r--r--src/core/delegated_frame_node.cpp24
-rw-r--r--src/core/delegated_frame_node.h1
-rw-r--r--src/core/surface_factory_qt.cpp40
-rw-r--r--src/core/type_conversion.h5
5 files changed, 126 insertions, 16 deletions
diff --git a/dist/changes-5.9.2 b/dist/changes-5.9.2
new file mode 100644
index 00000000..6cc9dbe3
--- /dev/null
+++ b/dist/changes-5.9.2
@@ -0,0 +1,72 @@
+Qt 5.9.2 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.9.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+http://doc.qt.io/qt-5/index.html
+
+The Qt version 5.9 series is binary compatible with the 5.8.x series.
+Applications compiled for 5.8 will continue to run with 5.9.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* General *
+****************************************************************************
+
+ - Chromium Snapshot:
+ * Security fixes from Chromium up to version 61.0.3163.79
+ Including: CVE-2017-5092, CVE-2017-5093, CVE-2017-5095, CVE-2017-5097,
+ CVE-2017-5099, CVE-2017-5102, CVE-2017-5103, CVE-2017-5107,
+ CVE-2017-5112, CVE-2017-5114, CVE-2017-5117 and CVE-2017-5118
+ * Fixed Skia to to render text correctly with FreeType 2.8.1
+ * [QTBUG-50389] Fixed assert on some flash content
+
+ - QtWebEngine:
+ * [QTBUG-57505] Handle --force-webrtc-ip-handling-policy on command-line
+ * [QTBUG-58306] Fixed handling of menu key
+ * [QTBUG-60790] Fixed dragging images to desktop
+ * [QTBUG-61354] Set referrer on download requests
+ * [QTBUG-61429] Fixed cancelling IME composition
+ * [QTBUG-61506] Stop searching when navigating away
+ * [QTBUG-61910] Fixed an issue where system proxy settings were not
+ picked up correctly
+ * [QTBUG-62112] Fixed upside-down rendering in software rendering mode
+ * [QTBUG-62112] Fixed rendering of content with preserve-3d in CSS
+ * [QTBUG-62311] Fixed hang when exiting with open combobox
+ * [QTBUG-62808] Handle --explicitly-allowed-ports on command-line
+ * [QTBUG-62898] Fixed accessing webchannels from document-creation
+ user-scripts after navigation.
+ * [QTBUG-62942] Fixed committing IME composition on touch events
+
+ - QWebEngineView:
+ * [QTBUG-61621] Fixed propagation of unhandled key press events
+
+ - WebEngineView:
+ * The callback version of printToPdf is now called with a proper
+ bytearray result instead of a PDF data in a javascript string.
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+ - Linux:
+ * [QTBUG-61528, QTBUG-62673] Fixed various multilib build configurations
+ * [QTBUG-61846] Fixed host builds on Arm and MIPS
+
+ - Windows:
+ * [QTBUG-60334] Fixed location of IME window
+ * [QTBUG-62146] Fixed following system font configuration
+ * [QTBUG-62200] Fixed assert on hover
+ * Allow WebGL to work with software OpenGL using the new command-line
+ argument --enable-webgl-software-rendering
+
+ - macOS:
+ * [QTBUG-60605] Use OpenGL core-profile when the main application does
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index be085831..73e0420a 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -850,8 +850,8 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
// countering the scale of devicePixel-scaled tiles when rendering them
// to the final surface.
QMatrix4x4 matrix;
- matrix.scale(1 / m_chromiumCompositorData->frameDevicePixelRatio,
- 1 / m_chromiumCompositorData->frameDevicePixelRatio);
+ const float devicePixelRatio = m_chromiumCompositorData->frameDevicePixelRatio;
+ matrix.scale(1 / devicePixelRatio, 1 / devicePixelRatio);
if (QSGTransformNode::matrix() != matrix)
setMatrix(matrix);
@@ -873,12 +873,21 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
frameData->resource_list.clear();
QScopedPointer<DelegatedNodeTreeHandler> nodeHandler;
+ const QSizeF viewportSizeInPt = apiDelegate->screenRect().size();
+ const QSize viewportSize = (viewportSizeInPt * devicePixelRatio).toSize();
+
// We first compare if the render passes from the previous frame data are structurally
// equivalent to the render passes in the current frame data. If they are, we are going
// to reuse the old nodes. Otherwise, we will delete the old nodes and build a new tree.
+ //
+ // Additionally, because we clip (i.e. don't build scene graph nodes for) quads outside
+ // of the visible area, we also have to rebuild the tree whenever the window is resized.
#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
cc::DelegatedFrameData *previousFrameData = m_chromiumCompositorData->previousFrameData.get();
- const bool buildNewTree = !areRenderPassStructuresEqual(frameData, previousFrameData) || m_sceneGraphNodes.empty();
+ const bool buildNewTree =
+ !areRenderPassStructuresEqual(frameData, previousFrameData) ||
+ m_sceneGraphNodes.empty() ||
+ viewportSize != m_previousViewportSize;
#else
// No updates possible with old scenegraph nodes
const bool buildNewTree = true;
@@ -912,10 +921,7 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
// All RenderPasses except the last one are rendered to an FBO.
cc::RenderPass *rootRenderPass = frameData->render_pass_list.back().get();
- QRectF screenRectQt = apiDelegate->screenRect();
- gfx::Size thisSize(int(screenRectQt.width() * m_chromiumCompositorData->frameDevicePixelRatio),
- int(screenRectQt.height() * m_chromiumCompositorData->frameDevicePixelRatio));
-
+ gfx::Rect viewportRect(toGfx(viewportSize));
for (unsigned i = 0; i < frameData->render_pass_list.size(); ++i) {
cc::RenderPass *pass = frameData->render_pass_list.at(i).get();
@@ -947,7 +953,7 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
scissorRect = pass->output_rect;
} else {
renderPassParent = this;
- scissorRect = gfx::Rect(thisSize);
+ scissorRect = viewportRect;
scissorRect += rootRenderPass->output_rect.OffsetFromOrigin();
}
@@ -1015,6 +1021,8 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
ResourceHolderIterator end = resourceCandidates.constEnd();
for (ResourceHolderIterator it = resourceCandidates.constBegin(); it != end ; ++it)
resourcesToRelease->push_back((*it)->returnResource());
+
+ m_previousViewportSize = viewportSize;
}
void DelegatedFrameNode::flushPolygons(
diff --git a/src/core/delegated_frame_node.h b/src/core/delegated_frame_node.h
index cc682988..3b6453a4 100644
--- a/src/core/delegated_frame_node.h
+++ b/src/core/delegated_frame_node.h
@@ -143,6 +143,7 @@ private:
bool m_contextShared;
QScopedPointer<QOffscreenSurface> m_offsurface;
#endif
+ QSize m_previousViewportSize;
};
} // namespace QtWebEngineCore
diff --git a/src/core/surface_factory_qt.cpp b/src/core/surface_factory_qt.cpp
index e8be8480..36c05ec5 100644
--- a/src/core/surface_factory_qt.cpp
+++ b/src/core/surface_factory_qt.cpp
@@ -51,27 +51,51 @@
#if defined(USE_OZONE)
#include <EGL/egl.h>
-#include <dlfcn.h>
+
+#ifndef QT_LIBDIR_EGL
+#define QT_LIBDIR_EGL "/usr/lib"
+#endif
+#ifndef QT_LIBDIR_GLES2
+#define QT_LIBDIR_GLES2 QT_LIBDIR_EGL
+#endif
namespace QtWebEngineCore {
+base::NativeLibrary LoadLibrary(const base::FilePath& filename) {
+ base::NativeLibraryLoadError error;
+ base::NativeLibrary library = base::LoadNativeLibrary(filename, &error);
+ if (!library) {
+ LOG(ERROR) << "Failed to load " << filename.MaybeAsASCII() << ": " << error.ToString();
+ return NULL;
+ }
+ return library;
+}
+
bool SurfaceFactoryQt::LoadEGLGLES2Bindings()
{
- base::NativeLibrary eglgles2Library = dlopen(NULL, RTLD_LAZY);
- if (!eglgles2Library) {
- LOG(ERROR) << "Failed to open EGL/GLES2 context " << dlerror();
+ base::FilePath libEGLPath = QtWebEngineCore::toFilePath(QT_LIBDIR_EGL);
+ libEGLPath = libEGLPath.Append("libEGL.so.1");
+ base::NativeLibrary eglLibrary = LoadLibrary(libEGLPath);
+ if (!eglLibrary)
+ return false;
+
+ base::FilePath libGLES2Path = QtWebEngineCore::toFilePath(QT_LIBDIR_GLES2);
+ libGLES2Path = libGLES2Path.Append("libGLESv2.so.2");
+ base::NativeLibrary gles2Library = LoadLibrary(libGLES2Path);
+ if (!gles2Library)
return false;
- }
- gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglgles2Library, "eglGetProcAddress"));
+ gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglLibrary, "eglGetProcAddress"));
if (!get_proc_address) {
LOG(ERROR) << "eglGetProcAddress not found.";
- base::UnloadNativeLibrary(eglgles2Library);
+ base::UnloadNativeLibrary(eglLibrary);
+ base::UnloadNativeLibrary(gles2Library);
return false;
}
gl::SetGLGetProcAddressProc(get_proc_address);
- gl::AddGLNativeLibrary(eglgles2Library);
+ gl::AddGLNativeLibrary(eglLibrary);
+ gl::AddGLNativeLibrary(gles2Library);
return true;
}
diff --git a/src/core/type_conversion.h b/src/core/type_conversion.h
index ed02a9db..39c4f610 100644
--- a/src/core/type_conversion.h
+++ b/src/core/type_conversion.h
@@ -139,6 +139,11 @@ inline QRectF toQt(const gfx::RectF &rect)
return QRectF(rect.x(), rect.y(), rect.width(), rect.height());
}
+inline gfx::Size toGfx(const QSize &size)
+{
+ return gfx::Size(size.width(), size.height());
+}
+
inline QSize toQt(const gfx::Size &size)
{
return QSize(size.width(), size.height());