def _set_style(self): user_content = self.get_user_content_manager() user_content.remove_all_style_sheets() gfile = Gio.File.new_for_uri( 'resource:///com/github/hugolabe/Wike/styles/view.min.css') try: gfile_contents = gfile.load_contents(None) except: print('Can\'t load css file from resources') return else: css_view = gfile_contents[1].decode('utf-8') style_view = WebKit2.UserStyleSheet( css_view, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) user_content.add_style_sheet(style_view) if settings.get_boolean('custom-font'): css_font = 'body,h1,h2{font-family:"' + settings.get_string( 'font-family') + '"!important}' style_font = WebKit2.UserStyleSheet( css_font, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) user_content.add_style_sheet(style_font)
def load_node(self, node, line=0, retrace=True): # TODO: Needs error handling! self.webview.load_uri('file://' + temp_dir + '/' + self.current_database.database + '/' + node.name + '.html') self.set_title(node.title) font_family = 'font-family: ' '' + self.current_database.font + ';' font_size = 'font-size: ''' + \ str(self.current_database.font_size) + 'px;' if self.current_database.wordwrap: white_space = 'white-space: pre-wrap;' else: white_space = 'white-space: pre;' self.webview.get_user_content_manager().add_style_sheet( WebKit2.UserStyleSheet( 'html {' + font_family + font_size + white_space + '}', injected_frames=WebKit2.UserContentInjectedFrames.ALL_FRAMES, level=WebKit2.UserStyleLevel.USER)) if retrace: self.history.append(self.current_node) self.update_buttons(node) self.current_node = node # self.webview.run_javascript('alert_box();') return True
def setup_content_manager(self): # Inject styles and functions content_manager = self.webview.get_user_content_manager() # with open('normalize.css', 'r') as style: # content_manager.add_style_sheet(WebKit2.UserStyleSheet(style.read( # ), injected_frames=WebKit2.UserContentInjectedFrames.ALL_FRAMES, level=WebKit2.UserStyleLevel.USER)) with open('style.css', 'r') as style: content_manager.add_style_sheet( WebKit2.UserStyleSheet(style.read(), injected_frames=WebKit2. UserContentInjectedFrames.ALL_FRAMES, level=WebKit2.UserStyleLevel.USER)) with open('functions.js', 'r') as functions: content_manager.add_script( WebKit2.UserScript( source=functions.read(), injected_frames=WebKit2.UserContentInjectedFrames. ALL_FRAMES, injection_time=WebKit2.UserScriptInjectionTime.END)) # Callback function for links (overriding html links) content_manager.register_script_message_handler('signal') content_manager.connect('script-message-received::signal', link_receiver)
def update_settings_for_uri(self, uri): """ Update internal settings for URI @param uri as str """ parsed = urlparse(uri) http_scheme = parsed.scheme in ["http", "https"] App().history.set_page_state(uri) self.__switch_profile(uri) self.__update_bookmark_metadata(uri) self.content_manager.remove_all_style_sheets() # Can't find a way to block content for ephemeral views if App().settings.get_value("adblock") and\ not App().adblock_exceptions.find_parsed(parsed) and\ http_scheme and\ self.content_manager is not None: self.content_manager.add_style_sheet(App().default_style_sheet) rules = App().adblock.get_css_rules(uri) user_style_sheet = WebKit2.UserStyleSheet( rules, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.content_manager.add_style_sheet(user_style_sheet) user_agent = App().websettings.get_user_agent(uri) settings = self.get_settings() if user_agent: settings.set_user_agent(user_agent) else: settings.set_user_agent_with_application_details("Eolie", None) # Setup image blocker block_image = http_scheme and\ App().settings.get_value("imageblock") and\ not App().image_exceptions.find_parsed(parsed) self.set_setting("auto-load-images", not block_image)
def _build_ui(self): self.set_position(Gtk.WindowPosition.CENTER) # Create HeaderBar headerbar = Gtk.HeaderBar() headerbar.set_show_close_button(True) headerbar.show_all() # Create webview with custom stylesheet css = WebKit2.UserStyleSheet( ".sidebar, .banner { display: none; }", WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) content_manager = WebKit2.UserContentManager() content_manager.add_style_sheet(css) self.webview = WebKit2.WebView.new_with_user_content_manager( content_manager) self.webview.connect("resource-load-started", self.cb_load_started) self.webview.show() scrolledwindow = Gtk.ScrolledWindow() scrolledwindow.add(self.webview) scrolledwindow.show() # Add children to ApplicationWindow self.add(scrolledwindow) self.set_titlebar(headerbar)
def inject_custom_styles(self): style = open(self.file_path('styles/webview.css'), 'r').read() frame = WebKit2.UserContentInjectedFrames.ALL_FRAMES level = WebKit2.UserStyleLevel.USER style = WebKit2.UserStyleSheet(style, frame, level, None, None) self.manager.add_style_sheet(style)
def update_default_style_sheet(self): """ Should be called on startup """ rules = self.adblock.get_default_css_rules() self.__default_style_sheet = WebKit2.UserStyleSheet( rules, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None)
def get_stylesheet(self): if self.stylesheet is None: style = ("html { background: %s; color: %s;}" " a { color: %s; }" " a:visited { color: %s; }") % \ (self.background_color.to_string(), self.foreground_color.to_string(), self.link_color.to_string(), self.visited_color.to_string()) self.stylesheet = WebKit2.UserStyleSheet(style, 0, 1, None, None) return self.stylesheet
def hook_webkit_view(self, wk_view): cm = wk_view.get_user_content_manager() # https://lazka.github.io/pgi-docs/#WebKit2-4.0/classes/UserStyleSheet.html#WebKit2.UserStyleSheet frames = WebKit2.UserContentInjectedFrames.TOP_FRAME level = WebKit2.UserStyleLevel.USER whitelist = None blacklist = None stylesheet = WebKit2.UserStyleSheet(self.css, frames, level, whitelist, blacklist) cm.add_style_sheet(stylesheet)
def get_stylesheet(self): if self.stylesheet is None: foreground = get_foreground_color() background = get_background_color(Gtk.StateFlags.ACTIVE) if background is not None: style = "html { background: %s; color: %s;}" % \ (background.to_string(), foreground.to_string()) self.stylesheet = WebKit2.UserStyleSheet( style, 0, 1, None, None) return self.stylesheet
def get_stylesheet(self): if self.stylesheet is None: style = ("html { background: %s; color: %s;}" " a { color: %s; }" " a:visited { color: %s; }" " #gpodder-title h3, #gpodder-title p { margin: 0}" " #gpodder-title {margin-block-end: 1em;}") % \ (self.background_color.to_string(), self.foreground_color.to_string(), self.link_color.to_string(), self.visited_color.to_string()) self.stylesheet = WebKit2.UserStyleSheet(style, 0, 1, None, None) return self.stylesheet
def update_stylesheet_for_settings(self): user_content_manager = self._manager current_stylesheet = self.main_window.app_settings.get_string( 'stylesheet') css_path = path.join(DRAFT_DIR, 'styles', current_stylesheet) with open(css_path) as f: css_str = f.read() user_stylesheet = WebKit.UserStyleSheet( css_str, WebKit.UserContentInjectedFrames.ALL_FRAMES, WebKit.UserStyleLevel.AUTHOR, None, None) user_content_manager.remove_all_style_sheets() user_content_manager.add_style_sheet(user_stylesheet)
def _set_style(self): user_content = self.get_user_content_manager() user_content.remove_all_style_sheets() gfile = Gio.File.new_for_uri( 'resource:///com/github/hugolabe/Wike/styles/view.min.css') try: gfile_contents = gfile.load_contents(None) except: print('Can\'t load css file from resources') return else: style = gfile_contents[1].decode('utf-8') user_style = WebKit2.UserStyleSheet( style, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) user_content.add_style_sheet(user_style)
def __init__(self, **kwargs): cm = WebKit2.UserContentManager() cm.register_script_message_handler('scrolled'); cm.connect('script-message-received::scrolled', lambda cm, result: self.emit('scrolled', result.get_js_value().to_double())) cm.register_script_message_handler('scrolled_top'); cm.connect('script-message-received::scrolled_top', lambda cm, result: self.emit('scrolled-top')) cm.register_script_message_handler('scrolled_bottom'); cm.connect('script-message-received::scrolled_bottom', lambda cm, result: self.emit('scrolled-bottom')) cm.register_script_message_handler('selection_changed'); cm.connect('script-message-received::selection_changed', lambda cm, result: self.emit('selection-changed', result.get_js_value().to_boolean())) cm.add_script(WebKit2.UserScript(''' window.addEventListener("scroll", function(){ var handler = window.webkit.messageHandlers.scrolled; handler.postMessage(window.scrollY); }); document.addEventListener("selectionchange", function() { var handler = window.webkit.messageHandlers.selection_changed; handler.postMessage(window.getSelection() != ''); }); ''', WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserScriptInjectionTime.START, None, None)) cm.add_style_sheet(WebKit2.UserStyleSheet(''' html { margin: 50px; } body { overflow: hidden; } ''', WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None)) WebKit2.WebView.__init__(self, user_content_manager=cm, **kwargs) self.get_settings().set_enable_write_console_messages_to_stdout(True)
def new_content_manager(self): css = """ .icn--close { visibility: hidden; } button#continue_offline { visibility: hidden; } """ content_injected_frames = WebKit2.UserContentInjectedFrames(0) user_style_level = WebKit2.UserStyleLevel(0) style_sheet = WebKit2.UserStyleSheet(css, content_injected_frames, user_style_level, None, None) content_manager = WebKit2.UserContentManager() content_manager.add_style_sheet(style_sheet) return content_manager
def set_style(self): data_manager = web_context.get_website_data_manager() data_manager.clear(WebKit2.WebsiteDataTypes.MEMORY_CACHE, 0, None, None, None) self.user_content.remove_all_style_sheets() style_view = WebKit2.UserStyleSheet( self._css_view, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_view) theme = settings.get_int('theme') if theme == 1: style_dark = WebKit2.UserStyleSheet( self._css_dark, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_dark) elif theme == 2: style_sepia = WebKit2.UserStyleSheet( self._css_sepia, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_sepia) elif theme == 3: if self.style_manager.get_dark(): style_dark = WebKit2.UserStyleSheet( self._css_dark, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_dark) if settings.get_boolean('custom-font'): css_font = 'body,h1,h2{font-family:"' + settings.get_string( 'font-family') + '"!important}' style_font = WebKit2.UserStyleSheet( css_font, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_font) if not settings.get_boolean('preview-popups'): css_previews = '.mwe-popups{display:none!important}' style_previews = WebKit2.UserStyleSheet( css_previews, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.user_content.add_style_sheet(style_previews)
def load_assets(self): """ Injects css and js files into the webview """ assets_path = os.path.join(os.path.dirname(__file__), '..', 'assets') with open(os.path.join(assets_path, 'css', 'markdown.css'), encoding='utf-8') as f: style_contents = f.read() with open(os.path.join(assets_path, 'js', 'hljs.js'), encoding='utf-8') as f: hljs_script = f.read() style = WebKit.UserStyleSheet( style_contents, WebKit.UserContentInjectedFrames.TOP_FRAME, WebKit.UserStyleLevel.USER, None, None) script = WebKit.UserScript(hljs_script, WebKit.UserContentInjectedFrames.TOP_FRAME, WebKit.UserScriptInjectionTime.END, None, None) self.webview.get_user_content_manager().add_style_sheet(style) self.webview.get_user_content_manager().add_script(script)
def __init__(self, library): Gtk.Grid.__init__(self, expand=True) library stylesheet = """ :root { font-family: 'Open Sans', 'sans-serif'; color: #333; font-size: 100%; } .main { min-width: 32rem; max-width: 100rem; word-wrap: break-word; line-height: 1.5rem; margin: 0 auto 4rem auto; padding: 0 1rem 0 1rem; columns: 3 28rem; } span.verse-num { color: #999; font-size: .75rem; font-weight: bold; padding-right: .15rem; padding-left: .25rem; vertical-align: text-top; } h1 { font-size: 2rem } h2 { font-size: 1.5rem; column-span: all; } h3 { font-size: 1.125rem; font-weight: lighter; } h4 { font-size: 1rem } h5 { font-size: .875rem } h6 { font-size: .75rem } .mx-auto { margin-left: auto; margin-right: auto; } .divineName { font-variant: small-caps; } .wordsOfJesus { color: #7a0000 } .indent1 { margin-left: .5rem } .indent2 { margin-left: 1rem } .indent3 { margin-left: 2rem } .indent4 { margin-left: 4rem } """ user_style = WebKit2.UserStyleSheet( stylesheet, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) content_manager = WebKit2.UserContentManager() content_manager.add_style_sheet(user_style) self.webview = WebKit2.WebView.new_with_user_content_manager( content_manager) self.webview.props.expand = True self.webview.connect('context-menu', self._on_context_menu) self.add(self.webview) library.connect('reference-changed', self._on_library_changed) library.connect('module-changed', self._on_library_changed) self.show_all()
def _on_load_changed(self, webview, event): """ Update internals @param webview as WebView @param event as WebKit2.LoadEvent """ uri = webview.uri parsed = urlparse(uri) if event == WebKit2.LoadEvent.STARTED: self.set_setting("auto-load-images", not El().image_exceptions.find(parsed.netloc)) self._cancelled = False elif event == WebKit2.LoadEvent.COMMITTED: self.__hw_acceleration_policy(parsed.netloc) self.content_manager.remove_all_style_sheets() if El().phishing.is_phishing(uri): self._show_phishing_error(uri) else: # Can't find a way to block content for ephemeral views if El().settings.get_value("adblock") and\ not El().adblock_exceptions.find_parsed(parsed) and\ parsed.scheme in ["http", "https"] and\ self.content_manager is not None: self.content_manager.add_style_sheet( El().default_style_sheet) rules = El().adblock.get_css_rules(uri) user_style_sheet = WebKit2.UserStyleSheet( rules, WebKit2.UserContentInjectedFrames.ALL_FRAMES, WebKit2.UserStyleLevel.USER, None, None) self.content_manager.add_style_sheet(user_style_sheet) self.update_zoom_level() user_agent = El().websettings.get_user_agent(uri) settings = self.get_settings() if user_agent: settings.set_user_agent(user_agent) else: settings.set_user_agent_with_application_details( "Eolie", None) # Setup image blocker self.set_setting("auto-load-images", not El().image_exceptions.find(parsed.netloc)) # Setup eolie internal adblocker if El().settings.get_value("adblock") and\ parsed.scheme in ["http", "https"]: exception = El().adblock_exceptions.find_parsed(parsed) if not exception: noext = ".".join(parsed.netloc.split(".")[:-1]) javascripts = [ "adblock_%s.js" % parsed.netloc, "adblock_%s.js" % noext ] for javascript in javascripts: f = Gio.File.new_for_path("%s/%s" % (ADBLOCK_JS, javascript)) if f.query_exists(): (status, content, tag) = f.load_contents(None) js = content.decode("utf-8") self.run_javascript(js, None, None) break elif event == WebKit2.LoadEvent.FINISHED: self.run_javascript_from_gresource( "/org/gnome/Eolie/Extensions.js", None, None) self.set_favicon(False) if parsed.scheme != "populars": self.set_snapshot() self.update_spell_checking() if El().show_tls: try: from OpenSSL import crypto from datetime import datetime (valid, tls, errors) = webview.get_tls_info() if tls is not None: print("***************************************" "***************************************") cert_pem = tls.get_property("certificate-pem") cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_pem) subject = cert.get_subject() print("CN: %s" % subject.CN) start_bytes = cert.get_notBefore() end_bytes = cert.get_notAfter() start = datetime.strptime(start_bytes.decode("utf-8"), "%Y%m%d%H%M%SZ") end = datetime.strptime(end_bytes.decode("utf-8"), "%Y%m%d%H%M%SZ") print("Valid from %s to %s" % (start, end)) print("Serial number: %s" % cert.get_serial_number()) print(cert_pem) print("***************************************" "***************************************") except Exception as e: print("Please install OpenSSL python support:", e)