Exemple #1
0
    def resolve_url(self, baseurl: QUrl) -> typing.Optional[QUrl]:
        """Resolve the URL in the element's src/href attribute.

        Args:
            baseurl: The URL to base relative URLs on as QUrl.

        Return:
            A QUrl with the absolute URL, or None.
        """
        if baseurl.isRelative():
            raise ValueError("Need an absolute base URL!")

        for attr in ['href', 'src']:
            if attr in self:
                text = self[attr].strip()
                break
        else:
            return None

        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url
Exemple #2
0
    def resolve_url(self, baseurl: QUrl) -> typing.Optional[QUrl]:
        """Resolve the URL in the element's src/href attribute.

        Args:
            baseurl: The URL to base relative URLs on as QUrl.

        Return:
            A QUrl with the absolute URL, or None.
        """
        if baseurl.isRelative():
            raise ValueError("Need an absolute base URL!")

        for attr in ['href', 'src']:
            if attr in self:
                text = self[attr].strip()
                break
        else:
            return None

        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url
Exemple #3
0
    def handle_starttag(self, tag, alist):
        if tag not in ['a', 'link']:
            return

        attrs = dict(alist)
        href = attrs.get('href')

        if not isinstance(href, str):
            return

        if len(href) > 1024:
            return

        href = unquote(href)

        url = QUrl(href)
        if not url.isValid():
            return

        if not url.scheme() or url.isRelative():
            # Relative URL
            p = self.base.child(href)
            if p and self.pathValid(p):
                self.links.append(p)

        elif isIpfsUrl(url):
            # Absolute URL
            p = IPFSPath(url.toString())
            if self.pathValid(p):
                self.links.append(p)
Exemple #4
0
 def handleVideoButton(self, url):
     if validYoutubeUrl(url):
         self.videoDownloadButton.show()
         return
     self.video_URL = False
     frames = [self.tabWidget.currentWidget().page().mainFrame()]
     frames += self.tabWidget.currentWidget().page().mainFrame(
     ).childFrames()
     for frame in frames:
         videos = frame.findAllElements('video').toList()
         for video in videos:
             dl_link = video.attribute('src')
             child = video.findFirst('source[src]')
             if dl_link == '' and not child.isNull():
                 dl_link = child.attribute('src')
             dl_url = QUrl(dl_link)
             if not dl_url.isValid(): continue
             if dl_url.isRelative():
                 dl_url = frame.url().resolved(dl_url)
             self.video_URL = QUrl.fromUserInput(dl_url.toString())
             self.video_page_url = frame.url().toString()
             break
             break
     if self.video_URL:
         self.videoDownloadButton.show()
     else:
         self.videoDownloadButton.hide()
    def addEngineFromForm(self, res, view):
        """
        Public method to add a new search engine from a form.
        
        @param res result of the JavaScript run on by
            WebBrowserView.__addSearchEngine()
        @type dict or None
        @param view reference to the web browser view
        @type WebBrowserView
        """
        if not res:
            return

        method = res["method"]
        actionUrl = QUrl(res["action"])
        inputName = res["inputName"]

        if method != "get":
            E5MessageBox.warning(
                self, self.tr("Method not supported"),
                self.tr("""{0} method is not supported.""").format(
                    method.upper()))
            return

        if actionUrl.isRelative():
            actionUrl = view.url().resolved(actionUrl)

        searchUrlQuery = QUrlQuery(actionUrl)
        searchUrlQuery.addQueryItem(inputName, "{searchTerms}")

        inputFields = res["inputs"]
        for inputField in inputFields:
            name = inputField[0]
            value = inputField[1]

            if not name or name == inputName or not value:
                continue

            searchUrlQuery.addQueryItem(name, value)

        engineName, ok = QInputDialog.getText(
            view, self.tr("Engine name"),
            self.tr("Enter a name for the engine"), QLineEdit.Normal)
        if not ok:
            return

        actionUrl.setQuery(searchUrlQuery)

        from .OpenSearchEngine import OpenSearchEngine
        engine = OpenSearchEngine()
        engine.setName(engineName)
        engine.setDescription(engineName)
        engine.setSearchUrlTemplate(
            actionUrl.toDisplayString(QUrl.FullyDecoded))
        engine.setImage(view.icon().pixmap(16, 16).toImage())

        self.__addEngineByEngine(engine)
 def __showEnginesMenu(self):
     """
     Private slot to handle the display of the engines menu.
     """
     self.__enginesMenu.clear()
     
     from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction
     engineNames = self.__openSearchManager.allEnginesNames()
     for engineName in engineNames:
         engine = self.__openSearchManager.engine(engineName)
         action = OpenSearchEngineAction(engine, self.__enginesMenu)
         action.setData(engineName)
         action.triggered.connect(self.__changeCurrentEngine)
         self.__enginesMenu.addAction(action)
         
         if self.__openSearchManager.currentEngineName() == engineName:
             action.setCheckable(True)
             action.setChecked(True)
     
     ct = self.__mw.currentBrowser()
     linkedResources = ct.linkedResources("search")
     
     if len(linkedResources) > 0:
         self.__enginesMenu.addSeparator()
     
     for linkedResource in linkedResources:
         url = QUrl(linkedResource.href)
         title = linkedResource.title
         mimetype = linkedResource.type_
         
         if mimetype != "application/opensearchdescription+xml":
             continue
         if url.isEmpty():
             continue
         
         if url.isRelative():
             url = ct.url().resolved(url)
         
         if not title:
             if not ct.title():
                 title = url.host()
             else:
                 title = ct.title()
         
         action = self.__enginesMenu.addAction(
             self.tr("Add '{0}'").format(title),
             self.__addEngineFromUrl)
         action.setData(url)
         action.setIcon(ct.icon())
     
     self.__enginesMenu.addSeparator()
     self.__enginesMenu.addAction(self.__mw.searchEnginesAction())
     
     if self.__recentSearches:
         self.__enginesMenu.addAction(self.tr("Clear Recent Searches"),
                                      self.clear)
    def __showEnginesMenu(self):
        """
        Private slot to handle the display of the engines menu.
        """
        self.__enginesMenu.clear()

        from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction
        engineNames = self.__openSearchManager.allEnginesNames()
        for engineName in engineNames:
            engine = self.__openSearchManager.engine(engineName)
            action = OpenSearchEngineAction(engine, self.__enginesMenu)
            action.setData(engineName)
            action.triggered.connect(self.__changeCurrentEngine)
            self.__enginesMenu.addAction(action)

            if self.__openSearchManager.currentEngineName() == engineName:
                action.setCheckable(True)
                action.setChecked(True)

        ct = self.__mw.currentBrowser()
        linkedResources = ct.linkedResources("search")

        if len(linkedResources) > 0:
            self.__enginesMenu.addSeparator()

        for linkedResource in linkedResources:
            url = QUrl(linkedResource.href)
            title = linkedResource.title
            mimetype = linkedResource.type_

            if mimetype != "application/opensearchdescription+xml":
                continue
            if url.isEmpty():
                continue

            if url.isRelative():
                url = ct.url().resolved(url)

            if not title:
                if not ct.title():
                    title = url.host()
                else:
                    title = ct.title()

            action = self.__enginesMenu.addAction(
                self.tr("Add '{0}'").format(title), self.__addEngineFromUrl)
            action.setData(url)
            action.setIcon(ct.icon())

        self.__enginesMenu.addSeparator()
        self.__enginesMenu.addAction(self.__mw.searchEnginesAction())

        if self.__recentSearches:
            self.__enginesMenu.addAction(self.tr("Clear Recent Searches"),
                                         self.clear)
Exemple #8
0
    def _resolve_url(self, elem, baseurl):
        """Resolve a URL and check if we want to keep it.

        Args:
            elem: The QWebElement to get the URL of.
            baseurl: The baseurl of the current tab.

        Return:
            A QUrl with the absolute URL, or None.
        """
        try:
            text = elem['href']
        except KeyError:
            return None
        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url
Exemple #9
0
    def _resolve_url(self, elem, baseurl):
        """Resolve a URL and check if we want to keep it.

        Args:
            elem: The QWebElement to get the URL of.
            baseurl: The baseurl of the current tab.

        Return:
            A QUrl with the absolute URL, or None.
        """
        try:
            text = elem['href']
        except KeyError:
            return None
        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url
    def on_imagesTree_currentItemChanged(self, current, previous):
        """
        Private slot to show a preview of the selected image.
        
        @param current current image entry (QTreeWidgetItem)
        @param previous old current entry (QTreeWidgetItem)
        """
        if current is None:
            return

        imageUrl = QUrl(current.text(1))
        if imageUrl.isRelative():
            imageUrl = self.__baseUrl.resolved(imageUrl)

        pixmap = QPixmap()
        loading = False

        if imageUrl.scheme() == "data":
            encodedUrl = current.text(1).encode("utf-8")
            imageData = encodedUrl[encodedUrl.find(b",") + 1:]
            pixmap = WebBrowserTools.pixmapFromByteArray(imageData)
        elif imageUrl.scheme() == "file":
            pixmap = QPixmap(imageUrl.toLocalFile())
        elif imageUrl.scheme() == "qrc":
            pixmap = QPixmap(imageUrl.toString()[3:])
        else:
            if self.__imageReply is not None:
                self.__imageReply.deleteLater()
                self.__imageReply = None

            from WebBrowser.WebBrowserWindow import WebBrowserWindow
            self.__imageReply = WebBrowserWindow.networkManager().get(
                QNetworkRequest(imageUrl))
            self.__imageReply.finished.connect(self.__imageReplyFinished)
            loading = True
            self.__showLoadingText()

        if not loading:
            self.__showPixmap(pixmap)
Exemple #11
0
    def __addFeed(self, button):
        """
        Private slot to add a RSS feed.
        
        @param button reference to the feed button
        @type QPushButton
        """
        urlString = button.feed[1]
        url = QUrl(urlString)
        if url.isRelative():
            url = self.__browser.url().resolved(url)
            urlString = url.toDisplayString(QUrl.FullyDecoded)

        if not url.isValid():
            return

        if button.feed[0]:
            title = button.feed[0]
        else:
            title = self.__browser.url().host()

        from WebBrowser.WebBrowserWindow import WebBrowserWindow
        feedsManager = WebBrowserWindow.feedsManager()
        if feedsManager.addFeed(urlString, title, self.__browser.icon()):
            if WebBrowserWindow.notificationsEnabled():
                WebBrowserWindow.showNotification(
                    UI.PixmapCache.getPixmap("rss48.png"),
                    self.tr("Add RSS Feed"),
                    self.tr("""The feed was added successfully."""))
            else:
                E5MessageBox.information(
                    self, self.tr("Add RSS Feed"),
                    self.tr("""The feed was added successfully."""))
        else:
            E5MessageBox.warning(
                self, self.tr("Add RSS Feed"),
                self.tr("""The feed was already added before."""))

        self.close()
Exemple #12
0
    def _resolve_url(self, elem, baseurl=None):
        """Resolve a URL and check if we want to keep it.

        Args:
            elem: The QWebElement to get the URL of.
            baseurl: The baseurl of the current tab (overrides baseurl from
                     self._context).

        Return:
            A QUrl with the absolute URL, or None.
        """
        try:
            text = elem['href']
        except KeyError:
            return None
        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            if baseurl is None:
                baseurl = self._context.baseurl
            url = baseurl.resolved(url)
        return url
Exemple #13
0
    def _resolve_url(self, elem, baseurl):
        """Resolve a URL and check if we want to keep it.

        Args:
            elem: The QWebElement to get the URL of.
            baseurl: The baseurl of the current tab.

        Return:
            A QUrl with the absolute URL, or None.
        """
        for attr in ('href', 'src'):
            if attr in elem:
                text = elem[attr]
                break
        else:
            return None

        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url
Exemple #14
0
    def _resolve_url(self, elem, baseurl):
        """Resolve a URL and check if we want to keep it.

        Args:
            elem: The QWebElement to get the URL of.
            baseurl: The baseurl of the current tab.

        Return:
            A QUrl with the absolute URL, or None.
        """
        for attr in ('href', 'src'):
            if attr in elem:
                text = elem[attr]
                break
        else:
            return None

        url = QUrl(text)
        if not url.isValid():
            return None
        if url.isRelative():
            url = baseurl.resolved(url)
        qtutils.ensure_valid(url)
        return url