Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(687)

Unified Diff: third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp

Issue 2916893003: Bookkeep the pointer event listeners added to page (Closed)
Patch Set: fix rebase error Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
diff --git a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
index 9ce3ff4a3014ddfd571e050a48cc40423b4ff516..1a6fa112896d2ae5ddd6bbfeb6a0f247b6e5621e 100644
--- a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
+++ b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
@@ -56,10 +56,9 @@ bool EventHandlerRegistry::EventTypeToClass(
*result = options.passive() ? kTouchStartOrMoveEventPassive
: kTouchStartOrMoveEventBlocking;
} else if (EventUtil::IsPointerEventType(event_type)) {
- // The EventHandlerClass is TouchStartOrMoveEventPassive since
- // the pointer events never block scrolling and the compositor
+ // The pointer events never block scrolling and the compositor
// only needs to know about the touch listeners.
- *result = kTouchStartOrMoveEventPassive;
+ *result = kPointerEvent;
#if DCHECK_IS_ON()
} else if (event_type == EventTypeNames::load ||
event_type == EventTypeNames::mousemove ||
@@ -112,7 +111,7 @@ bool EventHandlerRegistry::UpdateEventHandlerTargets(
return true;
}
-void EventHandlerRegistry::UpdateEventHandlerInternal(
+bool EventHandlerRegistry::UpdateEventHandlerInternal(
ChangeOperation op,
EventHandlerClass handler_class,
EventTarget* target) {
@@ -121,21 +120,16 @@ void EventHandlerRegistry::UpdateEventHandlerInternal(
UpdateEventHandlerTargets(op, handler_class, target);
bool has_handlers = targets_[handler_class].size();
- if (had_handlers != has_handlers) {
- LocalFrame* frame = nullptr;
- if (Node* node = target->ToNode()) {
- frame = node->GetDocument().GetFrame();
- } else if (LocalDOMWindow* dom_window = target->ToLocalDOMWindow()) {
- frame = dom_window->GetFrame();
- } else {
- NOTREACHED() << "Unexpected target type for event handler.";
- }
+ bool handlers_changed = had_handlers != has_handlers;
- NotifyHasHandlersChanged(frame, handler_class, has_handlers);
- }
+ if (op != kRemoveAll) {
+ if (handlers_changed)
+ NotifyHasHandlersChanged(target, handler_class, has_handlers);
- if (target_set_changed)
- NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
+ if (target_set_changed)
+ NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
+ }
+ return handlers_changed;
}
void EventHandlerRegistry::UpdateEventHandlerOfType(
@@ -200,16 +194,43 @@ void EventHandlerRegistry::DidMoveOutOfPage(EventTarget& target) {
}
void EventHandlerRegistry::DidRemoveAllEventHandlers(EventTarget& target) {
+ bool handlers_changed[kEventHandlerClassCount];
+ bool target_set_changed[kEventHandlerClassCount];
+
for (size_t i = 0; i < kEventHandlerClassCount; ++i) {
EventHandlerClass handler_class = static_cast<EventHandlerClass>(i);
- UpdateEventHandlerInternal(kRemoveAll, handler_class, &target);
+
+ EventTargetSet* targets = &targets_[handler_class];
+ target_set_changed[i] = targets->Contains(&target);
+
+ handlers_changed[i] =
+ UpdateEventHandlerInternal(kRemoveAll, handler_class, &target);
+ }
+
+ for (size_t i = 0; i < kEventHandlerClassCount; ++i) {
+ EventHandlerClass handler_class = static_cast<EventHandlerClass>(i);
+ if (handlers_changed[i]) {
+ bool has_handlers = targets_[handler_class].size();
+ NotifyHasHandlersChanged(&target, handler_class, has_handlers);
+ }
+ if (target_set_changed[i])
+ NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
}
}
void EventHandlerRegistry::NotifyHasHandlersChanged(
- LocalFrame* frame,
+ EventTarget* target,
EventHandlerClass handler_class,
bool has_active_handlers) {
+ LocalFrame* frame = nullptr;
+ if (Node* node = target->ToNode()) {
+ frame = node->GetDocument().GetFrame();
+ } else if (LocalDOMWindow* dom_window = target->ToLocalDOMWindow()) {
+ frame = dom_window->GetFrame();
+ } else {
+ NOTREACHED() << "Unexpected target type for event handler.";
+ }
+
switch (handler_class) {
case kScrollEvent:
page_->GetChromeClient().SetHasScrollEventHandlers(frame,
@@ -224,11 +245,13 @@ void EventHandlerRegistry::NotifyHasHandlersChanged(
break;
case kTouchStartOrMoveEventBlocking:
case kTouchStartOrMoveEventPassive:
+ case kPointerEvent:
page_->GetChromeClient().SetEventListenerProperties(
frame, WebEventListenerClass::kTouchStartOrMove,
GetWebEventListenerProperties(
HasEventHandlers(kTouchStartOrMoveEventBlocking),
- HasEventHandlers(kTouchStartOrMoveEventPassive)));
+ HasEventHandlers(kTouchStartOrMoveEventPassive) ||
+ HasEventHandlers(kPointerEvent)));
break;
case kTouchEndOrCancelEventBlocking:
case kTouchEndOrCancelEventPassive:

Powered by Google App Engine
This is Rietveld 408576698