Some improvements of the Web Browser NG.

Sat, 10 Feb 2018 17:24:42 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 10 Feb 2018 17:24:42 +0100
changeset 6127
128d9567a533
parent 6126
6c4509eceea2
child 6128
afc2cda1a743

Some improvements of the Web Browser NG.

WebBrowser/JavaScript/ExternalJsObject.py file | annotate | diff | comparison | revisions
WebBrowser/Network/EricSchemeHandler.py file | annotate | diff | comparison | revisions
WebBrowser/StatusBar/ImagesIcon.py file | annotate | diff | comparison | revisions
WebBrowser/Tools/Scripts.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
WebBrowser/WebInspector.py file | annotate | diff | comparison | revisions
WebBrowser/data/html/speeddialPage.html file | annotate | diff | comparison | revisions
--- a/WebBrowser/JavaScript/ExternalJsObject.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/JavaScript/ExternalJsObject.py	Sat Feb 10 17:24:42 2018 +0100
@@ -27,6 +27,8 @@
     """
     Class implementing the endpoint of our web channel.
     """
+    extraObjects = {}
+    
     def __init__(self, page):
         """
         Constructor
@@ -89,3 +91,41 @@
             self.__startPage = StartPageJsObject(self)
         
         return self.__startPage
+    
+    @classmethod
+    def setupWebChannel(cls, channel, page):
+        """
+        Class method to setup the web channel.
+        
+        @param channel reference to the channel
+        @type QWebChannel
+        @param page reference to the web page
+        @type QWebEnginePage
+        """
+        channel.registerObject("eric_object", ExternalJsObject(page))
+        for jsObject in cls.extraObjects:
+            channel.registerObject("eric_{0}".forma(jsObject),
+                                   cls.extraObjects[jsObject])
+    
+    @classmethod
+    def registerExtraObject(cls, name, jsObject):
+        """
+        Class method to register extra JavaScript objects.
+        
+        @param name name for the object
+        @type str
+        @param jsObject reference to the JavaScript object to be registered
+        @type QObject
+        """
+        cls.extraObjects[id] = jsObject
+    
+    @classmethod
+    def unregisterExtraObject(cls, name):
+        """
+        Class method to unregister extra JavaScript objects.
+        
+        @param name name of the object
+        @type str
+        """
+        if name in cls.extraObjects:
+            del cls.extraObjects[name]
--- a/WebBrowser/Network/EricSchemeHandler.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/Network/EricSchemeHandler.py	Sat Feb 10 17:24:42 2018 +0100
@@ -235,6 +235,9 @@
                                 self.tr("Maximum pages in a row:"))
             page = page.replace("@TXT_SDSIZE@",
                                 self.tr("Change size of pages:"))
+            page = page.replace("@JAVASCRIPT_DISABLED@",
+                                self.tr("SpeedDial requires JavaScript"
+                                        " enabled."))
             
             self._speedDialPage = page
         
--- a/WebBrowser/StatusBar/ImagesIcon.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/StatusBar/ImagesIcon.py	Sat Feb 10 17:24:42 2018 +0100
@@ -124,7 +124,8 @@
         @param enable flag indicating the state to set
         @type bool
         """
-        QWebEngineSettings.defaultSettings().setAttribute(
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        WebBrowserWindow.webSettings().setAttribute(
             QWebEngineSettings.AutoLoadImages, enable)
         Preferences.setWebBrowser("AutoLoadImages", enable)
         
--- a/WebBrowser/Tools/Scripts.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/Tools/Scripts.py	Sat Feb 10 17:24:42 2018 +0100
@@ -27,41 +27,49 @@
     @rtype str
     """
     source = """
-        (function() {{
-            {0}
-            
-            function registerExternal(e) {{
-                window.external = e;
-                if (window.external) {{
-                    var event = document.createEvent('Event');
-                    event.initEvent('_eric_external_created', true, true);
-                    document.dispatchEvent(event);
-                }}
-            }}
-            
-            if (self !== top) {{
-                if (top.external)
+(function() {{
+    {0}
+    
+    function registerExternal(e) {{
+        window.external = e;
+        if (window.external) {{
+            var event = document.createEvent('Event');
+            event.initEvent('_eric_external_created', true, true);
+            document.dispatchEvent(event);
+        }}
+    }}
+    
+    if (self !== top) {{
+        if (top.external)
+            registerExternal(top.external);
+        else
+            top.document.addEventListener(
+                '_eric_external_created', function() {{
                     registerExternal(top.external);
-                else
-                    top.document.addEventListener(
-                        '_eric_external_created', function() {{
-                            registerExternal(top.external);
-                    }});
-                return;
-            }}
+            }});
+        return;
+    }}
 
-            function registerWebChannel() {{
-                try {{
-                   new QWebChannel(qt.webChannelTransport, function(channel) {{
-                        registerExternal(channel.objects.eric_object);
-                   }});
-                }} catch (e) {{
-                    setTimeout(registerWebChannel, 100);
+    function registerWebChannel() {{
+        try {{
+           new QWebChannel(qt.webChannelTransport, function(channel) {{
+                registerExternal(channel.objects.eric_object);
+                var external = channel.objects.eric_object;
+                external.extra = {{}};
+                for (var key in channel.objects) {{
+                    if (key != 'eric_object' && key.startsWith('eric_')) {{
+                        external.extra[key.substr(3)] = channel.objects[key];
+                    }}
                 }}
-            }}
-            registerWebChannel();
+                registerExternal(external);
+           }});
+        }} catch (e) {{
+            setTimeout(registerWebChannel, 100);
+        }}
+    }}
+    registerWebChannel();
 
-        }})()"""
+}})()"""
     
     return source.format(readAllFileContents(":/javascript/qwebchannel.js"))
 
@@ -76,12 +84,12 @@
     @rtype str
     """
     source = """
-        (function() {{
-            var css = document.createElement('style');
-            css.setAttribute('type', 'text/css');
-            css.appendChild(document.createTextNode('{0}'));
-            document.getElementsByTagName('head')[0].appendChild(css);
-        }})()"""
+(function() {{
+    var css = document.createElement('style');
+    css.setAttribute('type', 'text/css');
+    css.appendChild(document.createTextNode('{0}'));
+    document.getElementsByTagName('head')[0].appendChild(css);
+}})()"""
     
     style = css.replace("'", "\\'").replace("\n", "\\n")
     return source.format(style)
@@ -97,30 +105,30 @@
     @rtype str
     """
     source = """
-        (function() {{
-            var e = document.elementFromPoint({0}, {1});
-            if (!e || e.tagName != 'INPUT')
-                return;
-            var fe = e.parentElement;
-            while (fe) {{
-                if (fe.tagName == 'FORM')
-                    break;
-                fe = fe.parentElement;
-            }}
-            if (!fe)
-                return;
-            var res = {{
-                method: fe.method.toLowerCase(),
-                action: fe.action,
-                inputName: e.name,
-                inputs: [],
-            }};
-            for (var i = 0; i < fe.length; ++i) {{
-                var input = fe.elements[i];
-                res.inputs.push([input.name, input.value]);
-            }}
-            return res;
-        }})()"""
+(function() {{
+    var e = document.elementFromPoint({0}, {1});
+    if (!e || e.tagName != 'INPUT')
+        return;
+    var fe = e.parentElement;
+    while (fe) {{
+        if (fe.tagName == 'FORM')
+            break;
+        fe = fe.parentElement;
+    }}
+    if (!fe)
+        return;
+    var res = {{
+        method: fe.method.toLowerCase(),
+        action: fe.action,
+        inputName: e.name,
+        inputs: [],
+    }};
+    for (var i = 0; i < fe.length; ++i) {{
+        var input = fe.elements[i];
+        res.inputs.push([input.name, input.value]);
+    }}
+    return res;
+}})()"""
     return source.format(pos.x(), pos.y())
 
 
@@ -132,18 +140,18 @@
     @rtype str
     """
     source = """
-        (function() {
-            var out = [];
-            var imgs = document.getElementsByTagName('img');
-            for (var i = 0; i < imgs.length; ++i) {
-                var e = imgs[i];
-                out.push({
-                    src: e.src,
-                    alt: e.alt
-                });
-            }
-            return out;
-        })()"""
+(function() {
+    var out = [];
+    var imgs = document.getElementsByTagName('img');
+    for (var i = 0; i < imgs.length; ++i) {
+        var e = imgs[i];
+        out.push({
+            src: e.src,
+            alt: e.alt
+        });
+    }
+    return out;
+})()"""
     return source
 
 
@@ -155,20 +163,20 @@
     @rtype str
     """
     source = """
-        (function() {
-            var out = [];
-            var meta = document.getElementsByTagName('meta');
-            for (var i = 0; i < meta.length; ++i) {
-                var e = meta[i];
-                out.push({
-                    name: e.getAttribute('name'),
-                    content: e.getAttribute('content'),
-                    httpequiv: e.getAttribute('http-equiv'),
-                    charset: e.getAttribute('charset')
-                });
-            }
-            return out;
-        })()"""
+(function() {
+    var out = [];
+    var meta = document.getElementsByTagName('meta');
+    for (var i = 0; i < meta.length; ++i) {
+        var e = meta[i];
+        out.push({
+            name: e.getAttribute('name'),
+            content: e.getAttribute('content'),
+            httpequiv: e.getAttribute('http-equiv'),
+            charset: e.getAttribute('charset')
+        });
+    }
+    return out;
+})()"""
     return source
 
 
@@ -180,20 +188,20 @@
     @rtype str
     """
     source = """
-        (function() {
-            var out = [];
-            var links = document.getElementsByTagName('link');
-            for (var i = 0; i < links.length; ++i) {
-                var e = links[i];
-                if (e.type == 'application/opensearchdescription+xml') {
-                    out.push({
-                        url: e.getAttribute('href'),
-                        title: e.getAttribute('title')
-                    });
-                }
-            }
-            return out;
-        })()"""
+(function() {
+    var out = [];
+    var links = document.getElementsByTagName('link');
+    for (var i = 0; i < links.length; ++i) {
+        var e = links[i];
+        if (e.type == 'application/opensearchdescription+xml') {
+            out.push({
+                url: e.getAttribute('href'),
+                title: e.getAttribute('title')
+            });
+        }
+    }
+    return out;
+})()"""
     return source
 
 
@@ -209,21 +217,21 @@
     @rtype str
     """
     source = """
-        (function() {{
-            var form = document.createElement('form');
-            form.setAttribute('method', 'POST');
-            form.setAttribute('action', '{0}');
-            var val;
-            {1}
-            form.submit();
-        }})()"""
+(function() {{
+    var form = document.createElement('form');
+    form.setAttribute('method', 'POST');
+    form.setAttribute('action', '{0}');
+    var val;
+    {1}
+    form.submit();
+}})()"""
     
     valueSource = """
-        val = document.createElement('input');
-        val.setAttribute('type', 'hidden');
-        val.setAttribute('name', '{0}');
-        val.setAttribute('value', '{1}');
-        form.appendChild(val);"""
+val = document.createElement('input');
+val.setAttribute('type', 'hidden');
+val.setAttribute('name', '{0}');
+val.setAttribute('value', '{1}');
+form.appendChild(val);"""
     
     values = ""
     query = QUrlQuery(data)
@@ -243,68 +251,68 @@
     @rtype str
     """
     source = """
-        (function() {
-            function findUsername(inputs) {
-                var usernameNames = ['user', 'name', 'login'];
-                for (var i = 0; i < usernameNames.length; ++i) {
-                    for (var j = 0; j < inputs.length; ++j)
-                        if (inputs[j].type == 'text' &&
-                            inputs[j].value.length &&
-                            inputs[j].name.indexOf(usernameNames[i]) != -1)
-                            return inputs[j].value;
-                }
-                for (var i = 0; i < inputs.length; ++i)
-                    if (inputs[i].type == 'text' && inputs[i].value.length)
-                        return inputs[i].value;
-                for (var i = 0; i < inputs.length; ++i)
-                    if (inputs[i].type == 'email' && inputs[i].value.length)
-                        return inputs[i].value;
-                return '';
+(function() {
+    function findUsername(inputs) {
+        var usernameNames = ['user', 'name', 'login'];
+        for (var i = 0; i < usernameNames.length; ++i) {
+            for (var j = 0; j < inputs.length; ++j)
+                if (inputs[j].type == 'text' &&
+                    inputs[j].value.length &&
+                    inputs[j].name.indexOf(usernameNames[i]) != -1)
+                    return inputs[j].value;
+        }
+        for (var i = 0; i < inputs.length; ++i)
+            if (inputs[i].type == 'text' && inputs[i].value.length)
+                return inputs[i].value;
+        for (var i = 0; i < inputs.length; ++i)
+            if (inputs[i].type == 'email' && inputs[i].value.length)
+                return inputs[i].value;
+        return '';
+    }
+    
+    function registerForm(form) {
+        form.addEventListener('submit', function() {
+            var form = this;
+            var data = '';
+            var password = '';
+            var inputs = form.getElementsByTagName('input');
+            for (var i = 0; i < inputs.length; ++i) {
+                var input = inputs[i];
+                var type = input.type.toLowerCase();
+                if (type != 'text' && type != 'password' &&
+                    type != 'email')
+                    continue;
+                if (!password && type == 'password')
+                    password = input.value;
+                data += encodeURIComponent(input.name);
+                data += '=';
+                data += encodeURIComponent(input.value);
+                data += '&';
             }
-            
-            function registerForm(form) {
-                form.addEventListener('submit', function() {
-                    var form = this;
-                    var data = '';
-                    var password = '';
-                    var inputs = form.getElementsByTagName('input');
-                    for (var i = 0; i < inputs.length; ++i) {
-                        var input = inputs[i];
-                        var type = input.type.toLowerCase();
-                        if (type != 'text' && type != 'password' &&
-                            type != 'email')
-                            continue;
-                        if (!password && type == 'password')
-                            password = input.value;
-                        data += encodeURIComponent(input.name);
-                        data += '=';
-                        data += encodeURIComponent(input.value);
-                        data += '&';
-                    }
-                    if (!password)
-                        return;
-                    data = data.substring(0, data.length - 1);
-                    var url = window.location.href;
-                    var username = findUsername(inputs);
-                    external.passwordManager.formSubmitted(
-                        url, username, password, data);
-                }, true);
-            }
-            
-            for (var i = 0; i < document.forms.length; ++i)
-                registerForm(document.forms[i]);
-            
-            var observer = new MutationObserver(function(mutations) {
-                for (var i = 0; i < mutations.length; ++i)
-                    for (var j = 0; j < mutations[i].addedNodes.length; ++j)
-                        if (mutations[i].addedNodes[j].tagName == 'FORM')
-                            registerForm(mutations[i].addedNodes[j]);
-            });
-            observer.observe(document.documentElement, {
-                childList: true, subtree: true
-            });
-            
-        })()"""
+            if (!password)
+                return;
+            data = data.substring(0, data.length - 1);
+            var url = window.location.href;
+            var username = findUsername(inputs);
+            external.passwordManager.formSubmitted(
+                url, username, password, data);
+        }, true);
+    }
+    
+    for (var i = 0; i < document.forms.length; ++i)
+        registerForm(document.forms[i]);
+    
+    var observer = new MutationObserver(function(mutations) {
+        for (var i = 0; i < mutations.length; ++i)
+            for (var j = 0; j < mutations[i].addedNodes.length; ++j)
+                if (mutations[i].addedNodes[j].tagName == 'FORM')
+                    registerForm(mutations[i].addedNodes[j]);
+    });
+    observer.observe(document.documentElement, {
+        childList: true, subtree: true
+    });
+    
+})()"""
     return source
 
 
@@ -318,28 +326,28 @@
     @rtype str
     """
     source = """
-        (function() {{
-            var data = '{0}'.split('&');
-            var inputs = document.getElementsByTagName('input');
-            
-            for (var i = 0; i < data.length; ++i) {{
-                var pair = data[i].split('=');
-                if (pair.length != 2)
-                    continue;
-                var key = decodeURIComponent(pair[0]);
-                var val = decodeURIComponent(pair[1]);
-                for (var j = 0; j < inputs.length; ++j) {{
-                    var input = inputs[j];
-                    var type = input.type.toLowerCase();
-                    if (type != 'text' && type != 'password' &&
-                        type != 'email')
-                        continue;
-                    if (input.name == key)
-                        input.value = val;
-                }}
-            }}
-            
-        }})()"""
+(function() {{
+    var data = '{0}'.split('&');
+    var inputs = document.getElementsByTagName('input');
+    
+    for (var i = 0; i < data.length; ++i) {{
+        var pair = data[i].split('=');
+        if (pair.length != 2)
+            continue;
+        var key = decodeURIComponent(pair[0]);
+        var val = decodeURIComponent(pair[1]);
+        for (var j = 0; j < inputs.length; ++j) {{
+            var input = inputs[j];
+            var type = input.type.toLowerCase();
+            if (type != 'text' && type != 'password' &&
+                type != 'email')
+                continue;
+            if (input.name == key)
+                input.value = val;
+        }}
+    }}
+    
+}})()"""
     
     data = bytes(data).decode("utf-8")
     data = data.replace("'", "\\'")
@@ -356,12 +364,12 @@
     @rtype str
     """
     source = """
-        (function() {{
-            var css = document.createElement('style');
-            css.setAttribute('type', 'text/css');
-            css.appendChild(document.createTextNode('{0}'));
-            document.getElementsByTagName('head')[0].appendChild(css);
-            }})()"""
+(function() {{
+    var css = document.createElement('style');
+    css.setAttribute('type', 'text/css');
+    css.appendChild(document.createTextNode('{0}'));
+    document.getElementsByTagName('head')[0].appendChild(css);
+    }})()"""
     style = css.replace("'", "\\'").replace("\n", "\\n")
     return source.format(style)
 
@@ -378,22 +386,22 @@
     @rtype str
     """
     source = """
-        (function() {
-            var out = [];
-            var links = document.getElementsByTagName('link');
-            for (var i = 0; i < links.length; ++i) {
-                var e = links[i];
-                if ((e.rel == 'alternate') &&
-                    ((e.type == 'application/atom+xml') ||
-                     (e.type == 'application/rss+xml')
-                    )
-                   ) {
-                    out.push({
-                        url: e.getAttribute('href'),
-                        title: e.getAttribute('title')
-                    });
-                }
-            }
-            return out;
-        })()"""
+(function() {
+    var out = [];
+    var links = document.getElementsByTagName('link');
+    for (var i = 0; i < links.length; ++i) {
+        var e = links[i];
+        if ((e.rel == 'alternate') &&
+            ((e.type == 'application/atom+xml') ||
+             (e.type == 'application/rss+xml')
+            )
+           ) {
+            out.push({
+                url: e.getAttribute('href'),
+                title: e.getAttribute('title')
+            });
+        }
+    }
+    return out;
+})()"""
     return source
--- a/WebBrowser/WebBrowserPage.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/WebBrowserPage.py	Sat Feb 10 17:24:42 2018 +0100
@@ -337,7 +337,7 @@
         """
         oldChannel = self.webChannel()
         newChannel = QWebChannel(self)
-        newChannel.registerObject("eric_object", ExternalJsObject(self))
+        ExternalJsObject.setupWebChannel(newChannel, self)
         self.setWebChannel(newChannel)
         
         if oldChannel:
--- a/WebBrowser/WebBrowserWindow.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/WebBrowserWindow.py	Sat Feb 10 17:24:42 2018 +0100
@@ -530,7 +530,7 @@
         """
         Private method to set the global web settings.
         """
-        settings = QWebEngineSettings.defaultSettings()
+        settings = self.webSettings()
         
         settings.setFontFamily(
             QWebEngineSettings.StandardFont,
@@ -4171,8 +4171,7 @@
         """
         if codecNames:
             defaultCodec = \
-                QWebEngineSettings.defaultSettings().defaultTextEncoding()\
-                .lower()
+                self.webSettings().defaultTextEncoding().lower()
             
             menu = QMenu(title, parentMenu)
             for codec in codecNames:
@@ -4194,8 +4193,7 @@
                 codecs.append(codec)
         codecs.sort()
         
-        defaultTextEncoding = \
-            QWebEngineSettings.defaultSettings().defaultTextEncoding().lower()
+        defaultTextEncoding = self.webSettings().defaultTextEncoding().lower()
         if defaultTextEncoding in codecs:
             currentCodec = defaultTextEncoding
         else:
@@ -4249,9 +4247,9 @@
         """
         codec = act.data()
         if codec == "":
-            QWebEngineSettings.defaultSettings().setDefaultTextEncoding("")
+            self.webSettings().setDefaultTextEncoding("")
         else:
-            QWebEngineSettings.defaultSettings().setDefaultTextEncoding(codec)
+            self.webSettings().setDefaultTextEncoding(codec)
     
     def __populateToolbarsMenu(self, menu):
         """
@@ -4901,6 +4899,16 @@
         
         return cls._webProfile
     
+    @classmethod
+    def webSettings(cls):
+        """
+        Class method to get the web settings of the current profile.
+        
+        @return web settings of the current profile
+        @rtype QWebEngineSettings
+        """
+        return cls.webProfile().settings()
+    
     ####################################################
     ## Methods below implement session related functions
     ####################################################
--- a/WebBrowser/WebInspector.py	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/WebInspector.py	Sat Feb 10 17:24:42 2018 +0100
@@ -144,7 +144,8 @@
         if not os.getenv("QTWEBENGINE_REMOTE_DEBUGGING"):
             return False
         
-        if not QWebEngineSettings.defaultSettings().testAttribute(
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        if not WebBrowserWindow.webSettings().testAttribute(
                 QWebEngineSettings.JavascriptEnabled):
             return False
         
--- a/WebBrowser/data/html/speeddialPage.html	Fri Feb 09 19:44:25 2018 +0100
+++ b/WebBrowser/data/html/speeddialPage.html	Sat Feb 10 17:24:42 2018 +0100
@@ -560,7 +560,9 @@
 </head>
 
 <body>
-    <div id="quickdial"></div>
+    <div id="quickdial">
+        <noscript>@JAVASCRIPT_DISABLED@</noscript>
+    </div>
     <a onClick="configureSpeedDial();" title="@SETTINGS-TITLE@" class="sett"></a>
     <a onClick="addSpeedDial();" title="@ADD-TITLE@" class="add"></a>
 

eric ide

mercurial