summaryrefslogtreecommitdiff
path: root/crocoite/browser.py
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2019-06-18 16:57:29 +0200
committerLars-Dominik Braun <lars@6xq.net>2019-06-18 16:57:29 +0200
commit9c1de8ebb7b9e00bc6afc9f2ed2978a003d9abd8 (patch)
tree4ad0c2a78e23896739d6dadbfbea9cfd1bb4d722 /crocoite/browser.py
parentb4669705fa8e581c17bbe0ca0c7cf4fadbd3deb8 (diff)
downloadcrocoite-9c1de8ebb7b9e00bc6afc9f2ed2978a003d9abd8.tar.gz
crocoite-9c1de8ebb7b9e00bc6afc9f2ed2978a003d9abd8.tar.bz2
crocoite-9c1de8ebb7b9e00bc6afc9f2ed2978a003d9abd8.zip
Re-inject behavior scripts on site reload
Fixes #13. Event handler’s push() is async now.
Diffstat (limited to 'crocoite/browser.py')
-rw-r--r--crocoite/browser.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/crocoite/browser.py b/crocoite/browser.py
index 577e77a..dc67c51 100644
--- a/crocoite/browser.py
+++ b/crocoite/browser.py
@@ -252,12 +252,22 @@ class NavigateError (IOError):
class PageIdle:
""" Page idle event """
+ __slots__ = ('idle', )
+
def __init__ (self, idle):
self.idle = idle
def __bool__ (self):
return self.idle
+class FrameNavigated:
+ __slots__ = ('id', 'url', 'mimeType')
+
+ def __init__ (self, id, url, mimeType):
+ self.id = id
+ self.url = URL (url)
+ self.mimeType = mimeType
+
class SiteLoader:
"""
Load site in Chrome and monitor network requests
@@ -266,7 +276,7 @@ class SiteLoader:
"""
__slots__ = ('requests', 'browser', 'logger', 'tab', '_iterRunning',
- '_framesLoading')
+ '_framesLoading', '_rootFrame')
allowedSchemes = {'http', 'https'}
def __init__ (self, browser, logger):
@@ -276,6 +286,7 @@ class SiteLoader:
self._iterRunning = []
self._framesLoading = set ()
+ self._rootFrame = None
async def __aenter__ (self):
tab = self.tab = await self.browser.__aenter__ ()
@@ -317,6 +328,7 @@ class SiteLoader:
tab.Page.javascriptDialogOpening: self._javascriptDialogOpening,
tab.Page.frameStartedLoading: self._frameStartedLoading,
tab.Page.frameStoppedLoading: self._frameStoppedLoading,
+ tab.Page.frameNavigated: self._frameNavigated,
}
# The implementation is a little advanced. Why? The goal here is to
@@ -356,6 +368,7 @@ class SiteLoader:
uuid='9d47ded2-951f-4e09-86ee-fd4151e20666', result=ret)
if 'errorText' in ret:
raise NavigateError (ret['errorText'])
+ self._rootFrame = ret['frameId']
# internal chrome callbacks
async def _requestWillBeSent (self, **kwargs):
@@ -489,3 +502,11 @@ class SiteLoader:
if not self._framesLoading:
return PageIdle (True)
+ async def _frameNavigated (self, **kwargs):
+ self.logger.debug ('frameNavigated',
+ uuid='0e876f7d-7129-4612-8632-686f42ac6e1f', args=kwargs)
+ frame = kwargs['frame']
+ if self._rootFrame == frame['id']:
+ assert frame.get ('parentId', None) is None, "root frame must not have a parent"
+ return FrameNavigated (frame['id'], frame['url'], frame['mimeType'])
+