diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-16 14:57:44 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-16 14:57:44 +0100 |
commit | ef177a48f2c6c41549ef9d11a985ab2661942638 (patch) | |
tree | d6bc5aa8cbde95d9e9857ead4b509e8b04b524b9 /src/core | |
parent | 396ca081d7b0d9dab7de14ebaec7943c3f857a24 (diff) | |
parent | e5bc5a6dbdd915e0b19cfc43e7af17e43c1a7878 (diff) |
Merge branch '5.12' into dev
Conflicts:
src/core/compositor/compositor.cpp
src/core/compositor/compositor.h
Change-Id: I8a4d73d728d93d95e499849f8778cc88dda2105e
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/compositor/compositor.cpp | 11 | ||||
-rw-r--r-- | src/core/compositor/compositor.h | 4 | ||||
-rw-r--r-- | src/core/config/common.pri | 3 | ||||
-rw-r--r-- | src/core/config/linux.pri | 1 | ||||
-rw-r--r-- | src/core/ozone/gl_ozone_glx_qt.cpp | 18 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 28 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 4 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt_delegate.h | 1 | ||||
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 7 | ||||
-rw-r--r-- | src/core/type_conversion.cpp | 38 | ||||
-rw-r--r-- | src/core/type_conversion.h | 2 | ||||
-rw-r--r-- | src/core/web_engine_context.cpp | 2 |
12 files changed, 91 insertions, 28 deletions
diff --git a/src/core/compositor/compositor.cpp b/src/core/compositor/compositor.cpp index 2d955b917..77a973748 100644 --- a/src/core/compositor/compositor.cpp +++ b/src/core/compositor/compositor.cpp @@ -41,15 +41,17 @@ #include "compositor_resource_tracker.h" #include "delegated_frame_node.h" +#include "render_widget_host_view_qt.h" -#include <components/viz/common/resources/returned_resource.h> -#include <content/public/browser/browser_thread.h> -#include <services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h> +#include "components/viz/common/resources/returned_resource.h" +#include "content/public/browser/browser_thread.h" +#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h" namespace QtWebEngineCore { -Compositor::Compositor() +Compositor::Compositor(RenderWidgetHostViewQt *hostView) : m_resourceTracker(new CompositorResourceTracker) + , m_view(hostView) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -169,6 +171,7 @@ bool Compositor::OnBeginFrameDerivedImpl(const viz::BeginFrameArgs &args) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + m_view->OnBeginFrame(args.frame_time); m_beginFrameSource->OnUpdateVSyncParameters(args.frame_time, args.interval); if (m_frameSinkClient) m_frameSinkClient->OnBeginFrame(args); diff --git a/src/core/compositor/compositor.h b/src/core/compositor/compositor.h index d34255d26..b025f901d 100644 --- a/src/core/compositor/compositor.h +++ b/src/core/compositor/compositor.h @@ -64,6 +64,7 @@ class CompositorFrameSinkClient; namespace QtWebEngineCore { class CompositorResourceTracker; +class RenderWidgetHostViewQt; class RenderWidgetHostViewQtDelegate; // Receives viz::CompositorFrames from child compositors and provides QSGNodes @@ -87,7 +88,7 @@ class RenderWidgetHostViewQtDelegate; class Compositor final : private viz::BeginFrameObserverBase { public: - explicit Compositor(); + explicit Compositor(RenderWidgetHostViewQt *hostView); ~Compositor() override; void setFrameSinkClient(viz::mojom::CompositorFrameSinkClient *frameSinkClient); @@ -109,6 +110,7 @@ private: viz::CompositorFrame m_pendingFrame; base::OnceClosure m_submitCallback; std::unique_ptr<CompositorResourceTracker> m_resourceTracker; + RenderWidgetHostViewQt *m_view; std::unique_ptr<viz::SyntheticBeginFrameSource> m_beginFrameSource; viz::mojom::CompositorFrameSinkClient *m_frameSinkClient = nullptr; bool m_updatePaintNodeShouldCommit = false; diff --git a/src/core/config/common.pri b/src/core/config/common.pri index 6b79a1f99..ddb4ca4bf 100644 --- a/src/core/config/common.pri +++ b/src/core/config/common.pri @@ -23,7 +23,8 @@ gn_args += \ !win32: gn_args += \ use_jumbo_build=true \ - jumbo_file_merge_limit=8 + jumbo_file_merge_limit=8 \ + jumbo_build_excluded="[\"browser\"]" qtConfig(webengine-printing-and-pdf) { gn_args += enable_basic_printing=true enable_print_preview=true diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri index eb8bb7bb0..ed7745b89 100644 --- a/src/core/config/linux.pri +++ b/src/core/config/linux.pri @@ -147,7 +147,6 @@ host_build { gn_args += use_system_libpng=true qtConfig(webengine-printing-and-pdf): gn_args += pdfium_use_system_libpng=true } - qtConfig(webengine-system-png): gn_args += use_system_libpng=true qtConfig(webengine-system-jpeg): gn_args += use_system_libjpeg=true qtConfig(webengine-system-freetype): gn_args += use_system_freetype=true qtConfig(webengine-system-harfbuzz): gn_args += use_system_harfbuzz=true diff --git a/src/core/ozone/gl_ozone_glx_qt.cpp b/src/core/ozone/gl_ozone_glx_qt.cpp index 2e7a28a0e..e3a4f4708 100644 --- a/src/core/ozone/gl_ozone_glx_qt.cpp +++ b/src/core/ozone/gl_ozone_glx_qt.cpp @@ -44,18 +44,12 @@ #include <QGuiApplication> #include "gl_ozone_glx_qt.h" #include "gl_surface_glx_qt.h" +#include "gl_context_qt.h" #include "ui/gl/gl_context_glx.h" #include "ui/gl/gl_gl_api_implementation.h" #include "ui/gl/gl_glx_api_implementation.h" #include <dlfcn.h> -#ifndef QT_NO_OPENGL -#include <QOpenGLContext> -QT_BEGIN_NAMESPACE -Q_GUI_EXPORT QOpenGLContext *qt_gl_global_share_context(); -QT_END_NAMESPACE -#endif - namespace ui { bool GLOzoneGLXQt::InitializeGLOneOffPlatform() { @@ -79,16 +73,12 @@ bool GLOzoneGLXQt::InitializeStaticGLBindings( reinterpret_cast<gl::GLGetProcAddressProc>( base::GetFunctionPointerFromNativeLibrary(library, "glXGetProcAddress")); - -#ifndef QT_NO_OPENGL if (!get_proc_address) { // glx handle not loaded, fallback to qpa - if (QOpenGLContext *context = qt_gl_global_share_context()) { - get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>( - context->getProcAddress("glXGetProcAddress")); - } + QFunctionPointer address = GLContextHelper::getGlXGetProcAddress(); + get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(address); } -#endif + if (!get_proc_address) { LOG(ERROR) << "glxGetProcAddress not found."; base::UnloadNativeLibrary(library); diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index bac9dd6cf..31a145b44 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -53,6 +53,7 @@ #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/frame_host/frame_tree.h" #include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/common/content_switches_internal.h" #include "content/common/cursors/webcursor.h" #include "content/common/input_messages.h" #include "third_party/skia/include/core/SkColor.h" @@ -260,7 +261,7 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost *widget , m_gestureProvider(QtGestureProviderConfig(), this) , m_sendMotionActionDown(false) , m_touchMotionStarted(false) - , m_compositor(new Compositor) + , m_compositor(new Compositor(this)) , m_loadVisuallyCommittedState(NotCommitted) , m_adapterClient(0) , m_imeInProgress(false) @@ -402,7 +403,18 @@ bool RenderWidgetHostViewQt::HasFocus() const bool RenderWidgetHostViewQt::IsSurfaceAvailableForCopy() const { - return false; + return true; +} + +void RenderWidgetHostViewQt::CopyFromSurface(const gfx::Rect &src_rect, + const gfx::Size &output_size, + base::OnceCallback<void(const SkBitmap &)> callback) +{ + QImage image; + if (m_delegate->copySurface(toQt(src_rect), toQt(output_size), image)) + std::move(callback).Run(toSkBitmap(image)); + else + std::move(callback).Run(SkBitmap()); } void RenderWidgetHostViewQt::Show() @@ -870,6 +882,13 @@ void RenderWidgetHostViewQt::selectionChanged() void RenderWidgetHostViewQt::OnGestureEvent(const ui::GestureEventData& gesture) { + if ((gesture.type() == ui::ET_GESTURE_PINCH_BEGIN + || gesture.type() == ui::ET_GESTURE_PINCH_UPDATE + || gesture.type() == ui::ET_GESTURE_PINCH_END) + && !content::IsPinchToZoomEnabled()) { + return; + } + host()->ForwardGestureEvent(ui::CreateWebGestureEventFromGestureEventData(gesture)); } @@ -1627,6 +1646,11 @@ void RenderWidgetHostViewQt::SetNeedsBeginFrames(bool needs_begin_frames) m_compositor->setNeedsBeginFrames(needs_begin_frames); } +void RenderWidgetHostViewQt::OnBeginFrame(base::TimeTicks frame_time) +{ + host()->ProgressFlingIfNeeded(frame_time); +} + content::RenderFrameHost *RenderWidgetHostViewQt::getFocusedFrameHost() { content::RenderViewHostImpl *viewHost = content::RenderViewHostImpl::From(host()); diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 6a1134ac0..6dd4d57e5 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -112,6 +112,7 @@ public: RenderWidgetHostViewQtDelegate *delegate() { return m_delegate.get(); } void setDelegate(RenderWidgetHostViewQtDelegate *delegate); void setAdapterClient(WebContentsAdapterClient *adapterClient); + void OnBeginFrame(base::TimeTicks frame_time); void InitAsChild(gfx::NativeView) override; void InitAsPopup(content::RenderWidgetHostView*, const gfx::Rect&) override; @@ -124,6 +125,9 @@ public: void Focus() override; bool HasFocus() const override; bool IsSurfaceAvailableForCopy() const override; + void CopyFromSurface(const gfx::Rect &src_rect, + const gfx::Size &output_size, + base::OnceCallback<void(const SkBitmap &)> callback) override; void Show() override; void Hide() override; bool IsShowing() override; diff --git a/src/core/render_widget_host_view_qt_delegate.h b/src/core/render_widget_host_view_qt_delegate.h index 991c26ea8..5ce595502 100644 --- a/src/core/render_widget_host_view_qt_delegate.h +++ b/src/core/render_widget_host_view_qt_delegate.h @@ -114,6 +114,7 @@ public: virtual void inputMethodStateChanged(bool editorVisible, bool passwordInput) = 0; virtual void setInputMethodHints(Qt::InputMethodHints hints) = 0; virtual void setClearColor(const QColor &color) = 0; + virtual bool copySurface(const QRect &, const QSize &, QImage &) = 0; }; } // namespace QtWebEngineCore diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 3eda3993a..403448b91 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -213,8 +213,9 @@ void ContentRendererClientQt::PrepareErrorPageForHttpStatusError(content::Render errorHtml, errorDescription); } -void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderFrame */*renderFrame*/, const blink::WebURLRequest &failedRequest, const error_page::Error &error, std::string *errorHtml, base::string16 *errorDescription) +void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderFrame *renderFrame, const blink::WebURLRequest &failedRequest, const error_page::Error &error, std::string *errorHtml, base::string16 *errorDescription) { + Q_UNUSED(renderFrame) const bool isPost = QByteArray::fromStdString(failedRequest.HttpMethod().Utf8()) == QByteArrayLiteral("POST"); if (errorHtml) { @@ -424,8 +425,6 @@ static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> return; } - media::SupportedCodecs supported_codecs = media::EME_CODEC_NONE; - // Codecs and encryption schemes. auto codecs = GetSupportedCodecs(capability->video_codecs, /*is_secure=*/false); @@ -452,8 +451,6 @@ static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> return; } - bool cdm_supports_persistent_license = - base::ContainsValue(capability->session_types, media::CdmSessionType::kPersistentLicense); auto persistent_license_support = media::EmeSessionTypeSupport::NOT_SUPPORTED; auto persistent_usage_record_support = media::EmeSessionTypeSupport::NOT_SUPPORTED; diff --git a/src/core/type_conversion.cpp b/src/core/type_conversion.cpp index 4aff2cff6..d35426ac3 100644 --- a/src/core/type_conversion.cpp +++ b/src/core/type_conversion.cpp @@ -137,6 +137,44 @@ QImage toQImage(const gfx::ImageSkiaRep &imageSkiaRep) return image; } +SkBitmap toSkBitmap(const QImage &image) +{ + SkBitmap bitmap; + SkImageInfo imageInfo; + + switch (image.format()) { + case QImage::Format_RGB32: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kOpaque_SkAlphaType); + break; + case QImage::Format_ARGB32: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kUnpremul_SkAlphaType); + break; + case QImage::Format_ARGB32_Premultiplied: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kPremul_SkAlphaType); + break; + case QImage::Format_RGBX8888: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kOpaque_SkAlphaType); + break; + case QImage::Format_RGBA8888: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); + break; + case QImage::Format_RGBA8888_Premultiplied: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); + break; + default: + return toSkBitmap(image.convertToFormat(QImage::Format_ARGB32_Premultiplied)); + } + + bitmap.installPixels(imageInfo, (void *)image.bits(), image.bytesPerLine()); + + // Ensure we copy the pixels + SkBitmap bitmapCopy; + bitmapCopy.allocPixels(imageInfo); + bitmapCopy.writePixels(bitmap.pixmap()); + + return bitmapCopy; +} + QIcon toQIcon(const std::vector<SkBitmap> &bitmaps) { if (!bitmaps.size()) diff --git a/src/core/type_conversion.h b/src/core/type_conversion.h index b9e210c22..afc3c3336 100644 --- a/src/core/type_conversion.h +++ b/src/core/type_conversion.h @@ -194,6 +194,8 @@ inline QImage toQImage(const SkBitmap &bitmap, QImage::Format format) QImage toQImage(const SkBitmap &bitmap); QImage toQImage(const gfx::ImageSkiaRep &imageSkiaRep); +SkBitmap toSkBitmap(const QImage &image); + QIcon toQIcon(const std::vector<SkBitmap> &bitmaps); inline QMatrix4x4 toQt(const SkMatrix44 &m) diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 096568570..f9d9631fd 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -449,6 +449,8 @@ WebEngineContext::WebEngineContext() appendToFeatureSwitch(parsedCommandLine, switches::kDisableFeatures, features::kEnableSurfaceSynchronization.name); // The video-capture service is not functioning at this moment (since 69) appendToFeatureSwitch(parsedCommandLine, switches::kDisableFeatures, features::kMojoVideoCapture.name); + // We do not yet support the internal video capture API. + appendToFeatureSwitch(parsedCommandLine, switches::kDisableFeatures, features::kUseVideoCaptureApiForDevToolsSnapshots.name); if (useEmbeddedSwitches) { // embedded switches are based on the switches for Android, see content/browser/android/content_startup_flags.cc |