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.
master
Andy Stewart 6 years ago
parent 937309898e
commit ebefb61911
  1. 142
      core/browser.py
  2. 56
      core/js/open_in_new_tab.js

@ -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")

@ -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;
})()
Loading…
Cancel
Save