#!/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. There was more optimizations I did to this but I lost them and I don't care enough anymore. Fuck this shit. 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 use if you're experiencing trouble with the viewport not showing up or freezing. """ 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 # Uncomment the following line for software-mode #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 * 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 = super().userAgentForUrl def userAgentForUrl(self,url): protocol,domain,path,arguments = parseUrl(url.toString()) if len(domain) < 2: return self.defaultUserAgent(url) mainDomain = (domain[-2] + "." + domain[-1]).lower() if domain[-2].lower() == "google": return "" return self.defaultUserAgent(url) class browserView(QWebView): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.window = args[0] self.setPage(browserPage()) self.load(QUrl("about:blank")) self.titleChanged.connect(self.cTitleChanged) self.urlChanged.connect(self.cUrlChanged) def cTitleChanged(self): self.window.setWindowTitle(self.title()+ " - webkit-inabox-qt5") def cUrlChanged(self,url): self.window.cUrlBar.setText(url.toString()) self.window.cUrlBar.setCursorPosition(0) class browserWindow(QMainWindow): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.cTitle = "webkit-inabox" self.setWindowTitle(self.cTitle) self.cWidth = 640 self.cHeight = 480 self.resize(self.cWidth,self.cHeight) 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)) app = QApplication(sys.argv) browserWindows.append(browserWindow()) app.exec_()