| 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 |