Commit da317449 authored by Frank Tang's avatar Frank Tang Committed by Commit Bot

[chromedriver] Add "Set Timezone" Extension to ChromeDriver

Part 3 of the work to allow wpt to set timezone during the test.
This allow ChromeDriver to set the default host timezone in the test.

* Design Doc: https://docs.google.com/document/d/1QAMHl7qIfGyFmWxta8OpR2YwivwaVgX_ixG17QWAgd0/edit#
* API Spec of the SetTimezone WebDriver Extension:
https://docs.google.com/document/d/12vdPTH_Vlkt4pxwlWzR1CjKtLE6y2Z-Qs-GPi_hWXqc/edit#
* Design Doc of the "Chromium DevTools design doc: timezone emulation"
https://docs.google.com/document/d/1ZH2jw1uFWX5uKwiIwv9mgpyBBAdwv95nb8gIRuX4W3k/edit#heading=h.7nki9mck5t64



Bug: 1144403
Change-Id: Iae396a68fb79152a684f95a989c430f4e91c86f8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2512788Reviewed-by: default avatarShengfa Lin <shengfa@google.com>
Reviewed-by: default avatarJohn Chen <johnchen@chromium.org>
Commit-Queue: Shengfa Lin <shengfa@google.com>
Cr-Commit-Position: refs/heads/master@{#823790}
parent 95907b33
...@@ -665,6 +665,9 @@ class ChromeDriver(object): ...@@ -665,6 +665,9 @@ class ChromeDriver(object):
def GenerateTestReport(self, message): def GenerateTestReport(self, message):
self.ExecuteCommand(Command.GENERATE_TEST_REPORT, {'message': message}) self.ExecuteCommand(Command.GENERATE_TEST_REPORT, {'message': message})
def SetTimezone(self, timezone):
return self.ExecuteCommand(Command.SET_TIMEZONE, {'timezone': timezone})
def AddVirtualAuthenticator(self, protocol=None, transport=None, def AddVirtualAuthenticator(self, protocol=None, transport=None,
hasResidentKey=None, hasUserVerification=None, hasResidentKey=None, hasUserVerification=None,
isUserConsenting=None, isUserVerified=None, isUserConsenting=None, isUserVerified=None,
......
...@@ -182,6 +182,7 @@ class Command(object): ...@@ -182,6 +182,7 @@ class Command(object):
_Method.POST, '/session/:sessionId/chromium/send_command_and_get_result') _Method.POST, '/session/:sessionId/chromium/send_command_and_get_result')
GENERATE_TEST_REPORT = ( GENERATE_TEST_REPORT = (
_Method.POST, '/session/:sessionId/reporting/generate_test_report') _Method.POST, '/session/:sessionId/reporting/generate_test_report')
SET_TIMEZONE = (_Method.POST, '/session/:sessionId/timezone')
ADD_VIRTUAL_AUTHENTICATOR = ( ADD_VIRTUAL_AUTHENTICATOR = (
_Method.POST, '/session/:sessionId/webauthn/authenticator') _Method.POST, '/session/:sessionId/webauthn/authenticator')
REMOVE_VIRTUAL_AUTHENTICATOR = ( REMOVE_VIRTUAL_AUTHENTICATOR = (
......
...@@ -884,6 +884,11 @@ HttpHandler::HttpHandler( ...@@ -884,6 +884,11 @@ HttpHandler::HttpHandler(
WrapToCommand("QuitAll", base::BindRepeating(&ExecuteQuit, true)), WrapToCommand("QuitAll", base::BindRepeating(&ExecuteQuit, true)),
&session_thread_map_)), &session_thread_map_)),
// Set Timezone command
CommandMapping(kPost, "session/:sessionId/timezone",
WrapToCommand("SetTimezone",
base::BindRepeating(&ExecuteSetTimezone))),
// //
// ChromeDriver specific extension commands. // ChromeDriver specific extension commands.
// //
......
...@@ -1274,3 +1274,23 @@ Status ExecuteGenerateTestReport(Session* session, ...@@ -1274,3 +1274,23 @@ Status ExecuteGenerateTestReport(Session* session,
web_view->SendCommandAndGetResult("Page.generateTestReport", body, value); web_view->SendCommandAndGetResult("Page.generateTestReport", body, value);
return Status(kOk); return Status(kOk);
} }
Status ExecuteSetTimezone(Session* session,
const base::DictionaryValue& params,
std::unique_ptr<base::Value>* value) {
WebView* web_view = nullptr;
Status status = session->GetTargetWindow(&web_view);
if (status.IsError())
return status;
std::string timezone;
if (!params.GetString("timezone", &timezone))
return Status(kInvalidArgument, "missing parameter 'timezone'");
base::DictionaryValue body;
body.SetString("timezoneId", timezone);
web_view->SendCommandAndGetResult("Emulation.setTimezoneOverride", body,
value);
return Status(kOk);
}
...@@ -167,6 +167,10 @@ Status ExecuteGenerateTestReport(Session* session, ...@@ -167,6 +167,10 @@ Status ExecuteGenerateTestReport(Session* session,
const base::DictionaryValue& params, const base::DictionaryValue& params,
std::unique_ptr<base::Value>* value); std::unique_ptr<base::Value>* value);
Status ExecuteSetTimezone(Session* session,
const base::DictionaryValue& params,
std::unique_ptr<base::Value>* value);
namespace internal { namespace internal {
Status ConfigureHeadlessSession(Session* session, Status ConfigureHeadlessSession(Session* session,
const Capabilities& capabilities); const Capabilities& capabilities);
......
...@@ -2702,6 +2702,17 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer): ...@@ -2702,6 +2702,17 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer):
self.assertEquals('test', report['type']); self.assertEquals('test', report['type']);
self.assertEquals('test report message', report['body']['message']); self.assertEquals('test report message', report['body']['message']);
def testSetTimezone(self):
self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
self._driver.SetTimezone('Asia/Taipei');
timeZone = self._driver.ExecuteScript(
'return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;')
self.assertEquals('Asia/Taipei', timeZone);
self._driver.SetTimezone('Asia/Hong_Kong');
timeZone = self._driver.ExecuteScript(
'return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;')
self.assertEquals('Asia/Hong_Kong', timeZone);
def GetPermissionWithQuery(self, query): def GetPermissionWithQuery(self, query):
script = """ script = """
let query = arguments[0]; let query = arguments[0];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment