32 @signal rulesChanged() emitted after the subscription's rules have changed |
32 @signal rulesChanged() emitted after the subscription's rules have changed |
33 """ |
33 """ |
34 changed = pyqtSignal() |
34 changed = pyqtSignal() |
35 rulesChanged = pyqtSignal() |
35 rulesChanged = pyqtSignal() |
36 |
36 |
37 def __init__(self, url, parent=None, default=False): |
37 def __init__(self, url, custom, parent=None, default=False): |
38 """ |
38 """ |
39 Constructor |
39 Constructor |
40 |
40 |
41 @param url AdBlock URL for the subscription (QUrl) |
41 @param url AdBlock URL for the subscription (QUrl) |
|
42 @param custom flag indicating a custom subscription (boolean) |
42 @param parent reference to the parent object (QObject) |
43 @param parent reference to the parent object (QObject) |
43 @param default flag indicating a default subscription (Boolean) |
44 @param default flag indicating a default subscription (boolean) |
44 """ |
45 """ |
45 super().__init__(parent) |
46 super().__init__(parent) |
46 |
47 |
|
48 self.__custom = custom |
47 self.__url = url.toEncoded() |
49 self.__url = url.toEncoded() |
48 self.__enabled = False |
50 self.__enabled = False |
49 self.__downloading = None |
51 self.__downloading = None |
50 self.__defaultSubscription = default |
52 self.__defaultSubscription = default |
51 |
53 |
52 self.__title = "" |
54 self.__title = "" |
53 self.__location = QByteArray() |
55 self.__location = QByteArray() |
54 self.__lastUpdate = QDateTime() |
56 self.__lastUpdate = QDateTime() |
|
57 self.__requiresLocation = "" |
|
58 self.__requiresTitle = "" |
55 |
59 |
56 self.__rules = [] # list containing all AdBlock rules |
60 self.__rules = [] # list containing all AdBlock rules |
57 |
61 |
58 self.__networkExceptionRules = [] |
62 self.__networkExceptionRules = [] |
59 self.__networkBlockRules = [] |
63 self.__networkBlockRules = [] |
|
64 self.__domainRestrictedCssRules = [] |
|
65 self.__elementHidingRules = "" |
|
66 self.__documentRules = [] |
|
67 self.__elemhideRules = [] |
60 |
68 |
61 self.__parseUrl(url) |
69 self.__parseUrl(url) |
62 |
70 |
63 def __parseUrl(self, url): |
71 def __parseUrl(self, url): |
64 """ |
72 """ |
77 self.__enabled = \ |
85 self.__enabled = \ |
78 QUrl.fromPercentEncoding(url.encodedQueryItemValue("enabled")) != "false" |
86 QUrl.fromPercentEncoding(url.encodedQueryItemValue("enabled")) != "false" |
79 self.__location = \ |
87 self.__location = \ |
80 QByteArray(QUrl.fromPercentEncoding(url.encodedQueryItemValue("location"))) |
88 QByteArray(QUrl.fromPercentEncoding(url.encodedQueryItemValue("location"))) |
81 |
89 |
|
90 # Check for required subscription |
|
91 self.__requiresLocation = \ |
|
92 QUrl.fromPercentEncoding(url.encodedQueryItemValue("requiresLocation")) |
|
93 self.__requiresTitle = \ |
|
94 QUrl.fromPercentEncoding(url.encodedQueryItemValue("requiresTitle")) |
|
95 if self.__requiresLocation and self.__requiresTitle: |
|
96 Helpviewer.HelpWindow.HelpWindow.adBlockManager().loadRequiredSubscription( |
|
97 self.__requiresLocation, self.__requiresTitle) |
|
98 |
82 lastUpdateByteArray = url.encodedQueryItemValue("lastUpdate") |
99 lastUpdateByteArray = url.encodedQueryItemValue("lastUpdate") |
83 lastUpdateString = QUrl.fromPercentEncoding(lastUpdateByteArray) |
100 lastUpdateString = QUrl.fromPercentEncoding(lastUpdateByteArray) |
84 self.__lastUpdate = QDateTime.fromString(lastUpdateString, Qt.ISODate) |
101 self.__lastUpdate = QDateTime.fromString(lastUpdateString, Qt.ISODate) |
|
102 ## if lastUpdateString: |
|
103 ## self.__lastUpdate = QDateTime.fromString(lastUpdateString, Qt.ISODate) |
|
104 ## else: |
|
105 ## self.__lastUpdate = QDateTime.currentDateTime() |
85 |
106 |
86 self.__loadRules() |
107 self.__loadRules() |
87 |
108 |
88 def url(self): |
109 def url(self): |
89 """ |
110 """ |
96 url.setPath("subscribe") |
117 url.setPath("subscribe") |
97 |
118 |
98 queryItems = [] |
119 queryItems = [] |
99 queryItems.append(("location", bytes(self.__location).decode())) |
120 queryItems.append(("location", bytes(self.__location).decode())) |
100 queryItems.append(("title", self.__title)) |
121 queryItems.append(("title", self.__title)) |
|
122 if self.__requiresLocation and self.__requiresTitle: |
|
123 queryItems.append(("requiresLocation", self.__requiresLocation)) |
|
124 queryItems.append(("requiresTitle", self.__requiresTitle)) |
101 if not self.__enabled: |
125 if not self.__enabled: |
102 queryItems.append(("enabled", "false")) |
126 queryItems.append(("enabled", "false")) |
103 if self.__lastUpdate.isValid(): |
127 if self.__lastUpdate.isValid(): |
104 queryItems.append(("lastUpdate", |
128 queryItems.append(("lastUpdate", |
105 self.__lastUpdate.toString(Qt.ISODate))) |
129 self.__lastUpdate.toString(Qt.ISODate))) |
165 return |
187 return |
166 |
188 |
167 self.__location = url.toEncoded() |
189 self.__location = url.toEncoded() |
168 self.__lastUpdate = QDateTime() |
190 self.__lastUpdate = QDateTime() |
169 self.changed.emit() |
191 self.changed.emit() |
|
192 |
|
193 def requiresLocation(self): |
|
194 """ |
|
195 Public method to get the location of a required subscription. |
|
196 |
|
197 @return location of a required subscription (string) |
|
198 """ |
|
199 return self.__requiresLocation |
170 |
200 |
171 def lastUpdate(self): |
201 def lastUpdate(self): |
172 """ |
202 """ |
173 Public method to get the date and time of the last update. |
203 Public method to get the date and time of the last update. |
174 |
204 |
251 return |
281 return |
252 |
282 |
253 if self.location().scheme() == "file": |
283 if self.location().scheme() == "file": |
254 self.__lastUpdate = QDateTime.currentDateTime() |
284 self.__lastUpdate = QDateTime.currentDateTime() |
255 self.__loadRules() |
285 self.__loadRules() |
256 self.changed.emit() |
|
257 return |
286 return |
258 |
287 |
259 self.__downloading = FollowRedirectReply(self.location(), |
288 self.__downloading = FollowRedirectReply(self.location(), |
260 Helpviewer.HelpWindow.HelpWindow.networkAccessManager()) |
289 Helpviewer.HelpWindow.HelpWindow.networkAccessManager()) |
261 self.__downloading.finished[()].connect(self.__rulesDownloaded) |
290 self.__downloading.finished[()].connect(self.__rulesDownloaded) |
317 self.trUtf8("""Unable to open adblock file '{0}' for writing.""")\ |
345 self.trUtf8("""Unable to open adblock file '{0}' for writing.""")\ |
318 .format(fileName)) |
346 .format(fileName)) |
319 return |
347 return |
320 |
348 |
321 textStream = QTextStream(f) |
349 textStream = QTextStream(f) |
322 textStream << "[Adblock Plus 0.7.1]\n" |
350 textStream << "[Adblock Plus 1.1.1]\n" |
323 for rule in self.__rules: |
351 for rule in self.__rules: |
324 textStream << rule.filter() << "\n" |
352 textStream << rule.filter() << "\n" |
325 |
353 |
326 def match(self, req, urlDomain, urlString): |
354 def match(self, req, urlDomain, urlString): |
327 """ |
355 """ |
392 if rule.matchDomain(domain): |
420 if rule.matchDomain(domain): |
393 rules += rule.cssSelector() + "," |
421 rules += rule.cssSelector() + "," |
394 |
422 |
395 return rules |
423 return rules |
396 |
424 |
|
425 def rule(self, offset): |
|
426 """ |
|
427 Public method to get a specific rule. |
|
428 |
|
429 @param offset offset of the rule (integer) |
|
430 @return requested rule (AdBlockRule) |
|
431 """ |
|
432 if offset >= len(self.__rules): |
|
433 return None |
|
434 |
|
435 return self.__rules[offset] |
|
436 |
397 def allRules(self): |
437 def allRules(self): |
398 """ |
438 """ |
399 Public method to get the list of rules. |
439 Public method to get the list of rules. |
400 |
440 |
401 @return list of rules (list of AdBlockRule) |
441 @return list of rules (list of AdBlockRule) |
405 def addRule(self, rule): |
445 def addRule(self, rule): |
406 """ |
446 """ |
407 Public method to add a rule. |
447 Public method to add a rule. |
408 |
448 |
409 @param rule reference to the rule to add (AdBlockRule) |
449 @param rule reference to the rule to add (AdBlockRule) |
|
450 @return offset of the rule (integer) |
410 """ |
451 """ |
411 self.__rules.append(rule) |
452 self.__rules.append(rule) |
412 self.__populateCache() |
453 self.__populateCache() |
413 self.rulesChanged.emit() |
454 self.rulesChanged.emit() |
|
455 |
|
456 return len(self.__rules) - 1 |
414 |
457 |
415 def removeRule(self, offset): |
458 def removeRule(self, offset): |
416 """ |
459 """ |
417 Public method to remove a rule given the offset. |
460 Public method to remove a rule given the offset. |
418 |
461 |
429 """ |
472 """ |
430 Public method to replace a rule given the offset. |
473 Public method to replace a rule given the offset. |
431 |
474 |
432 @param rule reference to the rule to set (AdBlockRule) |
475 @param rule reference to the rule to set (AdBlockRule) |
433 @param offset offset of the rule to remove (integer) |
476 @param offset offset of the rule to remove (integer) |
434 """ |
477 @return requested rule (AdBlockRule) |
|
478 """ |
|
479 if offset >= len(self.__rules): |
|
480 return None |
|
481 |
435 self.__rules[offset] = rule |
482 self.__rules[offset] = rule |
436 self.__populateCache() |
483 self.__populateCache() |
437 self.rulesChanged.emit() |
484 self.rulesChanged.emit() |
|
485 |
|
486 return self.__rules[offset] |
438 |
487 |
439 def __populateCache(self): |
488 def __populateCache(self): |
440 """ |
489 """ |
441 Private method to populate the various rule caches. |
490 Private method to populate the various rule caches. |
442 """ |
491 """ |
462 self.__elemhideRules.append(rule) |
511 self.__elemhideRules.append(rule) |
463 elif rule.isException(): |
512 elif rule.isException(): |
464 self.__networkExceptionRules.append(rule) |
513 self.__networkExceptionRules.append(rule) |
465 else: |
514 else: |
466 self.__networkBlockRules.append(rule) |
515 self.__networkBlockRules.append(rule) |
|
516 |
|
517 def canEditRules(self): |
|
518 """ |
|
519 Public method to check, if rules can be edited. |
|
520 |
|
521 @return flag indicating rules may be edited (boolean) |
|
522 """ |
|
523 return self.__custom |
|
524 |
|
525 def canBeRemoved(self): |
|
526 """ |
|
527 Public method to check, if the subscription can be removed. |
|
528 |
|
529 @return flag indicating removal is allowed (boolean) |
|
530 """ |
|
531 return not self.__custom and not self.__defaultSubscription |
|
532 |
|
533 def setRuleEnabled(self, offset, enabled): |
|
534 """ |
|
535 Public method to enable a specific rule. |
|
536 |
|
537 @param offset offset of the rule (integer) |
|
538 @param enabled new enabled state (boolean) |
|
539 @return reference to the changed rule (AdBlockRule) |
|
540 """ |
|
541 if offset >= len(self.__rules): |
|
542 return None |
|
543 |
|
544 rule = self.__rules[offset] |
|
545 rule.setEnabled(enabled) |
|
546 if rule.isCSSRule(): |
|
547 self.__populateCache() |
|
548 Helpviewer.HelpWindow.HelpWindow.mainWindow().reloadUserStyleSheet() |
|
549 |
|
550 return rule |