| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * This Source Code is subject to the terms of the Mozilla Public License | |
| 3 * version 2.0 (the "License"). You can obtain a copy of the License at | |
| 4 * http://mozilla.org/MPL/2.0/. | |
| 5 */ | |
| 6 | |
| 7 // | |
| 8 // This mimicks the API of the Matcher module in ABP/Firefox but users Opera's | |
| 9 // URLFilter API. | |
| 10 // | |
| 11 | |
| 12 (function() | |
| 13 { | |
| 14 var WhitelistFilter = null; | |
| 15 var RegExpFilter = null; | |
| 16 var resourceTypes = [ | |
| 17 "DOCUMENT", "FONT", "IMAGE", "MEDIA", "OBJECT", "OBJECT_SUBREQUEST", | |
| 18 "OTHER", "SCRIPT", "STYLESHEET", "SUBDOCUMENT", "XMLHTTPREQUEST" | |
| 19 ]; | |
| 20 | |
| 21 require.scopes.matcher = | |
| 22 { | |
| 23 defaultMatcher: | |
| 24 { | |
| 25 _rules: {}, | |
| 26 | |
| 27 _generateRule: function(filter) | |
|
Felix Dahlke
2012/10/10 12:11:22
I'd love it if the code segments below comments ("
| |
| 28 { | |
| 29 if (!WhitelistFilter) | |
| 30 { | |
| 31 WhitelistFilter = require("filterClasses").WhitelistFilter; | |
| 32 RegExpFilter = require("filterClasses").RegExpFilter; | |
| 33 } | |
| 34 | |
| 35 var rule = { | |
| 36 type: filter instanceof WhitelistFilter ? "allow" : "block", | |
| 37 text: filter.regexpSource, | |
| 38 options: {} | |
| 39 }; | |
| 40 | |
| 41 // Convert anchors, Opera requires explicit * | |
| 42 | |
| 43 // |foo => foo | |
| 44 // foo => *foo | |
| 45 // *foo and ||foo stay unchanged | |
| 46 if (rule.text.substr(0, 2) != "||") | |
| 47 { | |
| 48 if (rule.text.substr(0, 1) == "|") | |
|
Felix Dahlke
2012/10/10 12:11:22
This value is used twice, so how about storing it
| |
| 49 rule.text = rule.text.slice(1); | |
| 50 else if (rule.text.substr(0, 1) != "*") | |
| 51 rule.text = "*" + rule.text; | |
| 52 } | |
| 53 | |
| 54 // foo| => foo | |
| 55 // foo => foo* | |
| 56 // foo* stays unchanged | |
| 57 if (rule.text.substr(-1) == "|") | |
|
Felix Dahlke
2012/10/10 12:11:22
As above, how about storing this in a variable las
| |
| 58 rule.text = rule.text.slice(0, -1); | |
| 59 else if (rule.text.substr(-1) != "*") | |
| 60 rule.text = rule.text + "*"; | |
| 61 | |
| 62 // Translate type options | |
| 63 var resources = 0; | |
| 64 var urlfilter = opera.extension.urlfilter; | |
| 65 for (var i = 0; i < resourceTypes.length; i++) | |
| 66 { | |
| 67 var type = resourceTypes[i]; | |
| 68 if (filter.contentType & RegExpFilter.typeMap[type]) | |
| 69 resources = resources | urlfilter["RESOURCE_" + type]; | |
|
Felix Dahlke
2012/10/10 12:11:22
How about:
resources |= urlfilter["RESOURCE_" + ty
Wladimir Palant
2012/10/11 09:36:26
I thought that JavaScript doesn't support |= but i
| |
| 70 } | |
| 71 rule.options.resources = resources; | |
| 72 | |
| 73 // Translate domain options | |
| 74 if (filter.domainSource) | |
| 75 { | |
| 76 var domains = filter.domainSource.split(filter.domainSeparator); | |
| 77 for (var i = 0; i < domains.length; i++) | |
| 78 { | |
| 79 var domain = domains[i]; | |
| 80 if (domain == "") | |
| 81 continue; | |
| 82 | |
| 83 var type = "includeDomains"; | |
| 84 if (domain[0] == "~") | |
| 85 { | |
| 86 type = "excludeDomains"; | |
| 87 domain = domain.substr(1); | |
| 88 } | |
| 89 if (!(type in rule.options)) | |
| 90 rule.options[type] = []; | |
| 91 rule.options[type].push(domain); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 // Translate third-party option | |
| 96 if (filter.thirdParty !== null) | |
| 97 rule.options.thirdParty = filter.thirdParty; | |
| 98 | |
| 99 return rule; | |
| 100 }, | |
| 101 | |
| 102 add: function(filter) | |
| 103 { | |
| 104 if (filter.text in this._rules) | |
| 105 return; | |
| 106 | |
| 107 var rule = this._generateRule(filter); | |
| 108 if (filter.text == "http://") | |
|
Felix Dahlke
2012/10/10 12:11:22
Why just check for the string "http://" here? Woul
Wladimir Palant
2012/10/11 09:36:26
This is just debugging code I forgot :)
| |
| 109 Cu.reportError(JSON.stringify(rule)); | |
| 110 opera.extension.urlfilter[rule.type].add(rule.text, rule.options); | |
| 111 this._rules[filter.text] = rule; | |
| 112 }, | |
| 113 | |
| 114 remove: function(filter) | |
| 115 { | |
| 116 if (!(filter.text in this._rules)) | |
| 117 return; | |
| 118 | |
| 119 var rule = this._rules[filter.text]; | |
| 120 opera.extension.urlfilter[rule.type].remove(rule.text); | |
| 121 delete this._rules[filter.text]; | |
| 122 }, | |
| 123 | |
| 124 clear: function(filter) | |
| 125 { | |
| 126 for (var text in this._rules) | |
| 127 { | |
| 128 var rule = this._rules[text]; | |
| 129 opera.extension.urlfilter[rule.type].remove(rule); | |
|
Felix Dahlke
2012/10/10 12:11:22
Shouldn't this be "remove(text)"?
| |
| 130 } | |
| 131 this._rules = {}; | |
| 132 } | |
| 133 } | |
| 134 }; | |
| 135 })(); | |
| OLD | NEW |