Chromium Code Reviews| Index: Source/web/WebViewImpl.cpp |
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp |
| index 0ed038eb8fa1febc7dfa5d9417dd29ec62f02e80..294f601efe642ac70a466b8fe5bea6ee9a15a28d 100644 |
| --- a/Source/web/WebViewImpl.cpp |
| +++ b/Source/web/WebViewImpl.cpp |
| @@ -340,10 +340,14 @@ void WebView::didExitModalLoop() |
| void WebViewImpl::setMainFrame(WebFrame* frame) |
| { |
| - if (frame->isWebLocalFrame()) |
| - toWebLocalFrameImpl(frame)->initializeCoreFrame(&page()->frameHost(), 0, nullAtom, nullAtom); |
| - else |
| + if (frame->isWebLocalFrame()) { |
| + WebLocalFrameImpl* localFrame = toWebLocalFrameImpl(frame); |
| + localFrame->initializeCoreFrame(&page()->frameHost(), 0, nullAtom, nullAtom); |
| + // Composited WebViews want repaints outside the frame visible rect. |
| + localFrame->frame()->view()->setClipsRepaints(!m_layerTreeView); |
| + } else { |
| toWebRemoteFrameImpl(frame)->initializeCoreFrame(&page()->frameHost(), 0, nullAtom); |
| + } |
| } |
| void WebViewImpl::setCredentialManagerClient(WebCredentialManagerClient* webCredentialManagerClient) |
| @@ -406,19 +410,13 @@ WebViewImpl::WebViewImpl(WebViewClient* client) |
| , m_rootGraphicsLayer(0) |
| , m_rootTransformLayer(0) |
| , m_graphicsLayerFactory(adoptPtr(new GraphicsLayerFactoryChromium(this))) |
| - , m_isAcceleratedCompositingActive(false) |
| - , m_layerTreeViewCommitsDeferred(false) |
| - , m_layerTreeViewClosed(false) |
| , m_matchesHeuristicsForGpuRasterization(false) |
| , m_recreatingGraphicsContext(false) |
| , m_flingModifier(0) |
| , m_flingSourceDevice(false) |
| , m_fullscreenController(FullscreenController::create(this)) |
| , m_showFPSCounter(false) |
| - , m_showPaintRects(false) |
| - , m_showDebugBorders(false) |
| , m_continuousPaintingEnabled(false) |
| - , m_showScrollBottleneckRects(false) |
| , m_baseBackgroundColor(Color::white) |
| , m_backgroundColorOverride(Color::transparent) |
| , m_zoomFactorOverride(0) |
| @@ -961,7 +959,6 @@ void WebViewImpl::setShowPaintRects(bool show) |
| TRACE_EVENT0("blink", "WebViewImpl::setShowPaintRects"); |
| m_layerTreeView->setShowPaintRects(show); |
| } |
| - m_showPaintRects = show; |
| setFirstPaintInvalidationTrackingEnabledForShowPaintRects(show); |
| } |
| @@ -969,7 +966,6 @@ void WebViewImpl::setShowDebugBorders(bool show) |
| { |
| if (m_layerTreeView) |
| m_layerTreeView->setShowDebugBorders(show); |
| - m_showDebugBorders = show; |
| } |
| void WebViewImpl::setContinuousPaintingEnabled(bool enabled) |
| @@ -997,7 +993,6 @@ void WebViewImpl::setShowScrollBottleneckRects(bool show) |
| { |
| if (m_layerTreeView) |
| m_layerTreeView->setShowScrollBottleneckRects(show); |
| - m_showScrollBottleneckRects = show; |
| } |
| void WebViewImpl::acceptLanguagesChanged() |
| @@ -2734,14 +2729,13 @@ void WebViewImpl::setTextDirection(WebTextDirection direction) |
| bool WebViewImpl::isAcceleratedCompositingActive() const |
| { |
| - return m_isAcceleratedCompositingActive; |
| + return m_rootLayer; |
| } |
| void WebViewImpl::willCloseLayerTreeView() |
| { |
| - setIsAcceleratedCompositingActive(false); |
| + setRootGraphicsLayer(nullptr); |
|
enne (OOO)
2015/04/23 22:48:17
This is the crash fix from https://codereview.chro
|
| m_layerTreeView = 0; |
| - m_layerTreeViewClosed = true; |
| } |
| void WebViewImpl::didAcquirePointerLock() |
| @@ -3706,7 +3700,7 @@ void WebViewImpl::sendResizeEventAndRepaint() |
| } |
| if (m_client) { |
| - if (isAcceleratedCompositingActive()) { |
| + if (m_layerTreeView) { |
| updateLayerTreeViewport(); |
| } else { |
| WebRect damagedRect(0, 0, m_size.width, m_size.height); |
| @@ -3848,6 +3842,9 @@ void WebViewImpl::setIsTransparent(bool isTransparent) |
| // Future frames check this to know whether to be transparent. |
| m_isTransparent = isTransparent; |
| + |
| + if (m_layerTreeView) |
| + m_layerTreeView->setHasTransparentBackground(this->isTransparent()); |
| } |
| bool WebViewImpl::isTransparent() const |
| @@ -3948,11 +3945,8 @@ void WebViewImpl::didRemoveAllPendingStylesheet(WebLocalFrameImpl* webframe) |
| void WebViewImpl::resumeTreeViewCommits() |
| { |
| - if (m_layerTreeViewCommitsDeferred) { |
| - if (m_layerTreeView) |
| - m_layerTreeView->setDeferCommits(false); |
| - m_layerTreeViewCommitsDeferred = false; |
| - } |
| + if (m_layerTreeView) |
| + m_layerTreeView->setDeferCommits(false); |
| } |
| void WebViewImpl::postLayoutResize(WebLocalFrameImpl* webframe) |
| @@ -4148,6 +4142,9 @@ void WebViewImpl::suppressInvalidations(bool enable) |
| void WebViewImpl::setRootGraphicsLayer(GraphicsLayer* layer) |
| { |
| + if (!m_layerTreeView) |
| + return; |
| + |
| suppressInvalidations(true); |
| PinchViewport& pinchViewport = page()->frameHost().pinchViewport(); |
| @@ -4156,26 +4153,30 @@ void WebViewImpl::setRootGraphicsLayer(GraphicsLayer* layer) |
| m_rootGraphicsLayer = pinchViewport.rootGraphicsLayer(); |
| m_rootLayer = pinchViewport.rootGraphicsLayer()->platformLayer(); |
| m_rootTransformLayer = pinchViewport.rootGraphicsLayer(); |
| + updateRootLayerTransform(); |
|
enne (OOO)
2015/04/23 22:48:17
I rolled https://codereview.chromium.org/109718300
|
| + m_layerTreeView->setRootLayer(*m_rootLayer); |
| + // We register viewport layers here since there may not be a layer |
| + // tree view prior to this point. |
| + page()->frameHost().pinchViewport().registerLayersWithTreeView(m_layerTreeView); |
| + if (m_pageOverlays) |
| + m_pageOverlays->update(); |
| + |
| + // TODO(enne): Work around page visibility changes not being |
| + // propogated to the WebView in some circumstances. This needs to |
| + // be refreshed here when setting a new root layer to avoid being |
| + // stuck in a presumed incorrectly invisible state. |
| + bool visible = page()->visibilityState() == PageVisibilityStateVisible; |
|
enne (OOO)
2015/04/23 22:48:17
This is the fix that made me revert the original p
|
| + m_layerTreeView->setVisible(visible); |
| } else { |
| m_rootGraphicsLayer = nullptr; |
| m_rootLayer = nullptr; |
| m_rootTransformLayer = nullptr; |
| - } |
| - |
| - setIsAcceleratedCompositingActive(layer != 0); |
| - |
| - updateRootLayerTransform(); |
| - |
| - if (m_layerTreeView) { |
| - if (m_rootLayer) { |
| - m_layerTreeView->setRootLayer(*m_rootLayer); |
| - // We register viewport layers here since there may not be a layer |
| - // tree view prior to this point. |
| - page()->frameHost().pinchViewport().registerLayersWithTreeView(m_layerTreeView); |
| - } else { |
| - m_layerTreeView->clearRootLayer(); |
| - page()->frameHost().pinchViewport().clearLayersForTreeView(m_layerTreeView); |
| - } |
| + // This means that we're transitioning to a new page. Suppress |
| + // commits until Blink generates invalidations so we don't |
| + // attempt to paint too early in the next page load. |
| + m_layerTreeView->setDeferCommits(true); |
| + m_layerTreeView->clearRootLayer(); |
| + page()->frameHost().pinchViewport().clearLayersForTreeView(m_layerTreeView); |
| } |
| suppressInvalidations(false); |
| @@ -4188,10 +4189,9 @@ void WebViewImpl::scheduleCompositingLayerSync() |
| void WebViewImpl::invalidateRect(const IntRect& rect) |
| { |
| - if (m_isAcceleratedCompositingActive) { |
| - ASSERT(m_layerTreeView); |
| + if (m_layerTreeView) |
| updateLayerTreeViewport(); |
| - } else if (m_client) |
| + else if (m_client) |
| m_client->didInvalidateRect(rect); |
| } |
| @@ -4258,58 +4258,6 @@ void WebViewImpl::initializeLayerTreeView() |
| ASSERT(m_layerTreeView || !m_client || m_client->allowsBrokenNullLayerTreeView()); |
| } |
| -void WebViewImpl::setIsAcceleratedCompositingActive(bool active) |
| -{ |
| - // In the middle of shutting down; don't try to spin back up a compositor. |
| - // FIXME: compositing startup/shutdown should be refactored so that it |
| - // turns on explicitly rather than lazily, which causes this awkwardness. |
| - if (m_layerTreeViewClosed) |
| - return; |
| - |
| - ASSERT(!active || m_layerTreeView); |
| - Platform::current()->histogramEnumeration("GPU.setIsAcceleratedCompositingActive", active * 2 + m_isAcceleratedCompositingActive, 4); |
| - |
| - if (m_isAcceleratedCompositingActive == active) |
| - return; |
| - |
| - if (!m_client) |
| - return; |
| - |
| - if (!active) { |
| - m_isAcceleratedCompositingActive = false; |
| - if (!m_layerTreeViewCommitsDeferred) { |
| - ASSERT(m_layerTreeView); |
| - // This means that we're transitioning to a new page. Suppress commits until WebKit generates invalidations so |
| - // we don't attempt to paint too early in the next page load. |
| - m_layerTreeView->setDeferCommits(true); |
| - m_layerTreeViewCommitsDeferred = true; |
| - } |
| - } else { |
| - TRACE_EVENT0("blink", "WebViewImpl::setIsAcceleratedCompositingActive(true)"); |
| - m_layerTreeView->setRootLayer(*m_rootLayer); |
| - |
| - bool visible = page()->visibilityState() == PageVisibilityStateVisible; |
| - m_layerTreeView->setVisible(visible); |
| - updateLayerTreeDeviceScaleFactor(); |
| - m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); |
| - updateLayerTreeBackgroundColor(); |
| - m_layerTreeView->setHasTransparentBackground(isTransparent()); |
| - updateLayerTreeViewport(); |
| - m_isAcceleratedCompositingActive = true; |
| - if (m_pageOverlays) |
| - m_pageOverlays->update(); |
| - // FIXME: allow emulation, fps counter and continuous painting at the same time: crbug.com/299837. |
| - m_layerTreeView->setShowFPSCounter(m_showFPSCounter && !m_devToolsEmulator->deviceEmulationEnabled()); |
| - m_layerTreeView->setShowPaintRects(m_showPaintRects); |
| - m_layerTreeView->setShowDebugBorders(m_showDebugBorders); |
| - m_layerTreeView->setContinuousPaintingEnabled(m_continuousPaintingEnabled && !m_devToolsEmulator->deviceEmulationEnabled()); |
| - m_layerTreeView->setShowScrollBottleneckRects(m_showScrollBottleneckRects); |
| - m_layerTreeView->heuristicsForGpuRasterizationUpdated(m_matchesHeuristicsForGpuRasterization); |
| - } |
| - if (page() && page()->mainFrame()->isLocalFrame()) |
| - page()->deprecatedLocalMainFrame()->view()->setClipsRepaints(!m_isAcceleratedCompositingActive); |
| -} |
| - |
| void WebViewImpl::updateMainFrameScrollPosition(const DoublePoint& scrollPosition, bool programmaticScroll) |
| { |
| if (!page()->mainFrame()->isLocalFrame()) |
| @@ -4431,11 +4379,10 @@ bool WebViewImpl::detectContentOnTouch(const GestureEventWithHitTestResults& tar |
| void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState, |
| bool isInitialState) { |
| - if (!page()) |
| - return; |
| - |
| ASSERT(visibilityState == WebPageVisibilityStateVisible || visibilityState == WebPageVisibilityStateHidden || visibilityState == WebPageVisibilityStatePrerender); |
| - m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState); |
| + |
| + if (page()) |
| + m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState); |
| if (m_layerTreeView) { |
| bool visible = visibilityState == WebPageVisibilityStateVisible; |