Расширения для hackwrench
Захотелось сделать простые, но удобные расширения для hackwrench.
Первое что пришло на ум — создать базовый класс, например PluginBase, от которого будут наследоваться все расширения. В нужный момент мы можем получить список загруженных расширений вызвав PluginBase.__subclasses__()
Как-нибудь так: self.plugins = [plugin(self) for plugin in PluginBase.__subclasses__()]
В PluginBase мы определяем перечисляем все возможные методы, а конструктор его может выглядить как-нибудь так:
def __init__(self, parent):
self.parent = parent
for k, f in self.__class__.__dict__.items():
if not k.startswith('_') and k in PluginBase.__dict__:
print 'Found BasePlugin method %s in %r' % (k, self)
В моем браузере такой базовый класс называется hackwrench.browser.BrowserPlugin, его методы соответствуют сигналам webkit.WebView, только вместо дефиса — подчеркивание. Например сигналу load-finished соответствует load_finished; title-changed — title_changed и т.п.
Полный список: console_message, create_web_view, download_requested, hovering_over_link, icon_loaded, load_committed, load_error, load_finished, load_progress_changed, load_started, populate_popup, script_alert, title_changed
Для удобства, я сделал декоратор BrowserPlugin.stop, который делает для соотв. сигнала stop_emission — если хочется чтобы встроенный обработчик сигнала(и из других расширений) не сработал.
Пример:
from hackwrench.browser import BrowserPlugin
class Example(BrowserPlugin):
def title_changed(self, view, frame, title):
print 'Title changed', title
@BrowserPlugin.stop
def download_requested(self, view, download):
print 'Download blocked', download.get_uri()
@BrowserPlugin.stop
def script_alert(self, view, frame, msg):
""" javascript alert просто выводим в консоль; никаких диалоговых окон не показываем """
print 'Javascript alert', msg
Расширения должны лежать в ~/.hackwrench/extensions или глобально — в подкаталоге extensions самого hackwrench.
Более сложные расширения можно посмотреть в исходниках, в каталоге extensions: поддержка userscripts и “открыть все выделенные ссылки в новых вкладках”






Comments