Bug 1321278 - Rename processId capability to moz:processID; r?whimboo
The WebDriver specification says that any proprietary capabilities
should be defined as so called extension capabilities, which means we
must prefix them with `moz:`.
Even though the `processId` capability is removed, this change is
backwards compatible because a new property `Marionette.process_id`
is introduced that looks for `moz:processID` and `processId` in order
when starting a new session.
MozReview-Commit-ID: ChkC6QTklzC
--- a/testing/marionette/client/marionette_driver/marionette.py
+++ b/testing/marionette/client/marionette_driver/marionette.py
@@ -568,16 +568,17 @@ class Marionette(object):
"""
self.host = host
self.port = self.local_port = int(port)
self.bin = bin
self.instance = None
self.session = None
self.session_id = None
+ self.process_id = None
self.window = None
self.chrome_window = None
self.baseurl = baseurl
self._test_name = None
self.socket_timeout = socket_timeout
self.crashed = 0
startup_timeout = startup_timeout or self.DEFAULT_STARTUP_TIMEOUT
@@ -1214,21 +1215,21 @@ class Marionette(object):
self.instance.restart(clean=clean)
self.raise_for_port()
self.start_session(session_id=session_id)
# Restore the context as used before the restart
self.set_context(context)
- if in_app and self.session.get("processId"):
+ if in_app and self.process_id:
# In some cases Firefox restarts itself by spawning into a new process group.
# As long as mozprocess cannot track that behavior (bug 1284864) we assist by
# informing about the new process id.
- self.instance.runner.process_handler.check_for_detached(self.session["processId"])
+ self.instance.runner.process_handler.check_for_detached(self.process_id)
def absolute_url(self, relative_url):
'''
Returns an absolute url for files served from Marionette's www directory.
:param relative_url: The url of a static file, relative to Marionette's www directory.
'''
return "{0}{1}".format(self.baseurl, relative_url)
@@ -1266,16 +1267,18 @@ class Marionette(object):
self.wait_for_port(timeout=timeout)
self.protocol, _ = self.client.connect()
body = {"capabilities": desired_capabilities, "sessionId": session_id}
resp = self._send_message("newSession", body)
self.session_id = resp["sessionId"]
self.session = resp["value"] if self.protocol == 1 else resp["capabilities"]
+ # fallback to processId can be removed in Firefox 55
+ self.process_id = self.session.get("moz:processID", self.session.get("processId"))
return self.session
@property
def test_name(self):
return self._test_name
@test_name.setter
@@ -1295,16 +1298,17 @@ class Marionette(object):
"""
try:
if send_request:
self._send_message("deleteSession")
finally:
if reset_session_id:
self.session_id = None
self.session = None
+ self.process_id = None
self.window = None
self.client.close()
@property
def session_capabilities(self):
"""A JSON dictionary representing the capabilities of the
current session.
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -155,17 +155,17 @@ this.GeckoDriver = function(appName, ser
// supported features
"raisesAccessibilityExceptions": false,
"rotatable": this.appName == "B2G",
"proxy": {},
// proprietary extensions
"specificationLevel": 0,
- "processId" : Services.appinfo.processID,
+ "moz:processID": Services.appinfo.processID,
};
this.mm = globalMessageManager;
this.listener = proxy.toListener(() => this.mm, this.sendAsync.bind(this));
// always keep weak reference to current dialogue
this.dialog = null;
let handleDialog = (subject, topic) => {
--- a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py
+++ b/testing/marionette/harness/marionette/tests/unit/test_capabilities.py
@@ -33,18 +33,19 @@ class TestCapabilities(MarionetteTestCas
self.assertEqual(self.caps["specificationLevel"], 0)
def test_supported_features(self):
self.assertIn("rotatable", self.caps)
self.assertIn("acceptInsecureCerts", self.caps)
self.assertFalse(self.caps["acceptInsecureCerts"])
def test_additional_capabilities(self):
- self.assertIn("processId", self.caps)
- self.assertEqual(self.caps["processId"], self.appinfo["processID"])
+ self.assertIn("moz:processID", self.caps)
+ self.assertEqual(self.caps["moz:processID"], self.appinfo["processID"])
+ self.assertEqual(self.marionette.process_id, self.appinfo["processID"])
def test_we_can_pass_in_capabilities_on_session_start(self):
self.marionette.delete_session()
capabilities = {"desiredCapabilities": {"somethingAwesome": "cake"}}
self.marionette.start_session(capabilities)
caps = self.marionette.session_capabilities
self.assertIn("somethingAwesome", caps)
--- a/testing/marionette/harness/marionette/tests/unit/test_crash.py
+++ b/testing/marionette/harness/marionette/tests/unit/test_crash.py
@@ -47,17 +47,17 @@ class BaseCrashTestCase(MarionetteTestCa
# Reduce the timeout for faster processing of the tests
socket_timeout = 10
def setUp(self):
super(BaseCrashTestCase, self).setUp()
self.mozcrash_mock = MockMozCrash(self.marionette)
self.crash_count = self.marionette.crashed
- self.pid = self.marionette.session["processId"]
+ self.pid = self.marionette.process_id
self.remote_uri = self.marionette.absolute_url("javascriptPage.html")
def tearDown(self):
self.marionette.crashed = self.crash_count
super(BaseCrashTestCase, self).tearDown()
def crash(self, chrome=True):
@@ -93,17 +93,17 @@ class TestCrash(BaseCrashTestCase):
self.assertRaisesRegexp(IOError, 'Process crashed',
self.crash, chrome=True)
self.assertEqual(self.marionette.crashed, 1)
self.assertIsNone(self.marionette.session)
self.assertRaisesRegexp(MarionetteException, 'Please start a session',
self.marionette.get_url)
self.marionette.start_session()
- self.assertNotEqual(self.marionette.session['processId'], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
# TODO: Bug 1314594 - Causes a hang for the communication between the
# chrome and frame script.
# self.marionette.get_url()
@run_if_e10s
def test_crash_content_process(self):
# If e10s is disabled the chrome process crashes
@@ -112,17 +112,17 @@ class TestCrash(BaseCrashTestCase):
self.assertRaisesRegexp(IOError, 'Content process crashed',
self.crash, chrome=False)
self.assertEqual(self.marionette.crashed, 1)
self.assertIsNone(self.marionette.session)
self.assertRaisesRegexp(MarionetteException, 'Please start a session',
self.marionette.get_url)
self.marionette.start_session()
- self.assertNotEqual(self.marionette.session['processId'], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
self.marionette.get_url()
@expectedFailure
def test_unexpected_crash(self):
self.crash(chrome=True)
class TestCrashInSetUp(BaseCrashTestCase):
@@ -132,17 +132,17 @@ class TestCrashInSetUp(BaseCrashTestCase
self.assertRaisesRegexp(IOError, 'Process crashed',
self.crash, chrome=True)
self.assertEqual(self.marionette.crashed, 1)
self.assertIsNone(self.marionette.session)
def test_crash_in_setup(self):
self.marionette.start_session()
- self.assertNotEqual(self.marionette.session['processId'], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
class TestCrashInTearDown(BaseCrashTestCase):
def tearDown(self):
try:
self.assertRaisesRegexp(IOError, 'Process crashed',
self.crash, chrome=True)
--- a/testing/marionette/harness/marionette/tests/unit/test_quit_restart.py
+++ b/testing/marionette/harness/marionette/tests/unit/test_quit_restart.py
@@ -6,17 +6,17 @@ from marionette import MarionetteTestCas
from marionette_driver.errors import MarionetteException
class TestQuitRestart(MarionetteTestCase):
def setUp(self):
MarionetteTestCase.setUp(self)
- self.pid = self.marionette.session["processId"]
+ self.pid = self.marionette.process_id
self.session_id = self.marionette.session_id
self.assertNotEqual(self.marionette.get_pref("browser.startup.page"), 3)
self.marionette.set_pref("browser.startup.page", 3)
def tearDown(self):
# Ensure to restart a session if none exist for clean-up
if not self.marionette.session:
@@ -26,17 +26,17 @@ class TestQuitRestart(MarionetteTestCase
MarionetteTestCase.tearDown(self)
def test_force_restart(self):
self.marionette.restart()
self.assertEqual(self.marionette.session_id, self.session_id)
# A forced restart will cause a new process id
- self.assertNotEqual(self.marionette.session["processId"], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
# If a preference value is not forced, a restart will cause a reset
self.assertNotEqual(self.marionette.get_pref("browser.startup.page"), 3)
def test_force_quit(self):
self.marionette.quit()
self.assertEqual(self.marionette.session, None)
@@ -51,35 +51,35 @@ class TestQuitRestart(MarionetteTestCase
with self.assertRaises(ValueError):
self.marionette.restart(in_app=True, clean=True)
def test_in_app_restart(self):
self.marionette.restart(in_app=True)
self.assertEqual(self.marionette.session_id, self.session_id)
# An in-app restart will keep the same process id only on Linux
- if self.marionette.session_capabilities['platformName'] == 'linux':
- self.assertEqual(self.marionette.session["processId"], self.pid)
+ if self.marionette.session_capabilities["platformName"] == "linux":
+ self.assertEqual(self.marionette.process_id, self.pid)
else:
- self.assertNotEqual(self.marionette.session["processId"], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
# If a preference value is not forced, a restart will cause a reset
self.assertNotEqual(self.marionette.get_pref("browser.startup.page"), 3)
def test_in_app_restart_with_callback(self):
self.marionette.restart(in_app=True,
callback=lambda: self.shutdown(restart=True))
self.assertEqual(self.marionette.session_id, self.session_id)
# An in-app restart will keep the same process id only on Linux
- if self.marionette.session_capabilities['platformName'] == 'linux':
- self.assertEqual(self.marionette.session["processId"], self.pid)
+ if self.marionette.session_capabilities["platformName"] == "linux":
+ self.assertEqual(self.marionette.process_id, self.pid)
else:
- self.assertNotEqual(self.marionette.session["processId"], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
# If a preference value is not forced, a restart will cause a reset
self.assertNotEqual(self.marionette.get_pref("browser.startup.page"), 3)
def test_in_app_quit(self):
self.marionette.quit(in_app=True)
self.assertEqual(self.marionette.session, None)
@@ -129,40 +129,40 @@ class TestQuitRestart(MarionetteTestCase
self.assertNotIn('chrome://', self.marionette.get_url(),
"Context doesn't default to content")
# restart while we are in chrome context
self.marionette.set_context('chrome')
self.marionette.restart(in_app=True)
# An in-app restart will keep the same process id only on Linux
- if self.marionette.session_capabilities['platformName'] == 'linux':
- self.assertEqual(self.marionette.session["processId"], self.pid)
+ if self.marionette.session_capabilities["platformName"] == "linux":
+ self.assertEqual(self.marionette.process_id, self.pid)
else:
- self.assertNotEqual(self.marionette.session["processId"], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
self.assertIn('chrome://', self.marionette.get_url(),
"Not in chrome context after a restart with set_context")
def test_keep_context_after_restart_by_using_context(self):
# Check that we are in content context which is used by default in Marionette
self.assertNotIn('chrome://', self.marionette.get_url(),
"Context doesn't default to content")
# restart while we are in chrome context
with self.marionette.using_context('chrome'):
self.marionette.restart(in_app=True)
# An in-app restart will keep the same process id only on Linux
- if self.marionette.session_capabilities['platformName'] == 'linux':
- self.assertEqual(self.marionette.session["processId"], self.pid)
+ if self.marionette.session_capabilities["platformName"] == "linux":
+ self.assertEqual(self.marionette.process_id, self.pid)
else:
- self.assertNotEqual(self.marionette.session["processId"], self.pid)
+ self.assertNotEqual(self.marionette.process_id, self.pid)
- self.assertIn('chrome://', self.marionette.get_url(),
+ self.assertIn("chrome://", self.marionette.get_url(),
"Not in chrome context after a restart with using_context")
def shutdown(self, restart=False):
self.marionette.set_context("chrome")
self.marionette.execute_script("""
Components.utils.import("resource://gre/modules/Services.jsm");
let flags = Ci.nsIAppStartup.eAttemptQuit
if(arguments[0]) {