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

Unified Diff: Source/devtools/front_end/ui/DOMExtension.js

Issue 602783002: Devtools: make DOM traversal utilities climb shadow tree. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Review comments addressed. Created 6 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
Index: Source/devtools/front_end/ui/DOMExtension.js
diff --git a/Source/devtools/front_end/ui/DOMExtension.js b/Source/devtools/front_end/ui/DOMExtension.js
index 822d083d90ea82ed287c18e710b139c8522e5f8f..0d9ab5f3c76062079e0d733ab6931fd704ea1913 100644
--- a/Source/devtools/front_end/ui/DOMExtension.js
+++ b/Source/devtools/front_end/ui/DOMExtension.js
@@ -308,7 +308,7 @@ Element.prototype.containsEventPoint = function(event)
*/
Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
{
- for (var node = this; node && node !== this.ownerDocument; node = node.parentNode) {
+ for (var node = this; node && node !== this.ownerDocument; node = node.parentNodeOrShadowHost()) {
for (var i = 0; i < nameArray.length; ++i) {
if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
return node;
@@ -333,7 +333,7 @@ Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
*/
Node.prototype.enclosingNodeOrSelfWithClass = function(className, stayWithin)
{
- for (var node = this; node && node !== stayWithin && node !== this.ownerDocument; node = node.parentNode) {
+ for (var node = this; node && node !== stayWithin && node !== this.ownerDocument; node = node.parentNodeOrShadowHost()) {
if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains(className))
return /** @type {!Element} */ (node);
}
@@ -341,6 +341,29 @@ Node.prototype.enclosingNodeOrSelfWithClass = function(className, stayWithin)
}
/**
+ * @return {?Element}
+ */
+Node.prototype.parentElementOrShadowHost = function()
+{
+ var node = this.parentNode;
+ if (!node)
+ return null;
+ if (node.nodeType === Node.ELEMENT_NODE)
+ return /** @type {!Element} */ (node);
+ if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE)
+ return /** @type {!Element} */ (node.host);
+ return null;
+}
+
+/**
+ * @return {?Node}
+ */
+Node.prototype.parentNodeOrShadowHost = function()
+{
+ return this.parentNode || this.host || null;
+}
+
+/**
* @param {string} query
* @return {?Node}
*/
@@ -626,7 +649,7 @@ Element.prototype.selectionLeftOffset = function()
node = node.previousSibling;
leftOffset += node.textContent.length;
}
- node = node.parentNode;
+ node = node.parentNodeOrShadowHost();
}
return leftOffset;
@@ -641,11 +664,11 @@ Node.prototype.isAncestor = function(node)
if (!node)
return false;
- var currentNode = node.parentNode;
+ var currentNode = node.parentNodeOrShadowHost();
while (currentNode) {
if (this === currentNode)
return true;
- currentNode = currentNode.parentNode;
+ currentNode = currentNode.parentNodeOrShadowHost();
}
return false;
}
@@ -695,8 +718,8 @@ Node.prototype.traverseNextNode = function(stayWithin)
return node;
node = this;
- while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
- node = node.parentNode;
+ while (node && !node.nextSibling && (!stayWithin || !node.parentNodeOrShadowHost() || node.parentNodeOrShadowHost() !== stayWithin))
+ node = node.parentNodeOrShadowHost();
if (!node)
return null;
@@ -716,7 +739,7 @@ Node.prototype.traversePreviousNode = function(stayWithin)
node = node.lastChild;
if (node)
return node;
- return this.parentNode;
+ return this.parentNodeOrShadowHost();
}
/**
@@ -741,6 +764,30 @@ Node.prototype.setTextContentTruncatedIfNeeded = function(text, placeholder)
}
/**
+ * @return {?Node}
+ */
+Event.prototype.elementFromPoint = function()
+{
+ var node = this.target;
+ while (node && node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE && node.nodeType !== Node.DOCUMENT_NODE)
+ node = node.parentNode;
+ return node ? node.elementFromPoint(this.pageX, this.pageY) : null;
+}
+
+/**
+ * @param {number} x
+ * @param {number} y
+ * @return {?Node}
+ */
+Document.prototype.deepElementFromPoint = function(x, y)
+{
+ var node = this.elementFromPoint(x, y);
+ while (node && node.shadowRoot)
+ node = node.shadowRoot.elementFromPoint(x, y);
+ return node;
+}
+
+/**
* @return {boolean}
*/
function isEnterKey(event) {

Powered by Google App Engine
This is Rietveld 408576698