From 9c1de8ebb7b9e00bc6afc9f2ed2978a003d9abd8 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Tue, 18 Jun 2019 16:57:29 +0200 Subject: Re-inject behavior scripts on site reload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #13. Event handler’s push() is async now. --- crocoite/browser.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'crocoite/browser.py') 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']) + -- cgit v1.2.3