Left: | ||
Right: |
OLD | NEW |
---|---|
1 importAll("filterClasses", this); | 1 importAll("filterClasses", this); |
2 importAll("subscriptionClasses", this); | 2 importAll("subscriptionClasses", this); |
3 importAll("filterStorage", this); | 3 importAll("filterStorage", this); |
4 importAll("elemHide", this); | 4 importAll("elemHide", this); |
5 importAll("filterListener", this); | 5 importAll("filterListener", this); |
6 importAll("filterNotifier", this); | 6 importAll("filterNotifier", this); |
7 importAll("matcher", this); | 7 importAll("matcher", this); |
8 importAll("prefs", this); | 8 importAll("prefs", this); |
9 importAll("synchronizer", this); | 9 importAll("synchronizer", this); |
10 importAll("utils", this); | 10 importAll("utils", this); |
11 | 11 |
12 // Some types cannot be distinguished | 12 // Some types cannot be distinguished |
13 RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT; | 13 RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT; |
14 RegExpFilter.typeMap.MEDIA = RegExpFilter.typeMap.FONT = RegExpFilter.typeMap.OT HER; | 14 RegExpFilter.typeMap.MEDIA = RegExpFilter.typeMap.FONT = RegExpFilter.typeMap.OT HER; |
15 | 15 |
16 var isFirstRun = false; | |
Felix Dahlke
2012/10/02 12:36:04
It seems like this variable is never read, so I gu
Wladimir Palant
2012/10/17 10:25:39
Yes, that's code from ABP/Chrome used by the first
| |
16 FilterNotifier.addListener(function(action) | 17 FilterNotifier.addListener(function(action) |
17 { | 18 { |
18 if (action == "load") | 19 if (action == "load") |
19 { | 20 { |
20 importOldData(); | 21 importOldData(); |
21 if (!localStorage["currentVersion"]) | 22 if (!localStorage["currentVersion"]) |
23 { | |
24 isFirstRun = true; | |
22 executeFirstRunActions(); | 25 executeFirstRunActions(); |
26 } | |
23 localStorage["currentVersion"] = require("info").addonVersion; | 27 localStorage["currentVersion"] = require("info").addonVersion; |
24 } | 28 } |
25 }); | 29 }); |
26 | 30 |
27 // Special-case domains for which we cannot use style-based hiding rules. | 31 // Special-case domains for which we cannot use style-based hiding rules. |
28 // See http://crbug.com/68705. | 32 // See http://crbug.com/68705. |
29 var noStyleRulesHosts = ["mail.google.com", "mail.yahoo.com", "www.google.com"]; | 33 var noStyleRulesHosts = ["mail.google.com", "mail.yahoo.com", "www.google.com"]; |
30 | 34 |
31 // Sets options to defaults, upgrading old options from previous versions as nec essary | 35 // Sets options to defaults, upgrading old options from previous versions as nec essary |
32 function setDefaultOptions() | 36 function setDefaultOptions() |
33 { | 37 { |
34 function defaultOptionValue(opt, val) | 38 function defaultOptionValue(opt, val) |
35 { | 39 { |
36 if(!(opt in localStorage)) | 40 if(!(opt in localStorage)) |
37 localStorage[opt] = val; | 41 localStorage[opt] = val; |
38 } | 42 } |
39 | 43 |
40 defaultOptionValue("shouldShowIcon", "true"); | 44 defaultOptionValue("shouldShowIcon", "true"); |
41 defaultOptionValue("shouldShowBlockElementMenu", "true"); | 45 defaultOptionValue("shouldShowBlockElementMenu", "true"); |
42 defaultOptionValue("disableInlineTextAds", "false"); | 46 defaultOptionValue("disableInlineTextAds", "false"); |
43 | 47 |
44 // If user had older version installed, get rid of old option | 48 // If user had older version installed, get rid of old option |
45 if ("specialCaseYouTube" in localStorage) | 49 if ("specialCaseYouTube" in localStorage) |
46 delete localStorage.specialCaseYouTube; | 50 delete localStorage.specialCaseYouTube; |
47 if ("experimental" in localStorage) | 51 if ("experimental" in localStorage) |
48 delete localStorage.experimental; | 52 delete localStorage.experimental; |
49 } | 53 } |
50 | 54 |
51 // Upgrade options before we do anything else. | 55 // Upgrade options before we do anything else. |
52 setDefaultOptions(); | 56 setDefaultOptions(); |
53 | 57 |
54 /** | 58 /** |
55 * Checks whether a page is whitelisted. | 59 * Checks whether a page is whitelisted. |
56 * @param {String} url | 60 * @param {String} url |
57 * @param {String} [type] content type to be checked, default is "DOCUMENT" | 61 * @param {String} [type] content type to be checked, default is "DOCUMENT" |
58 * @return {Filter} filter that matched the URL or null if not whitelisted | 62 * @return {Filter} filter that matched the URL or null if not whitelisted |
59 */ | 63 */ |
60 function isWhitelisted(url, type) | 64 function isWhitelisted(url, type) |
61 { | 65 { |
62 // Ignore fragment identifier | 66 // Ignore fragment identifier |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
345 { | 349 { |
346 chrome.contextMenus.create({'title': chrome.i18n.getMessage('block_element '), 'contexts': ['image', 'video', 'audio'], 'onclick': function(info, tab) | 350 chrome.contextMenus.create({'title': chrome.i18n.getMessage('block_element '), 'contexts': ['image', 'video', 'audio'], 'onclick': function(info, tab) |
347 { | 351 { |
348 if(info.srcUrl) | 352 if(info.srcUrl) |
349 chrome.tabs.sendRequest(tab.id, {reqtype: "clickhide-new-filter", fi lter: info.srcUrl}); | 353 chrome.tabs.sendRequest(tab.id, {reqtype: "clickhide-new-filter", fi lter: info.srcUrl}); |
350 }}); | 354 }}); |
351 } | 355 } |
352 }); | 356 }); |
353 } | 357 } |
354 | 358 |
359 /** | |
360 * Opens Options window or focuses an existing one. | |
361 * @param {Function} callback function to be called with the window object of | |
362 * the Options window | |
363 */ | |
364 function openOptions(callback) | |
365 { | |
366 function findOptions(selectTab) | |
367 { | |
368 var views = chrome.extension.getViews({type: "tab"}); | |
369 for (var i = 0; i < views.length; i++) | |
370 if ("startSubscriptionSelection" in views[i]) | |
371 return views[i]; | |
372 | |
373 return null; | |
374 } | |
375 | |
376 function selectOptionsTab() | |
377 { | |
378 chrome.windows.getAll({populate: true}, function(windows) | |
379 { | |
380 var url = chrome.extension.getURL("options.html"); | |
381 for (var i = 0; i < windows.length; i++) | |
382 for (var j = 0; j < windows[i].tabs.length; j++) | |
383 if (windows[i].tabs[j].url == url) | |
384 chrome.tabs.update(windows[i].tabs[j].id, {selected: true}); | |
385 }); | |
386 } | |
387 | |
388 var view = findOptions(); | |
389 if (view) | |
390 { | |
391 selectOptionsTab(); | |
392 callback(view); | |
393 } | |
394 else | |
395 { | |
396 var onLoad = function() | |
397 { | |
398 var view = findOptions(); | |
399 if (view) | |
400 callback(view); | |
401 }; | |
402 | |
403 chrome.tabs.create({url: chrome.extension.getURL("options.html")}, function( tab) | |
404 { | |
405 if (tab.status == "complete") | |
406 onLoad(); | |
407 else | |
408 { | |
409 var id = tab.id; | |
410 var listener = function(tabId, changeInfo, tab) | |
411 { | |
412 if (tabId == id && changeInfo.status == "complete") | |
413 { | |
414 chrome.tabs.onUpdated.removeListener(listener); | |
415 onLoad(); | |
416 } | |
417 }; | |
418 chrome.tabs.onUpdated.addListener(listener); | |
419 } | |
420 }); | |
421 } | |
422 } | |
423 | |
355 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) | 424 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) |
356 { | 425 { |
357 switch (request.reqtype) | 426 switch (request.reqtype) |
358 { | 427 { |
359 case "get-settings": | 428 case "get-settings": |
360 var hostDomain = null; | 429 var hostDomain = null; |
361 var selectors = null; | 430 var selectors = null; |
362 | 431 |
363 // HACK: We don't know which frame sent us the message, try to find it | 432 // HACK: We don't know which frame sent us the message, try to find it |
364 // in webRequest's frame data. | 433 // in webRequest's frame data. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
417 } | 486 } |
418 break; | 487 break; |
419 case "add-filters": | 488 case "add-filters": |
420 if (request.filters && request.filters.length) | 489 if (request.filters && request.filters.length) |
421 { | 490 { |
422 for (var i = 0; i < request.filters.length; i++) | 491 for (var i = 0; i < request.filters.length; i++) |
423 FilterStorage.addFilter(Filter.fromText(request.filters[i])); | 492 FilterStorage.addFilter(Filter.fromText(request.filters[i])); |
424 } | 493 } |
425 break; | 494 break; |
426 case "add-subscription": | 495 case "add-subscription": |
427 function doAddSubscription(selectTab) | 496 openOptions(function(view) |
428 { | 497 { |
429 var views = chrome.extension.getViews({type: "tab"}); | 498 view.startSubscriptionSelection(request.title, request.url); |
430 var view = null; | 499 }); |
431 for (var i = 0; i < views.length; i++) | |
432 if ("startSubscriptionSelection" in views[i]) | |
433 view = views[i]; | |
434 | |
435 if (view) | |
436 { | |
437 view.startSubscriptionSelection(request.title, request.url); | |
438 if (selectTab) | |
439 { | |
440 chrome.windows.getAll({populate: true}, function(windows) | |
441 { | |
442 var url = chrome.extension.getURL("options.html"); | |
443 for (var i = 0; i < windows.length; i++) | |
444 for (var j = 0; j < windows[i].tabs.length; j++) | |
445 if (windows[i].tabs[j].url == url) | |
446 return chrome.tabs.update(windows[i].tabs[j].id, {selected: true}); | |
447 }); | |
448 } | |
449 } | |
450 return view; | |
451 } | |
452 | |
453 if (!doAddSubscription(true)) | |
454 { | |
455 chrome.tabs.create({url: chrome.extension.getURL("options.html")}, funct ion(tab) | |
456 { | |
457 if (tab.status == "complete") | |
458 doAddSubscription() | |
459 else | |
460 { | |
461 var id = tab.id; | |
462 var listener = function(tabId, changeInfo, tab) | |
463 { | |
464 if (tabId == id && changeInfo.status == "complete") | |
465 { | |
466 chrome.tabs.onUpdated.removeListener(listener); | |
467 doAddSubscription(); | |
468 } | |
469 }; | |
470 chrome.tabs.onUpdated.addListener(listener); | |
471 } | |
472 }); | |
473 } | |
474 break; | 500 break; |
475 case "forward": | 501 case "forward": |
476 chrome.tabs.sendRequest(sender.tab.id, request.request, sendResponse); | 502 chrome.tabs.sendRequest(sender.tab.id, request.request, sendResponse); |
477 break; | 503 break; |
478 default: | 504 default: |
479 sendResponse({}); | 505 sendResponse({}); |
480 break; | 506 break; |
481 } | 507 } |
482 }); | 508 }); |
483 | 509 |
484 // Show icon as page action for all tabs that already exist | 510 // Show icon as page action for all tabs that already exist |
485 chrome.windows.getAll({populate: true}, function(windows) | 511 chrome.windows.getAll({populate: true}, function(windows) |
486 { | 512 { |
487 for (var i = 0; i < windows.length; i++) | 513 for (var i = 0; i < windows.length; i++) |
488 for (var j = 0; j < windows[i].tabs.length; j++) | 514 for (var j = 0; j < windows[i].tabs.length; j++) |
489 refreshIconAndContextMenu(windows[i].tabs[j]); | 515 refreshIconAndContextMenu(windows[i].tabs[j]); |
490 }); | 516 }); |
491 | 517 |
492 // Update icon if a tab changes location | 518 // Update icon if a tab changes location |
493 chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) | 519 chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) |
494 { | 520 { |
495 chrome.tabs.sendRequest(tabId, {reqtype: "clickhide-deactivate"}) | 521 chrome.tabs.sendRequest(tabId, {reqtype: "clickhide-deactivate"}) |
496 if(changeInfo.status == "loading") | 522 if(changeInfo.status == "loading") |
497 refreshIconAndContextMenu(tab); | 523 refreshIconAndContextMenu(tab); |
498 }); | 524 }); |
OLD | NEW |