Skip to content

Commit

Permalink
Prototype of the "Set Timezone WebDrive extension"
Browse files Browse the repository at this point in the history
This CL is NOT intended to be merge into chromium.
I just want to use the chromium tryBot to validate the code is correct.
The WPT PR is in #26555

Bug: 1144403
Change-Id: Ie3c062d1d9e59ee3f9087c7af99df7d2d29b056d
  • Loading branch information
FrankYFTang authored and chromium-wpt-export-bot committed Dec 15, 2020
1 parent 7647a1f commit 1c9ddd6
Show file tree
Hide file tree
Showing 20 changed files with 432 additions and 3 deletions.
17 changes: 17 additions & 0 deletions docs/writing-tests/testdriver.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,23 @@ await test_driver.set_permission({ name: "background-fetch" }, "denied");
await test_driver.set_permission({ name: "push", userVisibleOnly: true }, "granted", true);
```

### set_time_zone

Usage: `test_driver.set_time_zone(time_zone)`
* _timezone_: a string matching one of the
[Zone or Link names of the IANA Time Zone Database](https://www.iana.org/time-zones)

This function set the host default time zone to the given time zone ID.
It returns a promise that resolves after the time zone has
been set to be overridden with _time_zone_.

Example:

``` js
await test_driver.set_time_zone("Asia/Taipei");
await test_driver.set_time_zone("Asia/Hong_Kong");
```

## Using testdriver in Other Browsing Contexts

Testdriver can be used in browsing contexts (i.e. windows or frames)
Expand Down
23 changes: 23 additions & 0 deletions infrastructure/testdriver/set_timezone.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>TestDriver set_time_zone method</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>

<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
async_test(t => {
let timeZone = "Asia/Taipei";
test_driver
.set_time_zone(timeZone)
.then(() => {
assert_equals(defaultTimeZone(), timeZone);
t.done()
})
.catch(() => assert_unreached("set_time_zone failed"));
});
</script>
24 changes: 24 additions & 0 deletions resources/testdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,26 @@
const blocked = state === "blocked";
return window.test_driver_internal.set_storage_access(origin, embedding_origin, blocked, context);
},

/**
* Set time zone.
*
* The set_time_zone function set the host default time zone to a new
* timezone id.
*
* This matches the behavior of the {@link
* https://github.com/whatwg/html/pull/3047
* Set Time Zone command}.
*
* @param {String} time_zone - IANA Time Zone ID.
*
* @returns {Promise} fulfilled after the time zone is set, or
* rejected if the set of time zone fails
*/
set_time_zone: function(time_zone) {
return window.test_driver_internal.set_time_zone(time_zone);
},

};

window.test_driver_internal = {
Expand Down Expand Up @@ -560,5 +580,9 @@
set_storage_access: function(origin, embedding_origin, blocked, context=null) {
return Promise.reject(new Error("unimplemented"));
},

set_time_zone: function(time_zone) {
return Promise.reject(new Error("unimplemented"));
},
};
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
self.addEventListener('message', function(e) {
const message = e.data;
if ('port' in message) {
const port = message.port;
const oldTimeZone =
(new Intl.DateTimeFormat()).resolvedOptions().timeZone;
self.addEventListener('timezonechange', function(evt) {
const newTimeZone =
(new Intl.DateTimeFormat()).resolvedOptions().timeZone;
port.postMessage('SUCCESS:' + newTimeZone);
});
port.postMessage('READY:' + oldTimeZone);
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<title>Service Worker: timezonechange event</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="../service-worker/resources/test-helpers.sub.js"></script>
<script>

function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}

promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, we set to a fixed time zone.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);

const script = 'resources/service-worker-timezonechange.js';
const scope = 'resources/blank.html';
let worker;
let port;

return service_worker_unregister_and_register(t, script, scope)
.then(registration => {
t.add_cleanup(() => registration.unregister());
worker = registration.installing;

const messageChannel = new MessageChannel();
port = messageChannel.port1;
return new Promise(resolve => {
port.onmessage = resolve;
worker.postMessage({port: messageChannel.port2},
[messageChannel.port2]);
});
})
.then(e => {
assert_equals(e.data, 'READY:' + oldTimeZone);
return new Promise(async resolve => {
port.onmessage = resolve;
// Change the time zone once the service worker is ready.
await window.test_driver.set_time_zone(newTimeZone);
});
})
.then(e => {
assert_equals(e.data, 'SUCCESS:' + newTimeZone);
});
}, 'timezonechange event work in ServiceWorker');
</script>
28 changes: 28 additions & 0 deletions timezonechange/addeventlistener-timezonechange-fired.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>

function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
return new Promise(r => {
window.addEventListener('timezonechange', r);
window.test_driver.set_time_zone(newTimeZone);
}).then(e => {
assert_equals(defaultTimeZone(), newTimeZone);
});
}, "Test that the timezonechange event fires on window.addEventListener('timezonechange')");
</script>
</body>
</html>
30 changes: 30 additions & 0 deletions timezonechange/ontimezonechange-event-property.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
return new Promise(async r => {
window.addEventListener('timezonechange', r);
await window.test_driver.set_time_zone(newTimeZone);
}).then(e => {
assert_false(e.cancelable);
assert_false(e.bubbles);
assert_equals(defaultTimeZone(), newTimeZone);
});
}, "Test properties of the fired event.");

</script>
</body>
</html>
33 changes: 33 additions & 0 deletions timezonechange/ontimezonechange-over-setattribute.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time_zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
window.received = 0; // We need a global variable here.
var fromWindowHandler = false;
document.body.setAttribute('ontimezonechange', 'window.received++;');

return new Promise(async r => {
window.ontimezonechange = r;
await window.test_driver.set_time_zone(newTimeZone);
}).then(evt => {
received++;
assert_equals(window.received, 1);
assert_equals(defaultTimeZone(), newTimeZone);
});
}, "Test that the timezonechange event fires on window.ontimezonechange but not body ontimezonechange attribute");
</script>
</body>
</html>
16 changes: 16 additions & 0 deletions timezonechange/ontimezonechange.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>

test(function() {
assert_true('ontimezonechange' in window);
}, "Test that timezonechange event handler API is present in window");

</script>
</body>
</html>
9 changes: 9 additions & 0 deletions timezonechange/resources/shared-worker-timezonechange.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
onconnect = connectEvent => {
let oldtimezone = (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
const port = connectEvent.ports[0];
ontimezonechange = () => {
let timezone = (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
port.postMessage("SUCCESS:" + timezone);
};
port.postMessage("READY:" + oldtimezone); // (the html will change the timezone)
}
6 changes: 6 additions & 0 deletions timezonechange/resources/worker-timezonechange.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
let oldtimezone = (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
ontimezonechange = evt => {
let timezone = (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
postMessage("SUCCESS:" + timezone);
}
postMessage("READY:" + oldtimezone);
29 changes: 29 additions & 0 deletions timezonechange/setattribute-over-ontimezonechange.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
window.received = 0; // We need a global variable here.
window.ontimezonechange = () => received++;
document.body.setAttribute('ontimezonechange', () => {
received++;
assert_equals(window.received, 1);
assert_equals(defaultTimeZone(), newTimeZone);
});
await window.test_driver.set_time_zone(newTimeZone);
}, "Test that the timezonechange event fires on body ontimezonechange attribute but not window.ontimezonechange");
</script>
</body>
</html>
28 changes: 28 additions & 0 deletions timezonechange/setattribute.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
window.received = false; // We need a global variable here.
document.body.setAttribute('ontimezonechange', 'window.received = true;');

await window.test_driver.set_time_zone(newTimeZone);
assert_true(window.received);
assert_equals(defaultTimeZone(), newTimeZone);
}, "Test that the timezonechange event fires on body ontimezonechange attribute");

</script>
</body>
</html>
26 changes: 26 additions & 0 deletions timezonechange/shared-worker-timezonechange.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<title>Test shared worker handle ontimezonechange event.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First we set the time zone to a fixed time zone.
await window.test_driver.set_time_zone(oldTimeZone);
const worker = new SharedWorker('resources/shared-worker-timezonechange.js', 'name');
return new Promise(r => { worker.port.onmessage = r; })
.then(e => {
// Once we know the worker is ready, we change the time zone.
assert_equals(e.data, "READY:" + oldTimeZone);
return new Promise(async r => {
worker.port.onmessage = r;
await window.test_driver.set_time_zone(newTimeZone);
}).then(e => {
assert_equals(e.data, "SUCCESS:" + newTimeZone);
})
});
}, "Test a shared worker handles ontimezonechange event.");
</script>
28 changes: 28 additions & 0 deletions timezonechange/window-ontimezonechange-fired.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function defaultTimeZone() {
return (new Intl.DateTimeFormat()).resolvedOptions().timeZone;
}
promise_test(async t => {
const oldTimeZone = "Pacific/Fakaofo";
const newTimeZone = "Asia/Taipei";
// First, setup the time zone in a fixed place.
await window.test_driver.set_time_zone(oldTimeZone);
assert_equals(defaultTimeZone(), oldTimeZone);
return new Promise(async r => {
window.ontimezonechange = r;
await window.test_driver.set_time_zone(newTimeZone);
}).then(e => {
assert_equals(defaultTimeZone(), newTimeZone);
});
}, "Test that the timezonechange event fires on window.ontimezonechange");

</script>
</body>
</html>
Loading

0 comments on commit 1c9ddd6

Please sign in to comment.