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