 Issue 5564089086509056:
  Issue 1801 - Use URL objects to process URLs in the background page  (Closed)
    
  
    Issue 5564089086509056:
  Issue 1801 - Use URL objects to process URLs in the background page  (Closed) 
  | Left: | ||
| Right: | 
| OLD | NEW | 
|---|---|
| 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 (function() | 18 (function() | 
| 19 { | 19 { | 
| 20 /* Pages */ | 20 /* Pages */ | 
| 21 | 21 | 
| 22 var Page = ext.Page = function(tab) | 22 var Page = ext.Page = function(tab) | 
| 23 { | 23 { | 
| 24 this._id = tab.id; | 24 this._id = tab.id; | 
| 25 this._url = tab.url; | |
| 26 | 25 | 
| 27 this.browserAction = new BrowserAction(tab.id); | 26 this.browserAction = new BrowserAction(tab.id); | 
| 28 this.contextMenus = new ContextMenus(this); | 27 this.contextMenus = new ContextMenus(this); | 
| 28 | |
| 29 // Usually Page objects are created from Chrome's Tab objects, which | |
| 30 // provide the url. So we can override the fallback implemented below. | |
| 31 if (tab.url) | |
| 32 Object.defineProperty(this, "url", {value: new URL(tab.url), enumerable: t rue}); | |
| 
Wladimir Palant
2015/02/09 12:54:29
Code that belongs together should really be togeth
 
Sebastian Noack
2015/02/11 10:55:51
Whatever.
 | |
| 29 }; | 33 }; | 
| 30 Page.prototype = { | 34 Page.prototype = { | 
| 31 get url() | 35 get url() | 
| 32 { | 36 { | 
| 33 // usually our Page objects are created from Chrome's Tab objects, which | 37 // Sometimes we only have the tab id when we create a Page object. | 
| 34 // provide the url. So we can return the url given in the constructor. | 38 // In that case we get the url from top frame of the tab, recorded | 
| 35 if (this._url != null) | 39 // by the onBeforeRequest handler. | 
| 36 return this._url; | |
| 37 | |
| 38 // but sometimes we only have the tab id when we create a Page object. | |
| 39 // In that case we get the url from top frame of the tab, recorded by | |
| 40 // the onBeforeRequest handler. | |
| 41 var frames = framesOfTabs[this._id]; | 40 var frames = framesOfTabs[this._id]; | 
| 42 if (frames) | 41 if (frames) | 
| 43 { | 42 { | 
| 44 var frame = frames[0]; | 43 var frame = frames[0]; | 
| 45 if (frame) | 44 if (frame) | 
| 46 return frame.url; | 45 return frame.url; | 
| 47 } | 46 } | 
| 48 }, | 47 }, | 
| 49 sendMessage: function(message, responseCallback) | 48 sendMessage: function(message, responseCallback) | 
| 50 { | 49 { | 
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 258 { | 257 { | 
| 259 tabs.forEach(function(tab) | 258 tabs.forEach(function(tab) | 
| 260 { | 259 { | 
| 261 chrome.webNavigation.getAllFrames({tabId: tab.id}, function(details) | 260 chrome.webNavigation.getAllFrames({tabId: tab.id}, function(details) | 
| 262 { | 261 { | 
| 263 if (details && details.length > 0) | 262 if (details && details.length > 0) | 
| 264 { | 263 { | 
| 265 var frames = framesOfTabs[tab.id] = {__proto__: null}; | 264 var frames = framesOfTabs[tab.id] = {__proto__: null}; | 
| 266 | 265 | 
| 267 for (var i = 0; i < details.length; i++) | 266 for (var i = 0; i < details.length; i++) | 
| 268 frames[details[i].frameId] = {url: details[i].url, parent: null}; | 267 frames[details[i].frameId] = {url: new URL(details[i].url), parent: null}; | 
| 269 | 268 | 
| 270 for (var i = 0; i < details.length; i++) | 269 for (var i = 0; i < details.length; i++) | 
| 271 { | 270 { | 
| 272 var parentFrameId = details[i].parentFrameId; | 271 var parentFrameId = details[i].parentFrameId; | 
| 273 | 272 | 
| 274 if (parentFrameId != -1) | 273 if (parentFrameId != -1) | 
| 275 frames[details[i].frameId].parent = frames[parentFrameId]; | 274 frames[details[i].frameId].parent = frames[parentFrameId]; | 
| 276 } | 275 } | 
| 277 } | 276 } | 
| 278 }); | 277 }); | 
| (...skipping 19 matching lines...) Expand all Loading... | |
| 298 details.frameId == 0 && !(details.tabId in framesOfTabs) | 297 details.frameId == 0 && !(details.tabId in framesOfTabs) | 
| 299 ); | 298 ); | 
| 300 | 299 | 
| 301 var frames = null; | 300 var frames = null; | 
| 302 if (!isMainFrame) | 301 if (!isMainFrame) | 
| 303 frames = framesOfTabs[details.tabId]; | 302 frames = framesOfTabs[details.tabId]; | 
| 304 if (!frames) | 303 if (!frames) | 
| 305 frames = framesOfTabs[details.tabId] = {__proto__: null}; | 304 frames = framesOfTabs[details.tabId] = {__proto__: null}; | 
| 306 | 305 | 
| 307 var frame = null; | 306 var frame = null; | 
| 307 var url = new URL(details.url); | |
| 308 if (!isMainFrame) | 308 if (!isMainFrame) | 
| 309 { | 309 { | 
| 310 // we are looking for the frame that contains the element that | 310 // we are looking for the frame that contains the element that | 
| 311 // is about to load, however if a frame is loading the surrounding | 311 // is about to load, however if a frame is loading the surrounding | 
| 312 // frame is indicated by parentFrameId instead of frameId | 312 // frame is indicated by parentFrameId instead of frameId | 
| 313 var frameId; | 313 var frameId; | 
| 314 if (requestType == "sub_frame") | 314 if (requestType == "sub_frame") | 
| 315 frameId = details.parentFrameId; | 315 frameId = details.parentFrameId; | 
| 316 else | 316 else | 
| 317 frameId = details.frameId; | 317 frameId = details.frameId; | 
| 318 | 318 | 
| 319 frame = frames[frameId] || frames[Object.keys(frames)[0]]; | 319 frame = frames[frameId] || frames[Object.keys(frames)[0]]; | 
| 320 | 320 | 
| 321 if (frame) | 321 if (frame) | 
| 322 { | 322 { | 
| 323 // Since Chrome 38 requests of type 'object' (e.g. requests | 323 // Since Chrome 38 requests of type 'object' (e.g. requests | 
| 324 // initiated by Flash) are mistakenly reported with the type 'other'. | 324 // initiated by Flash) are mistakenly reported with the type 'other'. | 
| 325 // https://code.google.com/p/chromium/issues/detail?id=410382 | 325 // https://code.google.com/p/chromium/issues/detail?id=410382 | 
| 326 if (requestType == "other" && parseInt(navigator.userAgent.match(/\bCh rome\/(\d+)/)[1], 10) >= 38) | 326 if (requestType == "other" && parseInt(navigator.userAgent.match(/\bCh rome\/(\d+)/)[1], 10) >= 38) | 
| 327 requestType = "object"; | 327 requestType = "object"; | 
| 328 | 328 | 
| 329 var results = ext.webRequest.onBeforeRequest._dispatch( | 329 var results = ext.webRequest.onBeforeRequest._dispatch( | 
| 330 details.url, | 330 url, | 
| 331 requestType, | 331 requestType, | 
| 332 new Page({id: details.tabId}), | 332 new Page({id: details.tabId}), | 
| 333 frame | 333 frame | 
| 334 ); | 334 ); | 
| 335 | 335 | 
| 336 if (results.indexOf(false) != -1) | 336 if (results.indexOf(false) != -1) | 
| 337 return {cancel: true}; | 337 return {cancel: true}; | 
| 338 } | 338 } | 
| 339 } | 339 } | 
| 340 | 340 | 
| 341 if (isMainFrame || details.type == "sub_frame") | 341 if (isMainFrame || details.type == "sub_frame") | 
| 342 frames[details.frameId] = {url: details.url, parent: frame}; | 342 frames[details.frameId] = {url: url, parent: frame}; | 
| 343 } | 343 } | 
| 344 catch (e) | 344 catch (e) | 
| 345 { | 345 { | 
| 346 // recent versions of Chrome cancel the request when an error occurs in | 346 // recent versions of Chrome cancel the request when an error occurs in | 
| 347 // the onBeforeRequest listener. However in our case it is preferred, to | 347 // the onBeforeRequest listener. However in our case it is preferred, to | 
| 348 // let potentially some ads through, rather than blocking legit requests. | 348 // let potentially some ads through, rather than blocking legit requests. | 
| 349 console.error(e); | 349 console.error(e); | 
| 350 } | 350 } | 
| 351 }, {urls: ["http://*/*", "https://*/*"]}, ["blocking"]); | 351 }, {urls: ["http://*/*", "https://*/*"]}, ["blocking"]); | 
| 352 | 352 | 
| 353 | 353 | 
| 354 /* Message passing */ | 354 /* Message passing */ | 
| 355 | 355 | 
| 356 chrome.runtime.onMessage.addListener(function(message, rawSender, sendResponse ) | 356 chrome.runtime.onMessage.addListener(function(message, rawSender, sendResponse ) | 
| 357 { | 357 { | 
| 358 var sender = { | 358 var sender = { | 
| 359 page: new Page(rawSender.tab), | 359 page: new Page(rawSender.tab), | 
| 360 frame: { | 360 frame: { | 
| 361 url: rawSender.url, | 361 url: new URL(rawSender.url), | 
| 362 get parent() | 362 get parent() | 
| 363 { | 363 { | 
| 364 var frames = framesOfTabs[rawSender.tab.id]; | 364 var frames = framesOfTabs[rawSender.tab.id]; | 
| 365 | 365 | 
| 366 if (!frames) | 366 if (!frames) | 
| 367 return null; | 367 return null; | 
| 368 | 368 | 
| 369 if ("frameId" in rawSender) | 369 if ("frameId" in rawSender) | 
| 370 { | 370 { | 
| 371 // Chrome 41+ | 371 // Chrome 41+ | 
| 372 var frame = frames[rawSender.frameId]; | 372 var frame = frames[rawSender.frameId]; | 
| 373 if (frame) | 373 if (frame) | 
| 374 return frame.parent; | 374 return frame.parent; | 
| 375 } | 375 } | 
| 376 else | 376 else | 
| 377 { | 377 { | 
| 378 // Chrome 28-40 | 378 // Chrome 28-40 | 
| 379 for (var frameId in frames) | 379 for (var frameId in frames) | 
| 380 { | 380 { | 
| 381 if (frames[frameId].url == rawSender.url) | 381 if (frames[frameId].url.href == this.url.href) | 
| 382 return frames[frameId].parent; | 382 return frames[frameId].parent; | 
| 383 } | 383 } | 
| 384 } | 384 } | 
| 385 | 385 | 
| 386 return frames[0]; | 386 return frames[0]; | 
| 387 } | 387 } | 
| 388 } | 388 } | 
| 389 }; | 389 }; | 
| 390 | 390 | 
| 391 return ext.onMessage._dispatch(message, sender, sendResponse).indexOf(true) != -1; | 391 return ext.onMessage._dispatch(message, sender, sendResponse).indexOf(true) != -1; | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 callback(new Page(tab)); | 431 callback(new Page(tab)); | 
| 432 } | 432 } | 
| 433 else | 433 else | 
| 434 { | 434 { | 
| 435 ext.pages.open(optionsUrl, callback); | 435 ext.pages.open(optionsUrl, callback); | 
| 436 } | 436 } | 
| 437 }); | 437 }); | 
| 438 }); | 438 }); | 
| 439 }; | 439 }; | 
| 440 })(); | 440 })(); | 
| OLD | NEW |