[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.21-584-g1e41756
pfeldman at chromium.org
pfeldman at chromium.org
Fri Feb 26 22:19:50 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 06d688a34c19f8e2080419646b785beb34ea16d0
Author: pfeldman at chromium.org <pfeldman at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Feb 15 10:34:36 2010 +0000
2010-02-14 Pavel Feldman <pfeldman at chromium.org>
Reviewed by Timothy Hatcher.
Web Inspector: highlight actual search match in elements panel.
https://bugs.webkit.org/show_bug.cgi?id=34251
* inspector/front-end/ElementsPanel.js:
(WebInspector.ElementsPanel.prototype.searchCanceled):
(WebInspector.ElementsPanel.prototype.performSearch):
(WebInspector.ElementsPanel.prototype.addNodesToSearchResult):
(WebInspector.ElementsPanel.prototype.jumpToNextSearchResult):
(WebInspector.ElementsPanel.prototype.jumpToPreviousSearchResult):
(WebInspector.ElementsPanel.prototype._highlightCurrentSearchResult):
(WebInspector.ElementsPanel.prototype._hideSearchHighlights):
* inspector/front-end/InjectedScript.js:
* inspector/front-end/SourceFrame.js:
(WebInspector.SourceFrame.prototype.findSearchMatches):
* inspector/front-end/TextViewer.js:
(WebInspector.TextViewer.prototype._paintLine):
* inspector/front-end/textViewer.css:
* inspector/front-end/utilities.js:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54770 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 42ab182..5ecea96 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -2,6 +2,30 @@
Reviewed by Timothy Hatcher.
+ Web Inspector: highlight actual search match in elements panel.
+
+ https://bugs.webkit.org/show_bug.cgi?id=34251
+
+ * inspector/front-end/ElementsPanel.js:
+ (WebInspector.ElementsPanel.prototype.searchCanceled):
+ (WebInspector.ElementsPanel.prototype.performSearch):
+ (WebInspector.ElementsPanel.prototype.addNodesToSearchResult):
+ (WebInspector.ElementsPanel.prototype.jumpToNextSearchResult):
+ (WebInspector.ElementsPanel.prototype.jumpToPreviousSearchResult):
+ (WebInspector.ElementsPanel.prototype._highlightCurrentSearchResult):
+ (WebInspector.ElementsPanel.prototype._hideSearchHighlights):
+ * inspector/front-end/InjectedScript.js:
+ * inspector/front-end/SourceFrame.js:
+ (WebInspector.SourceFrame.prototype.findSearchMatches):
+ * inspector/front-end/TextViewer.js:
+ (WebInspector.TextViewer.prototype._paintLine):
+ * inspector/front-end/textViewer.css:
+ * inspector/front-end/utilities.js:
+
+2010-02-14 Pavel Feldman <pfeldman at chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
Web Inspector: XPathResult objects are not expanded in console.
https://bugs.webkit.org/show_bug.cgi?id=34926
diff --git a/WebCore/inspector/front-end/ElementsPanel.js b/WebCore/inspector/front-end/ElementsPanel.js
index e839a60..bdfe5f9 100644
--- a/WebCore/inspector/front-end/ElementsPanel.js
+++ b/WebCore/inspector/front-end/ElementsPanel.js
@@ -245,13 +245,8 @@ WebInspector.ElementsPanel.prototype = {
searchCanceled: function()
{
- if (this._searchResults) {
- for (var i = 0; i < this._searchResults.length; ++i) {
- var treeElement = this.treeOutline.findTreeElement(this._searchResults[i]);
- if (treeElement)
- treeElement.highlighted = false;
- }
- }
+ delete this._searchQuery;
+ this._hideSearchHighlights();
WebInspector.updateSearchMatchesCount(0, this);
@@ -271,6 +266,7 @@ WebInspector.ElementsPanel.prototype = {
this._updatedMatchCountOnce = false;
this._matchesCountUpdateTimeout = null;
+ this._searchQuery = query;
InjectedScriptAccess.getDefault().performSearch(whitespaceTrimmedQuery, function() {});
},
@@ -304,25 +300,10 @@ WebInspector.ElementsPanel.prototype = {
if (!node)
continue;
- if (!this._searchResults.length) {
- this._currentSearchResultIndex = 0;
-
- // Only change the focusedDOMNode if the search was manually performed, because
- // the search may have been performed programmatically and we wouldn't want to
- // change the current focusedDOMNode.
- if (WebInspector.currentFocusElement === document.getElementById("search"))
- this.focusedDOMNode = node;
- }
-
+ this._currentSearchResultIndex = 0;
this._searchResults.push(node);
-
- // Highlight the tree element to show it matched the search.
- // FIXME: highlight the substrings in text nodes and attributes.
- var treeElement = this.treeOutline.findTreeElement(node);
- if (treeElement)
- treeElement.highlighted = true;
}
-
+ this._highlightCurrentSearchResult();
this._updateMatchesCountSoon();
},
@@ -330,18 +311,41 @@ WebInspector.ElementsPanel.prototype = {
{
if (!this._searchResults || !this._searchResults.length)
return;
+
if (++this._currentSearchResultIndex >= this._searchResults.length)
this._currentSearchResultIndex = 0;
- this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
+ this._highlightCurrentSearchResult();
},
jumpToPreviousSearchResult: function()
{
if (!this._searchResults || !this._searchResults.length)
return;
+
if (--this._currentSearchResultIndex < 0)
this._currentSearchResultIndex = (this._searchResults.length - 1);
- this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
+ this._highlightCurrentSearchResult();
+ },
+
+ _highlightCurrentSearchResult: function()
+ {
+ this._hideSearchHighlights();
+ var node = this._searchResults[this._currentSearchResultIndex];
+ var treeElement = this.treeOutline.findTreeElement(node);
+ if (treeElement) {
+ treeElement.highlightSearchResults(this._searchQuery);
+ treeElement.reveal();
+ }
+ },
+
+ _hideSearchHighlights: function(node)
+ {
+ for (var i = 0; this._searchResults && i < this._searchResults.length; ++i) {
+ var node = this._searchResults[i];
+ var treeElement = this.treeOutline.findTreeElement(node);
+ if (treeElement)
+ treeElement.highlightSearchResults(null);
+ }
},
renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)
diff --git a/WebCore/inspector/front-end/ElementsTreeOutline.js b/WebCore/inspector/front-end/ElementsTreeOutline.js
index 4a8dae0..b5dcf94 100644
--- a/WebCore/inspector/front-end/ElementsTreeOutline.js
+++ b/WebCore/inspector/front-end/ElementsTreeOutline.js
@@ -296,27 +296,17 @@ WebInspector.ElementsTreeElement = function(node)
if (this.representedObject.nodeType == Node.ELEMENT_NODE)
this._canAddAttributes = true;
+ this._searchQuery = null;
}
WebInspector.ElementsTreeElement.prototype = {
- get highlighted()
+ highlightSearchResults: function(searchQuery)
{
- return this._highlighted;
- },
-
- set highlighted(x)
- {
- if (this._highlighted === x)
+ if (this._searchQuery === searchQuery)
return;
- this._highlighted = x;
-
- if (this.listItemElement) {
- if (x)
- this.listItemElement.addStyleClass("highlighted");
- else
- this.listItemElement.removeStyleClass("highlighted");
- }
+ this._searchQuery = searchQuery;
+ this.updateTitle();
},
get hovered()
@@ -386,9 +376,6 @@ WebInspector.ElementsTreeElement.prototype = {
{
this.listItemElement.addEventListener("mousedown", this.onmousedown.bind(this), false);
- if (this._highlighted)
- this.listItemElement.addStyleClass("highlighted");
-
if (this._hovered) {
this.updateSelection();
this.listItemElement.addStyleClass("hovered");
@@ -884,6 +871,7 @@ WebInspector.ElementsTreeElement.prototype = {
delete self.selectionElement;
self.updateSelection();
self._preventFollowingLinksOnDoubleClick();
+ self._highlightSearchResults();
};
// TODO: Replace with InjectedScriptAccess.getBasicProperties(obj, [names]).
@@ -1077,6 +1065,23 @@ WebInspector.ElementsTreeElement.prototype = {
_copyHTML: function()
{
InspectorBackend.copyNode(this.representedObject.id);
+ },
+
+ _highlightSearchResults: function()
+ {
+ if (!this._searchQuery)
+ return;
+ var text = this.listItemElement.textContent;
+ var regexObject = createSearchRegex(this._searchQuery);
+
+ var offset = 0;
+ var match = regexObject.exec(text);
+ while (match) {
+ highlightSearchResult(this.listItemElement, offset + match.index, match[0].length);
+ offset += match.index + 1;
+ text = text.substring(match.index + 1);
+ match = regexObject.exec(text);
+ }
}
}
diff --git a/WebCore/inspector/front-end/InjectedScript.js b/WebCore/inspector/front-end/InjectedScript.js
index 5a9e524..44cc3b1 100644
--- a/WebCore/inspector/front-end/InjectedScript.js
+++ b/WebCore/inspector/front-end/InjectedScript.js
@@ -685,6 +685,12 @@ InjectedScript.addInspectedNode = function(nodeId)
InjectedScript.performSearch = function(whitespaceTrimmedQuery)
{
+ // FIXME: Few things are missing here:
+ // 1) Search works with node granularity - number of matches within node is not calculated.
+ // 2) Search does not work outside main documents' domain - we need to use specific InjectedScript instances
+ // for other domains.
+ // 3) There is no need to push all search results to the front-end at a time, pushing next / previous result
+ // is sufficient.
var tagNameQuery = whitespaceTrimmedQuery;
var attributeNameQuery = whitespaceTrimmedQuery;
var startTagFound = (tagNameQuery.indexOf("<") === 0);
diff --git a/WebCore/inspector/front-end/SourceFrame.js b/WebCore/inspector/front-end/SourceFrame.js
index 34317a3..51c9f4b 100644
--- a/WebCore/inspector/front-end/SourceFrame.js
+++ b/WebCore/inspector/front-end/SourceFrame.js
@@ -196,14 +196,7 @@ WebInspector.SourceFrame.prototype = {
var ranges = [];
// First do case-insensitive search.
- var regex = "";
- for (var i = 0; i < query.length; ++i) {
- var char = query.charAt(i);
- if (char === "]")
- char = "\\]";
- regex += "[" + char + "]";
- }
- var regexObject = new RegExp(regex, "i");
+ var regexObject = createSearchRegex(query);
this._collectRegexMatches(regexObject, ranges);
// Then try regex search if user knows the / / hint.
diff --git a/WebCore/inspector/front-end/TextViewer.js b/WebCore/inspector/front-end/TextViewer.js
index 7a9749d..01d8d45 100644
--- a/WebCore/inspector/front-end/TextViewer.js
+++ b/WebCore/inspector/front-end/TextViewer.js
@@ -327,7 +327,7 @@ WebInspector.TextViewer.prototype = {
if (!highlighterState) {
if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
- this._markRange(element, line, this._rangeToMark.startColumn, this._rangeToMark.endColumn);
+ highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
return;
}
@@ -356,7 +356,7 @@ WebInspector.TextViewer.prototype = {
if (plainTextStart !== -1)
this._appendTextNode(element, line.substring(plainTextStart, line.length));
if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
- this._markRange(element, line, this._rangeToMark.startColumn, this._rangeToMark.endColumn);
+ highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
if (lineRow.decorationsElement)
element.appendChild(lineRow.decorationsElement);
},
@@ -531,48 +531,6 @@ WebInspector.TextViewer.prototype = {
return WebInspector.completeURL(this._url, hrefValue);
},
- _markRange: function(element, lineText, startOffset, endOffset)
- {
- var markNode = document.createElement("span");
- markNode.className = "webkit-markup";
- markNode.textContent = lineText.substring(startOffset, endOffset);
-
- var markLength = endOffset - startOffset;
- var boundary = element.rangeBoundaryForOffset(startOffset);
- var textNode = boundary.container;
- var text = textNode.textContent;
-
- if (boundary.offset + markLength < text.length) {
- // Selection belong to a single split mode.
- textNode.textContent = text.substring(boundary.offset + markLength);
- textNode.parentElement.insertBefore(markNode, textNode);
- var prefixNode = document.createTextNode(text.substring(0, boundary.offset));
- textNode.parentElement.insertBefore(prefixNode, markNode);
- return;
- }
-
- var parentElement = textNode.parentElement;
- var anchorElement = textNode.nextSibling;
-
- markLength -= text.length - boundary.offset;
- textNode.textContent = text.substring(0, boundary.offset);
- textNode = textNode.traverseNextTextNode(element);
-
- while (textNode) {
- var text = textNode.textContent;
- if (markLength < text.length) {
- textNode.textContent = text.substring(markLength);
- break;
- }
-
- markLength -= text.length;
- textNode.textContent = "";
- textNode = textNode.traverseNextTextNode(element);
- }
-
- parentElement.insertBefore(markNode, anchorElement);
- },
-
resize: function()
{
this._repaintAll();
diff --git a/WebCore/inspector/front-end/textViewer.css b/WebCore/inspector/front-end/textViewer.css
index af079bc..386a9d7 100644
--- a/WebCore/inspector/front-end/textViewer.css
+++ b/WebCore/inspector/front-end/textViewer.css
@@ -130,13 +130,14 @@
outline: 1px solid rgb(64, 115, 244);
}
-.webkit-markup {
+.webkit-search-result {
-webkit-border-radius: 4px;
- padding: 2px 1px 2px 3px;
- margin-left: -4px;
- margin-top: -2px;
+ padding: 2px 2px 2px 3px;
+ margin: -2px -2px -2px -3px;
+ opacity: 0.8;
-webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
background-color: rgb(241, 234, 0);
+ color: black;
}
.webkit-highlighted-line .webkit-line-content {
diff --git a/WebCore/inspector/front-end/utilities.js b/WebCore/inspector/front-end/utilities.js
index 60d3b45..0877a2c 100644
--- a/WebCore/inspector/front-end/utilities.js
+++ b/WebCore/inspector/front-end/utilities.js
@@ -850,3 +850,59 @@ function isEnterKey(event) {
// Check if in IME.
return event.keyCode !== 229 && event.keyIdentifier === "Enter";
}
+
+
+function highlightSearchResult(element, offset, length)
+{
+ var lineText = element.textContent;
+ var endOffset = offset + length;
+ var highlightNode = document.createElement("span");
+ highlightNode.className = "webkit-search-result";
+ highlightNode.textContent = lineText.substring(offset, endOffset);
+
+ var boundary = element.rangeBoundaryForOffset(offset);
+ var textNode = boundary.container;
+ var text = textNode.textContent;
+
+ if (boundary.offset + length < text.length) {
+ // Selection belong to a single split mode.
+ textNode.textContent = text.substring(boundary.offset + length);
+ textNode.parentElement.insertBefore(highlightNode, textNode);
+ var prefixNode = document.createTextNode(text.substring(0, boundary.offset));
+ textNode.parentElement.insertBefore(prefixNode, highlightNode);
+ return;
+ }
+
+ var parentElement = textNode.parentElement;
+ var anchorElement = textNode.nextSibling;
+
+ length -= text.length - boundary.offset;
+ textNode.textContent = text.substring(0, boundary.offset);
+ textNode = textNode.traverseNextTextNode(element);
+
+ while (textNode) {
+ var text = textNode.textContent;
+ if (length < text.length) {
+ textNode.textContent = text.substring(length);
+ break;
+ }
+
+ length -= text.length;
+ textNode.textContent = "";
+ textNode = textNode.traverseNextTextNode(element);
+ }
+
+ parentElement.insertBefore(highlightNode, anchorElement);
+}
+
+function createSearchRegex(query)
+{
+ var regex = "";
+ for (var i = 0; i < query.length; ++i) {
+ var char = query.charAt(i);
+ if (char === "]")
+ char = "\\]";
+ regex += "[" + char + "]";
+ }
+ return new RegExp(regex, "i");
+}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list