webkit-disappointment/webkit-inabox-qt5.py

147 lines
4.2 KiB
Python

#!/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_()