185 lines
5.8 KiB
Python
185 lines
5.8 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. 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_() |