Chromium Code Reviews| Index: third_party/WebKit/Source/web/ChromeClientImpl.cpp |
| diff --git a/third_party/WebKit/Source/web/ChromeClientImpl.cpp b/third_party/WebKit/Source/web/ChromeClientImpl.cpp |
| index 11d980e89a6250fd8cc4a10933d6ccef31805e9e..4f3b80a50b38a643bed4a3f62fbe5cbb49f0f330 100644 |
| --- a/third_party/WebKit/Source/web/ChromeClientImpl.cpp |
| +++ b/third_party/WebKit/Source/web/ChromeClientImpl.cpp |
| @@ -929,23 +929,54 @@ bool ChromeClientImpl::shouldOpenModalDialogDuringPageDismissal( |
| } |
| void ChromeClientImpl::setEventListenerProperties( |
| + LocalFrame* frame, |
| WebEventListenerClass eventClass, |
| WebEventListenerProperties properties) { |
| - if (WebLayerTreeView* treeView = m_webView->layerTreeView()) { |
| + // |frame| might be null if called via TreeScopeAdopter:: |
| + // moveNodeToNewDocument() and the new document has no frame attached. |
| + // Since a document without a frame cannot attach one later, it is safe to |
| + // exit early. |
| + if (!frame) |
| + return; |
| + |
| + WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame); |
| + WebFrameWidgetBase* widget = webFrame->localRoot()->frameWidget(); |
| + // The widget may be nullptr if the frame is provisional. |
|
dcheng
2017/01/18 00:13:03
Please add a TODO(dcheng) referencing https://crbu
wjmaclean
2017/01/18 14:01:24
Done.
|
| + if (!widget) { |
| + // If we hit a provisional frame, we expect it to be during initialization |
| + // in which case the |properties| should be 'nothing'. |
| + DCHECK(properties == WebEventListenerProperties::Nothing); |
| + return; |
| + } |
| + |
| + // This relies on widget always pointing to a WebFrameWidgetImpl when |
| + // |frame| points to an OOPIF frame, i.e. |frame|'s mainFrame() is |
| + // remote. |
| + setEventListenerProperties(*widget, eventClass, properties); |
| +} |
| + |
| +void ChromeClientImpl::setEventListenerProperties( |
|
dcheng
2017/01/18 00:13:03
Nit: either merge this into the previous function,
wjmaclean
2017/01/18 14:01:24
Done.
|
| + WebFrameWidgetBase& widget, |
| + WebEventListenerClass eventClass, |
| + WebEventListenerProperties properties) { |
| + WebWidgetClient* client = widget.client(); |
| + if (WebLayerTreeView* treeView = widget.getLayerTreeView()) { |
| treeView->setEventListenerProperties(eventClass, properties); |
| if (eventClass == WebEventListenerClass::TouchStartOrMove) { |
| - m_webView->hasTouchEventHandlers( |
| + client->hasTouchEventHandlers( |
| properties != WebEventListenerProperties::Nothing || |
| - eventListenerProperties(WebEventListenerClass::TouchEndOrCancel) != |
| + treeView->eventListenerProperties( |
| + WebEventListenerClass::TouchEndOrCancel) != |
| WebEventListenerProperties::Nothing); |
| } else if (eventClass == WebEventListenerClass::TouchEndOrCancel) { |
| - m_webView->hasTouchEventHandlers( |
| + client->hasTouchEventHandlers( |
| properties != WebEventListenerProperties::Nothing || |
| - eventListenerProperties(WebEventListenerClass::TouchStartOrMove) != |
| + treeView->eventListenerProperties( |
| + WebEventListenerClass::TouchStartOrMove) != |
| WebEventListenerProperties::Nothing); |
| } |
| } else { |
| - m_webView->hasTouchEventHandlers(true); |
| + client->hasTouchEventHandlers(true); |
| } |
| } |
| @@ -957,21 +988,35 @@ void ChromeClientImpl::beginLifecycleUpdates() { |
| } |
| WebEventListenerProperties ChromeClientImpl::eventListenerProperties( |
| + LocalFrame* frame, |
| WebEventListenerClass eventClass) const { |
| - if (WebLayerTreeView* treeView = m_webView->layerTreeView()) |
| - return treeView->eventListenerProperties(eventClass); |
| - return WebEventListenerProperties::Nothing; |
| -} |
| + if (!frame) |
| + return WebEventListenerProperties::Nothing; |
| -void ChromeClientImpl::setHasScrollEventHandlers(bool hasEventHandlers) { |
| - if (WebLayerTreeView* treeView = m_webView->layerTreeView()) |
| - treeView->setHaveScrollEventHandlers(hasEventHandlers); |
| + WebFrameWidgetBase* widget = |
| + WebLocalFrameImpl::fromFrame(frame)->localRoot()->frameWidget(); |
| + |
| + if (!widget || !widget->getLayerTreeView()) |
| + return WebEventListenerProperties::Nothing; |
| + return widget->getLayerTreeView()->eventListenerProperties(eventClass); |
| } |
| -bool ChromeClientImpl::hasScrollEventHandlers() const { |
| - if (WebLayerTreeView* treeView = m_webView->layerTreeView()) |
| - return treeView->haveScrollEventHandlers(); |
| - return false; |
| +void ChromeClientImpl::setHasScrollEventHandlers(LocalFrame* frame, |
| + bool hasEventHandlers) { |
| + // |frame| might be null if called via TreeScopeAdopter:: |
| + // moveNodeToNewDocument() and the new document has no frame attached. |
| + // Since a document without a frame cannot attach one later, it is safe to |
| + // exit early. |
| + if (!frame) |
| + return; |
| + |
| + WebFrameWidgetBase* widget = |
| + WebLocalFrameImpl::fromFrame(frame)->localRoot()->frameWidget(); |
| + // While a frame is shutting down, we may get called after the layerTreeView |
| + // is gone: in this case we always expect |hasEventHandlers| to be false. |
| + DCHECK(!widget || widget->getLayerTreeView() || !hasEventHandlers); |
| + if (widget && widget->getLayerTreeView()) |
| + widget->getLayerTreeView()->setHaveScrollEventHandlers(hasEventHandlers); |
| } |
| void ChromeClientImpl::setTouchAction(LocalFrame* frame, |