Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/devtools.js

Issue 6393086494113792: Issue 154 - Added devtools panel showing blocked and blockable items (Closed)
Patch Set: Moved UI to adblockplusui repo Created Jan. 7, 2015, 1:46 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include.preload.js ('k') | metadata.chrome » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH
4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation.
8 *
9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 let info = require("info");
19 if (info.platform == "chromium")
20 {
21 let {WhitelistFilter} = require("filterClasses");
22 let {SpecialSubscription} = require("subscriptionClasses");
23 let {Filter, ElemHideFilter} = require("filterClasses");
24 let {FilterStorage} = require("filterStorage");
25 let {defaultMatcher} = require("matcher");
26 let {FilterNotifier} = require("filterNotifier");
27
28 let panels = Object.create(null);
29
30 function getFilterInfo(filter)
31 {
32 if (!filter)
33 return null;
34
35 let userDefined = false;
36 let subscriptionTitle = null;
37
38 for (let subscription of filter.subscriptions)
39 {
40 if (!subscription.disabled)
41 {
42 if (subscription instanceof SpecialSubscription)
43 userDefined = true;
44 else
45 subscriptionTitle = subscription.title;
46 }
47 }
48
49 return {
50 text: filter.text,
51 whitelisted: filter instanceof WhitelistFilter,
52 userDefined: userDefined,
53 subscription: subscriptionTitle
54 };
55 }
56
57 function addRecord(panel, request, filter)
58 {
59 panel.port.postMessage({
60 type: "add-record",
61 request: request,
62 filter: getFilterInfo(filter)
63 });
64
65 panel.records.push({
66 request: request,
67 filter: filter
68 });
69 }
70
71 function matchRequest(request)
72 {
73 return defaultMatcher.matchesAny(
74 request.url,
75 request.type,
76 request.docDomain,
77 isThirdParty(
78 extractHostFromURL(request.url),
79 request.docDomain
80 ),
81 request.sitekey
82 );
83 }
84
85 function logRequest(tabId, url, type, docDomain, sitekey, filter)
86 {
87 let panel = panels[tabId];
88 if (panel)
89 {
90 let request = {
91 url: url,
92 type: type,
93 docDomain: docDomain,
94 sitekey: sitekey
95 };
96
97 addRecord(panel, request, filter);
98 }
99 }
100 exports.logRequest = logRequest;
101
102 function logHiddenElements(tabId, selectors, docDomain)
103 {
104 let panel = panels[tabId];
105 if (panel)
106 {
107 for (let subscription of FilterStorage.subscriptions)
108 {
109 if (subscription.disabled)
110 continue;
111
112 for (let filter of subscription.filters)
113 {
114 if (!(filter instanceof ElemHideFilter))
115 continue;
116 if (selectors.indexOf(filter.selector) == -1)
117 continue;
118 if (!filter.isActiveOnDomain(docDomain))
119 continue;
120 if (panel.records.some(record => record.request.type == "ELEMHIDE" &&
121 record.request.docDomain == docDomain &&
122 record.filter.selector == filter.sele ctor))
123 continue;
124
125 addRecord(panel, {type: "ELEMHIDE", docDomain: docDomain}, filter);
126 }
127 }
128 }
129 };
130 exports.logHiddenElements = logHiddenElements;
131
132 function hasPanel(page)
133 {
134 return page._id in panels;
135 }
136 exports.hasPanel = hasPanel;
137
138 function onMessage(msg)
139 {
140 let filter = Filter.fromText(msg.filter);
141
142 switch (msg.action)
143 {
144 case "add":
145 FilterStorage.addFilter(filter);
146 break;
147
148 case "remove":
149 FilterStorage.removeFilter(filter);
150 break;
151 }
152 }
153
154 chrome.runtime.onConnect.addListener(function(port)
155 {
156 let match = port.name.match(/^devtools-(\d+)$/);
157 if (match)
158 {
159 let tabId = match[1];
160 panels[tabId] = {port: port, records: []};
161
162 port.onMessage.addListener(onMessage);
163 port.onDisconnect.addListener(() => delete panels[tabId]);
164 }
165 });
166
167 chrome.webNavigation.onBeforeNavigate.addListener(function(details)
168 {
169 let panel = panels[details.tabId];
170 if (panel && details.frameId == 0)
171 {
172 // We have to flush the in-memory cache on page load.
173 // Otherwise requests answered from the in-memory cache
174 // will not be shown in the devtools panel.
175 chrome.webRequest.handlerBehaviorChanged();
176
177 panel.records = [];
178 panel.port.postMessage({type: "reset"});
179 }
180 });
181
182 FilterNotifier.addListener(function(action, filter)
183 {
184 if (action != "filter.added" && action != "filter.removed")
185 return;
186
187 for (let tabId in panels)
188 {
189 let panel = panels[tabId];
190
191 for (let i = 0; i < panel.records.length; i++)
192 {
193 let record = panel.records[i];
194
195 if (action == "filter.added")
196 {
197 if (record.request.type == "ELEMHIDE")
198 continue;
199
200 if (matchRequest(record.request) != filter)
201 continue;
202
203 record.filter = filter;
204 }
205
206 if (action == "filter.removed")
207 {
208 if (record.filter != filter)
209 continue;
210
211 if (record.request.type == "ELEMHIDE")
212 {
213 panel.port.postMessage({
214 type: "remove-record",
215 index: i
216 });
217 panel.records.splice(i--, 1);
218 continue;
219 }
220
221 record.filter = matchRequest(record.request);
222 }
223
224 panel.port.postMessage({
225 type: "update-record",
226 index: i,
227 request: record.request,
228 filter: getFilterInfo(record.filter)
229 });
230 }
231 }
232 });
233 }
234 else
235 {
236 exports.logRequest = () => {};
237 exports.logHiddenElements = () => {};
238 exports.hasPanel = () => false;
239 }
OLDNEW
« no previous file with comments | « include.preload.js ('k') | metadata.chrome » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld