From 08bc55995b756908c9feeb04640c4b7cbfc1f6eb Mon Sep 17 00:00:00 2001
From: Florian Bruhin <git@the-compiler.org>
Date: Sat, 24 Feb 2018 18:25:02 +0100
Subject: [PATCH] First attempt at reloading pages after setting changes

---
 qutebrowser/browser/webengine/webenginetab.py | 23 +++++++++++++++----
 qutebrowser/config/websettings.py             |  6 ++---
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index ce57e498e..32a17916b 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -26,7 +26,7 @@ import html as html_utils
 
 import sip
 from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF,
-                          QUrl)
+                          QUrl, QTimer)
 from PyQt5.QtGui import QKeyEvent
 from PyQt5.QtNetwork import QAuthenticator
 from PyQt5.QtWidgets import QApplication
@@ -612,6 +612,7 @@ class WebEngineTab(browsertab.AbstractTab):
         self._init_js()
         self._child_event_filter = None
         self._saved_zoom = None
+        self._reload_url = None
 
     def _init_js(self):
         js_code = '\n'.join([
@@ -871,15 +872,27 @@ class WebEngineTab(browsertab.AbstractTab):
         """
         if not ok:
             self._load_finished_fake.emit(False)
-            if not self.settings.test_attribute('content.javascript.enabled'):
-                # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-66643
-                self._show_error_page(self.url(), error="")
+
+    @pyqtSlot(bool)
+    def _on_load_finished(self, ok):
+        super()._on_load_finished(ok)
+        if not ok and not self.settings.test_attribute('content.javascript.enabled'):
+            # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-66643
+            self._show_error_page(self.url(), error="")
+        elif ok and self._reload_url is not None:
+            # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-66656
+            QTimer.singleShot(100, lambda url=self._reload_url:
+                              self.openurl(url))
+            self._reload_url = None
 
     @pyqtSlot(usertypes.NavigationRequest)
     def _on_navigation_request(self, navigation):
         super()._on_navigation_request(navigation)
         if navigation.accepted and navigation.is_main_frame:
-            self.settings.update_for_url(navigation.url)
+            changed = self.settings.update_for_url(navigation.url)
+            if changed & {'content.plugins', 'content.javascript.enabled'}:
+                navigation.accepted = False
+                self._reload_url = navigation.url
 
     def _connect_signals(self):
         view = self._widget
diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py
index dcfc11036..517c3dd3c 100644
--- a/qutebrowser/config/websettings.py
+++ b/qutebrowser/config/websettings.py
@@ -139,9 +139,9 @@ class AbstractSettings:
         """Update settings customized for the given tab.
 
         Return:
-            A list of settings which actually changed.
+            A set of settings which actually changed.
         """
-        changed_settings = []
+        changed_settings = set()
         for values in config.instance:
             if not values.opt.supports_pattern:
                 continue
@@ -152,7 +152,7 @@ class AbstractSettings:
             if changed:
                 log.config.debug("Changed for {}: {} = {}".format(
                     url.toDisplayString(), values.opt.name, value))
-                changed_settings.append(values.opt.name)
+                changed_settings.add(values.opt.name)
 
         return changed_settings