Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Unified Diff: telemetry/telemetry/internal/browser/web_contents.py

Issue 3012573002: Add tab.IsServiceWorkerReadyOrNotRegist() which tells whether serviceworker registration is finished (Closed)
Patch Set: fix presubmit error Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: telemetry/telemetry/internal/browser/web_contents.py
diff --git a/telemetry/telemetry/internal/browser/web_contents.py b/telemetry/telemetry/internal/browser/web_contents.py
index 310fad75b324037e61609462dfb4a03748286eb8..bee55bce0c15bb9032b95fe0de91bb5dd130f737 100644
--- a/telemetry/telemetry/internal/browser/web_contents.py
+++ b/telemetry/telemetry/internal/browser/web_contents.py
@@ -10,6 +10,13 @@ from py_trace_event import trace_event
DEFAULT_WEB_CONTENTS_TIMEOUT = 90
+class ServiceWorkerState(object):
+ # these strings should exactly match strings used in
+ # wait_for_serviceworker_registration.js
falken 2017/09/05 02:16:45 Add some docu: # The page did not call register()
+ NOT_REGISTERED = "not registered"
falken 2017/09/05 02:16:45 # The page called register(), and there is not yet
+ INSTALLING = "installing"
falken 2017/09/05 02:16:45 # The page called register(), and has an active se
+ ACTIVATED = "activated"
falken 2017/09/05 02:16:45 if you take up my suggestion, can change this to A
+
# TODO(achuith, dtu, nduca): Add unit tests specifically for WebContents,
# independent of Tab.
class WebContents(object):
@@ -30,6 +37,11 @@ class WebContents(object):
'wait_for_frame.js')) as f:
self._wait_for_frame_js = f.read()
+ with open(os.path.join(
+ os.path.dirname(__file__),
+ 'wait_for_serviceworker_registration.js')) as f:
+ self._wait_for_serviceworker_js = f.read()
+
# An incrementing ID used to query frame timing javascript. Using a new id
# with each request ensures that previously timed-out wait for frame
# requests don't impact new requests.
@@ -121,6 +133,43 @@ class WebContents(object):
'{{ @script }}; window.__telemetry_testHasReachedNetworkQuiescence()',
script=self._quiescence_js)
+ def QueryServiceWorkerState(self):
+ """Returns service worker registration state.
+
+ Returns:
+ ServiceWorkerState if service worker registration state is not unexpected.
+ Raises:
+ exceptions.EvaluateException
+ exceptions.Error: See EvaluateJavaScript() for a detailed list of
+ possible exceptions.
+ """
+ state = self.EvaluateJavaScript(
+ '{{ @script }}; window.__telemetry_queryServiceWorkerState()',
+ script=self._wait_for_serviceworker_js)
+ if state == 'not registered':
+ return ServiceWorkerState.NOT_REGISTERED
+ elif state == 'installing':
+ return ServiceWorkerState.INSTALLING
+ elif state == 'activated':
+ return ServiceWorkerState.ACTIVATED
+ else:
+ raise exceptions.EvaluateException(
+ "Unexpected service worker registration state.")
falken 2017/09/05 02:16:45 maybe we can output 'state' as part of the excepti
+
+ def IsServiceWorkerActivatedOrNotRegistered(self):
falken 2017/09/05 02:16:45 IsServiceWorkerActiveOrNotRegistered
+ """Returns whether service worker is ready or not.
+
+ Returns:
+ True if the service worker registered from the page has reached to
+ ACTIVATED state. Also returns true if the page does not register service
falken 2017/09/05 02:16:45 It's a bit nitty but we're not really checking tha
+ worker.
+ Raises:
+ exceptions.Error: See EvaluateJavaScript() for a detailed list of
+ possible exceptions.
+ """
+ return self.QueryServiceWorkerState() in {ServiceWorkerState.NOT_REGISTERED,
+ ServiceWorkerState.ACTIVATED}
+
def ExecuteJavaScript(self, *args, **kwargs):
"""Executes a given JavaScript statement. Does not return the result.
@@ -229,7 +278,8 @@ class WebContents(object):
if not script_to_evaluate_on_commit:
script_to_evaluate_on_commit = ''
script_to_evaluate_on_commit = (
- self._quiescence_js + ';' + script_to_evaluate_on_commit)
+ self._quiescence_js + self._wait_for_serviceworker_js
+ + script_to_evaluate_on_commit)
self._inspector_backend.Navigate(url, script_to_evaluate_on_commit, timeout)
def IsAlive(self):

Powered by Google App Engine
This is Rietveld 408576698