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 767849621044c8f3201fafa471cfd6b5eb58698d..e89395988146f5f1934958ee43674c91e694c686 100644 |
--- a/third_party/WebKit/Source/web/ChromeClientImpl.cpp |
+++ b/third_party/WebKit/Source/web/ChromeClientImpl.cpp |
@@ -919,19 +919,44 @@ bool ChromeClientImpl::shouldOpenModalDialogDuringPageDismissal( |
} |
void ChromeClientImpl::setEventListenerProperties( |
+ LocalFrame* frame, |
WebEventListenerClass eventClass, |
WebEventListenerProperties properties) { |
- if (WebLayerTreeView* treeView = m_webView->layerTreeView()) { |
+ WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame); |
+ if (!webFrame || webFrame->localRoot() == m_webView->mainFrame()) { |
+ setEventListenerProperties(m_webView->layerTreeView(), eventClass, |
+ properties); |
+ } else { |
+ WebFrameWidgetBase* widget = webFrame->localRoot()->frameWidget(); |
+ // The widget may be nullptr in some unit tests. |
dcheng
2016/11/10 07:46:11
How many tests does this break? If possible, we sh
wjmaclean
2016/11/10 15:57:15
I realize I missed a case, this isn't just broken
dcheng
2016/11/11 08:51:52
Can you clarify what you mean?
wjmaclean
2016/11/11 15:40:51
The event listener properties are stored as an arr
dcheng
2016/11/11 22:32:11
I don't think we can expose that to the layer tree
|
+ if (!widget) { |
+ LOG(INFO) << "Null frameWidget."; |
dcheng
2016/11/10 07:46:11
Nit: remove this LOG
wjmaclean
2016/11/10 15:57:15
Done.
|
+ return; |
+ } |
+ |
+ WebWidgetClient* client = widget->client(); |
+ // TODO(wjmaclean): Do we need to inform the WebView about these also? |
+ setEventListenerProperties(client->layerTreeView(), eventClass, properties); |
+ } |
+} |
+ |
+void ChromeClientImpl::setEventListenerProperties( |
+ WebLayerTreeView* treeView, |
+ WebEventListenerClass eventClass, |
+ WebEventListenerProperties properties) { |
+ if (treeView) { |
treeView->setEventListenerProperties(eventClass, properties); |
if (eventClass == WebEventListenerClass::TouchStartOrMove) { |
m_webView->hasTouchEventHandlers( |
properties != WebEventListenerProperties::Nothing || |
- eventListenerProperties(WebEventListenerClass::TouchEndOrCancel) != |
+ eventListenerProperties(treeView, |
+ WebEventListenerClass::TouchEndOrCancel) != |
WebEventListenerProperties::Nothing); |
} else if (eventClass == WebEventListenerClass::TouchEndOrCancel) { |
m_webView->hasTouchEventHandlers( |
properties != WebEventListenerProperties::Nothing || |
- eventListenerProperties(WebEventListenerClass::TouchStartOrMove) != |
+ eventListenerProperties(treeView, |
+ WebEventListenerClass::TouchStartOrMove) != |
WebEventListenerProperties::Nothing); |
} |
} else { |
@@ -947,8 +972,21 @@ void ChromeClientImpl::beginLifecycleUpdates() { |
} |
WebEventListenerProperties ChromeClientImpl::eventListenerProperties( |
+ LocalFrame* frame, |
WebEventListenerClass eventClass) const { |
- if (WebLayerTreeView* treeView = m_webView->layerTreeView()) |
+ WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame); |
+ if (!webFrame || webFrame->localRoot() == m_webView->mainFrame()) |
+ return eventListenerProperties(m_webView->layerTreeView(), eventClass); |
+ |
+ WebWidgetClient* client = |
+ WebLocalFrameImpl::fromFrame(frame)->localRoot()->frameWidget()->client(); |
+ return eventListenerProperties(client->layerTreeView(), eventClass); |
+} |
+ |
+WebEventListenerProperties ChromeClientImpl::eventListenerProperties( |
+ WebLayerTreeView* treeView, |
+ WebEventListenerClass eventClass) const { |
+ if (treeView) |
return treeView->eventListenerProperties(eventClass); |
return WebEventListenerProperties::Nothing; |
} |