#!/usr/bin/env python3 """ This uses the abandoned QWebKit, which was abandoned by the soydevs making Qt5. I made this before I realized it was fucked. Not as fat as the GTK version of "my" browser, but outdated. Needs some old Qt5 idk. Use this if you are restricted in RAM and don't need the newest of newest features to access your pages, but do note that this will eventually stop working. Prerequisites (Debian and cousins): sudo apt install python3-pyqt5 python3-qtpy Below "# Script start" you can find a setting for software mode, which you should comment out if you use a modern PC. I don't use the software rendering that comes included with WebKit, as it's unstable in my experience. """ import sys oldexcepthook = sys.excepthook def newexcepthook(type,value,traceback): oldexcepthook(type,value,traceback) #input("Press ENTER to quit.") # - this causes issues with Qt's input hook sys.excepthook = newexcepthook import os p = os.path.join pUp = os.path.dirname s = False if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): s = os.path.realpath(sys.executable) else: s = os.path.realpath(__file__) sp = pUp(s) # Script start # Comment the following line for hardware acceleration os.environ["LIBGL_ALWAYS_SOFTWARE"] = "1" import qtpy import qtpy.QtGui as QtGui from qtpy.QtGui import * from qtpy.QtWidgets import * from qtpy.QtCore import * from PyQt5.QtWebKitWidgets import * from PyQt5.QtWebKit import * defaultProtocol = "https" browserWindows = [] def parseUrl(url): if url.startswith("data:"): return "data",[],"","" if url.startswith("blob:"): return "blob",[],"","" urlSplit = url.split(":",1) protocol = urlSplit[0] urlSplit = urlSplit[1].lstrip("/").split("/",1) if len(urlSplit) < 2: urlSplit.append("") domain = urlSplit[0].split(".") urlSplit = urlSplit[1].split("?",1) if len(urlSplit) < 2: urlSplit.append("") path = urlSplit[0] arguments = urlSplit[1] return protocol,domain,path,arguments class browserPage(QWebPage): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.defaultUserAgent = "" ua = super().userAgentForUrl(QUrl("https://example.com")).split(" ") skip = False for word in ua: if skip == True: skip = False continue if word == "Gecko)": skip = True self.defaultUserAgent += " " + word self.defaultUserAgent = self.defaultUserAgent[1:] #self.defaultUserAgent = "Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10992/35.5561; U; hr) Presto/2.8.119 Version/11.10" #self.settings().setAttribute(QWebSettings.AutoLoadImages,False) self.settings().setMaximumPagesInCache(0) self.settings().setAttribute(QWebSettings.DnsPrefetchEnabled,False) # idk if these work, folders need to exist #self.settings().setAttribute(QWebSettings.LocalStorageEnabled,True) #self.settings().setLocalStoragePath(p(sp,"LocalStorage")) #self.settings().setAttribute(QWebSettings.OfflineStorageDatabaseEnabled,True) #self.settings().setOfflineStorageDefaultQuota(500000000) #self.settings().setOfflineStoragePath(p(sp,"StorageOffline")) #self.settings().setAttribute(QWebSettings.OfflineWebApplicationCacheEnabled,True) #self.settings().setOfflineWebApplicationCacheQuota(500000000) #self.settings().setOfflineWebApplicationCachePath(p(sp,"AppStorageOffline")) def userAgentForUrl(self,url): protocol,domain,path,arguments = parseUrl(url.toString()) if len(domain) < 2: return self.defaultUserAgent mainDomain = (domain[-2] + "." + domain[-1]).lower() if domain[-2].lower() == "google": return "" return self.defaultUserAgent class browserView(QWebView): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.window = args[0] self.cPage = browserPage() self.setPage(self.cPage) self.load(QUrl("about:blank")) self.titleChanged.connect(self.cTitleChanged) self.urlChanged.connect(self.cUrlChanged) def cTitleChanged(self): self.window.setWindowTitle(self.title()+ " - " +self.window.cTitle) def cUrlChanged(self,url): self.window.cUrlBar.setText(url.toString()) self.window.cUrlBar.setCursorPosition(0) self.cPage.settings().clearMemoryCaches() class browserWindow(QMainWindow): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.cTitle = "webkit-inabox-qt5" self.setWindowTitle(self.cTitle) self.cWidth = 640 self.cHeight = 480 self.resize(self.cWidth,self.cHeight) self.cTaskTimer = QTimer() self.cTaskTimer.setInterval(10000) self.cTaskTimer.timeout.connect(self.cRunTasks) self.cTaskTimer.start() self.cCreateElements() def cCreateElements(self): self.cMenuBar = self.menuBar() self.cFileMenu = self.cMenuBar.addMenu("&File") self.cNewWindowButton = self.cFileMenu.addAction("New &window") self.cNewWindowButton.triggered.connect(self.cNewWindow) self.cUrlBar = QLineEdit("about:blank",self) self.cUrlBar.returnPressed.connect(self.cNavigate) self.cBrowserView = browserView(self) self.cResizeElements() self.show() def cResizeElements(self): barSize = 22 mb = self.cMenuBar.height() self.cUrlBar.move(0,mb) self.cUrlBar.resize(self.cWidth,barSize) self.cBrowserView.move(0,mb + barSize) self.cBrowserView.resize(self.cWidth,self.cHeight - mb - barSize) def resizeEvent(self,event): self.cWidth = self.width() self.cHeight = self.height() self.cResizeElements() def closeEvent(self,event): browserWindows.remove(self) def cNewWindow(self): browserWindows.append(browserWindow()) def cNavigate(self): self.cUrlBar.setCursorPosition(0) url = self.cUrlBar.text() if len(url.split(":",1)) < 2: url = defaultProtocol + "://" + url self.cBrowserView.setFocus() self.cBrowserView.load(QUrl(url)) def cRunTasks(self): self.cBrowserView.cPage.settings().clearMemoryCaches() app = QApplication(sys.argv) browserWindows.append(browserWindow()) app.exec_()