Permalink
Browse files

QtWebEngine: Implement scroll position based on JS

  • Loading branch information...
The-Compiler committed Jul 15, 2016
1 parent 83906d2 commit 7adc8ab2d61c63bdcf6eba16fde90979c03725fe
Showing with 56 additions and 16 deletions.
  1. +4 −1 qutebrowser/browser/browsertab.py
  2. +27 −15 qutebrowser/browser/webengine/webenginetab.py
  3. +25 −0 qutebrowser/javascript/scroll.js
@@ -354,6 +354,9 @@ def __init__(self, tab, parent=None):
self._tab = tab
self._widget = None
+ def _init_widget(self, widget):
+ self._widget = widget
+
def pos_px(self):
raise NotImplementedError
@@ -513,7 +516,7 @@ def _set_widget(self, widget):
self._layout = WrapperLayout(widget, self)
self._widget = widget
self.history._history = widget.history()
- self.scroll._widget = widget
+ self.scroll._init_widget(widget)
self.caret._widget = widget
self.zoom._widget = widget
self.search._widget = widget
@@ -182,6 +182,14 @@ class WebEngineScroller(browsertab.AbstractScroller):
"""QtWebEngine implementations related to scrolling."""
+ def __init__(self, tab, parent=None):
+ super().__init__(tab, parent)
+ self._pos_perc = (None, None)
+
+ def _init_widget(self, widget):
+ super()._init_widget(widget)
+ self._on_scroll_pos_changed()
+
def _key_press(self, key, count=1):
# FIXME:qtwebengine Abort scrolling if the minimum/maximum was reached.
press_evt = QKeyEvent(QEvent.KeyPress, key, Qt.NoModifier, 0, 0, 0)
@@ -193,24 +201,25 @@ def _key_press(self, key, count=1):
QApplication.postEvent(recipient, press_evt)
QApplication.postEvent(recipient, release_evt)
+ @pyqtSlot()
+ def _on_scroll_pos_changed(self):
+ def update_scroll_pos_perc(jsret):
+ assert len(jsret) == 2, jsret
+ self._pos_perc = jsret
+ self.perc_changed.emit(*jsret)
+
+ js_code = """
+ {scroll_js}
+ scroll_pos_perc();
+ """.format(scroll_js=utils.read_file('javascript/scroll.js'))
+ self._tab.run_js_async(js_code, update_scroll_pos_perc)
+
def pos_px(self):
log.stub()
return QPoint(0, 0)
def pos_perc(self):
- page = self._widget.page()
- try:
- size = page.contentsSize()
- pos = page.scrollPosition()
- except AttributeError:
- # Added in Qt 5.7
- log.stub('on Qt < 5.7')
- return (None, None)
- else:
- # FIXME:qtwebengine is this correct?
- perc_x = 100 / size.width() * pos.x()
- perc_y = 100 / size.height() * pos.y()
- return (perc_x, perc_y)
+ return self._pos_perc
def to_perc(self, x=None, y=None):
js_code = """
@@ -409,5 +418,8 @@ def _connect_signals(self):
view.iconChanged.connect(self.icon_changed)
except AttributeError:
log.stub('iconChanged, on Qt < 5.7')
- # FIXME:qtwebengine stub this?
- # view.scroll.pos_changed.connect(self.scroll.perc_changed)
+ try:
+ page.scrollPositionChanged.connect(
+ self.scroll._on_scroll_pos_changed)
+ except AttributeError:
+ log.stub('scrollPositionChanged, on Qt < 5.7')
@@ -38,3 +38,28 @@ function scroll_delta_page(x, y) {
var dy = document.documentElement.clientHeight * y;
window.scrollBy(dx, dy);
}
+
+function scroll_pos_perc() {
+ var elem = document.documentElement;
+ var dx = (elem.scrollWidth - elem.clientWidth);
+ var dy = (elem.scrollHeight - elem.clientHeight);
+
+ var perc_x, perc_y;
+
+ if (dx === 0) {
+ perc_x = 0;
+ } else {
+ perc_x = 100 / dx * window.scrollX;
+ }
+
+ if (dy === 0) {
+ perc_y = 0;
+ } else {
+ perc_y = 100 / dy * window.scrollY;
+ }
+
+ // console.log(perc_x);
+ // console.log(perc_y);
+
+ return [perc_x, perc_y];
+}

0 comments on commit 7adc8ab

Please sign in to comment.