Helpviewer/AdBlock/AdBlockSubscription.py

changeset 1970
02cf3bac079b
parent 1963
9c5b3235abf9
child 1971
a68d78702c98
equal deleted inserted replaced
1969:5522b3266c8b 1970:02cf3bac079b
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)))
122 """ 146 """
123 if self.__enabled == enabled: 147 if self.__enabled == enabled:
124 return 148 return
125 149
126 self.__enabled = enabled 150 self.__enabled = enabled
127 self.__populateCache()
128 self.changed.emit()
129 151
130 def title(self): 152 def title(self):
131 """ 153 """
132 Public method to get the subscription title. 154 Public method to get the subscription title.
133 155
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)
297 .file(fileName)) 326 .file(fileName))
298 return 327 return
299 f.write(response) 328 f.write(response)
300 self.__lastUpdate = QDateTime.currentDateTime() 329 self.__lastUpdate = QDateTime.currentDateTime()
301 self.__loadRules() 330 self.__loadRules()
302 self.changed.emit()
303 self.__downloading = None 331 self.__downloading = None
304 332
305 def saveRules(self): 333 def saveRules(self):
306 """ 334 """
307 Public method to save the subscription rules. 335 Public method to save the subscription rules.
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

eric ide

mercurial