Chromium Code Reviews| Index: Source/web/WebPagePopupImpl.cpp |
| diff --git a/Source/web/WebPagePopupImpl.cpp b/Source/web/WebPagePopupImpl.cpp |
| index 539f512bb556050a3b4667fdf23bec6da9c53b24..7814ae4fb66162b7b534991aeb796926490c9823 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()); |
|
jamesr
2014/02/20 22:00:33
apparently we don't have a way to update the devic
|
| + } 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()); |