From ebefb6191182eaf8a2e5c901336abb4a0150bfa8 Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Mon, 17 Feb 2020 12:32:23 +0800 Subject: [PATCH] Stop handle mouse event "Ctrl + Button", it's buggy that cause browser crash. Open link in new tab by keyboard, don't handle mouse click behavior. --- core/browser.py | 142 +++++-------------------------------- core/js/open_in_new_tab.js | 56 --------------- 2 files changed, 17 insertions(+), 181 deletions(-) delete mode 100644 core/js/open_in_new_tab.js diff --git a/core/browser.py b/core/browser.py index bd92e0d..4df1f69 100644 --- a/core/browser.py +++ b/core/browser.py @@ -147,38 +147,7 @@ class BrowserView(QWebEngineView): # Send mouse event to applicatin view. self.trigger_focus_event.emit("{0},{1}".format(event.globalX(), event.globalY())) - if event.type() == QEvent.MouseButtonRelease: - hit = self.web_page.hitTestContent(event.pos()) - clicked_url = hit.linkUrl() - base_url = hit.baseUrl() - - if clicked_url is not None and base_url is not None and clicked_url != base_url and clicked_url != '': - result = "" - - if 'http://' in clicked_url or 'https://' in clicked_url: - result = clicked_url - elif clicked_url == "#": - result = base_url + clicked_url - else: - # Don't open url in EAF if clicked_url is not start with http/ftp or # - result = "http://" + base_url.split("/")[2] + clicked_url - - event.accept() - return False - - modifiers = QApplication.keyboardModifiers() - - if modifiers == Qt.ControlModifier: - self.open_url_new_buffer(result) - else: - self.open_url(result) - - return True - - event.accept() - return False - - elif event.type() == QEvent.MouseButtonPress: + if event.type() == QEvent.MouseButtonPress: if event.button() == MOUSE_FORWARD_BUTTON: self.forward() @@ -217,7 +186,7 @@ class BrowserView(QWebEngineView): self.eval_js(self.read_js_content(js_file)) def execute_js(self, js): - return self.web_page.executeJavaScript(js) + return self.web_page.execute_javascript(js) def scroll_left(self): self.eval_js("document.scrollingElement.scrollBy(-35, 0)") @@ -263,11 +232,11 @@ class BrowserView(QWebEngineView): def select_all(self): # We need window focus before select all text. - self.execute_js("window.focus()") + self.eval_js("window.focus()") self.triggerPageAction(self.web_page.SelectAll) def select_input_text(self): - self.execute_js(self.select_input_text_js) + self.eval_js(self.select_input_text_js) def get_url(self): return self.execute_js("window.location.href;") @@ -279,24 +248,24 @@ class BrowserView(QWebEngineView): def get_link_markers(self): return self.execute_js(self.get_markers_raw.replace("%1", self.buffer.emacs_var_dict["eaf-marker-letters"])); - def jump_to_link(self, marker): + def get_marker_link(self, marker): self.goto_marker_js = self.goto_marker_raw.replace("%1", str(marker)); link = self.execute_js(self.goto_marker_js) self.cleanup_links() + return link + + def jump_to_link(self, marker): + link = self.get_marker_link(marker) if link != "": self.open_url(link) def jump_to_link_new_buffer(self, marker): - self.goto_marker_js = self.goto_marker_raw.replace("%1", str(marker)); - link = self.execute_js(self.goto_marker_js) - self.cleanup_links() + link = self.get_marker_link(marker) if link != "": self.open_url_new_buffer(link) def jump_to_link_background_buffer(self, marker): - self.goto_marker_js = self.goto_marker_raw.replace("%1", str(marker)); - link = self.execute_js(self.goto_marker_js) - self.cleanup_links() + link = self.get_marker_link(marker) if link != "": self.open_url_background_buffer(link) @@ -305,110 +274,33 @@ class BrowserView(QWebEngineView): def set_focus_text(self, new_text): self.set_focus_text_js = self.set_focus_text_raw.replace("%1", str(base64.b64encode(new_text.encode("utf-8")), "utf-8")); - self.execute_js(self.set_focus_text_js) + self.eval_js(self.set_focus_text_js) def clear_focus(self): - self.execute_js(self.clear_focus_js) + self.eval_js(self.clear_focus_js) def dark_mode(self): - self.execute_js(self.dark_mode_js) + self.eval_js(self.dark_mode_js) class BrowserPage(QWebEnginePage): def __init__(self): QWebEnginePage.__init__(self) - def hitTestContent(self, pos): - return WebHitTestResult(self, pos) - - def mapToViewport(self, pos): - return QPointF(pos.x(), pos.y()) - - def executeJavaScript(self, scriptSrc): + def execute_javascript(self, script_src): self.loop = QEventLoop() self.result = QVariant() QTimer.singleShot(250, self.loop.quit) - self.runJavaScript(scriptSrc, self.callbackJS) + self.runJavaScript(script_src, self.callback_js) self.loop.exec_() self.loop = None return self.result - def callbackJS(self, res): + def callback_js(self, res): if self.loop is not None and self.loop.isRunning(): self.result = res self.loop.quit() -class WebHitTestResult(): - def __init__(self, page, pos): - self.page = page - self.pos = pos - self.m_linkUrl = self.page.url().toString() - self.m_baseUrl = self.page.url().toString() - self.viewportPos = self.page.mapToViewport(self.pos) - with open(os.path.join(os.path.dirname(__file__), "js", "open_in_new_tab.js"), "r") as f: - self.open_in_new_tab_raw = f.read() - - self.open_in_new_tab_js = self.open_in_new_tab_raw.replace("%1", str(self.viewportPos.x())).replace("%2", str(self.viewportPos.y())) - self.dic = self.page.executeJavaScript(self.open_in_new_tab_js) - if self.dic is None: - return - - self.m_isNull = False - self.m_baseUrl = self.dic["baseUrl"] - self.m_alternateText = self.dic["alternateText"] - self.m_imageUrl = self.dic["imageUrl"] - self.m_isContentEditable = self.dic["contentEditable"] - self.m_isContentSelected = self.dic["contentSelected"] - self.m_linkTitle = self.dic["linkTitle"] - self.m_linkUrl = self.dic["linkUrl"] - self.m_mediaUrl = self.dic["mediaUrl"] - try: - self.m_mediaPaused = self.dic["mediaPaused"] - self.m_mediaMuted = self.dic["mediaMuted"] - except Exception: - pass - self.m_tagName = self.dic["tagName"] - - def linkUrl(self): - return self.m_linkUrl - - def isContentEditable(self): - return self.m_isContentEditable - - def isContentSelected(self): - return self.m_isContentSelected - - def imageUrl(self): - try: - return self.m_imageUrl - except Exception: - return "" - - def mediaUrl(self): - return self.m_mediaUrl - - def baseUrl(self): - return self.m_baseUrl - - def updateWithContextMenuData(self, data): - if data.isValid(): - pass - else: - return - - self.m_linkTitle = data.linkText() - self.m_linkUrl = data.linkUrl().toString() - self.m_isContentEditable = data.isContentEditable() - if data.selectedText() == "": - self.m_isContentSelected = False - else: - self.m_isContentSelected = True - - if data.mediaType() == QWebEngineContextMenuData.MediaTypeImage: - self.m_imageUrl = data.mediaUrl().toString() - elif data.mediaType() == QWebEngineContextMenuData.MediaTypeAudio or data.mediaType() == QWebEngineContextMenuData.MediaTypeVideo: - self.m_mediaUrl = data.mediaUrl().toString() - class BrowserCookieStorage: def __init__(self, config_dir): self.cookie_file = os.path.join(config_dir, "browser", "cookie", "cookie") diff --git a/core/js/open_in_new_tab.js b/core/js/open_in_new_tab.js deleted file mode 100644 index 1b2aa8f..0000000 --- a/core/js/open_in_new_tab.js +++ /dev/null @@ -1,56 +0,0 @@ -(function() { - let e = document.elementFromPoint(%1, %2); - if (!e) - return; - function isMediaElement(e) { - return e.tagName == 'AUDIO' || e.tagName == 'VIDEO'; - }; - function isEditableElement(e) { - if (e.isContentEditable) - return true; - if (e.tagName === 'INPUT' || e.tagName === 'TEXTAREA') - return e.getAttribute('readonly') != 'readonly'; - return false; - }; - function isSelected(e) { - let selection = window.getSelection(); - if (selection.type !== 'Range') - return false; - return window.getSelection().containsNode(e, true); - }; - let res = { - baseUrl: document.baseURI, - alternateText: e.getAttribute('alt'), - boundingRect: '', - imageUrl: '', - contentEditable: isEditableElement(e), - contentSelected: isSelected(e), - linkTitle: '', - linkUrl: '', - mediaUrl: '', - tagName: e.tagName.toLowerCase() - }; - let r = e.getBoundingClientRect(); - res.boundingRect = [r.top, r.left, r.width, r.height]; - if (e.tagName == 'IMG') - res.imageUrl = e.getAttribute('src'); - if (e.tagName == 'A') { - res.linkTitle = e.text; - res.linkUrl = e.getAttribute('href'); - } - while (e) { - if (res.linkTitle === '' && e.tagName === 'A') { - res.linkTitle = e.text; - if(res.linkUrl === '') { - res.linkUrl = e.getAttribute('href'); - } - } - if (res.mediaUrl === '' && isMediaElement(e)) { - res.mediaUrl = e.currentSrc; - res.mediaPaused = e.paused; - res.mediaMuted = e.muted; - } - e = e.parentElement; - } - return res; -})()