30#include <QWebEngineProfile>
31#include <QWebEngineScriptCollection>
33#include <QStyleOption>
44 setAutoFillBackground(
true);
50 setParent(m_view->overlayWidget());
51 resize(thickness, thickness);
52 move(m_view->width() - width(), m_view->height() - height());
60 void paintEvent(QPaintEvent *ev)
override
63 option.initFrom(
this);
67 if (
mApp->styleName() ==
QL1S(
"breeze")) {
68 p.fillRect(ev->rect(), option.palette.window());
70 style()->drawPrimitive(QStyle::PE_PanelScrollAreaCorner, &option, &p,
this);
94 m_scrollbarJs =
QL1S(
"(function() {"
95 "var head = document.getElementsByTagName('head')[0];"
97 "var css = document.createElement('style');"
98 "css.setAttribute('type', 'text/css');"
99 "var size = %1 / window.devicePixelRatio + 'px';"
100 "css.appendChild(document.createTextNode('"
101 " body::-webkit-scrollbar{width:'+size+';height:'+size+';}"
103 "head.appendChild(css);"
111 m_enabled =
Settings().
value(
QSL(
"Web-Browser-Settings/UseNativeScrollbars"),
false).toBool();
114 for (
WebView *view : m_scrollbars.keys()) {
126 delete m_scrollbars.value(view);
130 data->hscrollbar =
new WebScrollBar(Qt::Horizontal, view);
132 m_scrollbars[view] = data;
134 const int thickness = data->vscrollbar->thickness();
136 auto updateValues = [=]() {
137 const QSize viewport = viewportSize(view, thickness);
138 data->vscrollbar->updateValues(viewport);
139 data->vscrollbar->setVisible(data->vscrollbarVisible);
140 data->hscrollbar->updateValues(viewport);
141 data->hscrollbar->setVisible(data->hscrollbarVisible);
142 data->corner->updateVisibility(data->vscrollbarVisible && data->hscrollbarVisible, thickness);
146 connect(view->
page(), &WebPage::scrollPositionChanged, data->vscrollbar, updateValues);
148 connect(view->
page(), &WebPage::contentsSizeChanged, data->vscrollbar, [=]() {
149 const QString source = QL1S(
"var out = {"
150 "vertical: document.documentElement && window.innerWidth > document.documentElement.clientWidth,"
151 "horizontal: document.documentElement && window.innerHeight > document.documentElement.clientHeight"
154 QPointer<WebView> p(view);
155 view->page()->runJavaScript(source, WebPage::SafeJsWorld, [=](const QVariant &res) {
156 if (!p || !m_scrollbars.contains(view)) {
159 const QVariantMap map = res.toMap();
160 data->vscrollbarVisible = map.value(QSL(
"vertical")).toBool();
161 data->hscrollbarVisible = map.value(QSL(
"horizontal")).toBool();
167 view->page()->runJavaScript(m_scrollbarJs.arg(thickness));
170 if (m_scrollbars.size() == 1) {
171 createUserScript(thickness);
177 if (!m_scrollbars.contains(view)) {
181 if (m_scrollbars.size() == 1) {
185 delete m_scrollbars.take(view);
199 return qz_web_scrollbar_manager();
202void WebScrollBarManager::createUserScript(
int thickness)
204 QWebEngineScript script;
205 script.setName(
QSL(
"_falkon_scrollbar"));
206 script.setInjectionPoint(QWebEngineScript::DocumentReady);
208 script.setSourceCode(m_scrollbarJs.arg(thickness));
209 mApp->webProfile()->scripts()->insert(script);
212void WebScrollBarManager::removeUserScript()
214 for (
const QWebEngineScript &script :
mApp->webProfile()->scripts()->find(
QSL(
"_falkon_scrollbar"))) {
215 mApp->webProfile()->scripts()->remove(script);
219QSize WebScrollBarManager::viewportSize(
WebView *view,
int thickness)
const
221 QSize viewport = view->size();
223 thickness /= view->devicePixelRatioF();
229 viewport.setWidth(viewport.width() - thickness);
232 viewport.setHeight(viewport.height() - thickness);
236 const QSize content = view->
page()->contentsSize().toSize();
239 if (content.width() - viewport.width() > 0) {
240 viewport.setHeight(viewport.height() - thickness);
243 if (content.height() - viewport.height() > 0) {
244 viewport.setWidth(viewport.width() - thickness);
248 if (viewport.height() == view->height() && content.width() - viewport.width() > 0) {
249 viewport.setHeight(viewport.height() - thickness);
252 if (viewport.width() == view->width() && content.height() - viewport.height() > 0) {
253 viewport.setWidth(viewport.width() - thickness);
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void zoomLevelChanged(int)
void viewportResized(QSize)