summaryrefslogtreecommitdiffstats
path: root/patches/chromium/third_party/WebKit/0006-Use-compositor-for-page-popups.patch
diff options
context:
space:
mode:
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.patch190
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;
+ };