Browse Source

chore: cherry-pick d74ba931c4b7 from chromium (#27407)

* chore: cherry-pick d74ba931c4b7 from chromium

* update patches

Co-authored-by: Electron Bot <[email protected]>
Pedro Pontes 4 years ago
parent
commit
a73163d09a
2 changed files with 111 additions and 0 deletions
  1. 1 0
      patches/chromium/.patches
  2. 110 0
      patches/chromium/cherry-pick-d74ba931c4b7.patch

+ 1 - 0
patches/chromium/.patches

@@ -132,3 +132,4 @@ cherry-pick-d866af575997.patch
 cherry-pick-da9b5ec032ad.patch
 cherry-pick-861253f1de98.patch
 cherry-pick-3ca3d70c7af5.patch
+cherry-pick-d74ba931c4b7.patch

+ 110 - 0
patches/chromium/cherry-pick-d74ba931c4b7.patch

@@ -0,0 +1,110 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Achuith Bhandarkar <[email protected]>
+Date: Wed, 13 Jan 2021 21:27:05 +0000
+Subject: content-visibility: Don't adjust position of a locked hittest result
+ node.
+
+This patch ensures that if we have a hittest result that has a locked
+node, we don't try to recurse into its subtree. This can happen when we
+do a PositionWithAffinity check.
+
[email protected]
+
+(cherry picked from commit 8483cf6944e38203c3b247163c54cfa105e89c56)
+
+(cherry picked from commit 3f7b67374a1121b6756ccfd2e4e414987f167489)
+
+Bug: 1162131
+Change-Id: I357bd7032c6c2b6c9405bf26c49a36bda22d6a0d
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2611453
+Reviewed-by: Chris Harrelson <[email protected]>
+Commit-Queue: vmpstr <[email protected]>
+Cr-Original-Original-Commit-Position: refs/heads/master@{#840727}
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2618603
+Reviewed-by: Xianzhu Wang <[email protected]>
+Reviewed-by: Krishna Govind <[email protected]>
+Cr-Original-Commit-Position: refs/branch-heads/4324@{#1566}
+Cr-Original-Branched-From: c73b5a651d37a6c4d0b8e3262cc4015a5579c6c8-refs/heads/master@{#827102}
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2618982
+Commit-Queue: Achuith Bhandarkar <[email protected]>
+Reviewed-by: Victor-Gabriel Savu <[email protected]>
+Cr-Commit-Position: refs/branch-heads/4240@{#1520}
+Cr-Branched-From: f297677702651916bbf65e59c0d4bbd4ce57d1ee-refs/heads/master@{#800218}
+
+diff --git a/third_party/blink/renderer/core/layout/hit_test_result.cc b/third_party/blink/renderer/core/layout/hit_test_result.cc
+index 1359aa6bdd532028d8280b093a4381a70e4a7577..9d02cabafa3b8acc19ae2c0007c0eb6b86f1fb5d 100644
+--- a/third_party/blink/renderer/core/layout/hit_test_result.cc
++++ b/third_party/blink/renderer/core/layout/hit_test_result.cc
+@@ -21,12 +21,14 @@
+ 
+ #include "third_party/blink/renderer/core/layout/hit_test_result.h"
+ 
++#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
+ #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
+ #include "third_party/blink/renderer/core/dom/pseudo_element.h"
+ #include "third_party/blink/renderer/core/dom/shadow_root.h"
+ #include "third_party/blink/renderer/core/editing/editing_utilities.h"
+ #include "third_party/blink/renderer/core/editing/frame_selection.h"
+ #include "third_party/blink/renderer/core/editing/position_with_affinity.h"
++#include "third_party/blink/renderer/core/editing/text_affinity.h"
+ #include "third_party/blink/renderer/core/editing/visible_units.h"
+ #include "third_party/blink/renderer/core/frame/local_frame.h"
+ #include "third_party/blink/renderer/core/frame/visual_viewport.h"
+@@ -144,6 +146,20 @@ PositionWithAffinity HitTestResult::GetPosition() const {
+   LayoutObject* layout_object = GetLayoutObject();
+   if (!layout_object)
+     return PositionWithAffinity();
++
++  // We should never have a layout object that is within a locked subtree.
++  CHECK(!DisplayLockUtilities::NearestLockedExclusiveAncestor(*layout_object));
++
++  // If the layout object is blocked by display lock, we return the beginning of
++  // the node as the position. This is because we don't paint contents of the
++  // element. Furthermore, any caret adjustments below can access layout-dirty
++  // state in the subtree of this object.
++  if (layout_object->PaintBlockedByDisplayLock(
++          DisplayLockLifecycleTarget::kChildren)) {
++    return PositionWithAffinity(Position(*inner_node_, 0),
++                                TextAffinity::kDefault);
++  }
++
+   if (inner_possibly_pseudo_node_->IsPseudoElement() &&
+       inner_possibly_pseudo_node_->GetPseudoId() == kPseudoIdBefore) {
+     return PositionWithAffinity(MostForwardCaretPosition(
+diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-080.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-080.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..d3cea5fb83767ddfc236850097387644e0f74c8e
+--- /dev/null
++++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-080.html
+@@ -0,0 +1,31 @@
++<!doctype HTML>
++<html id=html>
++<meta charset="utf8">
++<title>Content Visibility: caret position with html hidden</title>
++<link rel="author" title="Vladimir Levin" href="mailto:[email protected]">
++<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
++<meta name="assert" content="caretRangeFromPoint works even if html has content-visibility hidden">
++
++<script src="/resources/testharness.js"></script>
++<script src="/resources/testharnessreport.js"></script>
++
++<meter></meter>
++<iframe></iframe>
++<style>
++* {
++  all: initial;
++  content-visibility: hidden;
++}
++</style>
++
++<script>
++test(() => {
++  const range = document.caretRangeFromPoint();
++  assert_not_equals(range, null, "range exists");
++  assert_equals(range.startContainer, html, "startContainer is html");
++  assert_equals(range.startOffset, 0, "startOffset is zero");
++  assert_equals(range.endContainer, html, "endContainer is html");
++  assert_equals(range.endOffset, 0, "endOffset is zero");
++}, "Caret range from point");
++</script>
++</html>