| Index: devtools-panel.js | 
| diff --git a/devtools-panel.js b/devtools-panel.js | 
| index 85068dd5c1ed8a02309a7370b841b84f7e134df6..d9d89619bb4ff15f678b642a8f2025103e3dd58c 100644 | 
| --- a/devtools-panel.js | 
| +++ b/devtools-panel.js | 
| @@ -17,6 +17,8 @@ | 
|  | 
| "use strict"; | 
|  | 
| +var lastFilterQuery = null; | 
| + | 
| function generateFilter(request, domainSpecific) | 
| { | 
| var filter = request.url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||"); | 
| @@ -117,9 +119,49 @@ function createRecord(request, filter, template) | 
| "add", "Block item", generateFilter(request, request.specificOnly) | 
| )); | 
|  | 
| +  if (lastFilterQuery && shouldFilterRow(row, lastFilterQuery)) | 
| +    row.classList.add("filtered-by-search"); | 
| + | 
| return row; | 
| } | 
|  | 
| +function shouldFilterRow(row, query) | 
| +{ | 
| +  var elementsToSearch = [ | 
| +    row.getElementsByClassName("url"), | 
| +    row.getElementsByClassName("filter"), | 
| +    row.getElementsByClassName("origin"), | 
| +    row.getElementsByClassName("type") | 
| +  ]; | 
| + | 
| +  for (var elements of elementsToSearch) | 
| +  { | 
| +    for (var element of elements) | 
| +    { | 
| +      if (element.innerText.search(query) != -1) | 
| +        return false; | 
| +    } | 
| +  } | 
| +  return true; | 
| +} | 
| + | 
| +function performSearch(table, query) | 
| +{ | 
| +  for (var row of table.rows) | 
| +  { | 
| +    if (shouldFilterRow(row, query)) | 
| +      row.classList.add("filtered-by-search"); | 
| +    else | 
| +      row.classList.remove("filtered-by-search"); | 
| +  } | 
| +} | 
| + | 
| +function cancelSearch(table) | 
| +{ | 
| +  for (var row of table.rows) | 
| +    row.classList.remove("filtered-by-search"); | 
| +} | 
| + | 
| document.addEventListener("DOMContentLoaded", function() | 
| { | 
| var container = document.getElementById("items"); | 
| @@ -169,4 +211,19 @@ document.addEventListener("DOMContentLoaded", function() | 
| break; | 
| } | 
| }); | 
| + | 
| +  window.addEventListener("message", function(event) | 
| +  { | 
| +    switch(event.data.type) | 
| +    { | 
| +      case "performSearch": | 
| +        performSearch(table, event.data.queryString); | 
| +        lastFilterQuery = event.data.queryString; | 
| +        break; | 
| +      case "cancelSearch": | 
| +        cancelSearch(table); | 
| +        lastFilterQuery = null; | 
| +        break; | 
| +    } | 
| +  }); | 
| }, false); | 
|  |