eric7/WebBrowser/WebBrowserView.py

branch
eric7
changeset 8698
b108ff4d845c
parent 8695
8a5179bced9e
child 8703
3f1f67a9b179
equal deleted inserted replaced
8697:936662560d04 8698:b108ff4d845c
528 (QContextMenuEvent) 528 (QContextMenuEvent)
529 """ 529 """
530 pos = evt.pos() 530 pos = evt.pos()
531 reason = evt.reason() 531 reason = evt.reason()
532 QTimer.singleShot( 532 QTimer.singleShot(
533 0, 533 0, functools.partial(
534 lambda: self._contextMenuEvent(QContextMenuEvent(reason, pos))) 534 self._contextMenuEvent, QContextMenuEvent(reason, pos)))
535 # needs to be done this way because contextMenuEvent is blocking 535 # needs to be done this way because contextMenuEvent is blocking
536 # the main loop 536 # the main loop
537 537
538 def _contextMenuEvent(self, evt): 538 def _contextMenuEvent(self, evt):
539 """ 539 """
559 559
560 if not self.__menu.isEmpty(): 560 if not self.__menu.isEmpty():
561 pos = evt.globalPos() 561 pos = evt.globalPos()
562 self.__menu.popup(QPoint(pos.x(), pos.y() + 1)) 562 self.__menu.popup(QPoint(pos.x(), pos.y() + 1))
563 563
564 # TODO: change all lambda functions to partials to fix an issue
565 def __createContextMenu(self, menu, hitTest): 564 def __createContextMenu(self, menu, hitTest):
566 """ 565 """
567 Private method to populate the context menu. 566 Private method to populate the context menu.
568 567
569 @param menu reference to the menu to be populated 568 @param menu reference to the menu to be populated
643 act = menu.addAction( 642 act = menu.addAction(
644 UI.PixmapCache.getIcon("openNewTab"), 643 UI.PixmapCache.getIcon("openNewTab"),
645 self.tr("Open Link in New Tab\tCtrl+LMB")) 644 self.tr("Open Link in New Tab\tCtrl+LMB"))
646 act.setData(hitTest.linkUrl()) 645 act.setData(hitTest.linkUrl())
647 act.triggered.connect( 646 act.triggered.connect(
648 lambda: self.__openLinkInNewTab(act)) 647 functools.partial(self.__openLinkInNewTab, act))
649 act = menu.addAction( 648 act = menu.addAction(
650 UI.PixmapCache.getIcon("newWindow"), 649 UI.PixmapCache.getIcon("newWindow"),
651 self.tr("Open Link in New Window")) 650 self.tr("Open Link in New Window"))
652 act.setData(hitTest.linkUrl()) 651 act.setData(hitTest.linkUrl())
653 act.triggered.connect( 652 act.triggered.connect(
654 lambda: self.__openLinkInNewWindow(act)) 653 functools.partial(self.__openLinkInNewWindow, act))
655 act = menu.addAction( 654 act = menu.addAction(
656 UI.PixmapCache.getIcon("privateMode"), 655 UI.PixmapCache.getIcon("privateMode"),
657 self.tr("Open Link in New Private Window")) 656 self.tr("Open Link in New Private Window"))
658 act.setData(hitTest.linkUrl()) 657 act.setData(hitTest.linkUrl())
659 act.triggered.connect( 658 act.triggered.connect(
660 lambda: self.__openLinkInNewPrivateWindow(act)) 659 functools.partial(self.__openLinkInNewPrivateWindow, act))
661 menu.addSeparator() 660 menu.addSeparator()
662 menu.addAction( 661 menu.addAction(
663 UI.PixmapCache.getIcon("download"), 662 UI.PixmapCache.getIcon("download"),
664 self.tr("Save Lin&k"), self.__downloadLink) 663 self.tr("Save Lin&k"), self.__downloadLink)
665 act = menu.addAction( 664 act = menu.addAction(
666 UI.PixmapCache.getIcon("bookmark22"), 665 UI.PixmapCache.getIcon("bookmark22"),
667 self.tr("Bookmark this Link")) 666 self.tr("Bookmark this Link"))
668 act.setData(hitTest.linkUrl()) 667 act.setData(hitTest.linkUrl())
669 act.triggered.connect( 668 act.triggered.connect(
670 lambda: self.__bookmarkLink(act)) 669 functools.partial(self.__bookmarkLink, act))
671 menu.addSeparator() 670 menu.addSeparator()
672 act = menu.addAction( 671 act = menu.addAction(
673 UI.PixmapCache.getIcon("editCopy"), 672 UI.PixmapCache.getIcon("editCopy"),
674 self.tr("Copy Link to Clipboard")) 673 self.tr("Copy Link to Clipboard"))
675 act.setData(hitTest.linkUrl()) 674 act.setData(hitTest.linkUrl())
676 act.triggered.connect( 675 act.triggered.connect(
677 lambda: self.__copyLink(act)) 676 functools.partial(self.__copyLink, act))
678 act = menu.addAction( 677 act = menu.addAction(
679 UI.PixmapCache.getIcon("mailSend"), 678 UI.PixmapCache.getIcon("mailSend"),
680 self.tr("Send Link")) 679 self.tr("Send Link"))
681 act.setData(hitTest.linkUrl()) 680 act.setData(hitTest.linkUrl())
682 act.triggered.connect( 681 act.triggered.connect(
683 lambda: self.__sendLink(act)) 682 functools.partial(self.__sendLink, act))
684 if ( 683 if (
685 Preferences.getWebBrowser("VirusTotalEnabled") and 684 Preferences.getWebBrowser("VirusTotalEnabled") and
686 Preferences.getWebBrowser("VirusTotalServiceKey") != "" 685 Preferences.getWebBrowser("VirusTotalServiceKey") != ""
687 ): 686 ):
688 act = menu.addAction( 687 act = menu.addAction(
689 UI.PixmapCache.getIcon("virustotal"), 688 UI.PixmapCache.getIcon("virustotal"),
690 self.tr("Scan Link with VirusTotal")) 689 self.tr("Scan Link with VirusTotal"))
691 act.setData(hitTest.linkUrl()) 690 act.setData(hitTest.linkUrl())
692 act.triggered.connect( 691 act.triggered.connect(
693 lambda: self.__virusTotal(act)) 692 functools.partial(self.__virusTotal, act))
694 693
695 def __createImageContextMenu(self, menu, hitTest): 694 def __createImageContextMenu(self, menu, hitTest):
696 """ 695 """
697 Private method to populate the context menu for images. 696 Private method to populate the context menu for images.
698 697
707 act = menu.addAction( 706 act = menu.addAction(
708 UI.PixmapCache.getIcon("openNewTab"), 707 UI.PixmapCache.getIcon("openNewTab"),
709 self.tr("Open Image in New Tab")) 708 self.tr("Open Image in New Tab"))
710 act.setData(hitTest.imageUrl()) 709 act.setData(hitTest.imageUrl())
711 act.triggered.connect( 710 act.triggered.connect(
712 lambda: self.__openLinkInNewTab(act)) 711 functools.partial(self.__openLinkInNewTab, act))
713 menu.addSeparator() 712 menu.addSeparator()
714 menu.addAction( 713 menu.addAction(
715 UI.PixmapCache.getIcon("download"), 714 UI.PixmapCache.getIcon("download"),
716 self.tr("Save Image"), self.__downloadImage) 715 self.tr("Save Image"), self.__downloadImage)
717 menu.addAction( 716 menu.addAction(
719 act = menu.addAction( 718 act = menu.addAction(
720 UI.PixmapCache.getIcon("editCopy"), 719 UI.PixmapCache.getIcon("editCopy"),
721 self.tr("Copy Image Location to Clipboard")) 720 self.tr("Copy Image Location to Clipboard"))
722 act.setData(hitTest.imageUrl()) 721 act.setData(hitTest.imageUrl())
723 act.triggered.connect( 722 act.triggered.connect(
724 lambda: self.__copyLink(act)) 723 functools.partial(self.__copyLink, act))
725 act = menu.addAction( 724 act = menu.addAction(
726 UI.PixmapCache.getIcon("mailSend"), 725 UI.PixmapCache.getIcon("mailSend"),
727 self.tr("Send Image Link")) 726 self.tr("Send Image Link"))
728 act.setData(hitTest.imageUrl()) 727 act.setData(hitTest.imageUrl())
729 act.triggered.connect( 728 act.triggered.connect(
730 lambda: self.__sendLink(act)) 729 functools.partial(self.__sendLink, act))
731 730
732 if hitTest.imageUrl().scheme() in ["http", "https"]: 731 if hitTest.imageUrl().scheme() in ["http", "https"]:
733 menu.addSeparator() 732 menu.addSeparator()
734 engine = WebBrowserWindow.imageSearchEngine() 733 engine = WebBrowserWindow.imageSearchEngine()
735 searchEngineName = engine.searchEngine() 734 searchEngineName = engine.searchEngine()
737 UI.PixmapCache.getIcon("{0}".format( 736 UI.PixmapCache.getIcon("{0}".format(
738 searchEngineName.lower())), 737 searchEngineName.lower())),
739 self.tr("Search image in {0}").format(searchEngineName)) 738 self.tr("Search image in {0}").format(searchEngineName))
740 act.setData(engine.getSearchQuery(hitTest.imageUrl())) 739 act.setData(engine.getSearchQuery(hitTest.imageUrl()))
741 act.triggered.connect( 740 act.triggered.connect(
742 lambda: self.__searchImage(act)) 741 functools.partial(self.__searchImage, act))
743 self.__imageSearchMenu = menu.addMenu( 742 self.__imageSearchMenu = menu.addMenu(
744 self.tr("Search image with...")) 743 self.tr("Search image with..."))
745 for searchEngineName in engine.searchEngineNames(): 744 for searchEngineName in engine.searchEngineNames():
746 act = self.__imageSearchMenu.addAction( 745 act = self.__imageSearchMenu.addAction(
747 UI.PixmapCache.getIcon("{0}".format( 746 UI.PixmapCache.getIcon("{0}".format(
756 act = menu.addAction( 755 act = menu.addAction(
757 UI.PixmapCache.getIcon("adBlockPlus"), 756 UI.PixmapCache.getIcon("adBlockPlus"),
758 self.tr("Block Image")) 757 self.tr("Block Image"))
759 act.setData(hitTest.imageUrl().toString()) 758 act.setData(hitTest.imageUrl().toString())
760 act.triggered.connect( 759 act.triggered.connect(
761 lambda: self.__blockImage(act)) 760 functools.partial(self.__blockImage, act))
762 if ( 761 if (
763 Preferences.getWebBrowser("VirusTotalEnabled") and 762 Preferences.getWebBrowser("VirusTotalEnabled") and
764 Preferences.getWebBrowser("VirusTotalServiceKey") != "" 763 Preferences.getWebBrowser("VirusTotalServiceKey") != ""
765 ): 764 ):
766 act = menu.addAction( 765 act = menu.addAction(
767 UI.PixmapCache.getIcon("virustotal"), 766 UI.PixmapCache.getIcon("virustotal"),
768 self.tr("Scan Image with VirusTotal")) 767 self.tr("Scan Image with VirusTotal"))
769 act.setData(hitTest.imageUrl()) 768 act.setData(hitTest.imageUrl())
770 act.triggered.connect( 769 act.triggered.connect(
771 lambda: self.__virusTotal(act)) 770 functools.partial(self.__virusTotal, act))
772 771
773 def __createMediaContextMenu(self, menu, hitTest): 772 def __createMediaContextMenu(self, menu, hitTest):
774 """ 773 """
775 Private method to populate the context menu for media elements. 774 Private method to populate the context menu for media elements.
776 775
802 act = menu.addAction( 801 act = menu.addAction(
803 UI.PixmapCache.getIcon("editCopy"), 802 UI.PixmapCache.getIcon("editCopy"),
804 self.tr("Copy Media Address to Clipboard")) 803 self.tr("Copy Media Address to Clipboard"))
805 act.setData(hitTest.mediaUrl()) 804 act.setData(hitTest.mediaUrl())
806 act.triggered.connect( 805 act.triggered.connect(
807 lambda: self.__copyLink(act)) 806 functools.partial(self.__copyLink, act))
808 act = menu.addAction( 807 act = menu.addAction(
809 UI.PixmapCache.getIcon("mailSend"), 808 UI.PixmapCache.getIcon("mailSend"),
810 self.tr("Send Media Address")) 809 self.tr("Send Media Address"))
811 act.setData(hitTest.mediaUrl()) 810 act.setData(hitTest.mediaUrl())
812 act.triggered.connect( 811 act.triggered.connect(
813 lambda: self.__sendLink(act)) 812 functools.partial(self.__sendLink, act))
814 menu.addAction( 813 menu.addAction(
815 UI.PixmapCache.getIcon("download"), 814 UI.PixmapCache.getIcon("download"),
816 self.tr("Save Media"), self.__downloadMedia) 815 self.tr("Save Media"), self.__downloadMedia)
817 816
818 def __createSelectedTextContextMenu(self, menu, hitTest): 817 def __createSelectedTextContextMenu(self, menu, hitTest):
832 act = menu.addAction( 831 act = menu.addAction(
833 UI.PixmapCache.getIcon("mailSend"), 832 UI.PixmapCache.getIcon("mailSend"),
834 self.tr("Send Text")) 833 self.tr("Send Text"))
835 act.setData(self.selectedText()) 834 act.setData(self.selectedText())
836 act.triggered.connect( 835 act.triggered.connect(
837 lambda: self.__sendLink(act)) 836 functools.partial(self.__sendLink, act))
838 837
839 engineName = self.__mw.openSearchManager().currentEngineName() 838 engineName = self.__mw.openSearchManager().currentEngineName()
840 if engineName: 839 if engineName:
841 menu.addAction(self.tr("Search with '{0}'").format(engineName), 840 menu.addAction(self.tr("Search with '{0}'").format(engineName),
842 self.__searchDefaultRequested) 841 self.__searchDefaultRequested)
865 language = languages[0] 864 language = languages[0]
866 langCode = language.split("[")[1][:2] 865 langCode = language.split("[")[1][:2]
867 googleTranslatorUrl = QUrl( 866 googleTranslatorUrl = QUrl(
868 "http://translate.google.com/#auto/{0}/{1}".format( 867 "http://translate.google.com/#auto/{0}/{1}".format(
869 langCode, self.selectedText())) 868 langCode, self.selectedText()))
870 act1 = menu.addAction( 869 act = menu.addAction(
871 UI.PixmapCache.getIcon("translate"), 870 UI.PixmapCache.getIcon("translate"),
872 self.tr("Google Translate")) 871 self.tr("Google Translate"))
873 act1.setData(googleTranslatorUrl) 872 act.setData(googleTranslatorUrl)
874 act1.triggered.connect( 873 act.triggered.connect(
875 lambda: self.__openLinkInNewTab(act1)) 874 functools.partial(self.__openLinkInNewTab, act))
876 wiktionaryUrl = QUrl( 875 wiktionaryUrl = QUrl(
877 "http://{0}.wiktionary.org/wiki/Special:Search?search={1}" 876 "http://{0}.wiktionary.org/wiki/Special:Search?search={1}"
878 .format(langCode, self.selectedText())) 877 .format(langCode, self.selectedText()))
879 act2 = menu.addAction( 878 act = menu.addAction(
880 UI.PixmapCache.getIcon("wikipedia"), 879 UI.PixmapCache.getIcon("wikipedia"),
881 self.tr("Dictionary")) 880 self.tr("Dictionary"))
882 act2.setData(wiktionaryUrl) 881 act.setData(wiktionaryUrl)
883 act2.triggered.connect( 882 act.triggered.connect(
884 lambda: self.__openLinkInNewTab(act2)) 883 functools.partial(self.__openLinkInNewTab, act))
885 menu.addSeparator() 884 menu.addSeparator()
886 885
887 guessedUrl = QUrl.fromUserInput(self.selectedText().strip()) 886 guessedUrl = QUrl.fromUserInput(self.selectedText().strip())
888 if self.__isUrlValid(guessedUrl): 887 if self.__isUrlValid(guessedUrl):
889 act3 = menu.addAction(self.tr("Go to web address")) 888 act = menu.addAction(self.tr("Go to web address"))
890 act3.setData(guessedUrl) 889 act.setData(guessedUrl)
891 act3.triggered.connect( 890 act.triggered.connect(
892 lambda: self.__openLinkInNewTab(act3)) 891 functools.partial(self.__openLinkInNewTab, act))
893 892
894 def __createPageContextMenu(self, menu): 893 def __createPageContextMenu(self, menu):
895 """ 894 """
896 Private method to populate the basic context menu. 895 Private method to populate the basic context menu.
897 896
932 act = menu.addAction( 931 act = menu.addAction(
933 UI.PixmapCache.getIcon("editCopy"), 932 UI.PixmapCache.getIcon("editCopy"),
934 self.tr("Copy Page Link")) 933 self.tr("Copy Page Link"))
935 act.setData(self.url()) 934 act.setData(self.url())
936 act.triggered.connect( 935 act.triggered.connect(
937 lambda: self.__copyLink(act)) 936 functools.partial(self.__copyLink, act))
938 act = menu.addAction( 937 act = menu.addAction(
939 UI.PixmapCache.getIcon("mailSend"), 938 UI.PixmapCache.getIcon("mailSend"),
940 self.tr("Send Page Link")) 939 self.tr("Send Page Link"))
941 act.setData(self.url()) 940 act.setData(self.url())
942 act.triggered.connect( 941 act.triggered.connect(
943 lambda: self.__sendLink(act)) 942 functools.partial(self.__sendLink, act))
944 menu.addSeparator() 943 menu.addSeparator()
945 944
946 from .UserAgent.UserAgentMenu import UserAgentMenu 945 from .UserAgent.UserAgentMenu import UserAgentMenu
947 self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"), 946 self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"),
948 url=self.url()) 947 url=self.url())
969 menu.addSeparator() 968 menu.addSeparator()
970 969
971 w3url = QUrl.fromEncoded( 970 w3url = QUrl.fromEncoded(
972 b"http://validator.w3.org/check?uri=" + 971 b"http://validator.w3.org/check?uri=" +
973 QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode())) 972 QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode()))
974 act1 = menu.addAction( 973 act = menu.addAction(
975 UI.PixmapCache.getIcon("w3"), 974 UI.PixmapCache.getIcon("w3"),
976 self.tr("Validate Page")) 975 self.tr("Validate Page"))
977 act1.setData(w3url) 976 act.setData(w3url)
978 act1.triggered.connect( 977 act.triggered.connect(
979 lambda: self.__openLinkInNewTab(act1)) 978 functools.partial(self.__openLinkInNewTab, act))
980 979
981 from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog 980 from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
982 languages = Preferences.toList( 981 languages = Preferences.toList(
983 Preferences.getSettings().value( 982 Preferences.getSettings().value(
984 "WebBrowser/AcceptLanguages", 983 "WebBrowser/AcceptLanguages",
990 b"http://translate.google.com/translate?sl=auto&tl=" + 989 b"http://translate.google.com/translate?sl=auto&tl=" +
991 langCode.encode() + 990 langCode.encode() +
992 b"&u=" + 991 b"&u=" +
993 QUrl.toPercentEncoding( 992 QUrl.toPercentEncoding(
994 bytes(self.url().toEncoded()).decode())) 993 bytes(self.url().toEncoded()).decode()))
995 act2 = menu.addAction( 994 act = menu.addAction(
996 UI.PixmapCache.getIcon("translate"), 995 UI.PixmapCache.getIcon("translate"),
997 self.tr("Google Translate")) 996 self.tr("Google Translate"))
998 act2.setData(googleTranslatorUrl) 997 act.setData(googleTranslatorUrl)
999 act2.triggered.connect( 998 act.triggered.connect(
1000 lambda: self.__openLinkInNewTab(act2)) 999 functools.partial(self.__openLinkInNewTab, act))
1001 1000
1002 def __checkForForm(self, act, pos): 1001 def __checkForForm(self, act, pos):
1003 """ 1002 """
1004 Private method to check the given position for an open search form. 1003 Private method to check the given position for an open search form.
1005 1004
1732 QWebEnginePage.RenderProcessTerminationStatus 1731 QWebEnginePage.RenderProcessTerminationStatus
1733 .NormalTerminationStatus 1732 .NormalTerminationStatus
1734 ): 1733 ):
1735 return 1734 return
1736 1735
1737 QTimer.singleShot(0, lambda: self.__showTabCrashPage(status)) 1736 QTimer.singleShot(0,
1737 functools.partial(self.__showTabCrashPage, status))
1738 1738
1739 def __showTabCrashPage(self, status): 1739 def __showTabCrashPage(self, status):
1740 """ 1740 """
1741 Private slot to show the tab crash page. 1741 Private slot to show the tab crash page.
1742 1742

eric ide

mercurial