class WebView(QWebView): def __init__(self, parent, realpath): super(WebView, self).__init__(parent) self.mainapp = parent # create an obj for communicate with js self.jsobj = JsObj(parent) self.page().mainFrame().addToJavaScriptWindowObject("picota", self.jsobj) self._home = "file:///%s/www/remote.html" % realpath.replace("\\", "/") self.gohome() # Inspector (for debug ..) settings = self.page().settings() settings.setAttribute(settings.DeveloperExtrasEnabled, True) self.inspector = QWebInspector() self.inspector.setPage(self.page()) def gohome(self): self.load(QUrl(self._home)) def goto(self, url): self.load(QUrl(url)) def eval(self, text): # code = json.dumps(text) code = text return self.page().mainFrame().evaluateJavaScript(code)
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupInspector() def _setupInspector(self): """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F12'] = QShortcut(self) shortcut['F12'].setContext(Qt.ApplicationShortcut) shortcut['F12'].setKey(Qt.Key_F12) shortcut['F12'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0,0,0,0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F12키를 다시 누르면 "개발자 도구"가 사라짐 """ # self.webInspector.setVisible(not self.webInspector.isVisible()) self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript(WebViewPlus.customEvent.format(type=type, detail=detail))
class WebPage(QWebPage): def __init__(self): super(WebPage, self).__init__() self.inspector = QWebInspector() self.inspector.setPage(self) self.inspector.resize(1024, 400) diskCache = QNetworkDiskCache(self) diskCache.setCacheDirectory(assets.fs.dataPath() + '/Cache') self.networkAccessManager().setCache(diskCache) self.networkAccessManager().setCookieJar(assets.dataJar) def acceptNavigationRequest(self, frame, request, type): if(type == QWebPage.NavigationTypeLinkClicked): url = request.url().toString() if(frame == self.mainFrame()): self.view().load(url) return False elif frame == None: # self.createWindow(QWebPage.WebBrowserWindow, url) webbrowser.open(request.url().toString()) return False return QWebPage.acceptNavigationRequest(self, frame, request, type) # def downloadRequested(self, request): # print(request) def findText(self, text): return super(WebPage, self).findText(text, QWebPage.FindBackward) def showInspector(self): self.inspector.show() self.inspector.activateWindow() def hideInspector(self): self.inspector.close() def createWindow(self, type, url = None): from window import Window window = Window(self.view().parentWidget(), url, isDialog = (type == QWebPage.WebModalDialog)) return window.webView.page() def javaScriptAlert(self, frame, msg): QMessageBox.information(self.view().parentWidget(), None, msg) def javaScriptConfirm(self, frame, msg): return QMessageBox.question(self.view().parentWidget(), None, msg) == QMessageBox.Yes # There is a bug in PyQt # def javaScriptPrompt(self, frame, msg, defaultValue): # result = QInputDialog.getText(self.view().parentWidget(), None, msg) # return (result[1], result[0]) def close(self): self.hideInspector() assets.dataJar.save()
class WebInspector(QDialog): def __init__(self, parent, page): QDialog.__init__(self, parent) self.setWindowFlags(self.windowFlags() | Qt.WindowMinMaxButtonsHint) self.setWindowTitle(_('Inspect book code')) self.setWindowIcon(QIcon(I('debug.png'))) l = QVBoxLayout() self.setLayout(l) self.inspector = QWebInspector(self) self.inspector.setPage(page) l.addWidget(self.inspector) self.bb = bb = QDialogButtonBox(QDialogButtonBox.Close) l.addWidget(bb) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) self.resize(self.sizeHint()) geom = gprefs.get('viewer_inspector_geom', None) if geom is not None: self.restoreGeometry(geom) def save_geometry(self): gprefs['viewer_inspector_geom'] = bytearray(self.saveGeometry()) def closeEvent(self, ev): self.save_geometry() return QDialog.closeEvent(self, ev) def accept(self): self.save_geometry() QDialog.accept(self) def reject(self): self.save_geometry() QDialog.reject(self)
class WebInspector(QWidget): """WebInspector widget class""" def __init__(self, parent): super(WebInspector, self).__init__(parent) vbox = QVBoxLayout(self) self._webInspector = QWebInspector(self) vbox.addWidget(self._webInspector) self.btnDock = QPushButton(translations.TR_UNDOCK) vbox.addWidget(self.btnDock) ExplorerContainer.register_tab(translations.TR_TAB_WEB_INSPECTOR, self) IDE.register_service('web_inspector', self) def refresh_inspector(self): """Refresh WebInspector widget by hiding and showing""" self._webInspector.hide() self._webInspector.show() def set_inspection_page(self, page): """Method to load an argument page object on the WebInspector""" self._webInspector.setPage(page) self._webInspector.setVisible(True)
class WebView(QWebView): def __init__(self, parent=None): QWebView.__init__(self, parent) self.inspector = QWebInspector(self) w = QApplication.instance().desktop().availableGeometry(self).width() self._size_hint = QSize(int(w/3), int(w/2)) self._page = WebPage(self) self.setPage(self._page) self.inspector.setPage(self._page) self.clear() def sizeHint(self): return self._size_hint def refresh(self): self.pageAction(self.page().Reload).trigger() @dynamic_property def scroll_pos(self): def fget(self): mf = self.page().mainFrame() return (mf.scrollBarValue(Qt.Horizontal), mf.scrollBarValue(Qt.Vertical)) def fset(self, val): mf = self.page().mainFrame() mf.setScrollBarValue(Qt.Horizontal, val[0]) mf.setScrollBarValue(Qt.Vertical, val[1]) return property(fget=fget, fset=fset) def clear(self): self.setHtml(_( ''' <h3>Live preview</h3> <p>Here you will see a live preview of the HTML file you are currently editing. The preview will update automatically as you make changes. <p style="font-size:x-small; color: gray">Note that this is a quick preview only, it is not intended to simulate an actual ebook reader. Some aspects of your ebook will not work, such as, page breaks and page margins. ''')) self.page().current_root = None def setUrl(self, qurl): self.page().current_root = current_container().root return QWebView.setUrl(self, qurl) def inspect(self): self.inspector.parent().show() self.inspector.parent().raise_() self.pageAction(self.page().InspectElement).trigger() def contextMenuEvent(self, ev): menu = QMenu(self) p = self.page() mf = p.mainFrame() r = mf.hitTestContent(ev.pos()) url = unicode(r.linkUrl().toString(QUrl.None)).strip() ca = self.pageAction(QWebPage.Copy) if ca.isEnabled(): menu.addAction(ca) menu.addAction(actions['reload-preview']) menu.addAction(QIcon(I('debug.png')), _('Inspect element'), self.inspect) if url.partition(':')[0].lower() in {'http', 'https'}: menu.addAction(_('Open link'), partial(open_url, r.linkUrl())) menu.exec_(ev.globalPos())
class Window(QWidget): session = dict() def __init__(self, config): super(Window, self).__init__() self.config = config self.base_uri = QUrl.fromLocalFile(os.path.dirname(__file__)).toString() # initial web view add handle all link and form submitted self.web_view = QWebView(self) self.web_view.setPage(WebPage()) self.web_view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.web_view.page().linkClicked.connect(self.link_clicked) # self.web_view.page().urlChanged.connect(self.url_changed) self.web_view.page().loadFinished.connect(self.load_finished) self.web_view.page().loadStarted.connect(self.load_started) self.web_view.page().form_submitted.connect(self.handle_form_submitted) self.web_view.page().request_reload.connect(self.handle_reload) # initial template lookup self.tempalte_lookup = TemplateLookup( directories=[self.config.settings.get("mako.directories")], module_directory=self.config.settings.get("mako.module_directory"), input_encoding="utf-8", ) # layout attribute layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) # add debug inspector if self.config.settings.get("debug", False): self.setup_inspector() self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Vertical) layout.addWidget(self.splitter) self.splitter.addWidget(self.web_view) self.splitter.addWidget(self.web_inspector) else: layout.addWidget(self.web_view) def setup_inspector(self): """ This code from http://agateau.com/2012/02/03/pyqtwebkit-experiments-part-2-debugging/ """ page = self.web_view.page() page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.web_inspector = QWebInspector(self) self.web_inspector.setPage(page) shortcut = QShortcut(self) shortcut.setKey(Qt.Key_F12) shortcut.activated.connect(self.toggle_inspector) self.web_inspector.setVisible(False) def toggle_inspector(self): self.web_inspector.setVisible(not self.web_inspector.isVisible()) def handle_form_submitted(self, qurl, elements=dict()): # print("\n\ngot url: ", qurl) qqurl = QUrlQuery(qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) # do stuff with elements... # for item in elements.items(): # print ("got: ", item) def handle_reload(self, qurl): self.render(qurl.path()) def load_started(self): """""" # print("load_started ->: ", self.web_view.url()) def load_finished(self, finished): """""" # print("load_finished ->: ", finished) # if finished: # self.web_view.setUrl(QUrl('/login')) # def url_changed(self, qurl): # '''''' # print("url_changed ->: ", qurl) def link_clicked(self, qurl): # print("link_clicked ->: ", qurl) qqurl = QUrlQuery(qurl) elements = {} # print("got link_clicked url: ", qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) # self.render(qurl.path()) def render(self, url, args=None): self.config.current_route_path = url print("current_route_path: ", self.config.current_route_path) logger.debug("url: %s" % url) route = self.config.get_route(url) logger.debug("view: %s" % route) if route is not None: view = route.get("view") context_obj = context.ResourceContext(self.config, self.session) context_obj.add_args(args) try: response = view(context_obj) except Exception as e: if e.args[0] == "Request Exit": self.close() return logger.exception(e) # need error page return self.link_clicked("/home") if not isinstance(response, dict): if isinstance(response, QUrl): return self.link_clicked(response) # url = response.path() # print('window url', url) # return self.render(url) # else: # # need error page # return self.render('/login') logger.debug("response: %s" % response) template = self.tempalte_lookup.get_template(self.config.get_route(url).get("renderer")) response["request"] = context_obj response["base_uri"] = self.base_uri html = template.render(**response) self.web_view.setHtml(html, QUrl("file://" + url)) # self.web_view.setHtml(html) # self.web_view.load(a) def welcome(self): context_obj = context.ResourceContext(self.config, self.session) return self.link_clicked(context_obj.redirect_url("login"))
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupWebview() def _setupWebview(self): settings = self.settings() currentPath = QDir.currentPath() settings.setAttribute(QWebSettings.LocalStorageEnabled, True) settings.setAttribute(QWebSettings.OfflineStorageDatabaseEnabled, True) settings.setAttribute(QWebSettings.OfflineWebApplicationCacheEnabled, True) settings.setAttribute(QWebSettings.DnsPrefetchEnabled, True) settings.setAttribute(QWebSettings.CSSGridLayoutEnabled, True) settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, True) settings.setAttribute(QWebSettings.JavascriptCanCloseWindows, True) settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, True) settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) settings.setOfflineStoragePath(currentPath + "/storage/offline") settings.setOfflineWebApplicationCachePath(currentPath + "/storage/webcache") settings.setLocalStoragePath(currentPath + "/storage/local") settings.setOfflineStorageDefaultQuota(5 * 1024 * 1024) settings.setOfflineWebApplicationCacheQuota(5 * 1024 * 1024) settings.enablePersistentStorage() """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F4'] = QShortcut(self) shortcut['F4'].setContext(Qt.ApplicationShortcut) shortcut['F4'].setKey(Qt.Key_F4) shortcut['F4'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0,0,0,0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F4키를 다시 누르면 "개발자 도구"가 토글됨. """ self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript(WebViewPlus.customEvent.format(type=type, detail=detail))
class WebView(QWebView): def __init__(self, parent=None): QWebView.__init__(self, parent) self.inspector = QWebInspector(self) w = QApplication.instance().desktop().availableGeometry(self).width() self._size_hint = QSize(int(w / 3), int(w / 2)) self._page = WebPage(self) self.setPage(self._page) self.inspector.setPage(self._page) self.clear() self.setAcceptDrops(False) def sizeHint(self): return self._size_hint def refresh(self): self.pageAction(self.page().Reload).trigger() @dynamic_property def scroll_pos(self): def fget(self): mf = self.page().mainFrame() return (mf.scrollBarValue(Qt.Horizontal), mf.scrollBarValue(Qt.Vertical)) def fset(self, val): mf = self.page().mainFrame() mf.setScrollBarValue(Qt.Horizontal, val[0]) mf.setScrollBarValue(Qt.Vertical, val[1]) return property(fget=fget, fset=fset) def clear(self): self.setHtml( _(''' <h3>Live preview</h3> <p>Here you will see a live preview of the HTML file you are currently editing. The preview will update automatically as you make changes. <p style="font-size:x-small; color: gray">Note that this is a quick preview only, it is not intended to simulate an actual e-book reader. Some aspects of your e-book will not work, such as page breaks and page margins. ''')) def inspect(self): self.inspector.parent().show() self.inspector.parent().raise_() self.pageAction(self.page().InspectElement).trigger() def contextMenuEvent(self, ev): menu = QMenu(self) p = self.page() mf = p.mainFrame() r = mf.hitTestContent(ev.pos()) url = unicode_type(r.linkUrl().toString(NO_URL_FORMATTING)).strip() ca = self.pageAction(QWebPage.Copy) if ca.isEnabled(): menu.addAction(ca) menu.addAction(actions['reload-preview']) menu.addAction(QIcon(I('debug.png')), _('Inspect element'), self.inspect) if url.partition(':')[0].lower() in {'http', 'https'}: menu.addAction(_('Open link'), partial(open_url, r.linkUrl())) menu.exec_(ev.globalPos())
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupWebview() def _setupWebview(self): self.settings().setAttribute(QWebSettings.LocalStorageEnabled, True) self.settings().setAttribute( QWebSettings.OfflineStorageDatabaseEnabled, True) self.settings().setLocalStoragePath("storage") """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F4'] = QShortcut(self) shortcut['F4'].setContext(Qt.ApplicationShortcut) shortcut['F4'].setKey(Qt.Key_F4) shortcut['F4'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F4키를 다시 누르면 "개발자 도구"가 토글됨. """ self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript( WebViewPlus.customEvent.format(type=type, detail=detail))
class Ui_MainWindow(QMainWindow): #Notice that this is the parent window. def __init__(self, *args, **kwargs): super(Ui_MainWindow, self).__init__(*args, **kwargs) #Begin page loading def begin(self): self.label.setText(label.begin()) def complete(self): self.label.setText(label.complete()) #####Download functions. def downloads(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self.web, "Save as", "", "All Files (*)", options=options) address = self.address.text() if fileName: subprocess.Popen(['wget', address, '-O', fileName]) #Set the label text. def loadings(self): self.label.setText(label.loadings()) #################################################### #####Printer functions. def handlePreview(self): dialog = QPrintPreviewDialog() dialog.paintRequested.connect(self.handlePaintRequest) dialog.exec_() def handlePaintRequest(self, printer): self.web.render(QPainter(printer)) #Set the label text. def printme(self): self.label.setText(label.printer()) #################################################### #Open html5 playback. def html5(self): subprocess.Popen(['python', '/usr/share/html5.py']) self.label.setText(label.html5()) #################################################### #####Page navigation functions. #Back function. def backs(self, url): goback = self.web.back() #Forward function. def forwards(self, url): self.web.forward() #Reload function. def reloads(self): self.web.reload() #System arguments support / Go to address / Find text functionality. def system_arguments(self): if len(sys.argv) == 1: url = self.address.text() if url.startswith('http://'): change = str(url) self.address.setText(change) load = self.address.text() self.label.setText(load) self.web.load(QUrl(load)) del sys.argv[1:] elif url.startswith('https://'): change = str(url) self.address.setText(change) load = self.address.text() self.label.setText(load) self.web.load(QUrl(load)) del sys.argv[1:] elif url.startswith('find:'): load = self.address.text() self.result0 = load.replace('find:', '') print "Finding:" + self.result0 self.web.findText(self.result0) self.label.setText(label.finding()) del sys.argv[1:] else: add = "https://" + url change = str(add) self.address.setText(change) load = self.address.text() self.label.setText(load) self.web.load(QUrl(load)) del sys.argv[1:] else: self.location = sys.argv[1:] self.temp = str(self.location) self.result0 = self.temp.replace('[', '') self.result1 = self.result0.replace(']', '') self.result_final = self.result1.replace("'", '') url = self.result_final if url.startswith('http://'): change = str(url) self.address.setText(change) load = self.address.text() self.label.setText(load) self.loading1 = self.web.load(QUrl(load)) del sys.argv[1:] elif url.startswith('https://'): change = str(url) self.address.setText(change) load = self.address.text() self.label.setText(load) self.loading1 = self.web.load(QUrl(load)) del sys.argv[1:] else: change = str("https://" + url) self.address.setText(change) load = self.address.text() self.label.setText(load) self.web.load(QUrl(load)) del sys.argv[1:] #Home page function. def homes(self): self.home = "http://www.techtimejourney.net/postx_pages/postx.html" self.address.setText(self.home) self.web.load(QUrl(self.home)) #################################################### #####Page Zoom functions. def zoomins(self): self.web.setZoomFactor(self.web.zoomFactor() + .2) def zoomouts(self): self.web.setZoomFactor(self.web.zoomFactor() - .2) ################################## #####Search engines & default (Now. Startpage). def extra(self): search = self.Search.text() text = self.switch_2.text() if text == ('wolf'): #Wolfram Alpha search. adds1 = "https://www.wolframalpha.com/input/?i=" + search self.web.load(QUrl(adds1)) print adds1 elif text == ('wiki'): #Wikipedia search (english). adds1 = "https://en.wikipedia.org/w/index.php?title=Special:Search&profile=default&fulltext=Search&search=" + search self.web.load(QUrl(adds1)) print adds1 elif text == ('tube'): #Youtube search (english). adds1 = "https://www.youtube.com/results?search_query=" + search self.web.load(QUrl(adds1)) print adds1 elif text == ('gs'): #Startpage search (english). adds1 = "https://startpage.com/do/search?query=" + search self.web.load(QUrl(adds1)) print adds1 else: adds1 = "https://startpage.com/do/search?query=" + search self.web.load(QUrl(adds1)) print adds1 ############################################ #####Bookmark functions. def bookmarks(self, widget): home = os.getenv("HOME") print home site = str(self.address.text()) os.chdir(home) f = open('.bookmarks.html', 'a') f.write("<br>" + "<a href=" + site + ">" + site + "</a>") f.close() #Set label text. def notice_new_bookmark(self): self.label.setText(label.bookmarked()) #Open bookmarks file. def bookopen(self, widget): home = os.getenv("HOME") print home home = os.getenv("HOME") os.chdir(home) head = "file:///" books = ".bookmarks.html" adds = self.address.setText(head + home + '/' + books) adda = self.address.text() self.web.load(QUrl(adda)) #################################################### #####Other functions. #Label reset. def reset(self): self.label.setText('') #About messagebox. def about(self): buttonReply = QMessageBox.question( self, "RunIT-QT Browser Copyright (c) 2015 JJ Posti <techtimejourney.net>", "RunIT-QT comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under GPL Version 2, June 1991 This is the 0.6.3 version(March 2018). ___________________________________________________________________________ \n \nArgument support (since 0.6).\nStart browser like this: runit 'gooogle.fi' and follow statusbar instructions. ___________________________________________________________________________\n \nFind text from html(since 0.6).\nWrite find:something to address field and press enter to find the first entry. Press enter again to find the second entry etc. ___________________________________________________________________________\n \nRight-click menu:Save image functionality(since 0.6). Right-click upon an image and choose Copy Image address. Next choose Save image and the Save as dialog should open.", QMessageBox.Ok) if buttonReply == QMessageBox.Ok: pass #################################################### #####UI Parts. def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.setStyleSheet("background-color:#a7a7a7;font-size: 12px;") MainWindow.setMaximumHeight(16777215) MainWindow.setMaximumWidth(16777215) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.toolbar = QToolBar() self.toolbar.setObjectName(_fromUtf8("toolbar")) self.verticalLayout_2 = QVBoxLayout(self.centralwidget) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) #Timer for label resets. self.timer = QtCore.QTimer() self.timer.timeout.connect(self.reset) self.timer.start(9000) #Update within every 9 seconds. #Back. self.back = QToolButton() self.back.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon = QIcon() icon.addPixmap(QPixmap(_fromUtf8(":/icons/back.png")), QIcon.Normal, QIcon.Off) self.back.setIcon(icon) self.back.setObjectName(_fromUtf8("back")) self.back.setToolTip('Go Back') self.back.clicked.connect(self.backs) self.back.setFixedSize(24, 24) self.toolbar.addWidget(self.back) #Address. self.address = QLineEdit() self.address.setStyleSheet( "QLineEdit{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QLineEdit:hover{background-color:#5c5c5c;}") self.address.setObjectName(_fromUtf8("lineEdit")) self.address.setPlaceholderText("Type an address") self.address.returnPressed.connect(self.system_arguments) self.toolbar.addWidget(self.address) #Forward. self.forward = QToolButton() self.forward.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon1 = QIcon() icon1.addPixmap(QPixmap(_fromUtf8(":/icons/forward.png")), QIcon.Normal, QIcon.Off) self.forward.setIcon(icon1) self.forward.setObjectName(_fromUtf8("forward")) self.forward.setToolTip('Go Forward') self.forward.clicked.connect(self.forwards) self.forward.setFixedSize(24, 24) self.toolbar.addWidget(self.forward) #Home. self.home = QToolButton() self.home.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon2 = QIcon() icon2.addPixmap(QPixmap(_fromUtf8(":/icons/home.png")), QIcon.Normal, QIcon.Off) self.home.setIcon(icon2) self.home.setObjectName(_fromUtf8("home")) self.home.setToolTip('Go Home') self.home.clicked.connect(self.homes) self.home.setFixedSize(24, 24) self.toolbar.addWidget(self.home) #Reload. self.reloading = QToolButton() self.reloading.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon3 = QIcon() icon3.addPixmap(QPixmap(_fromUtf8(":/icons/reload.png")), QIcon.Normal, QIcon.Off) self.reloading.setIcon(icon3) self.reloading.setObjectName(_fromUtf8("reload")) self.reloading.setToolTip('Reload Page') self.reloading.clicked.connect(self.reloads) self.reloading.setFixedSize(24, 24) self.toolbar.addWidget(self.reloading) #Html5 player. self.vlc = QToolButton() self.vlc.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon4 = QIcon() icon4.addPixmap(QPixmap(_fromUtf8(":/icons/vlc_play.png")), QIcon.Normal, QIcon.Off) self.vlc.setIcon(icon4) self.vlc.setObjectName(_fromUtf8("vlc")) self.vlc.setToolTip('Open HTML5 player') self.vlc.clicked.connect(self.html5) self.vlc.setFixedSize(24, 24) self.toolbar.addWidget(self.vlc) #Bookmark. self.bookmark = QToolButton() self.bookmark.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon5 = QIcon() icon5.addPixmap(QPixmap(_fromUtf8(":/icons/bookmark.png")), QIcon.Normal, QIcon.Off) self.bookmark.setIcon(icon5) self.bookmark.setObjectName(_fromUtf8("bookmark")) self.bookmark.setToolTip('Bookmark addressbar location') self.bookmark.clicked.connect(self.bookmarks) self.bookmark.clicked.connect(self.notice_new_bookmark) self.bookmark.setFixedSize(24, 24) self.toolbar.addWidget(self.bookmark) #Open Bookmarks. self.see_bookmark = QToolButton() self.see_bookmark.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon6 = QIcon() icon6.addPixmap(QPixmap(_fromUtf8(":/icons/seebook.png")), QIcon.Normal, QIcon.Off) self.see_bookmark.setIcon(icon6) self.see_bookmark.setObjectName(_fromUtf8("see_bookmark")) self.see_bookmark.setToolTip('See Bookmarks') self.see_bookmark.clicked.connect(self.bookopen) self.see_bookmark.setFixedSize(24, 24) self.toolbar.addWidget(self.see_bookmark) #Download. self.download = QToolButton() self.download.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon7 = QIcon() icon7.addPixmap(QPixmap(_fromUtf8(":/icons/download.png")), QIcon.Normal, QIcon.Off) self.download.setIcon(icon7) self.download.setObjectName(_fromUtf8("download")) self.download.setToolTip('Download file from location') self.download.clicked.connect(self.downloads) self.download.clicked.connect(self.loadings) self.download.setFixedSize(24, 24) self.toolbar.addWidget(self.download) #Search Switch. self.switch_2 = QLineEdit() self.switch_2.setStyleSheet( "QLineEdit{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QLineEdit:hover{background-color:#5c5c5c;}") self.switch_2.setObjectName(_fromUtf8("switch_2")) self.switch_2.setPlaceholderText("Switch") self.switch_2.setFixedSize(50, 24) self.switch_2.setToolTip( 'gs=Startpage, wiki = Wikipedia, tube = Youtube, wolf = Wolfram Alpha. Empty = Startpage search (default)' ) self.switch_2.returnPressed.connect(self.extra) self.toolbar.addWidget(self.switch_2) #Search. self.Search = QLineEdit() self.Search.setStyleSheet( "QLineEdit{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QLineEdit:hover{background-color:#5c5c5c;}") self.Search.setObjectName(_fromUtf8("Search")) self.Search.setPlaceholderText("Search something") self.Search.setToolTip('Search') self.Search.returnPressed.connect(self.extra) self.toolbar.addWidget(self.Search) #Printing. self.printing = QToolButton() self.printing.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon8 = QIcon() icon8.addPixmap(QPixmap(_fromUtf8(":/icons/print.png")), QIcon.Normal, QIcon.Off) self.printing.setIcon(icon8) self.printing.setObjectName(_fromUtf8("print")) self.printing.setToolTip('Print') self.printing.clicked.connect(self.handlePreview) self.printing.clicked.connect(self.printme) self.printing.setFixedSize(24, 24) self.toolbar.addWidget(self.printing) #Zoom +. self.zoom_in = QToolButton() self.zoom_in.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon9 = QIcon() icon9.addPixmap(QPixmap(_fromUtf8(":/icons/zoom-in.png")), QIcon.Normal, QIcon.Off) self.zoom_in.setIcon(icon9) self.zoom_in.setObjectName(_fromUtf8("zoom_in")) self.zoom_in.setToolTip('Zoom +') self.zoom_in.clicked.connect(self.zoomins) self.zoom_in.setFixedSize(24, 24) self.toolbar.addWidget(self.zoom_in) #Zoom -. self.zoom_out = QToolButton() self.zoom_out.setStyleSheet( "QToolButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QToolButton:hover{background-color:#5c5c5c;}") icon10 = QIcon() icon10.addPixmap(QPixmap(_fromUtf8(":/icons/zoom-out.png")), QIcon.Normal, QIcon.Off) self.zoom_out.setIcon(icon10) self.zoom_out.setObjectName(_fromUtf8("zoom_out")) self.zoom_out.setToolTip('Zoom -') self.zoom_out.clicked.connect(self.zoomouts) self.zoom_out.setFixedSize(24, 24) self.toolbar.addWidget(self.zoom_out) #About. self.about1 = QPushButton() self.about1.setObjectName("Info") self.about1.setStyleSheet( "QPushButton{color:#ffffff; background-color:#353535; border: 2px solid #353535; border-radius: 3px;font-size: 12px;}" "QPushButton:hover{background-color:#5c5c5c;}") self.about1.setText("i") self.about1.setToolTip('Info') self.about1.setFixedSize(24, 24) self.about1.clicked.connect(self.about) self.toolbar.addWidget(self.about1) #Web browser. self.web = NewWindow(self.centralwidget) self.web.titleChanged = self.setWindowTitle self.web.urlChanged.connect( lambda x: self.address.setText(x.toString())) self.web.loadStarted.connect(self.begin) self.web.loadFinished.connect(self.complete) #Label as a secondary address placeholder. self.label = QLabel() self.label.setFixedSize(500, 16) self.label.setText( "Click addressbar and press enter if you supplied arguments.") self.web.setObjectName(_fromUtf8("kwebview")) self.web.setMaximumHeight(16777215) self.web.setMaximumWidth(16777215) #Adding to layout. MainWindow.setCentralWidget(self.centralwidget) self.verticalLayout_2.addWidget(self.toolbar) self.verticalLayout_2.addWidget(self.web) self.verticalLayout_2.addWidget(self.label) #Web inspector. self.inspector = QWebInspector() self.web.page().settings().setAttribute( QWebSettings.DeveloperExtrasEnabled, True) self.inspector.setPage(self.web.page()) #More Browser settings. self.web.page().settings().setAttribute(QWebSettings.JavascriptEnabled, True) self.web.page().settings().setAttribute( QWebSettings.LocalContentCanAccessFileUrls, True) self.web.page().settings().setAttribute( QWebSettings.LocalContentCanAccessRemoteUrls, True) self.web.page().settings().setAttribute( QWebSettings.LocalStorageEnabled, True) self.web.page().settings().setAttribute(QWebSettings.PluginsEnabled, True) self.web.page().settings().setAttribute( QWebSettings.PrivateBrowsingEnabled, False) self.web.page().settings().setAttribute( QWebSettings.SpatialNavigationEnabled, True) self.web.page().settings().setAttribute(QWebSettings.AutoLoadImages, True) self.web.page().settings().setAttribute( QWebSettings.AcceleratedCompositingEnabled, True) #################################################### self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "RunIT-QT", None)) self.back.setText(_translate("MainWindow", "Back", None)) self.forward.setText(_translate("MainWindow", "Forward\n" "", None)) self.home.setText(_translate("MainWindow", "Home", None)) self.reloading.setText(_translate("MainWindow", "Reload\n" "", None)) self.vlc.setText(_translate("MainWindow", "Vlc Play", None)) self.bookmark.setText(_translate("MainWindow", "Bookmarkl", None)) self.see_bookmark.setText( _translate("MainWindow", "See bookmarks", None)) self.download.setText(_translate("MainWindow", "Download", None)) self.printing.setText(_translate("MainWindow", "Print", None)) self.zoom_in.setText(_translate("MainWindow", "Zoom+", None)) self.zoom_out.setText(_translate("MainWindow", "Zoom-", None))
class WebPage(QWebPage): def __init__(self): super(WebPage, self).__init__() self.inspector = QWebInspector() self.inspector.setPage(self) self.inspector.resize(1024, 400) diskCache = QNetworkDiskCache(self) diskCache.setCacheDirectory(assets.fs.dataPath() + '/Cache') self.networkAccessManager().setCache(diskCache) self.networkAccessManager().setCookieJar(assets.dataJar) def javaScriptConsoleMessage(self, messgae, lineNumber, sourceId): if assets.manifest['debug']: print("==>[console]: %s @%s: %s" % (sourceId, lineNumber, messgae)) def userAgentForUrl(self, url): return "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36" def acceptNavigationRequest(self, frame, request, type): if(type == QWebPage.NavigationTypeLinkClicked): url = request.url().toString() if(frame == self.mainFrame()): self.view().load(url) return False elif frame == None: # self.createWindow(QWebPage.WebBrowserWindow, url) webbrowser.open(request.url().toString()) return False return QWebPage.acceptNavigationRequest(self, frame, request, type) # def downloadRequested(self, request): # print(request) def findText(self, text): return super(WebPage, self).findText(text, QWebPage.FindBackward) def showInspector(self): self.inspector.show() self.inspector.activateWindow() def hideInspector(self): self.inspector.close() def createWindow(self, type, url = None): from dae.window import Window window = Window(self.view().parentWidget(), url, isDialog = (type == QWebPage.WebModalDialog)) return window.webView.page() def javaScriptAlert(self, frame, msg): QMessageBox.information(self.view().parentWidget(), None, msg) def javaScriptConfirm(self, frame, msg): return QMessageBox.question(self.view().parentWidget(), None, msg) == QMessageBox.Yes # There is a bug in PyQt # def javaScriptPrompt(self, frame, msg, defaultValue): # result = QInputDialog.getText(self.view().parentWidget(), None, msg) # return (result[1], result[0]) def close(self): self.hideInspector() assets.dataJar.save()