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

Side by Side Diff: chrome/content/ui/sendReport.js

Issue 29333320: Issue 3486 - Issue reporter: remove content window access (Closed)
Patch Set: Created Jan. 7, 2016, 7:32 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 | « no previous file | lib/ui.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 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 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 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/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 // 18 //
19 // Report data template, more data will be added during data collection 19 // Report data template, more data will be added during data collection
20 // 20 //
21 21
22 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); 22 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {});
23 let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", {}); 23 let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", {});
24 24
25 const MILLISECONDS_IN_SECOND = 1000; 25 const MILLISECONDS_IN_SECOND = 1000;
26 const SECONDS_IN_MINUTE = 60; 26 const SECONDS_IN_MINUTE = 60;
27 const SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE; 27 const SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE;
28 const SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR; 28 const SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR;
29 29
30 let contentWindow = window.arguments[0]; 30 let outerWindowID = window.arguments[0];
31 let windowURI = window.arguments[1]; 31 let windowURI = window.arguments[1];
32 if (typeof windowURI == "string") 32 if (typeof windowURI == "string")
33 windowURI = Services.newURI(windowURI, null, null); 33 windowURI = Services.newURI(windowURI, null, null);
34 let browser = window.arguments[2]; 34 let browser = window.arguments[2];
35 let isPrivate = false; 35 let isPrivate = false;
36 36
37 let reportData = new DOMParser().parseFromString("<report></report>", "text/xml" ); 37 let reportData = new DOMParser().parseFromString("<report></report>", "text/xml" );
38 38
39 // Some helper functions to work with the report data 39 // Some helper functions to work with the report data
40 function reportElement(tag) 40 function reportElement(tag)
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 }; 104 };
105 105
106 // 106 //
107 // Data collectors 107 // Data collectors
108 // 108 //
109 109
110 var reportsListDataSource = 110 var reportsListDataSource =
111 { 111 {
112 list: [], 112 list: [],
113 113
114 collectData: function(wnd, windowURI, browser, callback) 114 collectData: function(outerWindowID, windowURI, browser, callback)
115 { 115 {
116 let data = Prefs.recentReports; 116 let data = Prefs.recentReports;
117 if (data && "length" in data) 117 if (data && "length" in data)
118 { 118 {
119 for (let i = 0; i < data.length; i++) 119 for (let i = 0; i < data.length; i++)
120 { 120 {
121 let entry = data[i]; 121 let entry = data[i];
122 if (typeof entry.reportURL == "string" && entry.reportURL && 122 if (typeof entry.reportURL == "string" && entry.reportURL &&
123 typeof entry.time == "number" && Date.now() - entry.time < 30*24*60* 60*1000) 123 typeof entry.time == "number" && Date.now() - entry.time < 30*24*60* 60*1000)
124 { 124 {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 }; 187 };
188 188
189 var requestsDataSource = 189 var requestsDataSource =
190 { 190 {
191 requests: reportElement("requests"), 191 requests: reportElement("requests"),
192 origRequests: [], 192 origRequests: [],
193 requestNotifier: null, 193 requestNotifier: null,
194 callback: null, 194 callback: null,
195 nodeByKey: Object.create(null), 195 nodeByKey: Object.create(null),
196 196
197 collectData: function(wnd, windowURI, browser, callback) 197 collectData: function(outerWindowID, windowURI, browser, callback)
198 { 198 {
199 let outerWindowID = wnd.QueryInterface(Ci.nsIInterfaceRequestor)
200 .getInterface(Ci.nsIDOMWindowUtils)
201 .outerWindowID;
202 this.callback = callback; 199 this.callback = callback;
203 this.requestNotifier = new RequestNotifier(outerWindowID, this.onRequestFoun d, this); 200 this.requestNotifier = new RequestNotifier(outerWindowID, this.onRequestFoun d, this);
204 }, 201 },
205 202
206 onRequestFound: function(entry, scanComplete) 203 onRequestFound: function(entry, scanComplete)
207 { 204 {
208 if (entry) 205 if (entry)
209 { 206 {
210 let key = entry.location + " " + entry.type + " " + entry.docDomain; 207 let key = entry.location + " " + entry.type + " " + entry.docDomain;
211 let requestXML; 208 let requestXML;
(...skipping 29 matching lines...) Expand all
241 this.requestNotifier = null; 238 this.requestNotifier = null;
242 this.callback(); 239 this.callback();
243 } 240 }
244 } 241 }
245 }; 242 };
246 243
247 var filtersDataSource = 244 var filtersDataSource =
248 { 245 {
249 origFilters: [], 246 origFilters: [],
250 247
251 collectData: function(wnd, windowURI, browser, callback) 248 collectData: function(outerWindowID, windowURI, browser, callback)
252 { 249 {
253 let outerWindowID = wnd.QueryInterface(Ci.nsIInterfaceRequestor)
254 .getInterface(Ci.nsIDOMWindowUtils)
255 .outerWindowID;
256 RequestNotifier.getWindowStatistics(outerWindowID, (wndStats) => 250 RequestNotifier.getWindowStatistics(outerWindowID, (wndStats) =>
257 { 251 {
258 if (wndStats) 252 if (wndStats)
259 { 253 {
260 let filters = reportElement("filters"); 254 let filters = reportElement("filters");
261 for (let f in wndStats.filters) 255 for (let f in wndStats.filters)
262 { 256 {
263 let filter = Filter.fromText(f) 257 let filter = Filter.fromText(f)
264 let hitCount = wndStats.filters[f]; 258 let hitCount = wndStats.filters[f];
265 appendElement(filters, "filter", { 259 appendElement(filters, "filter", {
(...skipping 13 matching lines...) Expand all
279 { 273 {
280 subscriptionFilter: function(s) 274 subscriptionFilter: function(s)
281 { 275 {
282 if (s.disabled || !(s instanceof RegularSubscription)) 276 if (s.disabled || !(s instanceof RegularSubscription))
283 return false; 277 return false;
284 if (s instanceof DownloadableSubscription && !/^(http|https|ftp):/i.test(s.u rl)) 278 if (s instanceof DownloadableSubscription && !/^(http|https|ftp):/i.test(s.u rl))
285 return false; 279 return false;
286 return true; 280 return true;
287 }, 281 },
288 282
289 collectData: function(wnd, windowURI, browser, callback) 283 collectData: function(outerWindowID, windowURI, browser, callback)
290 { 284 {
291 let subscriptions = reportElement("subscriptions"); 285 let subscriptions = reportElement("subscriptions");
292 let now = Math.round(Date.now() / 1000); 286 let now = Math.round(Date.now() / 1000);
293 for (let i = 0; i < FilterStorage.subscriptions.length; i++) 287 for (let i = 0; i < FilterStorage.subscriptions.length; i++)
294 { 288 {
295 let subscription = FilterStorage.subscriptions[i]; 289 let subscription = FilterStorage.subscriptions[i];
296 if (!this.subscriptionFilter(subscription)) 290 if (!this.subscriptionFilter(subscription))
297 continue; 291 continue;
298 292
299 let subscriptionXML = appendElement(subscriptions, "subscription", { 293 let subscriptionXML = appendElement(subscriptions, "subscription", {
(...skipping 14 matching lines...) Expand all
314 subscriptionXML.setAttribute("hardExpiration", subscription.expires - now); 308 subscriptionXML.setAttribute("hardExpiration", subscription.expires - now);
315 subscriptionXML.setAttribute("downloadStatus", subscription.downloadStat us); 309 subscriptionXML.setAttribute("downloadStatus", subscription.downloadStat us);
316 } 310 }
317 } 311 }
318 callback(); 312 callback();
319 } 313 }
320 }; 314 };
321 315
322 var remoteDataSource = 316 var remoteDataSource =
323 { 317 {
324 collectData: function(wnd, windowURI, browser, callback) 318 collectData: function(outerWindowID, windowURI, browser, callback)
325 { 319 {
326 let outerWindowID = wnd.QueryInterface(Ci.nsIInterfaceRequestor)
327 .getInterface(Ci.nsIDOMWindowUtils)
328 .outerWindowID;
329 let dataCollector = require("dataCollector"); 320 let dataCollector = require("dataCollector");
330 let screenshotWidth = screenshotDataSource.getWidth(); 321 let screenshotWidth = screenshotDataSource.getWidth();
331 dataCollector.collectData(outerWindowID, screenshotWidth, data => { 322 dataCollector.collectData(outerWindowID, screenshotWidth, data => {
332 screenshotDataSource.setData(data && data.screenshot); 323 screenshotDataSource.setData(data && data.screenshot);
333 framesDataSource.setData(windowURI, data && data.opener, data && data.refe rrer, data && data.frames); 324 framesDataSource.setData(windowURI, data && data.opener, data && data.refe rrer, data && data.frames);
334 325
335 if (data && data.isPrivate) 326 if (data && data.isPrivate)
336 isPrivate = true; 327 isPrivate = true;
337 let element = reportElement("options"); 328 let element = reportElement("options");
338 appendElement(element, "option", {id: "privateBrowsing"}, isPrivate); 329 appendElement(element, "option", {id: "privateBrowsing"}, isPrivate);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 let frameXML = appendElement(xmlList, "frame", { 572 let frameXML = appendElement(xmlList, "frame", {
582 url: censorURL(frame.url) 573 url: censorURL(frame.url)
583 }); 574 });
584 this.addFrames(frame.frames, frameXML); 575 this.addFrames(frame.frames, frameXML);
585 } 576 }
586 } 577 }
587 }; 578 };
588 579
589 var errorsDataSource = 580 var errorsDataSource =
590 { 581 {
591 collectData: function(wnd, windowURI, browser, callback) 582 collectData: function(outerWindowID, windowURI, browser, callback)
592 { 583 {
593 let {addonID} = require("info"); 584 let {addonID} = require("info");
594 addonID = addonID.replace(/[\{\}]/g, ""); 585 addonID = addonID.replace(/[\{\}]/g, "");
595 586
596 // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with 587 // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with
597 // Gecko 19 this function returns the result, before that it wrote to a 588 // Gecko 19 this function returns the result, before that it wrote to a
598 // parameter. 589 // parameter.
599 let outparam = {}; 590 let outparam = {};
600 let messages = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleS ervice).getMessageArray(outparam, {}); 591 let messages = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleS ervice).getMessageArray(outparam, {});
601 messages = messages || outparam.value || []; 592 messages = messages || outparam.value || [];
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 } 647 }
657 648
658 callback(); 649 callback();
659 } 650 }
660 }; 651 };
661 652
662 var extensionsDataSource = 653 var extensionsDataSource =
663 { 654 {
664 data: reportData.createElement("extensions"), 655 data: reportData.createElement("extensions"),
665 656
666 collectData: function(wnd, windowURI, browser, callback) 657 collectData: function(outerWindowID, windowURI, browser, callback)
667 { 658 {
668 try 659 try
669 { 660 {
670 let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", nu ll).AddonManager; 661 let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", nu ll).AddonManager;
671 AddonManager.getAddonsByTypes(["extension", "plugin"], function(items) 662 AddonManager.getAddonsByTypes(["extension", "plugin"], function(items)
672 { 663 {
673 for (let i = 0; i < items.length; i++) 664 for (let i = 0; i < items.length; i++)
674 { 665 {
675 let item = items[i]; 666 let item = items[i];
676 if (!item.isActive) 667 if (!item.isActive)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 needUpdate: null, 700 needUpdate: null,
710 701
711 subscriptionFilter: function(s) 702 subscriptionFilter: function(s)
712 { 703 {
713 if (s instanceof DownloadableSubscription) 704 if (s instanceof DownloadableSubscription)
714 return subscriptionsDataSource.subscriptionFilter(s); 705 return subscriptionsDataSource.subscriptionFilter(s);
715 else 706 else
716 return false; 707 return false;
717 }, 708 },
718 709
719 collectData: function(wnd, windowURI, browser, callback) 710 collectData: function(outerWindowID, windowURI, browser, callback)
720 { 711 {
721 this.browser = browser; 712 this.browser = browser;
722 let now = Date.now() / MILLISECONDS_IN_SECOND; 713 let now = Date.now() / MILLISECONDS_IN_SECOND;
723 let outdatedThreshold = now - 14 * SECONDS_IN_DAY; 714 let outdatedThreshold = now - 14 * SECONDS_IN_DAY;
724 let needUpdateThreshold = now - 1 * SECONDS_IN_HOUR; 715 let needUpdateThreshold = now - 1 * SECONDS_IN_HOUR;
725 716
726 this.outdated = []; 717 this.outdated = [];
727 this.needUpdate = []; 718 this.needUpdate = [];
728 719
729 let subscriptions = FilterStorage.subscriptions.filter(this.subscriptionFilt er); 720 let subscriptions = FilterStorage.subscriptions.filter(this.subscriptionFilt er);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 if (s instanceof DownloadableSubscription && 866 if (s instanceof DownloadableSubscription &&
876 s.url != Prefs.subscriptions_exceptionsurl && 867 s.url != Prefs.subscriptions_exceptionsurl &&
877 s.url != Prefs.subscriptions_antiadblockurl) 868 s.url != Prefs.subscriptions_antiadblockurl)
878 { 869 {
879 return subscriptionsDataSource.subscriptionFilter(s); 870 return subscriptionsDataSource.subscriptionFilter(s);
880 } 871 }
881 else 872 else
882 return false; 873 return false;
883 }, 874 },
884 875
885 collectData: function(wnd, windowURI, browser, callback) 876 collectData: function(outerWindowID, windowURI, browser, callback)
886 { 877 {
887 this.browser = browser; 878 this.browser = browser;
888 this.whitelistFilter = Policy.isWhitelisted(windowURI.spec); 879 this.whitelistFilter = Policy.isWhitelisted(windowURI.spec);
889 880
890 if (!this.whitelistFilter && this.isEnabled) 881 if (!this.whitelistFilter && this.isEnabled)
891 { 882 {
892 // Find disabled filters in active subscriptions matching any of the reque sts 883 // Find disabled filters in active subscriptions matching any of the reque sts
893 let disabledMatcher = new CombinedMatcher(); 884 let disabledMatcher = new CombinedMatcher();
894 for (let subscription of FilterStorage.subscriptions) 885 for (let subscription of FilterStorage.subscriptions)
895 { 886 {
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
1233 { 1224 {
1234 let progressMeter = E("dataCollectorProgress"); 1225 let progressMeter = E("dataCollectorProgress");
1235 progressMeter.mode = "determined"; 1226 progressMeter.mode = "determined";
1236 progressMeter.value = progress; 1227 progressMeter.value = progress;
1237 } 1228 }
1238 1229
1239 // Continue with the next data source, asynchronously to allow progress mete r to update 1230 // Continue with the next data source, asynchronously to allow progress mete r to update
1240 let dataSource = dataCollectors.shift(); 1231 let dataSource = dataCollectors.shift();
1241 Utils.runAsync(function() 1232 Utils.runAsync(function()
1242 { 1233 {
1243 dataSource.collectData(contentWindow, windowURI, browser, initNextDataSour ce); 1234 dataSource.collectData(outerWindowID, windowURI, browser, initNextDataSour ce);
1244 }); 1235 });
1245 }; 1236 };
1246 1237
1247 initNextDataSource(); 1238 initNextDataSource();
1248 } 1239 }
1249 1240
1250 function initTypeSelectorPage() 1241 function initTypeSelectorPage()
1251 { 1242 {
1252 E("progressBar").activeItem = E("typeSelectorHeader"); 1243 E("progressBar").activeItem = E("typeSelectorHeader");
1253 let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header"); 1244 let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header");
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 1547
1557 function censorURL(url) 1548 function censorURL(url)
1558 { 1549 {
1559 return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*"); 1550 return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*");
1560 } 1551 }
1561 1552
1562 function encodeHTML(str) 1553 function encodeHTML(str)
1563 { 1554 {
1564 return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"). replace(/"/g, "&quot;"); 1555 return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"). replace(/"/g, "&quot;");
1565 } 1556 }
OLDNEW
« no previous file with comments | « no previous file | lib/ui.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld