diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp b/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp index b129dc6e10e..cadbc144e41 100644 --- a/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp +++ b/chromium/third_party/WebKit/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()); |