diff options
Diffstat (limited to 'patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch')
-rw-r--r-- | patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch b/patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch new file mode 100644 index 000000000..3b260a8dc --- /dev/null +++ b/patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch @@ -0,0 +1,190 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: "jbauman@chromium.org" <jbauman@chromium.org> +Date: Fri, 21 Feb 2014 00:46:34 +0000 +Subject: Use compositor for page popups. + +This is essentially the last user of the legacy 2d path. + +BUG=271140 + +Review URL: https://codereview.chromium.org/171343003 + +Change-Id: I64911d0d83b9d1d4782dff9b09db1bbcc439da24 +git-svn-id: svn://svn.chromium.org/blink/trunk@167552 bbb929c8-8fbe-4397-9dbb-9b2b20218538 +Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com> +--- + Source/web/WebPagePopupImpl.cpp | 87 +++++++++++++++++++++++++++++++++++++++++ + Source/web/WebPagePopupImpl.h | 13 ++++++ + 2 files changed, 100 insertions(+) + +diff --git a/Source/web/WebPagePopupImpl.cpp b/Source/web/WebPagePopupImpl.cpp +index b129dc6..cadbc14 100644 +--- a/Source/web/WebPagePopupImpl.cpp ++++ b/Source/web/WebPagePopupImpl.cpp +@@ -138,6 +138,16 @@ private: + m_popup->widgetClient()->hasTouchEventHandlers(needsTouchEvents); + } + ++ virtual GraphicsLayerFactory* graphicsLayerFactory() const OVERRIDE ++ { ++ return m_popup->m_webView->graphicsLayerFactory(); ++ } ++ ++ virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer* graphicsLayer) OVERRIDE ++ { ++ m_popup->setRootGraphicsLayer(graphicsLayer); ++ } ++ + WebPagePopupImpl* m_popup; + }; + +@@ -157,6 +167,10 @@ bool PagePopupFeaturesClient::isEnabled(Document*, ContextFeatures::FeatureType + WebPagePopupImpl::WebPagePopupImpl(WebWidgetClient* client) + : m_widgetClient(client) + , m_closing(false) ++ , m_layerTreeView(0) ++ , m_rootLayer(0) ++ , m_rootGraphicsLayer(0) ++ , m_isAcceleratedCompositingActive(false) + { + ASSERT(client); + } +@@ -224,6 +238,49 @@ void WebPagePopupImpl::destroyPage() + m_page.clear(); + } + ++void WebPagePopupImpl::setRootGraphicsLayer(GraphicsLayer* layer) ++{ ++ m_rootGraphicsLayer = layer; ++ m_rootLayer = layer ? layer->platformLayer() : 0; ++ ++ setIsAcceleratedCompositingActive(layer); ++ if (m_layerTreeView) { ++ if (m_rootLayer) { ++ m_layerTreeView->setRootLayer(*m_rootLayer); ++ } else { ++ m_layerTreeView->clearRootLayer(); ++ } ++ } ++} ++ ++void WebPagePopupImpl::setIsAcceleratedCompositingActive(bool enter) ++{ ++ if (m_isAcceleratedCompositingActive == enter) ++ return; ++ ++ if (!enter) { ++ m_isAcceleratedCompositingActive = false; ++ m_widgetClient->didDeactivateCompositor(); ++ } else if (m_layerTreeView) { ++ m_isAcceleratedCompositingActive = true; ++ m_widgetClient->didActivateCompositor(0); ++ } else { ++ TRACE_EVENT0("webkit", "WebPagePopupImpl::setIsAcceleratedCompositingActive(true)"); ++ ++ m_widgetClient->initializeLayerTreeView(); ++ m_layerTreeView = m_widgetClient->layerTreeView(); ++ if (m_layerTreeView) { ++ m_layerTreeView->setVisible(true); ++ m_widgetClient->didActivateCompositor(0); ++ m_isAcceleratedCompositingActive = true; ++ m_layerTreeView->setDeviceScaleFactor(m_widgetClient->deviceScaleFactor()); ++ } else { ++ m_isAcceleratedCompositingActive = false; ++ m_widgetClient->didDeactivateCompositor(); ++ } ++ } ++} ++ + WebSize WebPagePopupImpl::size() + { + return m_popupClient->contentSize(); +@@ -234,6 +291,36 @@ void WebPagePopupImpl::animate(double) + PageWidgetDelegate::animate(m_page.get(), monotonicallyIncreasingTime()); + } + ++void WebPagePopupImpl::enterForceCompositingMode(bool enter) ++{ ++ if (m_page->settings().forceCompositingMode() == enter) ++ return; ++ ++ TRACE_EVENT1("webkit", "WebPagePopupImpl::enterForceCompositingMode", "enter", enter); ++ m_page->settings().setForceCompositingMode(enter); ++ if (enter) { ++ if (!m_page) ++ return; ++ Frame* mainFrame = m_page->mainFrame(); ++ if (!mainFrame) ++ return; ++ mainFrame->view()->updateCompositingLayersAfterStyleChange(); ++ } ++} ++ ++void WebPagePopupImpl::didExitCompositingMode() ++{ ++ setIsAcceleratedCompositingActive(false); ++ m_widgetClient->didInvalidateRect(IntRect(0, 0, size().width, size().height)); ++ m_page->mainFrame()->document()->setNeedsStyleRecalc(SubtreeStyleChange); ++} ++ ++void WebPagePopupImpl::willCloseLayerTreeView() ++{ ++ setIsAcceleratedCompositingActive(false); ++ m_layerTreeView = 0; ++} ++ + void WebPagePopupImpl::layout() + { + PageWidgetDelegate::layout(m_page.get()); +diff --git a/Source/web/WebPagePopupImpl.h b/Source/web/WebPagePopupImpl.h +index 660c47f..050f3ae 100644 +--- a/Source/web/WebPagePopupImpl.h ++++ b/Source/web/WebPagePopupImpl.h +@@ -38,6 +38,7 @@ + #include "wtf/RefCounted.h" + + namespace WebCore { ++class GraphicsLayer; + class Page; + class PagePopupClient; + class PlatformKeyboardEvent; +@@ -46,6 +47,8 @@ class PlatformKeyboardEvent; + namespace blink { + + class PagePopupChromeClient; ++class WebLayerTreeView; ++class WebLayer; + class WebViewImpl; + + class WebPagePopupImpl : public WebPagePopup, +@@ -68,6 +71,9 @@ private: + virtual WebSize size() OVERRIDE; + virtual void animate(double) OVERRIDE; + virtual void layout() OVERRIDE; ++ virtual void enterForceCompositingMode(bool enter) OVERRIDE; ++ virtual void didExitCompositingMode() OVERRIDE; ++ virtual void willCloseLayerTreeView() OVERRIDE; + virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE; + virtual void resize(const WebSize&) OVERRIDE; + virtual void close() OVERRIDE; +@@ -83,6 +89,8 @@ private: + explicit WebPagePopupImpl(WebWidgetClient*); + bool initializePage(); + void destroyPage(); ++ void setRootGraphicsLayer(WebCore::GraphicsLayer*); ++ void setIsAcceleratedCompositingActive(bool enter); + + WebWidgetClient* m_widgetClient; + WebRect m_windowRectInScreen; +@@ -92,6 +100,11 @@ private: + WebCore::PagePopupClient* m_popupClient; + bool m_closing; + ++ WebLayerTreeView* m_layerTreeView; ++ WebLayer* m_rootLayer; ++ WebCore::GraphicsLayer* m_rootGraphicsLayer; ++ bool m_isAcceleratedCompositingActive; ++ + friend class WebPagePopup; + friend class PagePopupChromeClient; + }; |