11 from PyQt4.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, QUrl, \ |
11 from PyQt4.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, QUrl, \ |
12 QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, QRect, QFile, QPoint |
12 QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, QRect, QFile, QPoint |
13 from PyQt4.QtGui import qApp, QDesktopServices, QStyle, QMenu, QApplication, \ |
13 from PyQt4.QtGui import qApp, QDesktopServices, QStyle, QMenu, QApplication, \ |
14 QInputDialog, QLineEdit, QClipboard, QMouseEvent, QLabel, QToolTip, QColor, \ |
14 QInputDialog, QLineEdit, QClipboard, QMouseEvent, QLabel, QToolTip, QColor, \ |
15 QPalette, QFrame, QPrinter, QPrintDialog, QDialog |
15 QPalette, QFrame, QPrinter, QPrintDialog, QDialog |
16 from PyQt4 import QtWebKit |
|
17 from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings |
16 from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings |
18 try: |
17 try: |
19 from PyQt4.QtWebKit import QWebElement |
18 from PyQt4.QtWebKit import QWebElement |
20 except ImportError: |
19 except ImportError: |
21 pass |
20 pass |
588 self.mw.openSearchManager().currentEngineChanged.connect( |
586 self.mw.openSearchManager().currentEngineChanged.connect( |
589 self.__currentEngineChanged) |
587 self.__currentEngineChanged) |
590 |
588 |
591 self.setAcceptDrops(True) |
589 self.setAcceptDrops(True) |
592 |
590 |
593 if hasattr(QtWebKit, 'QWebElement'): |
591 self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") |
594 self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") |
592 self.__accessKeysPressed = False |
595 self.__accessKeysPressed = False |
593 self.__accessKeyLabels = [] |
596 self.__accessKeyLabels = [] |
594 self.__accessKeyNodes = {} |
597 self.__accessKeyNodes = {} |
595 |
598 |
596 self.page().loadStarted.connect(self.__hideAccessKeys) |
599 self.page().loadStarted.connect(self.__hideAccessKeys) |
597 self.page().scrollRequested.connect(self.__hideAccessKeys) |
600 self.page().scrollRequested.connect(self.__hideAccessKeys) |
|
601 |
598 |
602 self.__rss = [] |
599 self.__rss = [] |
603 |
600 |
604 self.__clickedFrame = None |
601 self.__clickedFrame = None |
605 |
602 |
611 """ |
608 """ |
612 Private slot to add javascript bindings for adding search providers. |
609 Private slot to add javascript bindings for adding search providers. |
613 |
610 |
614 @param frame reference to the web frame (QWebFrame) |
611 @param frame reference to the web frame (QWebFrame) |
615 """ |
612 """ |
616 if not hasattr(QtWebKit, 'QWebElement'): |
|
617 # test this only for Qt < 4.6.0 |
|
618 if not QWebSettings.globalSettings()\ |
|
619 .testAttribute(QWebSettings.JavascriptEnabled): |
|
620 return |
|
621 |
|
622 self.page().settings().setAttribute(QWebSettings.JavascriptEnabled, True) |
613 self.page().settings().setAttribute(QWebSettings.JavascriptEnabled, True) |
623 if self.__javaScriptBinding is None: |
614 if self.__javaScriptBinding is None: |
624 self.__javaScriptBinding = JavaScriptExternalObject(self.mw, self) |
615 self.__javaScriptBinding = JavaScriptExternalObject(self.mw, self) |
625 |
616 |
626 if frame is None: |
617 if frame is None: |
647 @param relation relation to extract (string) |
638 @param relation relation to extract (string) |
648 @return list of linked resources (list of LinkedResource) |
639 @return list of linked resources (list of LinkedResource) |
649 """ |
640 """ |
650 resources = [] |
641 resources = [] |
651 |
642 |
652 if hasattr(QtWebKit, 'QWebElement'): |
643 baseUrl = self.page().mainFrame().baseUrl() |
653 baseUrl = self.page().mainFrame().baseUrl() |
644 |
|
645 linkElements = self.page().mainFrame().findAllElements("html > head > link") |
|
646 |
|
647 for linkElement in linkElements.toList(): |
|
648 rel = linkElement.attribute("rel") |
|
649 href = linkElement.attribute("href") |
|
650 type_ = linkElement.attribute("type") |
|
651 title = linkElement.attribute("title") |
654 |
652 |
655 linkElements = self.page().mainFrame().findAllElements("html > head > link") |
653 if href == "" or type_ == "": |
|
654 continue |
|
655 if relation and rel != relation: |
|
656 continue |
656 |
657 |
657 for linkElement in linkElements.toList(): |
658 resource = LinkedResource() |
658 rel = linkElement.attribute("rel") |
659 resource.rel = rel |
659 href = linkElement.attribute("href") |
660 resource.type_ = type_ |
660 type_ = linkElement.attribute("type") |
661 resource.href = baseUrl.resolved(QUrl.fromEncoded(href)) |
661 title = linkElement.attribute("title") |
662 resource.title = title |
662 |
|
663 if href == "" or type_ == "": |
|
664 continue |
|
665 if relation and rel != relation: |
|
666 continue |
|
667 |
|
668 resource = LinkedResource() |
|
669 resource.rel = rel |
|
670 resource.type_ = type_ |
|
671 resource.href = baseUrl.resolved(QUrl.fromEncoded(href)) |
|
672 resource.title = title |
|
673 |
|
674 resources.append(resource) |
|
675 else: |
|
676 baseUrlString = self.page().mainFrame().evaluateJavaScript("document.baseURI") |
|
677 baseUrl = QUrl.fromEncoded(baseUrlString) |
|
678 |
663 |
679 lst = self.page().mainFrame().evaluateJavaScript(fetchLinks_js) |
664 resources.append(resource) |
680 for m in lst: |
|
681 rel = m["rel"] |
|
682 type_ = m["type"] |
|
683 href = m["href"] |
|
684 title = m["title"] |
|
685 |
|
686 if href == "" or type_ == "": |
|
687 continue |
|
688 if relation and rel != relation: |
|
689 continue |
|
690 |
|
691 resource = LinkedResource() |
|
692 resource.rel = rel |
|
693 resource.type_ = type_ |
|
694 resource.href = baseUrl.resolved(QUrl.fromEncoded(href)) |
|
695 resource.title = title |
|
696 |
|
697 resources.append(resource) |
|
698 |
665 |
699 return resources |
666 return resources |
700 |
667 |
701 def __currentEngineChanged(self): |
668 def __currentEngineChanged(self): |
702 """ |
669 """ |
1152 if self.__isUrlValid(guessedUrl): |
1119 if self.__isUrlValid(guessedUrl): |
1153 menu.addAction(self.trUtf8("Go to web address"), self.__openLinkInNewTab)\ |
1120 menu.addAction(self.trUtf8("Go to web address"), self.__openLinkInNewTab)\ |
1154 .setData(guessedUrl) |
1121 .setData(guessedUrl) |
1155 menu.addSeparator() |
1122 menu.addSeparator() |
1156 |
1123 |
1157 if hasattr(QtWebKit, 'QWebElement'): |
1124 element = hit.element() |
1158 element = hit.element() |
1125 if not element.isNull() and \ |
1159 if not element.isNull() and \ |
1126 element.tagName().lower() == "input" and \ |
1160 element.tagName().lower() == "input" and \ |
1127 element.attribute("type", "text") == "text": |
1161 element.attribute("type", "text") == "text": |
1128 menu.addAction(self.trUtf8("Add to web search toolbar"), |
1162 menu.addAction(self.trUtf8("Add to web search toolbar"), |
1129 self.__addSearchEngine).setData(element) |
1163 self.__addSearchEngine).setData(element) |
1130 menu.addSeparator() |
1164 menu.addSeparator() |
|
1165 |
1131 |
1166 menu.addAction(UI.PixmapCache.getIcon("webInspector.png"), |
1132 menu.addAction(UI.PixmapCache.getIcon("webInspector.png"), |
1167 self.trUtf8("Web Inspector..."), self.__webInspector) |
1133 self.trUtf8("Web Inspector..."), self.__webInspector) |
1168 |
1134 |
1169 menu.exec_(evt.globalPos()) |
1135 menu.exec_(evt.globalPos()) |
1539 @param evt reference to the key event (QKeyEvent) |
1505 @param evt reference to the key event (QKeyEvent) |
1540 """ |
1506 """ |
1541 if self.mw.personalInformationManager().viewKeyPressEvent(self, evt): |
1507 if self.mw.personalInformationManager().viewKeyPressEvent(self, evt): |
1542 return |
1508 return |
1543 |
1509 |
1544 if hasattr(QtWebKit, 'QWebElement'): |
1510 if self.__enableAccessKeys: |
1545 if self.__enableAccessKeys: |
1511 self.__accessKeysPressed = ( |
1546 self.__accessKeysPressed = ( |
1512 evt.modifiers() == Qt.ControlModifier and \ |
1547 evt.modifiers() == Qt.ControlModifier and \ |
1513 evt.key() == Qt.Key_Control) |
1548 evt.key() == Qt.Key_Control) |
1514 if not self.__accessKeysPressed: |
1549 if not self.__accessKeysPressed: |
1515 if self.__checkForAccessKey(evt): |
1550 if self.__checkForAccessKey(evt): |
|
1551 self.__hideAccessKeys() |
|
1552 evt.accept() |
|
1553 return |
|
1554 self.__hideAccessKeys() |
1516 self.__hideAccessKeys() |
1555 else: |
1517 evt.accept() |
1556 QTimer.singleShot(300, self.__accessKeyShortcut) |
1518 return |
|
1519 self.__hideAccessKeys() |
|
1520 else: |
|
1521 QTimer.singleShot(300, self.__accessKeyShortcut) |
1557 |
1522 |
1558 self.ctrlPressed = (evt.key() == Qt.Key_Control) |
1523 self.ctrlPressed = (evt.key() == Qt.Key_Control) |
1559 super().keyPressEvent(evt) |
1524 super().keyPressEvent(evt) |
1560 |
1525 |
1561 def keyReleaseEvent(self, evt): |
1526 def keyReleaseEvent(self, evt): |
1562 """ |
1527 """ |
1563 Protected method called by a key release. |
1528 Protected method called by a key release. |
1564 |
1529 |
1565 @param evt reference to the key event (QKeyEvent) |
1530 @param evt reference to the key event (QKeyEvent) |
1566 """ |
1531 """ |
1567 if hasattr(QtWebKit, 'QWebElement'): |
1532 if self.__enableAccessKeys: |
1568 if self.__enableAccessKeys: |
1533 self.__accessKeysPressed = evt.key() == Qt.Key_Control |
1569 self.__accessKeysPressed = evt.key() == Qt.Key_Control |
|
1570 |
1534 |
1571 self.ctrlPressed = False |
1535 self.ctrlPressed = False |
1572 super().keyReleaseEvent(evt) |
1536 super().keyReleaseEvent(evt) |
1573 |
1537 |
1574 def focusOutEvent(self, evt): |
1538 def focusOutEvent(self, evt): |
1575 """ |
1539 """ |
1576 Protected method called by a focus out event. |
1540 Protected method called by a focus out event. |
1577 |
1541 |
1578 @param evt reference to the focus event (QFocusEvent) |
1542 @param evt reference to the focus event (QFocusEvent) |
1579 """ |
1543 """ |
1580 if hasattr(QtWebKit, 'QWebElement'): |
1544 if self.__accessKeysPressed: |
1581 if self.__accessKeysPressed: |
1545 self.__hideAccessKeys() |
1582 self.__hideAccessKeys() |
1546 self.__accessKeysPressed = False |
1583 self.__accessKeysPressed = False |
|
1584 |
1547 |
1585 super().focusOutEvent(evt) |
1548 super().focusOutEvent(evt) |
1586 |
1549 |
1587 def event(self, evt): |
1550 def event(self, evt): |
1588 """ |
1551 """ |
2024 |
1987 |
2025 def preferencesChanged(self): |
1988 def preferencesChanged(self): |
2026 """ |
1989 """ |
2027 Public method to indicate a change of the settings. |
1990 Public method to indicate a change of the settings. |
2028 """ |
1991 """ |
2029 if hasattr(QtWebKit, 'QWebElement'): |
1992 self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") |
2030 self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") |
1993 if not self.__enableAccessKeys: |
2031 if not self.__enableAccessKeys: |
1994 self.__hideAccessKeys() |
2032 self.__hideAccessKeys() |
|
2033 |
1995 |
2034 self.reload() |
1996 self.reload() |
2035 |
1997 |
2036 ############################################################################ |
1998 ############################################################################ |
2037 ## RSS related methods below |
1999 ## RSS related methods below |