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 |
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): |
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 |