Continued porting the web browser. QtWebEngine

Fri, 05 Feb 2016 20:02:09 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 05 Feb 2016 20:02:09 +0100
branch
QtWebEngine
changeset 4717
5841f229baf7
parent 4715
79009bc4acd5
child 4725
b19ff70ba509

Continued porting the web browser.

WebBrowser/JavaScript/AutoFillJsObject.py file | annotate | diff | comparison | revisions
WebBrowser/JavaScript/ExternalJsObject.py file | annotate | diff | comparison | revisions
WebBrowser/JavaScript/__init__.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/JavaScript/AutoFillJsObject.py	Fri Feb 05 20:02:09 2016 +0100
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Auto Fill web channel endpoint.
+"""
+
+#
+# This code was ported from QupZilla.
+# Copyright (C) David Rosca <nowrep@gmail.com>
+#
+
+from PyQt5.QtCore import pyqtSlot, QObject, QByteArray
+
+
+class AutoFillJsObject(QObject):
+    """
+    Class implementing the Auto Fill web channel endpoint.
+    """
+    def __init__(self, parent):
+        """
+        Constructor
+        
+        @param parent reference to the parent object
+        @type ExternalJsObject
+        """
+        super(AutoFillJsObject, self).__init__(parent)
+        
+        self.__jsObject = parent
+    
+    @pyqtSlot(str, str, str, QByteArray)
+    def formSubmitted(self, urlStr, userName, password, data):
+        """
+        Public slot passing form data to the auto fill manager.
+        """
+        # TODO: AutoFill
+        pass
+##void AutoFillJsObject::formSubmitted(const QString &frameUrl, const QString &username, const QString &password, const QByteArray &data)
+##{
+##    PageFormData formData;
+##    formData.username = username;
+##    formData.password = password;
+##    formData.postData = data;
+##
+##    mApp->autoFill()->saveForm(m_jsObject->page(), QUrl(frameUrl), formData);
+##}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/JavaScript/ExternalJsObject.py	Fri Feb 05 20:02:09 2016 +0100
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the JavaScript external object being the endpoint of
+a web channel.
+"""
+
+#
+# This code was ported from QupZilla.
+# Copyright (C) David Rosca <nowrep@gmail.com>
+#
+
+from PyQt5.QtCore import QObject
+
+from .AutoFillJsObject import AutoFillJsObject
+
+
+class ExternalJsObject(QObject):
+    """
+    Class implementing the endpoint of our web channel.
+    """
+    def __init__(self, page):
+        """
+        Constructor
+        
+        @param page reference to the web page object
+        @type WebBrowserPage
+        """
+        super(ExternalJsObject, self).__init__(page)
+        
+        self.__page = page
+        self.__autoFill = AutoFillJsObject(self)
+    
+    def page(self):
+        """
+        Public method returning a reference to the web page object.
+        
+        @return reference to the web page object
+        @rtype WebBrowserPage
+        """
+        return self.__page
+    
+    def speedDial(self):
+        """
+        Public method returning a reference to a speed dial object.
+        
+        @return reference to a speed dial object
+        @rtype SpeedDial
+        """
+        if self.__page.url().toString() != "eric:speeddial":
+            return None
+        
+        # TODO: SpeedDial
+##        return WebBrowser.WebBrowserWindow.WebBrowserWindow.speedDial()
+        return None
+    
+    def autoFill(self):
+        """
+        Public method returning a reference to the auto fill object.
+        
+        @return reference to the auto fill object
+        @rtype AutoFillJsObject
+        """
+        return self.__autoFill
+    
+##void ExternalJsObject::AddSearchProvider(const QString &engineUrl)
+##{ Slot
+##    mApp->searchEnginesManager()->addEngine(QUrl(engineUrl));
+##}
+##
+##int ExternalJsObject::IsSearchProviderInstalled(const QString &engineURL)
+##{ Slot
+##    qDebug() << "NOT IMPLEMENTED: IsSearchProviderInstalled()" << engineURL;
+##    return 0;
+##}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/JavaScript/__init__.py	Fri Feb 05 20:02:09 2016 +0100
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the external JavaScript objects.
+"""
--- a/WebBrowser/WebBrowserPage.py	Thu Feb 04 19:39:54 2016 +0100
+++ b/WebBrowser/WebBrowserPage.py	Fri Feb 05 20:02:09 2016 +0100
@@ -10,25 +10,20 @@
 
 from __future__ import unicode_literals
 try:
-    str = unicode
+    str = unicode       # __IGNORE_EXCEPTION__
 except NameError:
     pass
 
 from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, \
     QUrl, QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, \
-    QRect, QFile, QPoint, QByteArray, qVersion
+    QRect, QFile, QPoint, QByteArray, QEventLoop, qVersion
 from PyQt5.QtGui import QDesktopServices, QClipboard, QMouseEvent, QColor, \
     QPalette
 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication, QInputDialog, \
     QLineEdit, QLabel, QToolTip, QFrame, QDialog
 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
-##from PyQt5.QtWebKit import QWebSettings
-##from PyQt5.QtWebKitWidgets import QWebView, QWebPage
 from PyQt5.QtWebEngineWidgets import QWebEnginePage
-try:
-    from PyQt5.QtWebKit import QWebElement
-except ImportError:
-    pass
+from PyQt5.QtWebChannel import QWebChannel
 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
 import sip
 
@@ -37,6 +32,8 @@
 import WebBrowser
 import WebBrowser.WebBrowserWindow
 
+from .JavaScript.ExternalJsObject import ExternalJsObject
+
 import Preferences
 import UI.PixmapCache
 import Globals
@@ -173,6 +170,8 @@
         """
         super(WebBrowserPage, self).__init__(parent)
         
+        self.setupWebChannel()
+        
 ##        self.setPluginFactory(self.webPluginFactory())
 ##        
 ##        self.__lastRequest = None
@@ -186,8 +185,8 @@
 ##        self.__proxy.setPrimaryNetworkAccessManager(
 ##            Helpviewer.HelpWindow.HelpWindow.networkAccessManager())
 ##        self.setNetworkAccessManager(self.__proxy)
-##        
-##        self.__sslConfiguration = None
+        
+        self.__sslConfiguration = None
 ##        self.__proxy.finished.connect(self.__managerFinished)
 ##        
         self.__adBlockedEntries = []
@@ -587,37 +586,32 @@
 ##                self.tr("SSL Info"),
 ##                self.tr("""This site does not contain SSL information."""))
 ##    
-##    def hasValidSslInfo(self):
-##        """
-##        Public method to check, if the page has a valid SSL certificate.
-##        
-##        @return flag indicating a valid SSL certificate (boolean)
-##        """
-##        if self.__sslConfiguration is None:
-##            return False
-##        
-##        certList = self.__sslConfiguration.peerCertificateChain()
-##        if not certList:
-##            return False
-##        
-##        certificateDict = Globals.toDict(
-##            Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-##        for server in certificateDict:
-##            localCAList = QSslCertificate.fromData(certificateDict[server])
-##            for cert in certList:
-##                if cert in localCAList:
-##                    return True
-##        
-##        if qVersion() >= "5.0.0":
-##            for cert in certList:
-##                if cert.isBlacklisted():
-##                    return False
-##        else:
-##            for cert in certList:
-##                if not cert.isValid():
-##                    return False
-##        
-##        return True
+    def hasValidSslInfo(self):
+        """
+        Public method to check, if the page has a valid SSL certificate.
+        
+        @return flag indicating a valid SSL certificate (boolean)
+        """
+        if self.__sslConfiguration is None:
+            return False
+        
+        certList = self.__sslConfiguration.peerCertificateChain()
+        if not certList:
+            return False
+        
+        certificateDict = Globals.toDict(
+            Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
+        for server in certificateDict:
+            localCAList = QSslCertificate.fromData(certificateDict[server])
+            for cert in certList:
+                if cert in localCAList:
+                    return True
+        
+        for cert in certList:
+            if cert.isBlacklisted():
+                return False
+        
+        return True
     
 ##    @classmethod
 ##    def webPluginFactory(cls):
@@ -711,6 +705,69 @@
         @param feature requested feature
         @type QWebEnginePage.Feature
         """
-        manager = WebBrowser.WebBrowserWindow.WebBrowserWindow\
-            .featurePermissionManager()
-        manager.requestFeaturePermission(self, frame, feature)
+        # TODO: Feature Permission
+##        manager = WebBrowser.WebBrowserWindow.WebBrowserWindow\
+##            .featurePermissionManager()
+##        manager.requestFeaturePermission(self, frame, feature)
+    
+    def execJavaScript(self, script):
+        """
+        Public method to execute a JavaScript function synchroneously.
+        
+        @param script JavaScript script source to be executed
+        @type str
+        @return result of the script
+        @rtype depending upon script result
+        """
+        loop = QEventLoop()
+        resultDict = {"res": None}
+        
+        def resultCallback(res, resDict=resultDict):
+            if loop and loop.isRunning():
+                resDict["res"] = res
+                loop.quit()
+        
+        self.previewView.page().runJavaScript(
+            script, resultCallback)
+        
+        loop.exec_()
+        return resultDict["res"]
+    
+    def scroll(self, x, y):
+        """
+        Public method to scroll by the given amount of pixels.
+        
+        @param x horizontal scroll value
+        @type int
+        @param y vertical scroll value
+        @type int
+        """
+        self.runJavaScript(
+            "window.scrollTo(window.scrollX + {0}, window.scrollY + {1})"
+            .format(x, y)
+        )
+    
+    def hitTestContent(self, pos):
+        """
+        Public method to test the contents at a given position.
+        
+        @param pos position to be tested
+        @type QPoint
+        @return object containing the test results
+        @rtype WebBrowserHitTestResult
+        """
+        # TODO: WebBrowserHitTestResult
+##        return WebBrowserHitTestResult(self, pos) 
+    
+    def setupWebChannel(self):
+        """
+        Public method to setup a web channel to our external object.
+        """
+        oldChannel = self.webChannel()
+        newChannel = QWebChannel()
+        newChannel.registerObject("eric_object", ExternalJsObject(self))
+        self.setWebChannel(newChannel)
+        
+        if oldChannel:
+            del oldChannel.registeredObjects["eric_object"]
+            del oldChannel
--- a/WebBrowser/WebBrowserView.py	Thu Feb 04 19:39:54 2016 +0100
+++ b/WebBrowser/WebBrowserView.py	Fri Feb 05 20:02:09 2016 +0100
@@ -40,117 +40,6 @@
 except ImportError:
     SSL_AVAILABLE = False
 
-###############################################################################
-##
-##
-##class JavaScriptExternalObject(QObject):
-##    """
-##    Class implementing an external javascript object to add search providers.
-##    """
-##    def __init__(self, mw, parent=None):
-##        """
-##        Constructor
-##        
-##        @param mw reference to the main window 8HelpWindow)
-##        @param parent reference to the parent object (QObject)
-##        """
-##        super(JavaScriptExternalObject, self).__init__(parent)
-##        
-##        self.__mw = mw
-##    
-##    @pyqtSlot(str)
-##    def AddSearchProvider(self, url):
-##        """
-##        Public slot to add a search provider.
-##        
-##        @param url url of the XML file defining the search provider (string)
-##        """
-##        self.__mw.openSearchManager().addEngine(QUrl(url))
-##
-##
-##class LinkedResource(object):
-##    """
-##    Class defining a data structure for linked resources.
-##    """
-##    def __init__(self):
-##        """
-##        Constructor
-##        """
-##        self.rel = ""
-##        self.type_ = ""
-##        self.href = ""
-##        self.title = ""
-##
-###############################################################################
-##
-##
-##class JavaScriptEricObject(QObject):
-##    """
-##    Class implementing an external javascript object to search via the
-##    startpage.
-##    """
-##    # these must be in line with the strings used by the javascript part of
-##    # the start page
-##    translations = [
-##        QT_TRANSLATE_NOOP("JavaScriptEricObject",
-##                          "Welcome to eric6 Web Browser!"),
-##        QT_TRANSLATE_NOOP("JavaScriptEricObject", "eric6 Web Browser"),
-##        QT_TRANSLATE_NOOP("JavaScriptEricObject", "Search!"),
-##        QT_TRANSLATE_NOOP("JavaScriptEricObject", "About eric6"),
-##    ]
-##    
-##    def __init__(self, mw, parent=None):
-##        """
-##        Constructor
-##        
-##        @param mw reference to the main window 8HelpWindow)
-##        @param parent reference to the parent object (QObject)
-##        """
-##        super(JavaScriptEricObject, self).__init__(parent)
-##        
-##        self.__mw = mw
-##    
-##    @pyqtSlot(str, result=str)
-##    def translate(self, trans):
-##        """
-##        Public method to translate the given string.
-##        
-##        @param trans string to be translated (string)
-##        @return translation (string)
-##        """
-##        if trans == "QT_LAYOUT_DIRECTION":
-##            # special handling to detect layout direction
-##            if qApp.isLeftToRight():
-##                return "LTR"
-##            else:
-##                return "RTL"
-##        
-##        return self.tr(trans)
-##    
-##    @pyqtSlot(result=str)
-##    def providerString(self):
-##        """
-##        Public method to get a string for the search provider.
-##        
-##        @return string for the search provider (string)
-##        """
-##        return self.tr("Search results provided by {0}")\
-##            .format(self.__mw.openSearchManager().currentEngineName())
-##    
-##    @pyqtSlot(str, result=str)
-##    def searchUrl(self, searchStr):
-##        """
-##        Public method to get the search URL for the given search term.
-##        
-##        @param searchStr search term (string)
-##        @return search URL (string)
-##        """
-##        return bytes(
-##            self.__mw.openSearchManager().currentEngine()
-##            .searchUrl(searchStr).toEncoded()).decode()
-##
-###############################################################################
-
 
 class WebBrowserView(QWebEngineView):
     """
@@ -187,6 +76,9 @@
         """
         super(WebBrowserView, self).__init__(parent)
         self.setObjectName(name)
+        
+        self.__rwhvqt = None
+        self.installEventFilter(self)
 ##        
 ##        import Helpviewer.HelpWindow
 ##        self.__speedDial = Helpviewer.HelpWindow.HelpWindow.speedDial()
@@ -232,9 +124,6 @@
 ##        self.__mw.openSearchManager().currentEngineChanged.connect(
 ##            self.__currentEngineChanged)
         
-        self.__rwhvqt = None
-        # TODO: eventFilter (see below)
-##        self.installEventFilter(self)
         self.setAcceptDrops(True)
         
         # TODO: Access Keys
@@ -254,7 +143,8 @@
 ##        self.__mw.personalInformationManager().connectPage(self.page())
         # TODO: GreaseMonkey
 ##        self.__mw.greaseMonkeyManager().connectPage(self.page())
-##        
+        
+        # TODO: WebInspector
 ##        self.__inspector = None
         
         self.grabGesture(Qt.PinchGesture)
@@ -1272,7 +1162,7 @@
                 self.setSource(url)
                 evt.acceptProposedAction()
     
-    def mousePressEvent(self, evt):
+    def _mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
         
@@ -1288,7 +1178,7 @@
         else:
             super(WebBrowserView, self).mousePressEvent(evt)
     
-    def mouseReleaseEvent(self, evt):
+    def _mouseReleaseEvent(self, evt):
         """
         Protected method called by a mouse release event.
         
@@ -1307,7 +1197,7 @@
                 self.setSource(url)
         evt.setAccepted(accepted)
     
-    def wheelEvent(self, evt):
+    def _wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
         
@@ -1332,45 +1222,45 @@
         
         super(WebBrowserView, self).wheelEvent(evt)
     
-##    def keyPressEvent(self, evt):
-##        """
-##        Protected method called by a key press.
-##        
-##        @param evt reference to the key event (QKeyEvent)
-##        """
-##        # TODO: PIM
-####        if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt):
-####            return
-##        
-##        # TODO: Access Keys
-####        if self.__enableAccessKeys:
-####            self.__accessKeysPressed = (
-####                evt.modifiers() == Qt.ControlModifier and
-####                evt.key() == Qt.Key_Control)
-####            if not self.__accessKeysPressed:
-####                if self.__checkForAccessKey(evt):
-####                    self.__hideAccessKeys()
-####                    evt.accept()
-####                    return
-####                self.__hideAccessKeys()
-####            else:
-####                QTimer.singleShot(300, self.__accessKeyShortcut)
-##        
-##        self.__ctrlPressed = (evt.key() == Qt.Key_Control)
-##        super(WebBrowserView, self).keyPressEvent(evt)
-##    
-##    def keyReleaseEvent(self, evt):
-##        """
-##        Protected method called by a key release.
-##        
-##        @param evt reference to the key event (QKeyEvent)
-##        """
-##        # TODO: Access Keys
-####        if self.__enableAccessKeys:
-####            self.__accessKeysPressed = evt.key() == Qt.Key_Control
-##        
-##        self.__ctrlPressed = False
-##        super(WebBrowserView, self).keyReleaseEvent(evt)
+    def _keyPressEvent(self, evt):
+        """
+        Protected method called by a key press.
+        
+        @param evt reference to the key event (QKeyEvent)
+        """
+        # TODO: PIM
+##        if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt):
+##            return
+        
+        # TODO: Access Keys
+##        if self.__enableAccessKeys:
+##            self.__accessKeysPressed = (
+##                evt.modifiers() == Qt.ControlModifier and
+##                evt.key() == Qt.Key_Control)
+##            if not self.__accessKeysPressed:
+##                if self.__checkForAccessKey(evt):
+##                    self.__hideAccessKeys()
+##                    evt.accept()
+##                    return
+##                self.__hideAccessKeys()
+##            else:
+##                QTimer.singleShot(300, self.__accessKeyShortcut)
+        
+        self.__ctrlPressed = (evt.key() == Qt.Key_Control)
+        super(WebBrowserView, self).keyPressEvent(evt)
+    
+    def _keyReleaseEvent(self, evt):
+        """
+        Protected method called by a key release.
+        
+        @param evt reference to the key event (QKeyEvent)
+        """
+        # TODO: Access Keys
+##        if self.__enableAccessKeys:
+##            self.__accessKeysPressed = evt.key() == Qt.Key_Control
+        
+        self.__ctrlPressed = False
+        super(WebBrowserView, self).keyReleaseEvent(evt)
     
     def focusOutEvent(self, evt):
         """
@@ -1385,20 +1275,21 @@
         
         super(WebBrowserView, self).focusOutEvent(evt)
     
-    def event(self, evt):
-        """
-        Public method handling events.
-        
-        @param evt reference to the event (QEvent)
-        @return flag indicating, if the event was handled (boolean)
-        """
-        if evt.type() == QEvent.Gesture:
-            self.gestureEvent(evt)
-            return True
-        
-        return super(WebBrowserView, self).event(evt)
+    # TODO: Obsoleted by eventFilter() (?)
+##    def event(self, evt):
+##        """
+##        Public method handling events.
+##        
+##        @param evt reference to the event (QEvent)
+##        @return flag indicating, if the event was handled (boolean)
+##        """
+##        if evt.type() == QEvent.Gesture:
+##            self.gestureEvent(evt)
+##            return True
+##        
+##        return super(WebBrowserView, self).event(evt)
     
-    def gestureEvent(self, evt):
+    def _gestureEvent(self, evt):
         """
         Protected method handling gesture events.
         
@@ -1413,73 +1304,58 @@
                 self.__currentZoom = int(scaleFactor * 100)
                 self.__applyZoom()
             evt.accept()
-##bool WebView::eventFilter(QObject *obj, QEvent *event)
-##{
-##    // Hack to find widget that receives input events
-##    if (obj == this && event->type() == QEvent::ChildAdded) {
-##        QWidget *child = qobject_cast<QWidget*>(static_cast<QChildEvent*>(event)->child());
-##        if (child && child->inherits("QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget")) {
-##            m_rwhvqt = child;
-##            m_rwhvqt->installEventFilter(this);
-##        }
-##    }
-##
-##    // Forward events to WebView
-##    if (obj == m_rwhvqt) {
-###define HANDLE_EVENT(f, t) \
-##        { \
-##        bool wasAccepted = event->isAccepted(); \
-##        event->setAccepted(false); \
-##        f(static_cast<t*>(event)); \
-##        bool ret = event->isAccepted(); \
-##        event->setAccepted(wasAccepted); \
-##        return ret; \
-##        }
-##
-##        switch (event->type()) {
-##        case QEvent::KeyPress:
-##            HANDLE_EVENT(_keyPressEvent, QKeyEvent);
-##
-##        case QEvent::KeyRelease:
-##            HANDLE_EVENT(_keyReleaseEvent, QKeyEvent);
-##
-##        case QEvent::MouseButtonPress:
-##            HANDLE_EVENT(_mousePressEvent, QMouseEvent);
-##
-##        case QEvent::MouseButtonRelease:
-##            HANDLE_EVENT(_mouseReleaseEvent, QMouseEvent);
-##
-##        case QEvent::MouseMove:
-##            HANDLE_EVENT(_mouseMoveEvent, QMouseEvent);
-##
-##        case QEvent::Wheel:
-##            HANDLE_EVENT(_wheelEvent, QWheelEvent);
-##
-##        default:
-##            break;
-##        }
-##
-###undef HANDLE_EVENT
-##    }
-##
-##    // Block already handled events
-##    if (obj == this) {
-##        switch (event->type()) {
-##        case QEvent::KeyPress:
-##        case QEvent::KeyRelease:
-##        case QEvent::MouseButtonPress:
-##        case QEvent::MouseButtonRelease:
-##        case QEvent::MouseMove:
-##        case QEvent::Wheel:
-##            return true;
-##
-##        default:
-##            break;
-##        }
-##    }
-##
-##    return QWebEngineView::eventFilter(obj, event);
-##}
+    
+    def eventFilter(self, obj, evt):
+        """
+        Protected method to process event for other objects.
+        
+        @param obj reference to object to process events for
+        @type QObject
+        @param evt reference to event to be processed
+        @type QEvent
+        @return flag indicating that the event should be filtered out
+        @rtype bool
+        """
+        # find the render widget receiving events for the web page
+        if obj is self and evt.type() == QEvent.ChildAdded:
+            child = evt.child()
+            if child and child.inherits(
+                    "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"):
+                self.__rwhvqt = child
+                self.__rwhvqt.installEventFilter(self)
+        
+        # forward events to WebBrowserView
+        if obj is self.__rwhvqt:
+            wasAccepted = evt.isAccepted()
+            evt.setAccepted(False)
+            if evt.type() == QEvent.KeyPress:
+                self._keyPressEvent(evt)
+            elif evt.type() == QEvent.KeyRelease:
+                self._keyReleaseEvent(evt)
+            elif evt.type() == QEvent.MouseButtonPress:
+                self._mousePressEvent(evt)
+            elif evt.type() == QEvent.MouseButtonRelease:
+                self._mouseReleaseEvent(evt)
+##            elif evt.type() == QEvent.MouseMove:
+##                self.__mouseMoveEvent(evt)
+            elif evt.type() == QEvent.Wheel:
+                self._wheelEvent(evt)
+            elif evt.type() == QEvent.Gesture:
+                self._gestureEvent(evt)
+            ret = evt.isAccepted()
+            evt.setAccepted(wasAccepted)
+            return ret
+        
+        # block already handled events
+        if obj is self:
+            if evt.type() in [QEvent.KeyPress, QEvent.KeyRelease,
+                              QEvent.MouseButtonPress,
+                              QEvent.MouseButtonRelease,
+##                              QEvent.MouseMove,
+                              QEvent.Wheel, QEvent.Gesture]:
+                return True
+        
+        return super(WebBrowserView, self).eventFilter(obj, evt)
     
     def clearHistory(self):
         """
@@ -1547,10 +1423,11 @@
         self.__isLoading = False
         self.__progress = 0
         
-        if Preferences.getHelp("ClickToFlashEnabled"):
-            # this is a hack to make the ClickToFlash button appear
-            self.zoomIn()
-            self.zoomOut()
+        # TODO: ClickToFlash (?)
+##        if Preferences.getHelp("ClickToFlashEnabled"):
+##            # this is a hack to make the ClickToFlash button appear
+##            self.zoomIn()
+##            self.zoomOut()
         
         # TODO: Zoom Manager
 ##        zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\
--- a/WebBrowser/WebBrowserWindow.py	Thu Feb 04 19:39:54 2016 +0100
+++ b/WebBrowser/WebBrowserWindow.py	Fri Feb 05 20:02:09 2016 +0100
@@ -1674,9 +1674,9 @@
         
         menu = mb.addMenu(self.tr('&View'))
         menu.setTearOffEnabled(True)
-##        menu.addAction(self.zoomInAct)
-##        menu.addAction(self.zoomResetAct)
-##        menu.addAction(self.zoomOutAct)
+        menu.addAction(self.zoomInAct)
+        menu.addAction(self.zoomResetAct)
+        menu.addAction(self.zoomOutAct)
 ##        if self.zoomTextOnlyAct is not None:
 ##            menu.addAction(self.zoomTextOnlyAct)
         menu.addSeparator()
@@ -1832,12 +1832,12 @@
         edittb.setIconSize(UI.Config.ToolBarIconSize)
         edittb.addAction(self.copyAct)
         
-##        viewtb = self.addToolBar(self.tr("View"))
-##        viewtb.setObjectName("ViewToolBar")
-##        viewtb.setIconSize(UI.Config.ToolBarIconSize)
-##        viewtb.addAction(self.zoomInAct)
-##        viewtb.addAction(self.zoomResetAct)
-##        viewtb.addAction(self.zoomOutAct)
+        viewtb = self.addToolBar(self.tr("View"))
+        viewtb.setObjectName("ViewToolBar")
+        viewtb.setIconSize(UI.Config.ToolBarIconSize)
+        viewtb.addAction(self.zoomInAct)
+        viewtb.addAction(self.zoomResetAct)
+        viewtb.addAction(self.zoomOutAct)
 ##        viewtb.addSeparator()
 ##        viewtb.addAction(self.fullScreenAct)
         
@@ -2545,28 +2545,29 @@
                 # set value of zoom widget
                 self.__zoomWidget.setValue(cb.zoomValue())
     
+    # TODO: Preferences dialog
     def __showPreferences(self):
         """
         Private slot to set the preferences.
         """
-        from Preferences.ConfigurationDialog import ConfigurationDialog
-        dlg = ConfigurationDialog(
-            self, 'Configuration', True, fromEric=self.__fromEric,
-            displayMode=ConfigurationDialog.WebBrowserMode)
-        dlg.preferencesChanged.connect(self.preferencesChanged)
-        dlg.masterPasswordChanged.connect(self.masterPasswordChanged)
-        dlg.show()
-        if self.__lastConfigurationPageName:
-            dlg.showConfigurationPageByName(self.__lastConfigurationPageName)
-        else:
-            dlg.showConfigurationPageByName("empty")
-        dlg.exec_()
-        QApplication.processEvents()
-        if dlg.result() == QDialog.Accepted:
-            dlg.setPreferences()
-            Preferences.syncPreferences()
-            self.preferencesChanged()
-        self.__lastConfigurationPageName = dlg.getConfigurationPageName()
+##        from Preferences.ConfigurationDialog import ConfigurationDialog
+##        dlg = ConfigurationDialog(
+##            self, 'Configuration', True, fromEric=self.__fromEric,
+##            displayMode=ConfigurationDialog.WebBrowserMode)
+##        dlg.preferencesChanged.connect(self.preferencesChanged)
+##        dlg.masterPasswordChanged.connect(self.masterPasswordChanged)
+##        dlg.show()
+##        if self.__lastConfigurationPageName:
+##            dlg.showConfigurationPageByName(self.__lastConfigurationPageName)
+##        else:
+##            dlg.showConfigurationPageByName("empty")
+##        dlg.exec_()
+##        QApplication.processEvents()
+##        if dlg.result() == QDialog.Accepted:
+##            dlg.setPreferences()
+##            Preferences.syncPreferences()
+##            self.preferencesChanged()
+##        self.__lastConfigurationPageName = dlg.getConfigurationPageName()
     
     def preferencesChanged(self):
         """
@@ -3576,38 +3577,38 @@
         else:
             QWebEngineSettings.globalSettings().setDefaultTextEncoding(codec)
     
-##    def eventMouseButtons(self):
-##        """
-##        Public method to get the last recorded mouse buttons.
-##        
-##        @return mouse buttons (Qt.MouseButtons)
-##        """
-##        return self.__eventMouseButtons
-##    
-##    def eventKeyboardModifiers(self):
-##        """
-##        Public method to get the last recorded keyboard modifiers.
-##        
-##        @return keyboard modifiers (Qt.KeyboardModifiers)
-##        """
-##        return self.__eventKeyboardModifiers
-##    
-##    def setEventMouseButtons(self, buttons):
-##        """
-##        Public method to record mouse buttons.
-##        
-##        @param buttons mouse buttons to record (Qt.MouseButtons)
-##        """
-##        self.__eventMouseButtons = buttons
-##    
-##    def setEventKeyboardModifiers(self, modifiers):
-##        """
-##        Public method to record keyboard modifiers.
-##        
-##        @param modifiers keyboard modifiers to record (Qt.KeyboardModifiers)
-##        """
-##        self.__eventKeyboardModifiers = modifiers
-##    
+    def eventMouseButtons(self):
+        """
+        Public method to get the last recorded mouse buttons.
+        
+        @return mouse buttons (Qt.MouseButtons)
+        """
+        return self.__eventMouseButtons
+    
+    def eventKeyboardModifiers(self):
+        """
+        Public method to get the last recorded keyboard modifiers.
+        
+        @return keyboard modifiers (Qt.KeyboardModifiers)
+        """
+        return self.__eventKeyboardModifiers
+    
+    def setEventMouseButtons(self, buttons):
+        """
+        Public method to record mouse buttons.
+        
+        @param buttons mouse buttons to record (Qt.MouseButtons)
+        """
+        self.__eventMouseButtons = buttons
+    
+    def setEventKeyboardModifiers(self, modifiers):
+        """
+        Public method to record keyboard modifiers.
+        
+        @param modifiers keyboard modifiers to record (Qt.KeyboardModifiers)
+        """
+        self.__eventKeyboardModifiers = modifiers
+    
     def mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
--- a/eric6.e4p	Thu Feb 04 19:39:54 2016 +0100
+++ b/eric6.e4p	Fri Feb 05 20:02:09 2016 +0100
@@ -1264,6 +1264,9 @@
     <Source>ViewManager/BookmarkedFilesDialog.py</Source>
     <Source>ViewManager/ViewManager.py</Source>
     <Source>ViewManager/__init__.py</Source>
+    <Source>WebBrowser/JavaScript/AutoFillJsObject.py</Source>
+    <Source>WebBrowser/JavaScript/ExternalJsObject.py</Source>
+    <Source>WebBrowser/JavaScript/__init__.py</Source>
     <Source>WebBrowser/SearchWidget.py</Source>
     <Source>WebBrowser/UrlBar/StackedUrlBar.py</Source>
     <Source>WebBrowser/UrlBar/UrlBar.py</Source>

eric ide

mercurial