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

Unified Diff: third_party/WebKit/LayoutTests/http/tests/resources/origin-trials-helper.js

Issue 2640823004: Allow origin trials to be enabled by script (Closed)
Patch Set: Address nit Created 3 years, 11 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: third_party/WebKit/LayoutTests/http/tests/resources/origin-trials-helper.js
diff --git a/third_party/WebKit/LayoutTests/http/tests/resources/origin-trials-helper.js b/third_party/WebKit/LayoutTests/http/tests/resources/origin-trials-helper.js
new file mode 100644
index 0000000000000000000000000000000000000000..af07d129e656088b45d03f09060990406a164f63
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/resources/origin-trials-helper.js
@@ -0,0 +1,134 @@
+// This file provides an OriginTrialsHelper object which can be used by
+// LayoutTests that are checking members exposed to script by origin trials.
+//
+// The current available methods are:
+// get_interface_names:
+// Report on the existence of the given interface names on the global object,
+// listing all the properties found for each interface. The properties can be
+// filtered by providing a list of desired property names. As well, it can
+// report on properties of the global object itself, by giving 'global' as one
+// of the interface names.
+// Example:
+// OriginTrialsHelper.get_interface_names(
+// this,
+// ['ForeignFetchEvent', 'InstallEvent', 'global'],
+// {'InstallEvent':['registerForeignFetch'], 'global':['onforeignfetch']}));
+//
+// check_interfaces_in_sw:
+// Collects the results of calling get_interface_names() in a service worker.
+// Use in a promise test to output the results.
+// Example:
+// promise_test(t => {
+// var script = 'path/to/script/calling/get_interface_names()'
+// var scope = 'matching scope'
+// return OriginTrialsHelper.check_interfaces_in_sw(t, script, scope)
+// .then(message => {
+// console.log('Interfaces in Service Worker - origin trial enabled.\n'
+// + message);
+// });
+//
+// add_token:
+// Adds a trial token to the document, to enable a trial via script
+// Example:
+// OriginTrialsHelper.add_token('token produced by generate_token.py');
+'use strict';
+
+var OriginTrialsHelper = (function() {
+ return {
+ get_interface_names:
+ (global_object, interface_names,
+ opt_property_filters) => {
+ var property_filters = opt_property_filters || {};
+ var result = [];
+ function collect_property_info(object, property_name, output) {
+ var descriptor =
+ Object.getOwnPropertyDescriptor(object, property_name);
+ if ('value' in descriptor) {
+ if (typeof descriptor.value === 'function') {
+ output.push(' method ' + property_name);
+ } else {
+ output.push(' attribute ' + property_name);
+ }
+ } else {
+ if (descriptor.get) {
+ output.push(' getter ' + property_name);
+ }
+ if (descriptor.set) {
+ output.push(' setter ' + property_name);
+ }
+ }
+ }
+ interface_names.sort();
+ interface_names.forEach(function(interface_name) {
+ var use_global = false;
+ var interface_object;
+ if (interface_name === 'global') {
+ use_global = true;
+ interface_object = global_object;
+ } else {
+ interface_object = global_object[interface_name];
+ }
+ if (interface_object === undefined) {
+ return;
+ }
+ var interface_prototype;
+ var display_name;
+ if (use_global) {
+ interface_prototype = interface_object;
+ display_name = 'global object';
+ } else {
+ interface_prototype = interface_object.prototype;
+ display_name = 'interface ' + interface_name;
+ }
+ result.push(display_name);
+ var property_names =
+ Object.getOwnPropertyNames(interface_prototype);
+ var match_property_names = property_filters[interface_name];
+ if (match_property_names) {
+ property_names = property_names.filter(
+ name => { return match_property_names.indexOf(name) >= 0; });
+ }
+ var property_strings = [];
+ property_names.forEach(function(property_name) {
+ collect_property_info(
+ interface_prototype, property_name, property_strings);
+ });
+ result.push.apply(result, property_strings.sort());
+ });
+ return result.join('\n');
+ },
+
+ check_interfaces_in_sw:
+ (t, script, scope) => {
+ var worker;
+ var message;
+ var registration;
+ return service_worker_unregister_and_register(t, script, scope)
+ .then(reg => {
+ registration = reg;
+ worker = registration.installing;
+ return wait_for_state(t, worker, 'activated');
+ })
+ .then(_ => {
+ var saw_message = new Promise(resolve => {
+ navigator.serviceWorker.onmessage =
+ e => { resolve(e.data); };
+ });
+ worker.postMessage('');
+ return saw_message;
+ })
+ .then(msg => {
+ message = msg;
+ return registration.unregister();
+ })
+ .then(_ => { return message; });
+ },
+
+ add_token: (token_string) => {
+ var tokenElement = document.createElement('meta');
+ tokenElement.httpEquiv = 'origin-trial';
+ tokenElement.content = token_string;
+ document.head.appendChild(tokenElement);
+ }
+ }
+})();

Powered by Google App Engine
This is Rietveld 408576698