Changeset 223057 in webkit


Ignore:
Timestamp:
Oct 9, 2017 12:27:40 PM (7 years ago)
Author:
Joseph Pecoraro
Message:

Web Inspector: Network Tab - Search Headers Detail View
https://bugs.webkit.org/show_bug.cgi?id=177981

Reviewed by Brian Burg.

  • UserInterface/Base/Main.js:
  • UserInterface/Views/LogContentView.js:

(WI.LogContentView.prototype.performSearch):
Rename "Dom" to "DOM" in utility function.

  • UserInterface/Views/ResourceHeadersContentView.css:

(.resource-headers.showing-find-banner .search-highlight):
Search highlight styles.

  • UserInterface/Views/ResourceHeadersContentView.js:

(WI.ResourceHeadersContentView.prototype.get supportsSearch):
(WI.ResourceHeadersContentView.prototype.get numberOfSearchResults):
(WI.ResourceHeadersContentView.prototype.get hasPerformedSearch):
(WI.ResourceHeadersContentView.prototype.set automaticallyRevealFirstSearchResult):
(WI.ResourceHeadersContentView.prototype.performSearch):
(WI.ResourceHeadersContentView.prototype.searchCleared):
(WI.ResourceHeadersContentView.prototype.revealPreviousSearchResult):
(WI.ResourceHeadersContentView.prototype.revealNextSearchResult):
(WI.ResourceHeadersContentView.prototype._perfomSearchOnKeyValuePairs):
(WI.ResourceHeadersContentView.prototype._revealSearchResult):
Implement ContentView search behavior.

Location:
trunk/Source/WebInspectorUI
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebInspectorUI/ChangeLog

    r223038 r223057  
     12017-10-09  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: Network Tab - Search Headers Detail View
     4        https://bugs.webkit.org/show_bug.cgi?id=177981
     5
     6        Reviewed by Brian Burg.
     7
     8        * UserInterface/Base/Main.js:
     9        * UserInterface/Views/LogContentView.js:
     10        (WI.LogContentView.prototype.performSearch):
     11        Rename "Dom" to "DOM" in utility function.
     12
     13        * UserInterface/Views/ResourceHeadersContentView.css:
     14        (.resource-headers.showing-find-banner .search-highlight):
     15        Search highlight styles.
     16
     17        * UserInterface/Views/ResourceHeadersContentView.js:
     18        (WI.ResourceHeadersContentView.prototype.get supportsSearch):
     19        (WI.ResourceHeadersContentView.prototype.get numberOfSearchResults):
     20        (WI.ResourceHeadersContentView.prototype.get hasPerformedSearch):
     21        (WI.ResourceHeadersContentView.prototype.set automaticallyRevealFirstSearchResult):
     22        (WI.ResourceHeadersContentView.prototype.performSearch):
     23        (WI.ResourceHeadersContentView.prototype.searchCleared):
     24        (WI.ResourceHeadersContentView.prototype.revealPreviousSearchResult):
     25        (WI.ResourceHeadersContentView.prototype.revealNextSearchResult):
     26        (WI.ResourceHeadersContentView.prototype._perfomSearchOnKeyValuePairs):
     27        (WI.ResourceHeadersContentView.prototype._revealSearchResult):
     28        Implement ContentView search behavior.
     29
    1302017-10-08  Devin Rousso  <webkit@devinrousso.com>
    231
  • trunk/Source/WebInspectorUI/UserInterface/Base/Main.js

    r223011 r223057  
    25522552};
    25532553
    2554 WI.revertDomChanges = function(domChanges)
     2554WI.revertDOMChanges = function(domChanges)
    25552555{
    25562556    for (var i = domChanges.length - 1; i >= 0; --i) {
  • trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.js

    r221691 r223057  
    951951    {
    952952        if (!isEmptyObject(this._searchHighlightDOMChanges))
    953             WI.revertDomChanges(this._searchHighlightDOMChanges);
     953            WI.revertDOMChanges(this._searchHighlightDOMChanges);
    954954
    955955        this._currentSearchQuery = searchQuery;
  • trunk/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.css

    r223006 r223057  
    7878    bottom: 1px;
    7979}
     80
     81.resource-headers.showing-find-banner .search-highlight {
     82    color: black;
     83    background-color: hsla(53, 83%, 53%, 0.2);
     84    border-bottom: 1px solid hsl(47, 82%, 60%);
     85}
  • trunk/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js

    r223006 r223057  
    3939        this._delegate = delegate || null;
    4040
     41        this._searchQuery = null;
     42        this._searchResults = null;
     43        this._searchDOMChanges = [];
     44        this._searchIndex = -1;
     45        this._automaticallyRevealFirstSearchResult = false;
     46        this._bouncyHighlightElement = null;
     47
    4148        this.element.classList.add("resource-details", "resource-headers");
     49        this.element.tabIndex = 0;
    4250
    4351        this._needsSummaryRefresh = false;
     
    108116
    109117        super.closed();
     118    }
     119
     120    get supportsSearch()
     121    {
     122        return true;
     123    }
     124
     125    get numberOfSearchResults()
     126    {
     127        return this._searchResults ? this._searchResults.length : null;
     128    }
     129
     130    get hasPerformedSearch()
     131    {
     132        return this._searchResults !== null;
     133    }
     134
     135    set automaticallyRevealFirstSearchResult(reveal)
     136    {
     137        this._automaticallyRevealFirstSearchResult = reveal;
     138
     139        // If we haven't shown a search result yet, reveal one now.
     140        if (this._automaticallyRevealFirstSearchResult && this.numberOfSearchResults > 0) {
     141            if (this._searchIndex === -1)
     142                this.revealNextSearchResult();
     143        }
     144    }
     145
     146    performSearch(query)
     147    {
     148        if (query === this._searchQuery)
     149            return;
     150
     151        WI.revertDOMChanges(this._searchDOMChanges);
     152
     153        this._searchQuery = query;
     154        this._searchResults = [];
     155        this._searchDOMChanges = [];
     156        this._searchIndex = -1;
     157
     158        this._perfomSearchOnKeyValuePairs();
     159
     160        this.dispatchEventToListeners(WI.ContentView.Event.NumberOfSearchResultsDidChange);
     161
     162        if (this._automaticallyRevealFirstSearchResult && this._searchResults.length > 0)
     163            this.revealNextSearchResult();
     164    }
     165
     166    searchCleared()
     167    {
     168        WI.revertDOMChanges(this._searchDOMChanges);
     169
     170        this._searchQuery = null;
     171        this._searchResults = null;
     172        this._searchDOMChanges = [];
     173        this._searchIndex = -1;
     174    }
     175
     176    revealPreviousSearchResult(changeFocus)
     177    {
     178        if (!this.numberOfSearchResults)
     179            return;
     180
     181        if (this._searchIndex > 0)
     182            --this._searchIndex;
     183        else
     184            this._searchIndex = this._searchResults.length - 1;
     185
     186        this._revealSearchResult(this._searchIndex, changeFocus);
     187    }
     188
     189    revealNextSearchResult(changeFocus)
     190    {
     191        if (!this.numberOfSearchResults)
     192            return;
     193
     194        if (this._searchIndex + 1 < this._searchResults.length)
     195            ++this._searchIndex;
     196        else
     197            this._searchIndex = 0;
     198
     199        this._revealSearchResult(this._searchIndex, changeFocus);
    110200    }
    111201
     
    315405    }
    316406
     407    _perfomSearchOnKeyValuePairs()
     408    {
     409        let searchRegex = new RegExp(this._searchQuery.escapeForRegExp(), "gi");
     410
     411        let elements = this.element.querySelectorAll(".key, .value");
     412        for (let element of elements) {
     413            let matchRanges = [];
     414            let text = element.textContent;
     415            let match;
     416            while (match = searchRegex.exec(text))
     417                matchRanges.push({offset: match.index, length: match[0].length});
     418
     419            if (matchRanges.length) {
     420                let highlightedNodes = WI.highlightRangesWithStyleClass(element, matchRanges, "search-highlight", this._searchDOMChanges);
     421                this._searchResults = this._searchResults.concat(highlightedNodes);
     422            }
     423        }
     424    }
     425
     426    _revealSearchResult(index, changeFocus)
     427    {
     428        let highlightElement = this._searchResults[index];
     429        if (!highlightElement)
     430            return;
     431
     432        highlightElement.scrollIntoViewIfNeeded();
     433
     434        if (!this._bouncyHighlightElement) {
     435            this._bouncyHighlightElement = document.createElement("div");
     436            this._bouncyHighlightElement.className = "bouncy-highlight";
     437            this._bouncyHighlightElement.addEventListener("animationend", (event) => {
     438                this._bouncyHighlightElement.remove();
     439            });
     440        }
     441
     442        this._bouncyHighlightElement.remove();
     443
     444        let computedStyles = window.getComputedStyle(highlightElement);
     445        let highlightElementRect = highlightElement.getBoundingClientRect();
     446        let contentViewRect = this.element.getBoundingClientRect();
     447        let contentViewScrollTop = this.element.scrollTop;
     448        let contentViewScrollLeft = this.element.scrollLeft;
     449
     450        this._bouncyHighlightElement.textContent = highlightElement.textContent;
     451        this._bouncyHighlightElement.style.top = (highlightElementRect.top - contentViewRect.top + contentViewScrollTop) + "px";
     452        this._bouncyHighlightElement.style.left = (highlightElementRect.left - contentViewRect.left + contentViewScrollLeft) + "px";
     453        this._bouncyHighlightElement.style.fontWeight = computedStyles.fontWeight;
     454
     455        this.element.appendChild(this._bouncyHighlightElement);
     456    }
     457
    317458    _resourceRequestHeadersDidChange(event)
    318459    {
Note: See TracChangeset for help on using the changeset viewer.