mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
DRYer
This commit is contained in:
parent
fb60925df3
commit
0c8af8c6b6
@ -165,20 +165,15 @@ def render_html_data(path_to_html, width, height):
|
|||||||
|
|
||||||
def render_html(path_to_html, width=590, height=750, as_xhtml=True):
|
def render_html(path_to_html, width=590, height=750, as_xhtml=True):
|
||||||
from PyQt5.QtWebKitWidgets import QWebPage
|
from PyQt5.QtWebKitWidgets import QWebPage
|
||||||
from PyQt5.QtWebKit import QWebSettings
|
|
||||||
from PyQt5.Qt import QEventLoop, QPalette, Qt, QUrl, QSize
|
from PyQt5.Qt import QEventLoop, QPalette, Qt, QUrl, QSize
|
||||||
from calibre.gui2 import is_ok_to_use_qt
|
from calibre.gui2 import is_ok_to_use_qt, secure_web_page
|
||||||
if not is_ok_to_use_qt():
|
if not is_ok_to_use_qt():
|
||||||
return None
|
return None
|
||||||
path_to_html = os.path.abspath(path_to_html)
|
path_to_html = os.path.abspath(path_to_html)
|
||||||
with CurrentDir(os.path.dirname(path_to_html)):
|
with CurrentDir(os.path.dirname(path_to_html)):
|
||||||
page = QWebPage()
|
page = QWebPage()
|
||||||
settings = page.settings()
|
settings = page.settings()
|
||||||
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
secure_web_page(settings)
|
||||||
settings.setAttribute(QWebSettings.PluginsEnabled, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
|
|
||||||
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
|
|
||||||
pal = page.palette()
|
pal = page.palette()
|
||||||
pal.setBrush(QPalette.Background, Qt.white)
|
pal.setBrush(QPalette.Background, Qt.white)
|
||||||
page.setPalette(pal)
|
page.setPalette(pal)
|
||||||
|
@ -19,6 +19,7 @@ class HTMLTableRenderer(QObject):
|
|||||||
`width, height`: page width and height in pixels
|
`width, height`: page width and height in pixels
|
||||||
`base_dir`: The directory in which the HTML file that contains the table resides
|
`base_dir`: The directory in which the HTML file that contains the table resides
|
||||||
'''
|
'''
|
||||||
|
from calibre.gui2 import secure_web_page
|
||||||
QObject.__init__(self)
|
QObject.__init__(self)
|
||||||
|
|
||||||
self.app = None
|
self.app = None
|
||||||
@ -28,6 +29,7 @@ class HTMLTableRenderer(QObject):
|
|||||||
self.tdir = tempfile.mkdtemp(prefix='calibre_render_table')
|
self.tdir = tempfile.mkdtemp(prefix='calibre_render_table')
|
||||||
self.loop = QEventLoop()
|
self.loop = QEventLoop()
|
||||||
self.page = QWebPage()
|
self.page = QWebPage()
|
||||||
|
secure_web_page(self.page.settings())
|
||||||
self.page.loadFinished.connect(self.render_html)
|
self.page.loadFinished.connect(self.render_html)
|
||||||
self.page.mainFrame().setTextSizeMultiplier(factor)
|
self.page.mainFrame().setTextSizeMultiplier(factor)
|
||||||
self.page.mainFrame().setHtml(html,
|
self.page.mainFrame().setHtml(html,
|
||||||
|
@ -65,6 +65,7 @@ def get_page_size(opts, for_comic=False): # {{{
|
|||||||
class Page(QWebPage): # {{{
|
class Page(QWebPage): # {{{
|
||||||
|
|
||||||
def __init__(self, opts, log):
|
def __init__(self, opts, log):
|
||||||
|
from calibre.gui2 import secure_web_page
|
||||||
self.log = log
|
self.log = log
|
||||||
QWebPage.__init__(self)
|
QWebPage.__init__(self)
|
||||||
settings = self.settings()
|
settings = self.settings()
|
||||||
@ -74,11 +75,7 @@ class Page(QWebPage): # {{{
|
|||||||
opts.pdf_mono_font_size)
|
opts.pdf_mono_font_size)
|
||||||
settings.setFontSize(QWebSettings.MinimumLogicalFontSize, 8)
|
settings.setFontSize(QWebSettings.MinimumLogicalFontSize, 8)
|
||||||
settings.setFontSize(QWebSettings.MinimumFontSize, 8)
|
settings.setFontSize(QWebSettings.MinimumFontSize, 8)
|
||||||
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
secure_web_page(settings)
|
||||||
settings.setAttribute(QWebSettings.PluginsEnabled, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
|
|
||||||
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
|
|
||||||
|
|
||||||
std = {'serif':opts.pdf_serif_family, 'sans':opts.pdf_sans_family,
|
std = {'serif':opts.pdf_serif_family, 'sans':opts.pdf_sans_family,
|
||||||
'mono':opts.pdf_mono_family}.get(opts.pdf_standard_font,
|
'mono':opts.pdf_mono_family}.get(opts.pdf_standard_font,
|
||||||
|
@ -106,9 +106,11 @@ def draw_image_page(printer, painter, p, preserve_aspect_ratio=True):
|
|||||||
class Page(QWebPage): # {{{
|
class Page(QWebPage): # {{{
|
||||||
|
|
||||||
def __init__(self, opts, log):
|
def __init__(self, opts, log):
|
||||||
|
from calibre.gui2 import secure_web_page
|
||||||
self.log = log
|
self.log = log
|
||||||
QWebPage.__init__(self)
|
QWebPage.__init__(self)
|
||||||
settings = self.settings()
|
settings = self.settings()
|
||||||
|
secure_web_page(settings)
|
||||||
settings.setFontSize(QWebSettings.DefaultFontSize,
|
settings.setFontSize(QWebSettings.DefaultFontSize,
|
||||||
opts.pdf_default_font_size)
|
opts.pdf_default_font_size)
|
||||||
settings.setFontSize(QWebSettings.DefaultFixedFontSize,
|
settings.setFontSize(QWebSettings.DefaultFixedFontSize,
|
||||||
@ -396,5 +398,3 @@ class ImagePDFWriter(object): # {{{
|
|||||||
painter.end()
|
painter.end()
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1401,3 +1401,16 @@ def event_type_name(ev_or_etype):
|
|||||||
if num == etype:
|
if num == etype:
|
||||||
return name
|
return name
|
||||||
return 'UnknownEventType'
|
return 'UnknownEventType'
|
||||||
|
|
||||||
|
|
||||||
|
def secure_web_page(qwebpage_or_qwebsettings):
|
||||||
|
from PyQt5.QtWebKit import QWebSettings
|
||||||
|
settings = qwebpage_or_qwebsettings if isinstance(qwebpage_or_qwebsettings, QWebSettings) else qwebpage_or_qwebsettings.settings()
|
||||||
|
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
||||||
|
settings.setAttribute(QWebSettings.PluginsEnabled, False)
|
||||||
|
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
|
||||||
|
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
|
||||||
|
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
|
||||||
|
settings.setAttribute(QWebSettings.NotificationsEnabled, False)
|
||||||
|
settings.setThirdPartyCookiePolicy(QWebSettings.AlwaysBlockThirdPartyCookies)
|
||||||
|
return settings
|
||||||
|
@ -19,7 +19,7 @@ from PyQt5.QtWebKitWidgets import QWebView, QWebPage
|
|||||||
|
|
||||||
from calibre.ebooks.chardet import xml_to_unicode
|
from calibre.ebooks.chardet import xml_to_unicode
|
||||||
from calibre import xml_replace_entities, prepare_string_for_xml
|
from calibre import xml_replace_entities, prepare_string_for_xml
|
||||||
from calibre.gui2 import open_url, error_dialog, choose_files, gprefs, NO_URL_FORMATTING
|
from calibre.gui2 import open_url, error_dialog, choose_files, gprefs, NO_URL_FORMATTING, secure_web_page
|
||||||
from calibre.utils.soupparser import fromstring
|
from calibre.utils.soupparser import fromstring
|
||||||
from calibre.utils.config import tweaks
|
from calibre.utils.config import tweaks
|
||||||
from calibre.utils.imghdr import what
|
from calibre.utils.imghdr import what
|
||||||
@ -171,6 +171,7 @@ class EditorWidget(QWebView): # {{{
|
|||||||
|
|
||||||
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
|
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
|
||||||
self.page().linkClicked.connect(self.link_clicked)
|
self.page().linkClicked.connect(self.link_clicked)
|
||||||
|
secure_web_page(self.page().settings())
|
||||||
|
|
||||||
self.setHtml('')
|
self.setHtml('')
|
||||||
self.set_readonly(False)
|
self.set_readonly(False)
|
||||||
@ -412,6 +413,8 @@ class EditorWidget(QWebView): # {{{
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Highlighter {{{
|
# Highlighter {{{
|
||||||
|
|
||||||
|
|
||||||
State_Text = -1
|
State_Text = -1
|
||||||
State_DocType = 0
|
State_DocType = 0
|
||||||
State_Comment = 1
|
State_Comment = 1
|
||||||
@ -791,6 +794,7 @@ class Editor(QWidget): # {{{
|
|||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app = QApplication([])
|
app = QApplication([])
|
||||||
w = Editor()
|
w = Editor()
|
||||||
|
@ -17,7 +17,7 @@ from PyQt5.QtWebKitWidgets import QWebView, QWebPage
|
|||||||
from PyQt5.QtWebKit import QWebElement
|
from PyQt5.QtWebKit import QWebElement
|
||||||
|
|
||||||
from calibre.ebooks.oeb.display.webview import load_html
|
from calibre.ebooks.oeb.display.webview import load_html
|
||||||
from calibre.gui2 import error_dialog, question_dialog, gprefs
|
from calibre.gui2 import error_dialog, question_dialog, gprefs, secure_web_page
|
||||||
from calibre.utils.logging import default_log
|
from calibre.utils.logging import default_log
|
||||||
|
|
||||||
|
|
||||||
@ -28,6 +28,7 @@ class Page(QWebPage): # {{{
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.log = default_log
|
self.log = default_log
|
||||||
QWebPage.__init__(self)
|
QWebPage.__init__(self)
|
||||||
|
secure_web_page(self.settings())
|
||||||
self.js = None
|
self.js = None
|
||||||
self.evaljs = self.mainFrame().evaluateJavaScript
|
self.evaljs = self.mainFrame().evaluateJavaScript
|
||||||
self.bridge_value = None
|
self.bridge_value = None
|
||||||
|
@ -25,7 +25,7 @@ from calibre import prints
|
|||||||
from calibre.constants import FAKE_PROTOCOL, FAKE_HOST
|
from calibre.constants import FAKE_PROTOCOL, FAKE_HOST
|
||||||
from calibre.ebooks.oeb.polish.parsing import parse
|
from calibre.ebooks.oeb.polish.parsing import parse
|
||||||
from calibre.ebooks.oeb.base import serialize, OEB_DOCS
|
from calibre.ebooks.oeb.base import serialize, OEB_DOCS
|
||||||
from calibre.gui2 import error_dialog, open_url, NO_URL_FORMATTING
|
from calibre.gui2 import error_dialog, open_url, NO_URL_FORMATTING, secure_web_page
|
||||||
from calibre.gui2.tweak_book import current_container, editors, tprefs, actions, TOP
|
from calibre.gui2.tweak_book import current_container, editors, tprefs, actions, TOP
|
||||||
from calibre.gui2.viewer.documentview import apply_settings
|
from calibre.gui2.viewer.documentview import apply_settings
|
||||||
from calibre.gui2.viewer.config import config
|
from calibre.gui2.viewer.config import config
|
||||||
@ -262,12 +262,8 @@ class WebPage(QWebPage):
|
|||||||
settings = self.settings()
|
settings = self.settings()
|
||||||
apply_settings(settings, config().parse())
|
apply_settings(settings, config().parse())
|
||||||
settings.setMaximumPagesInCache(0)
|
settings.setMaximumPagesInCache(0)
|
||||||
settings.setAttribute(settings.JavaEnabled, False)
|
secure_web_page(settings)
|
||||||
settings.setAttribute(settings.PluginsEnabled, False)
|
|
||||||
settings.setAttribute(settings.PrivateBrowsingEnabled, True)
|
settings.setAttribute(settings.PrivateBrowsingEnabled, True)
|
||||||
settings.setAttribute(settings.JavascriptCanOpenWindows, False)
|
|
||||||
settings.setAttribute(settings.JavascriptCanAccessClipboard, False)
|
|
||||||
settings.setAttribute(settings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
|
|
||||||
settings.setAttribute(settings.LinksIncludedInFocusChain, False)
|
settings.setAttribute(settings.LinksIncludedInFocusChain, False)
|
||||||
settings.setAttribute(settings.DeveloperExtrasEnabled, True)
|
settings.setAttribute(settings.DeveloperExtrasEnabled, True)
|
||||||
settings.setDefaultTextEncoding('utf-8')
|
settings.setDefaultTextEncoding('utf-8')
|
||||||
|
@ -18,7 +18,7 @@ from PyQt5.QtWebKit import QWebSettings, QWebElement
|
|||||||
|
|
||||||
from calibre.gui2.viewer.flip import SlideFlip
|
from calibre.gui2.viewer.flip import SlideFlip
|
||||||
from calibre.gui2.shortcuts import Shortcuts
|
from calibre.gui2.shortcuts import Shortcuts
|
||||||
from calibre.gui2 import open_url
|
from calibre.gui2 import open_url, secure_web_page
|
||||||
from calibre import prints
|
from calibre import prints
|
||||||
from calibre.customize.ui import all_viewer_plugins
|
from calibre.customize.ui import all_viewer_plugins
|
||||||
from calibre.gui2.viewer.keys import SHORTCUTS
|
from calibre.gui2.viewer.keys import SHORTCUTS
|
||||||
@ -48,16 +48,9 @@ def apply_settings(settings, opts):
|
|||||||
|
|
||||||
|
|
||||||
def apply_basic_settings(settings):
|
def apply_basic_settings(settings):
|
||||||
# Security
|
secure_web_page(settings)
|
||||||
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
|
||||||
settings.setAttribute(QWebSettings.PluginsEnabled, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
|
|
||||||
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
|
|
||||||
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
|
|
||||||
# PrivateBrowsing disables console messages
|
# PrivateBrowsing disables console messages
|
||||||
# settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True)
|
# settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True)
|
||||||
settings.setAttribute(QWebSettings.NotificationsEnabled, False)
|
|
||||||
settings.setThirdPartyCookiePolicy(QWebSettings.AlwaysBlockThirdPartyCookies)
|
|
||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user