1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-22 02:02:10 +02:00

WebScrollBar: Fix scrollbar values when page is zoomed

This commit is contained in:
David Rosca 2016-12-27 13:12:10 +01:00
parent 08af25f4f7
commit f651b42e23
2 changed files with 21 additions and 9 deletions

View File

@ -77,6 +77,16 @@ struct ScrollBarData {
WebScrollBarManager::WebScrollBarManager(QObject *parent) WebScrollBarManager::WebScrollBarManager(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
m_scrollbarJs = QL1S("(function() {"
"var css = document.createElement('style');"
"css.setAttribute('type', 'text/css');"
"var size = %1 / window.devicePixelRatio + 'px';"
"css.appendChild(document.createTextNode('"
" body::-webkit-scrollbar{width:'+size+';height:'+size+';}"
"'));"
"document.getElementsByTagName('head')[0].appendChild(css);"
"})()");
loadSettings(); loadSettings();
} }
@ -105,8 +115,9 @@ void WebScrollBarManager::addWebView(WebView *view)
data->corner = new WebScrollBarCornerWidget(view); data->corner = new WebScrollBarCornerWidget(view);
m_scrollbars[view] = data; m_scrollbars[view] = data;
auto updateValues = [=]() {
const int thickness = data->vscrollbar->thickness(); const int thickness = data->vscrollbar->thickness();
auto updateValues = [=]() {
const QSize viewport = viewportSize(view, thickness); const QSize viewport = viewportSize(view, thickness);
data->vscrollbar->updateValues(viewport); data->vscrollbar->updateValues(viewport);
data->hscrollbar->updateValues(viewport); data->hscrollbar->updateValues(viewport);
@ -117,8 +128,12 @@ void WebScrollBarManager::addWebView(WebView *view)
connect(view->page(), &WebPage::contentsSizeChanged, this, updateValues); connect(view->page(), &WebPage::contentsSizeChanged, this, updateValues);
connect(view->page(), &WebPage::scrollPositionChanged, this, updateValues); connect(view->page(), &WebPage::scrollPositionChanged, this, updateValues);
connect(view, &WebView::zoomLevelChanged, this, [=]() {
view->page()->runJavaScript(m_scrollbarJs.arg(thickness));
});
if (m_scrollbars.size() == 1) { if (m_scrollbars.size() == 1) {
createUserScript(); createUserScript(thickness);
} }
} }
@ -148,17 +163,13 @@ WebScrollBarManager *WebScrollBarManager::instance()
return qz_web_scrollbar_manager(); return qz_web_scrollbar_manager();
} }
void WebScrollBarManager::createUserScript() void WebScrollBarManager::createUserScript(int thickness)
{ {
Q_ASSERT(!m_scrollbars.isEmpty());
const int thickness = (*m_scrollbars.begin())->vscrollbar->thickness();
QWebEngineScript script; QWebEngineScript script;
script.setName(QSL("_qupzilla_scrollbar")); script.setName(QSL("_qupzilla_scrollbar"));
script.setInjectionPoint(QWebEngineScript::DocumentReady); script.setInjectionPoint(QWebEngineScript::DocumentReady);
script.setWorldId(WebPage::SafeJsWorld); script.setWorldId(WebPage::SafeJsWorld);
script.setSourceCode(Scripts::setCss(QSL("body::-webkit-scrollbar{width:%1px;height:%1px;}").arg(thickness))); script.setSourceCode(m_scrollbarJs.arg(thickness));
mApp->webProfile()->scripts()->insert(script); mApp->webProfile()->scripts()->insert(script);
} }

View File

@ -43,11 +43,12 @@ public:
static WebScrollBarManager *instance(); static WebScrollBarManager *instance();
private: private:
void createUserScript(); void createUserScript(int thickness);
void removeUserScript(); void removeUserScript();
QSize viewportSize(WebView *view, int thickness) const; QSize viewportSize(WebView *view, int thickness) const;
bool m_enabled = true; bool m_enabled = true;
QString m_scrollbarJs;
QHash<WebView*, struct ScrollBarData*> m_scrollbars; QHash<WebView*, struct ScrollBarData*> m_scrollbars;
}; };