[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