Make a webengine utils module

This commit is contained in:
Kovid Goyal 2018-07-27 22:02:44 +05:30
parent 561edbe1ea
commit 38836de4e1
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 48 additions and 23 deletions

View File

@ -17,8 +17,8 @@ from functools import partial
from threading import Thread from threading import Thread
from PyQt5.Qt import ( from PyQt5.Qt import (
QApplication, QBuffer, QByteArray, QFile, QIcon, QMenu, QSize, QTimer, QToolBar, QObject, QApplication, QBuffer, QByteArray, QFile, QIcon, QMenu, QObject, QSize, QTimer,
QUrl, QVBoxLayout, QWidget, pyqtSignal, pyqtSlot QToolBar, QUrl, QVBoxLayout, QWidget, pyqtSignal, pyqtSlot
) )
from PyQt5.QtWebChannel import QWebChannel from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler
@ -32,8 +32,9 @@ from calibre.constants import (
) )
from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, serialize from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, serialize
from calibre.ebooks.oeb.polish.parsing import parse from calibre.ebooks.oeb.polish.parsing import parse
from calibre.gui2 import NO_URL_FORMATTING, error_dialog, open_url, secure_webengine from calibre.gui2 import NO_URL_FORMATTING, error_dialog, open_url
from calibre.gui2.tweak_book import TOP, actions, current_container, editors, tprefs from calibre.gui2.tweak_book import TOP, actions, current_container, editors, tprefs
from calibre.gui2.webengine import create_script, insert_scripts, secure_webengine
from calibre.gui2.widgets2 import HistoryLineEdit2 from calibre.gui2.widgets2 import HistoryLineEdit2
from calibre.utils.ipc.simple_worker import offload_worker from calibre.utils.ipc.simple_worker import offload_worker
from polyglot.builtins import native_string_type, unicode_type from polyglot.builtins import native_string_type, unicode_type
@ -250,25 +251,6 @@ def uniq(vals):
return tuple(x for x in vals if x not in seen and not seen_add(x)) return tuple(x for x in vals if x not in seen and not seen_add(x))
def insert_scripts(profile, *scripts):
sc = profile.scripts()
for script in scripts:
for existing in sc.findScripts(script.name()):
sc.remove(existing)
for script in scripts:
sc.insert(script)
def create_script(name, src, world=QWebEngineScript.ApplicationWorld, injection_point=QWebEngineScript.DocumentReady, on_subframes=True):
script = QWebEngineScript()
script.setSourceCode(src)
script.setName(name)
script.setWorldId(world)
script.setInjectionPoint(injection_point)
script.setRunsOnSubFrames(on_subframes)
return script
def create_profile(): def create_profile():
ans = getattr(create_profile, 'ans', None) ans = getattr(create_profile, 'ans', None)
if ans is None: if ans is None:

View File

@ -28,7 +28,8 @@ from calibre.constants import DEBUG
from calibre.ebooks.oeb.polish.report import ( from calibre.ebooks.oeb.polish.report import (
gather_data, CSSEntry, CSSFileMatch, MatchLocation, ClassEntry, gather_data, CSSEntry, CSSFileMatch, MatchLocation, ClassEntry,
ClassFileMatch, ClassElement, CSSRule, LinkLocation) ClassFileMatch, ClassElement, CSSRule, LinkLocation)
from calibre.gui2 import error_dialog, question_dialog, choose_save_file, open_url, secure_webengine from calibre.gui2 import error_dialog, question_dialog, choose_save_file, open_url
from calibre.gui2.webengine import secure_webengine
from calibre.gui2.tweak_book import current_container, tprefs, dictionaries from calibre.gui2.tweak_book import current_container, tprefs, dictionaries
from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.tweak_book.widgets import Dialog
from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.progress_indicator import ProgressIndicator

View File

@ -0,0 +1,42 @@
#!/usr/bin/env python2
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
from __future__ import absolute_import, division, print_function, unicode_literals
from PyQt5.QtWebEngineWidgets import QWebEngineScript
def secure_webengine(view_or_page_or_settings, for_viewer=False):
s = view_or_page_or_settings.settings() if hasattr(
view_or_page_or_settings, 'settings') else view_or_page_or_settings
a = s.setAttribute
a(s.PluginsEnabled, False)
if not for_viewer:
a(s.JavascriptEnabled, False)
s.setUnknownUrlSchemePolicy(s.DisallowUnknownUrlSchemes)
a(s.JavascriptCanOpenWindows, False)
a(s.JavascriptCanAccessClipboard, False)
# ensure javascript cannot read from local files
a(s.LocalContentCanAccessFileUrls, False)
a(s.AllowWindowActivationFromJavaScript, False)
return s
def insert_scripts(profile, *scripts):
sc = profile.scripts()
for script in scripts:
for existing in sc.findScripts(script.name()):
sc.remove(existing)
for script in scripts:
sc.insert(script)
def create_script(name, src, world=QWebEngineScript.ApplicationWorld, injection_point=QWebEngineScript.DocumentReady, on_subframes=True):
script = QWebEngineScript()
script.setSourceCode(src)
script.setName(name)
script.setWorldId(world)
script.setInjectionPoint(injection_point)
script.setRunsOnSubFrames(on_subframes)
return script