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

Unified Diff: cc/trees/layer_tree_host_common.cc

Issue 26112002: cc: Fix hit-testing in zero-opacity layers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 2 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
« no previous file with comments | « cc/layers/draw_properties.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_common.cc
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index d483cc697bd76d44e0b7d9353dbb0974c6fdfc5d..8e48b2bc8de6fe53701743c3478e5b5da282bd13 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -63,6 +63,12 @@ static gfx::Vector2dF GetEffectiveTotalScrollOffset(LayerType* layer) {
return offset;
}
+template <typename LayerType>
+static inline bool LayerCanAcceptInput(LayerType* layer) {
+ return !layer->touch_event_handler_region().IsEmpty() ||
+ layer->have_wheel_event_handlers();
+}
+
inline gfx::Rect CalculateVisibleRectWithCachedLayerRect(
gfx::Rect target_surface_rect,
gfx::Rect layer_bound_rect,
@@ -452,14 +458,14 @@ static bool LayerShouldBeSkipped(LayerType* layer,
IsLayerBackFaceVisible(backface_test_layer))
return true;
- // The layer is visible to events. If it's subject to hit testing, then
- // we can't skip it.
- bool can_accept_input = !layer->touch_event_handler_region().IsEmpty() ||
- layer->have_wheel_event_handlers();
- if (!layer->DrawsContent() && !can_accept_input)
+ // A layer cannot be skipped if it is subject to hit-testing.
+ if (LayerCanAcceptInput(layer))
+ return false;
+
+ if (!layer->DrawsContent())
return true;
- return false;
+ return !layer->draw_opacity() && !layer->draw_opacity_is_animating();
enne (OOO) 2013/10/07 17:27:23 I'm not sure this is adequate. If you have: -A
danakj 2013/10/07 17:37:35 Can you make this a if () return true; and keep re
danakj 2013/10/07 17:37:35 PictureLayerImpl should probably consider its draw
enne (OOO) 2013/10/07 17:45:51 It's more than that. What if you've set a subtree
sadrul 2013/10/07 18:37:24 Done.
sadrul 2013/10/07 18:37:24 I am going through the code to completely grok thi
}
static inline bool SubtreeShouldBeSkipped(LayerImpl* layer,
@@ -481,9 +487,10 @@ static inline bool SubtreeShouldBeSkipped(LayerImpl* layer,
// The opacity of a layer always applies to its children (either implicitly
// via a render surface or explicitly if the parent preserves 3D), so the
- // entire subtree can be skipped if this layer is fully transparent.
- // TODO(sad): Don't skip layers used for hit testing crbug.com/295295.
- return !layer->opacity();
+ // entire subtree can be skipped if this layer is fully transparent, and none
+ // of layers in the subtree has event handlers.
+ return !layer->opacity() &&
+ !layer->draw_properties().layer_or_descendant_has_event_handler;
}
static inline bool SubtreeShouldBeSkipped(Layer* layer,
@@ -503,9 +510,9 @@ static inline bool SubtreeShouldBeSkipped(Layer* layer,
// In particular, it should not cause the subtree to be skipped.
// Similarly, for layers that might animate opacity using an impl-only
// animation, their subtree should also not be skipped.
- // TODO(sad): Don't skip layers used for hit testing crbug.com/295295.
return !layer->opacity() && !layer->OpacityIsAnimating() &&
- !layer->OpacityCanAnimateOnImplThread();
+ !layer->OpacityCanAnimateOnImplThread() &&
+ !layer->draw_properties().layer_or_descendant_has_event_handler;
enne (OOO) 2013/10/07 17:27:23 Can you break out this condition from the rest of
sadrul 2013/10/07 18:37:24 Done.
}
// Called on each layer that could be drawn after all information from
@@ -1014,15 +1021,19 @@ static inline void RemoveSurfaceForEarlyExit(
struct PreCalculateMetaInformationRecursiveData {
bool layer_or_descendant_has_copy_request;
+ bool layer_or_descendant_has_event_handler;
int num_unclipped_descendants;
PreCalculateMetaInformationRecursiveData()
: layer_or_descendant_has_copy_request(false),
+ layer_or_descendant_has_event_handler(false),
num_unclipped_descendants(0) {}
void Merge(const PreCalculateMetaInformationRecursiveData& data) {
layer_or_descendant_has_copy_request |=
data.layer_or_descendant_has_copy_request;
+ layer_or_descendant_has_event_handler |=
+ data.layer_or_descendant_has_event_handler;
num_unclipped_descendants +=
data.num_unclipped_descendants;
}
@@ -1084,6 +1095,9 @@ static void PreCalculateMetaInformation(
if (layer->HasCopyRequest())
recursive_data->layer_or_descendant_has_copy_request = true;
+ if (LayerCanAcceptInput(layer))
+ recursive_data->layer_or_descendant_has_event_handler = true;
+
layer->draw_properties().num_descendants_that_draw_content =
num_descendants_that_draw_content;
layer->draw_properties().num_unclipped_descendants =
@@ -1092,6 +1106,8 @@ static void PreCalculateMetaInformation(
descendants_can_clip_selves;
layer->draw_properties().layer_or_descendant_has_copy_request =
recursive_data->layer_or_descendant_has_copy_request;
+ layer->draw_properties().layer_or_descendant_has_event_handler =
+ recursive_data->layer_or_descendant_has_event_handler;
}
static void RoundTranslationComponents(gfx::Transform* transform) {
« no previous file with comments | « cc/layers/draw_properties.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698