mirror of
https://github.com/Feodor2/Mypal68.git
synced 2025-06-18 14:55:44 -04:00
68.14.2 - testing
This commit is contained in:
parent
0c2dfe37ab
commit
40ed9513e6
@ -1,10 +0,0 @@
|
||||
[
|
||||
{
|
||||
"size": 13426698,
|
||||
"visibility": "internal",
|
||||
"digest": "d2b45d3e2fab867152e2063785af48ead3f4d34b4dd614c1e0867f3eeef0c8088a4ffe811400234827293ff8b75f34f45b45eca991e4eed7de37934a7400a9ac",
|
||||
"algorithm": "sha512",
|
||||
"filename": "node-linux-x86.tar.gz",
|
||||
"unpack": true
|
||||
}
|
||||
]
|
@ -1,10 +0,0 @@
|
||||
[
|
||||
{
|
||||
"size": 13958999,
|
||||
"visibility": "internal",
|
||||
"digest": "ce5c0c20dfa83821284a1b69b226fe13224b82345622fc43d216332484ec8c89a2f171ad3dd2ac83cd5777510306d349bc4fbf00fc692e3542dfb7db70876489",
|
||||
"algorithm": "sha512",
|
||||
"filename": "node-linux-x64.tar.gz",
|
||||
"unpack": true
|
||||
}
|
||||
]
|
@ -1,10 +0,0 @@
|
||||
[
|
||||
{
|
||||
"size": 12148545,
|
||||
"visibility": "internal",
|
||||
"digest": "a79b5efc30b560fbfb48210b4e0b4c6418ebc8472b07460c7cb2042db6ea1b7a6473cb9fa35604b8abbc93df3d3689b91919dd21e8d4f382033d3c07c7ec6a3f",
|
||||
"algorithm": "sha512",
|
||||
"filename": "node-osx.tar.gz",
|
||||
"unpack": true
|
||||
}
|
||||
]
|
@ -1,9 +0,0 @@
|
||||
[
|
||||
{
|
||||
"size": 15066656,
|
||||
"visibility": "internal",
|
||||
"digest": "edf96781042db513700c4a092ef367c05933967b036db9b0f716b75da613a7eaea055d0f60b1e12f6e41a545962cec97a7b78c6b86363ee1ec7a9f42699a5531",
|
||||
"algorithm": "sha512",
|
||||
"filename": "node-win32.exe"
|
||||
}
|
||||
]
|
@ -30,6 +30,7 @@
|
||||
#include "sslproto.h"
|
||||
#include "plhash.h"
|
||||
#include "mozilla/Sprintf.h"
|
||||
#include "mozilla/Unused.h"
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::psm;
|
||||
@ -381,6 +382,32 @@ bool ConfigureSSLServerSocket(PRFileDesc* socket, server_info_t* si,
|
||||
SSL_OptionSet(ssl_socket, SSL_HANDSHAKE_AS_SERVER, true);
|
||||
|
||||
if (clientAuth != caNone) {
|
||||
// If we're requesting or requiring a client certificate, we should
|
||||
// configure NSS to include the "certificate_authorities" field in the
|
||||
// certificate request message. That way we can test that gecko properly
|
||||
// takes note of it.
|
||||
UniqueCERTCertificate issuer(
|
||||
CERT_FindCertIssuer(cert.get(), PR_Now(), certUsageAnyCA));
|
||||
if (!issuer) {
|
||||
LOG_DEBUG(("Failed to find issuer for %s\n", certnick));
|
||||
return false;
|
||||
}
|
||||
UniqueCERTCertList issuerList(CERT_NewCertList());
|
||||
if (!issuerList) {
|
||||
LOG_ERROR(("Failed to allocate new CERTCertList\n"));
|
||||
return false;
|
||||
}
|
||||
if (CERT_AddCertToListTail(issuerList.get(), issuer.get()) != SECSuccess) {
|
||||
LOG_ERROR(("Failed to add issuer to issuerList\n"));
|
||||
return false;
|
||||
}
|
||||
Unused << issuer.release(); // Ownership transferred to issuerList.
|
||||
if (SSL_SetTrustAnchors(ssl_socket, issuerList.get()) != SECSuccess) {
|
||||
LOG_ERROR(
|
||||
("Failed to set certificate_authorities list for client "
|
||||
"authentication\n"));
|
||||
return false;
|
||||
}
|
||||
SSL_OptionSet(ssl_socket, SSL_REQUEST_CERTIFICATE, true);
|
||||
SSL_OptionSet(ssl_socket, SSL_REQUIRE_CERTIFICATE, clientAuth == caRequire);
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
config = {
|
||||
# We bake this directly into the tester image now...
|
||||
"download_nodejs": False,
|
||||
"nodejs_path": "/usr/local/bin/node",
|
||||
"exes": {}
|
||||
}
|
||||
|
@ -13,6 +13,10 @@ ADJUST_MOUSE_AND_SCREEN = False
|
||||
# Note: keep these Valgrind .sup file names consistent with those
|
||||
# in testing/mochitest/mochitest_options.py.
|
||||
VALGRIND_SUPP_DIR = os.path.join(os.getcwd(), "build/tests/mochitest")
|
||||
NODEJS_PATH = None
|
||||
if 'MOZ_FETCHES_DIR' in os.environ:
|
||||
NODEJS_PATH = os.path.join(os.environ["MOZ_FETCHES_DIR"], "node/bin/node")
|
||||
|
||||
VALGRIND_SUPP_CROSS_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||
"cross-architecture.sup")
|
||||
VALGRIND_SUPP_ARCH = None
|
||||
@ -22,14 +26,11 @@ if platform.architecture()[0] == "64bit":
|
||||
MINIDUMP_STACKWALK_PATH = "linux64-minidump_stackwalk"
|
||||
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||
"x86_64-pc-linux-gnu.sup")
|
||||
NODEJS_PATH = "node-linux-x64/bin/node"
|
||||
NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux64/nodejs.manifest"
|
||||
else:
|
||||
TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/releng.manifest"
|
||||
MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
|
||||
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||
"i386-pc-linux-gnu.sup")
|
||||
NODEJS_PATH = "node-linux-x86/bin/node"
|
||||
NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/nodejs.manifest"
|
||||
|
||||
#####
|
||||
@ -260,8 +261,6 @@ config = {
|
||||
"minidump_stackwalk_path": MINIDUMP_STACKWALK_PATH,
|
||||
"minidump_tooltool_manifest_path": TOOLTOOL_MANIFEST_PATH,
|
||||
"tooltool_cache": "/builds/worker/tooltool-cache",
|
||||
"download_nodejs": True,
|
||||
"nodejs_path": NODEJS_PATH,
|
||||
"nodejs_tooltool_manifest_path": NODEJS_TOOLTOOL_MANIFEST_PATH,
|
||||
# "log_format": "%(levelname)8s - %(message)s",
|
||||
}
|
||||
|
@ -2,6 +2,10 @@ import os
|
||||
|
||||
# OS Specifics
|
||||
INSTALLER_PATH = os.path.join(os.getcwd(), "installer.dmg")
|
||||
NODEJS_PATH = None
|
||||
if 'MOZ_FETCHES_DIR' in os.environ:
|
||||
NODEJS_PATH = os.path.join(os.environ["MOZ_FETCHES_DIR"], "node/bin/node")
|
||||
|
||||
XPCSHELL_NAME = 'xpcshell'
|
||||
EXE_SUFFIX = ''
|
||||
DISABLE_SCREEN_SAVER = False
|
||||
@ -209,7 +213,5 @@ config = {
|
||||
"minidump_stackwalk_path": "macosx64-minidump_stackwalk",
|
||||
"minidump_tooltool_manifest_path": "config/tooltool-manifests/macosx64/releng.manifest",
|
||||
"tooltool_cache": "/builds/tooltool_cache",
|
||||
"download_nodejs": True,
|
||||
"nodejs_path": "node-osx/bin/node",
|
||||
"nodejs_tooltool_manifest_path": "config/tooltool-manifests/macosx64/nodejs.manifest",
|
||||
"nodejs_path": NODEJS_PATH,
|
||||
}
|
||||
|
@ -6,6 +6,10 @@ import sys
|
||||
ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
|
||||
BINARY_PATH = os.path.join(ABS_WORK_DIR, "firefox", "firefox.exe")
|
||||
INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.zip")
|
||||
NODEJS_PATH = None
|
||||
if 'MOZ_FETCHES_DIR' in os.environ:
|
||||
NODEJS_PATH = os.path.join(os.environ["MOZ_FETCHES_DIR"], "node/node.exe")
|
||||
|
||||
XPCSHELL_NAME = 'xpcshell.exe'
|
||||
EXE_SUFFIX = '.exe'
|
||||
DISABLE_SCREEN_SAVER = False
|
||||
@ -282,7 +286,5 @@ config = {
|
||||
},
|
||||
"minidump_stackwalk_path": "win32-minidump_stackwalk.exe",
|
||||
"minidump_tooltool_manifest_path": "config/tooltool-manifests/win32/releng.manifest",
|
||||
"download_nodejs": True,
|
||||
"nodejs_path": "node-win32.exe",
|
||||
"nodejs_tooltool_manifest_path": "config/tooltool-manifests/win32/nodejs.manifest",
|
||||
"nodejs_path": NODEJS_PATH,
|
||||
}
|
||||
|
@ -118,7 +118,6 @@ class TestingMixin(VirtualenvMixin, AutomationMixin, ResourceMonitoringMixin,
|
||||
symbols_path = None
|
||||
jsshell_url = None
|
||||
minidump_stackwalk_path = None
|
||||
nodejs_path = None
|
||||
default_tools_repo = 'https://hg.mozilla.org/build/tools'
|
||||
|
||||
def query_build_dir_url(self, file_name):
|
||||
@ -572,69 +571,6 @@ Did you run with --create-virtualenv? Is mozinstall in virtualenv_modules?""")
|
||||
else:
|
||||
self.fatal('We could not determine the minidump\'s filename.')
|
||||
|
||||
def query_nodejs_tooltool_manifest(self):
|
||||
if self.config.get('nodejs_tooltool_manifest_path'):
|
||||
return self.config['nodejs_tooltool_manifest_path']
|
||||
|
||||
self.info('NodeJS tooltool manifest unknown. Determining based upon '
|
||||
'platform and architecture.')
|
||||
platform_name = self.platform_name()
|
||||
|
||||
if platform_name:
|
||||
tooltool_path = "config/tooltool-manifests/%s/nodejs.manifest" % \
|
||||
TOOLTOOL_PLATFORM_DIR[platform_name]
|
||||
return tooltool_path
|
||||
else:
|
||||
self.fatal('Could not determine nodejs manifest filename')
|
||||
|
||||
def query_nodejs_filename(self):
|
||||
if self.config.get('nodejs_path'):
|
||||
return self.config['nodejs_path']
|
||||
|
||||
self.fatal('Could not determine nodejs filename')
|
||||
|
||||
def query_nodejs(self, manifest=None):
|
||||
if self.nodejs_path:
|
||||
return self.nodejs_path
|
||||
|
||||
c = self.config
|
||||
dirs = self.query_abs_dirs()
|
||||
|
||||
nodejs_path = self.query_nodejs_filename()
|
||||
if not self.config.get('download_nodejs'):
|
||||
self.nodejs_path = nodejs_path
|
||||
return self.nodejs_path
|
||||
|
||||
if not manifest:
|
||||
tooltool_manifest_path = self.query_nodejs_tooltool_manifest()
|
||||
manifest = os.path.join(dirs.get('abs_test_install_dir',
|
||||
os.path.join(dirs['abs_work_dir'], 'tests')),
|
||||
tooltool_manifest_path)
|
||||
|
||||
self.info('grabbing nodejs binary from tooltool')
|
||||
try:
|
||||
self.tooltool_fetch(
|
||||
manifest=manifest,
|
||||
output_dir=dirs['abs_work_dir'],
|
||||
cache=c.get('tooltool_cache')
|
||||
)
|
||||
except KeyError:
|
||||
self.error('missing a required key')
|
||||
|
||||
abs_nodejs_path = os.path.join(dirs['abs_work_dir'], nodejs_path)
|
||||
|
||||
if os.path.exists(abs_nodejs_path):
|
||||
if self.platform_name() not in ('win32', 'win64'):
|
||||
self.chmod(abs_nodejs_path, 0755)
|
||||
self.nodejs_path = abs_nodejs_path
|
||||
else:
|
||||
msg = """nodejs path was given but couldn't be found. Tried looking in '%s'""" % \
|
||||
abs_nodejs_path
|
||||
self.warning(msg)
|
||||
self.record_status(TBPL_WARNING, WARNING)
|
||||
|
||||
return self.nodejs_path
|
||||
|
||||
def query_minidump_stackwalk(self, manifest=None):
|
||||
if self.minidump_stackwalk_path:
|
||||
return self.minidump_stackwalk_path
|
||||
|
@ -862,8 +862,8 @@ class DesktopUnittest(TestingMixin, MercurialScript, MozbaseMixin,
|
||||
|
||||
if self.query_minidump_stackwalk():
|
||||
env['MINIDUMP_STACKWALK'] = self.minidump_stackwalk_path
|
||||
if self.query_nodejs():
|
||||
env['MOZ_NODE_PATH'] = self.nodejs_path
|
||||
if self.config['nodejs_path']:
|
||||
env['MOZ_NODE_PATH'] = self.config['nodejs_path']
|
||||
env['MOZ_UPLOAD_DIR'] = self.query_abs_dirs()['abs_blob_upload_dir']
|
||||
env['MINIDUMP_SAVE_PATH'] = self.query_abs_dirs()['abs_blob_upload_dir']
|
||||
env['RUST_BACKTRACE'] = 'full'
|
||||
|
@ -23,7 +23,7 @@ user_pref("places.history.enabled", false);
|
||||
// Suppress automatic safe mode after crashes
|
||||
user_pref("toolkit.startup.max_resumed_crashes", -1);
|
||||
// Disable antialiasing for the Ahem font.
|
||||
user_pref("gfx.font_ahem_antialias_none", true);
|
||||
user_pref("gfx.font_rendering.ahem_antialias_none", true);
|
||||
// Disable antiphishing popup
|
||||
user_pref("network.http.phishy-userpass-length", 255);
|
||||
// Disable safebrowsing components
|
||||
@ -34,3 +34,13 @@ user_pref("browser.safebrowsing.malware.enabled", false);
|
||||
user_pref("browser.safebrowsing.phishing.enabled", false);
|
||||
// Automatically unload beforeunload alerts
|
||||
user_pref("dom.disable_beforeunload", true);
|
||||
// Enable implicit keyframes since the common animation interpolation test
|
||||
// function assumes this is available.
|
||||
user_pref("dom.animations-api.implicit-keyframes.enabled", true);
|
||||
// sometime wpt runs test even before the document becomes visible, which would
|
||||
// delay video.play() and cause play() running in wrong order.
|
||||
user_pref("media.block-autoplay-until-in-foreground", false);
|
||||
user_pref("media.block-autoplay-until-in-foreground", false);
|
||||
// Enable AppCache globally for now whilst it's being removed in Bug 1584984
|
||||
user_pref("browser.cache.offline.storage.enable", true);
|
||||
user_pref("browser.cache.offline.enable", true);
|
||||
|
@ -0,0 +1,3 @@
|
||||
[bidi-001.xht]
|
||||
fuzzy:
|
||||
if os == "mac": maxDifference=3;totalPixels=0-1
|
@ -0,0 +1,3 @@
|
||||
[bidi-002.xht]
|
||||
fuzzy:
|
||||
if os == "mac": maxDifference=1;totalPixels=0-1
|
@ -1,5 +1,4 @@
|
||||
[c43-rpl-ibx-000.xht]
|
||||
expected:
|
||||
if os == "mac": FAIL
|
||||
if (os == "android") and not e10s: FAIL
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
@ -1,3 +0,0 @@
|
||||
[clear-applies-to-008.xht]
|
||||
expected:
|
||||
if (os == "mac"): FAIL
|
@ -1,3 +0,0 @@
|
||||
[contain-paint-independent-formatting-context-002.html]
|
||||
expected:
|
||||
if (os == "mac"): FAIL
|
@ -1,4 +0,0 @@
|
||||
[display-contents-details.html]
|
||||
expected:
|
||||
if (os == "mac"): PASS
|
||||
FAIL
|
@ -1,3 +0,0 @@
|
||||
[display-contents-fieldset.html]
|
||||
expected:
|
||||
if os == "mac": FAIL
|
@ -1,5 +0,0 @@
|
||||
[multi-line-wrap-reverse-column-reverse.html]
|
||||
expected:
|
||||
if (os == "mac") and (version == "OS X 10.14.5") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
|
@ -1,4 +0,0 @@
|
||||
[multi-line-wrap-with-column-reverse.html]
|
||||
expected:
|
||||
if (os == "mac") and (version == "OS X 10.14.5") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
|
@ -1,4 +1,5 @@
|
||||
[text-emphasis-style-006.html]
|
||||
disabled:
|
||||
if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview)
|
||||
fuzzy:
|
||||
if os == "mac": maxDifference=0-96;totalPixels=0-12
|
||||
|
@ -1,3 +0,0 @@
|
||||
[word-break-break-all-004.html]
|
||||
expected:
|
||||
if (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
|
@ -2,9 +2,6 @@
|
||||
[HTTP cache reuses an unknown response with Last-Modified based upon heuristic freshness when Cache-Control: public is present.]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache reuses a 204 No Content response with Last-Modified based upon heuristic freshness.]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache reuses a 404 Not Found response with Last-Modified based upon heuristic freshness.]
|
||||
expected: FAIL
|
||||
|
||||
@ -20,9 +17,6 @@
|
||||
[HTTP cache reuses an unknown response with Last-Modified based upon heuristic freshness when Cache-Control: public is present]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache reuses a 204 No Content response with Last-Modified based upon heuristic freshness]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache reuses a 404 Not Found response with Last-Modified based upon heuristic freshness]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -1,7 +1,4 @@
|
||||
[status.html]
|
||||
[HTTP cache avoids going to the network if it has a fresh 204 response.]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache avoids going to the network if it has a fresh 299 response.]
|
||||
expected: FAIL
|
||||
|
||||
@ -29,9 +26,6 @@
|
||||
[HTTP cache avoids going to the network if it has a fresh 599 response.]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache avoids going to the network if it has a fresh 204 response]
|
||||
expected: FAIL
|
||||
|
||||
[HTTP cache avoids going to the network if it has a fresh 299 response]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -0,0 +1,5 @@
|
||||
[appcache.tentative.https.sub.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||
[Appcache!]
|
||||
expected: FAIL
|
||||
|
@ -0,0 +1,35 @@
|
||||
[redirect-http-upgrade.tentative.sub.html]
|
||||
expected: TIMEOUT
|
||||
[Http upgrade embed]
|
||||
expected: FAIL
|
||||
|
||||
[Http upgrade top level navigation]
|
||||
expected: FAIL
|
||||
|
||||
[Http upgrade iframe]
|
||||
expected: FAIL
|
||||
|
||||
[Http upgrade script => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Http upgrade image => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Http upgrade font => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Http upgrade object]
|
||||
expected: FAIL
|
||||
|
||||
[Http upgrade stylesheet]
|
||||
expected: TIMEOUT
|
||||
|
||||
[Http upgrade prefetch => No headers]
|
||||
expected: [FAIL, TIMEOUT]
|
||||
|
||||
[Http upgrade track]
|
||||
expected: NOTRUN
|
||||
|
||||
[Http upgrade fetch() api]
|
||||
expected: FAIL
|
||||
|
@ -0,0 +1,3 @@
|
||||
[redirect-https-downgrade.tentative.sub.html]
|
||||
[redirect-https-downgrade]
|
||||
expected: FAIL
|
@ -0,0 +1,3 @@
|
||||
[fetch.tentative.sub.html]
|
||||
[http->https fetch (cross-scheme => cross-site)]
|
||||
expected: FAIL
|
@ -0,0 +1,3 @@
|
||||
[iframe.tentative.sub.html]
|
||||
[Secure, cross-site (cross-scheme, same-host) iframe]
|
||||
expected: FAIL
|
@ -0,0 +1,2 @@
|
||||
lsan-allowed: [Alloc, Create, Malloc, Realloc, mozilla::BasePrincipal::CreateContentPrincipal, mozilla::SchedulerGroup::CreateEventTargetFor, mozilla::WeakPtr, mozilla::net::CookieSettings::Create, mozilla::net::nsStandardURL::TemplatedMutator, nsNodeSupportsWeakRefTearoff::GetWeakReference, nsPrefetchService::EnqueueURI]
|
||||
leak-threshold: [tab:51200]
|
@ -0,0 +1,46 @@
|
||||
[multiple-redirect-https-downgrade-upgrade.tentative.sub.html]
|
||||
expected: TIMEOUT
|
||||
[Https downgrade-upgrade stylesheet => No headers]
|
||||
expected: TIMEOUT
|
||||
|
||||
[Https downgrade-upgrade iframe => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade top level navigation => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade image => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Https downgrade-upgrade script => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade track => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Https downgrade-upgrade fetch() api => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade font => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Https downgrade-upgrade prefetch => No headers]
|
||||
disabled:
|
||||
if (os == "win") and debug and webrender: wpt-sync Bug 1565002
|
||||
if (os == "linux") and webrender and debug: wpt-sync Bug 1565002
|
||||
if (os == "linux") and webrender and not debug: wpt-sync Bug 1565002
|
||||
if (os == "linux") and not webrender and not debug and (processor == "x86_64"): wpt-sync Bug 1565002
|
||||
if (os == "linux") and not webrender and not debug and (processor == "x86"): wpt-sync Bug 1565002
|
||||
if (os == "linux") and not webrender and debug and sw-e10s: wpt-sync Bug 1565002
|
||||
if (os == "linux") and not webrender and debug and not sw-e10s: wpt-sync Bug 1565002
|
||||
wpt-sync Bug 1565002
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade embed => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[Https downgrade-upgrade object => No headers]
|
||||
expected: FAIL
|
||||
|
||||
[multiple-redirect-https-downgrade-upgrade]
|
||||
expected: FAIL
|
@ -1,19 +0,0 @@
|
||||
[redirect-https-downgrade.tentative.sub.html]
|
||||
expected: TIMEOUT
|
||||
[Https downgrade track => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Https downgrade font => No headers]
|
||||
expected: NOTRUN
|
||||
|
||||
[Https downgrade prefetch => No headers]
|
||||
expected:
|
||||
if (os == "linux"): ["FAIL", "TIMEOUT"]
|
||||
if os == "android": PASS
|
||||
FAIL
|
||||
|
||||
[Https downgrade stylesheet => No headers]
|
||||
expected: TIMEOUT
|
||||
|
||||
[Https downgrade image => No headers]
|
||||
expected: NOTRUN
|
@ -0,0 +1,2 @@
|
||||
[appcache-iframe.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -1,4 +1,5 @@
|
||||
[appcache-worker.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true]
|
||||
disabled:
|
||||
if verify: fails in verify mode
|
||||
expected: TIMEOUT
|
||||
|
@ -0,0 +1,2 @@
|
||||
[api_status_checking-manual.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_status_downloading-manual.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_status_idle.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_status_obsolete-manual.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_status_uncached.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_status_updateready-manual.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_swapcache-manual.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_swapcache_error.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[api_update.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -1,4 +1,5 @@
|
||||
[api_update_error.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||
[INVALID_STATE_ERR error test]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
[secure_context.html]
|
||||
prefs: [browser.cache.offline.insecure.enable:false]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||
|
@ -0,0 +1,2 @@
|
||||
[manifest_url_check.https.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,4 @@
|
||||
[no-appcache-in-shared-workers-historical.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||
disabled:
|
||||
if (os == "win"): Bug 1581711
|
@ -480,9 +480,6 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[External interface: operation IsSearchProviderInstalled()]
|
||||
expected: FAIL
|
||||
|
||||
[SVGElement interface: attribute nonce]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute fontBoundingBoxAscent]
|
||||
expected: FAIL
|
||||
|
||||
@ -723,6 +720,9 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
|
||||
expected: FAIL
|
||||
|
||||
[Navigator interface: operation registerProtocolHandler(DOMString, USVString)]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[idlharness.https.html?include=(Document|Window)]
|
||||
[Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type]
|
||||
@ -921,9 +921,6 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLLinkElement interface: attribute imageSizes]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
@ -939,9 +936,6 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[HTMLDialogElement interface: attribute open]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
@ -999,18 +993,12 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[HTMLDialogElement interface: attribute returnValue]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: attribute nonce]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
@ -1020,15 +1008,9 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
||||
[HTMLElement interface: attribute autocapitalize]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLLinkElement interface: attribute imageSrcset]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -1,13 +0,0 @@
|
||||
[autoplay-with-broken-track.html]
|
||||
expected: TIMEOUT
|
||||
disabled:
|
||||
if debug and (os == "linux") and (processor == "x86"): https://bugzilla.mozilla.org/show_bug.cgi?id=1482405
|
||||
[<video autoplay> with <track src="invalid://url" default=""> child]
|
||||
expected:
|
||||
if (os == "android") and not e10s: PASS
|
||||
if (os == "android") and e10s: PASS
|
||||
TIMEOUT
|
||||
|
||||
[<video autoplay> with <track src="" default=""> child]
|
||||
expected: TIMEOUT
|
||||
|
@ -1,10 +0,0 @@
|
||||
[src-clear-cues.html]
|
||||
[track element changing "track URL" and clearing cues, set mode, add cue, set src]
|
||||
expected: FAIL
|
||||
|
||||
[track element changing "track URL" and clearing cues, set mode, set src, add cue, change src]
|
||||
expected: FAIL
|
||||
|
||||
[track element changing "track URL" and clearing cues, set mode, add cue, change mode to disabled, set src]
|
||||
expected: FAIL
|
||||
|
@ -1,5 +0,0 @@
|
||||
[src-empty-string.html]
|
||||
expected: TIMEOUT
|
||||
[Setting HTMLTrackElement.src to the empty string fires 'error' and sets readyState to ERROR]
|
||||
expected: TIMEOUT
|
||||
|
@ -1,4 +0,0 @@
|
||||
[track-default-attribute.html]
|
||||
[A track with the "default" attribute loads automatically]
|
||||
expected: FAIL
|
||||
|
@ -1,4 +0,0 @@
|
||||
[track-element-src-change-error.html]
|
||||
[HTMLTrackElement 'src' attribute mutations]
|
||||
expected: FAIL
|
||||
|
@ -1,4 +0,0 @@
|
||||
[track-element-src-change.html]
|
||||
[HTMLTrackElement 'src' attribute mutations]
|
||||
expected: FAIL
|
||||
|
@ -1,4 +0,0 @@
|
||||
[track-mode-not-changed-by-new-track.html]
|
||||
[A track appended after the initial track configuration does not change other tracks]
|
||||
expected: FAIL
|
||||
|
@ -1,4 +0,0 @@
|
||||
[track-mode-triggers-loading.html]
|
||||
[A "metadata" track does not load automatically, but it does load when the mode is changed]
|
||||
expected: FAIL
|
||||
|
@ -23,9 +23,6 @@
|
||||
[onsecuritypolicyviolation: the content attribute must execute when an event is dispatched]
|
||||
expected: FAIL
|
||||
|
||||
[GlobalEventHandlers]
|
||||
expected: FAIL
|
||||
|
||||
[onslotchange: must be on the appropriate locations for GlobalEventHandlers]
|
||||
expected: FAIL
|
||||
|
||||
@ -37,3 +34,4 @@
|
||||
|
||||
[onslotchange: the content attribute must execute when an event is dispatched]
|
||||
expected: FAIL
|
||||
|
||||
|
1
testing/web-platform/meta/loading/lazyload/__dir__.ini
Normal file
1
testing/web-platform/meta/loading/lazyload/__dir__.ini
Normal file
@ -0,0 +1 @@
|
||||
prefs: [dom.image-lazy-loading.enabled:true]
|
@ -1,2 +0,0 @@
|
||||
[link-header-preload-delay-onload.html]
|
||||
disabled: Regressed by bug 1618322, will be fixed by bug 1618548
|
@ -1,4 +0,0 @@
|
||||
[link-header-preload-imagesrcset.html]
|
||||
[Makes sure that Link headers preload images with imagesrcset/imagesizes attributes.]
|
||||
expected: FAIL
|
||||
|
@ -1,5 +0,0 @@
|
||||
[link-header-preload.html]
|
||||
disabled:
|
||||
if verify: fails in verify mode
|
||||
[Makes sure that Link headers preload resources]
|
||||
expected: FAIL
|
@ -1,6 +0,0 @@
|
||||
[preload-xhr.html]
|
||||
[Make an XHR request after loading link rel=preload.]
|
||||
expected: FAIL
|
||||
|
||||
[Make an XHR request immediately after creating link rel=preload.]
|
||||
disabled: Bug 1529173
|
@ -14,149 +14,6 @@
|
||||
[PushManager interface: attribute supportedContentEncodings]
|
||||
expected: FAIL
|
||||
|
||||
[PushManager must be primary interface of registration.pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute options]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "supportedContentEncodings" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute endpoint]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation permissionState(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation getSubscription()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[Stringification of registration.pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "getSubscription()" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: calling permissionState(PushSubscriptionOptionsInit) on registration.pushManager with too few arguments must throw TypeError]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: registration must inherit property "pushManager" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation subscribe(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation toJSON()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation unsubscribe()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: attribute applicationServerKey]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: calling subscribe(PushSubscriptionOptionsInit) on registration.pushManager with too few arguments must throw TypeError]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "subscribe(PushSubscriptionOptionsInit)" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "permissionState(PushSubscriptionOptionsInit)" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: attribute pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[idl_test setup]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[idlharness.https.any.worker.html]
|
||||
[PushManager interface object length]
|
||||
@ -174,115 +31,10 @@
|
||||
[PushManager interface: attribute supportedContentEncodings]
|
||||
expected: FAIL
|
||||
|
||||
[PushSubscription interface: attribute options]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation permissionState(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation getSubscription()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation subscribe(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation toJSON()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation unsubscribe()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: attribute applicationServerKey]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute endpoint]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: attribute pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[idl_test setup]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[idlharness.https.any.serviceworker.html]
|
||||
expected:
|
||||
if debug and (os == "win") and not webrender and (processor == "x86_64"): ["OK", "CRASH"]
|
||||
[PushSubscriptionChangeEvent must be primary interface of new PushSubscriptionChangeEvent("pushsubscriptionchange")]
|
||||
expected: FAIL
|
||||
|
||||
@ -334,229 +86,6 @@
|
||||
[PushSubscriptionChangeEvent interface object name]
|
||||
expected: FAIL
|
||||
|
||||
[PushManager must be primary interface of registration.pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute options]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "supportedContentEncodings" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: operation text()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute endpoint]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation permissionState(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation getSubscription()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[Stringification of registration.pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "getSubscription()" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: calling permissionState(PushSubscriptionOptionsInit) on registration.pushManager with too few arguments must throw TypeError]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: new PushEvent("type") must inherit property "data" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: registration must inherit property "pushManager" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation subscribe(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent must be primary interface of new PushEvent("type")]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: attribute data]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: operation arrayBuffer()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation toJSON()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: operation json()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation unsubscribe()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: attribute applicationServerKey]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: calling subscribe(PushSubscriptionOptionsInit) on registration.pushManager with too few arguments must throw TypeError]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "subscribe(PushSubscriptionOptionsInit)" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: registration.pushManager must inherit property "permissionState(PushSubscriptionOptionsInit)" with the proper type]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[Stringification of new PushEvent("type")]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushMessageData interface: operation blob()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushEvent interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: attribute pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[idl_test setup]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[idlharness.https.any.sharedworker.html]
|
||||
[PushManager interface object length]
|
||||
@ -573,110 +102,3 @@
|
||||
|
||||
[PushManager interface: attribute supportedContentEncodings]
|
||||
expected: FAIL
|
||||
|
||||
[PushSubscription interface: attribute options]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation permissionState(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation getSubscription()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: operation subscribe(PushSubscriptionOptionsInit)]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation toJSON()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: operation unsubscribe()]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: attribute applicationServerKey]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: attribute endpoint]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object length]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushManager interface: existence and properties of interface prototype object]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[PushSubscriptionOptions interface object name]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[ServiceWorkerRegistration interface: attribute pushManager]
|
||||
expected:
|
||||
if (os == "android") and e10s: FAIL
|
||||
|
||||
[idl_test setup]
|
||||
expected: FAIL
|
||||
|
@ -1,4 +1,5 @@
|
||||
[appcache-ordering-main.https.html]
|
||||
prefs: [browser.cache.offline.enable:true,browser.cache.offline.storage.enable:true]
|
||||
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1305877
|
||||
expected:
|
||||
if (e10s and (os == "win")) or ((os == "linux") and (bits == 64)): TIMEOUT
|
||||
|
@ -1,4 +1,5 @@
|
||||
[claim-fetch-with-appcache.https.html]
|
||||
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1237782
|
||||
[fetch() should be intercepted after the client is claimed.]
|
||||
expected:
|
||||
if (os == "linux") and debug and not webrender and e10s and not sw-e10s: FAIL
|
||||
|
@ -1,13 +0,0 @@
|
||||
[claim-fetch.https.html]
|
||||
[fetch() should be intercepted after the client is claimed.]
|
||||
expected:
|
||||
if (os == "linux") and debug and e10s and not sw-e10s and (processor == "x86"): FAIL
|
||||
if (os == "linux") and debug and not webrender and e10s and sw-e10s: FAIL
|
||||
if (os == "linux") and debug and webrender: FAIL
|
||||
if (os == "linux") and not debug: FAIL
|
||||
if os == "win": FAIL
|
||||
if os == "mac": FAIL
|
||||
if (os == "android") and not e10s: FAIL
|
||||
if (os == "linux") and debug and not webrender and e10s: FAIL
|
||||
FAIL
|
||||
|
@ -0,0 +1,2 @@
|
||||
[clients-get.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
||||
[clients-get.https.html]
|
||||
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1305877
|
@ -1,4 +1,5 @@
|
||||
[sxg-inner-resp-over-appcache.tentative.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true]
|
||||
[SignedHTTPExchange inner resp should take precedence to appcache.]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
[sxg-served-from-appcache.tentative.https.html]
|
||||
prefs: [browser.cache.offline.storage.enable:true]
|
||||
[SignedHTTPExchange cached in appcache should work.]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -0,0 +1,138 @@
|
||||
[presentation-attributes-irrelevant.html]
|
||||
[clip-path presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[clip-rule presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[color-interpolation-filters presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[direction presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[display presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[dominant-baseline presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[filter presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[flood-color presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[flood-opacity presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-family presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-size presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-size-adjust presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-stretch presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-style presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-variant presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[height presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[lighting-color presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-end presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-mid presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-start presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[mask-type presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[mask presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[opacity presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[overflow presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[pointer-events presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[r presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[rx presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[ry presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[stop-color presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[stop-opacity presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[text-anchor presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[text-decoration presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[text-overflow presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[transform-origin presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[transform presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[unicode-bidi presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[vector-effect presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[visibility presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[white-space presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[width presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[writing-mode presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[x presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
||||
|
||||
[y presentation attribute supported on an irrelevant element]
|
||||
expected: FAIL
|
@ -0,0 +1,13 @@
|
||||
[presentation-attributes-relevant.html]
|
||||
[color-interpolation presentation attribute supported on a relevant element]
|
||||
expected: FAIL
|
||||
|
||||
[text-overflow presentation attribute supported on a relevant element]
|
||||
expected: FAIL
|
||||
|
||||
[transform presentation attribute supported on a relevant element]
|
||||
expected: FAIL
|
||||
|
||||
[white-space presentation attribute supported on a relevant element]
|
||||
expected: FAIL
|
||||
|
@ -0,0 +1,21 @@
|
||||
[presentation-attributes-special-cases.html]
|
||||
[x, y, width, and height presentation attributes supported on svg element]
|
||||
expected: FAIL
|
||||
|
||||
[x, y, width, and height presentation attributes supported on symbol element]
|
||||
expected: FAIL
|
||||
|
||||
[x, y, width, and height presentation attributes supported on use element]
|
||||
expected: FAIL
|
||||
|
||||
[transform presentation attribute supported on g]
|
||||
expected: FAIL
|
||||
|
||||
[patternTransform presentation attribute supported on pattern]
|
||||
expected: FAIL
|
||||
|
||||
[patternTransform presentation attribute supported on linearGradient]
|
||||
expected: FAIL
|
||||
|
||||
[patternTransform presentation attribute supported on radialGradient]
|
||||
expected: FAIL
|
@ -0,0 +1,192 @@
|
||||
[presentation-attributes-unknown.html]
|
||||
[clip-path presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[clip-rule presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[color presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[color-interpolation-filters presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[color-interpolation presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[cursor presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[direction presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[display presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[dominant-baseline presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[fill presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[fill-opacity presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[fill-rule presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[filter presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[flood-color presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[flood-opacity presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-family presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-size presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-size-adjust presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-stretch presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-style presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-variant presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[height presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[image-rendering presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[lighting-color presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-end presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-mid presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[marker-start presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[mask-type presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[mask presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[opacity presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[overflow presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[paint-order presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[pointer-events presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[r presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[rx presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[ry presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[shape-rendering presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stop-color presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stop-opacity presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-dasharray presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-dashoffset presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-linecap presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-linejoin presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-miterlimit presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-opacity presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[stroke-width presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[text-anchor presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[text-decoration presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[text-overflow presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[text-rendering presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[transform-origin presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[transform presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[unicode-bidi presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[vector-effect presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[visibility presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[white-space presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[width presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[writing-mode presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[x presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
||||
|
||||
[y presentation attribute supported on an unknown SVG element]
|
||||
expected: FAIL
|
@ -1,7 +1,7 @@
|
||||
[idlharness.https.window.html]
|
||||
expected:
|
||||
if not debug and (os == "linux"): TIMEOUT
|
||||
if not debug and (os == "win"): TIMEOUT
|
||||
if not debug and not webrender and (os == "win") and (processor == "x86"): ["OK", "TIMEOUT"]
|
||||
if not debug and not webrender and (os == "linux"): ["OK", "TIMEOUT"]
|
||||
[MediaStreamTrack interface: track must inherit property "isolated" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
@ -61,5 +61,6 @@
|
||||
|
||||
[idl_test setup]
|
||||
expected:
|
||||
if not debug and (os == "linux"): TIMEOUT
|
||||
if not debug and (os == "win"): TIMEOUT
|
||||
if not debug and not webrender and (os == "win") and (processor == "x86"): ["PASS", "TIMEOUT"]
|
||||
if not debug and not webrender and (os == "linux"): ["PASS", "TIMEOUT"]
|
||||
|
||||
|
@ -1,49 +1,45 @@
|
||||
[RTCPeerConnection-createDataChannel.html]
|
||||
[createDataChannel attribute default values]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with provided parameters should initialize attributes to provided values]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531900
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with negotiated true should succeed]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1529695
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with priority "high" should succeed]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with invalid priority should throw TypeError]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||
expected: FAIL
|
||||
|
||||
[Channels created after SCTP transport is established should have id assigned]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1526253
|
||||
|
||||
[Reusing a data channel id that is in use (after setRemoteDescription, negotiated via DCEP) should throw OperationError]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
||||
expected: FAIL
|
||||
|
||||
[Reusing a data channel id that is in use (after setRemoteDescription) should throw OperationError]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
||||
expected: FAIL
|
||||
|
||||
[Reusing a data channel id that is in use should throw OperationError]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with negotiated true and id null should throw TypeError]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
||||
expected: FAIL
|
||||
|
||||
[createDataChannel with both maxPacketLifeTime and maxRetransmits null should succeed]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
||||
|
||||
[Channels created (after setRemoteDescription) should have id assigned]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=797135
|
||||
|
||||
|
@ -4,10 +4,10 @@
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||
|
||||
[In-band negotiated channel created on remote peer should match the same (default) configuration as local peer]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1529695
|
||||
expected: FAIL
|
||||
|
||||
[In-band negotiated channel created on remote peer should match the same configuration as local peer]
|
||||
expected: FAIL
|
||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1551589
|
||||
expected: FAIL
|
||||
|
||||
|
@ -2,3 +2,12 @@ This directory contains the common infrastructure for the following tests.
|
||||
- referrer-policy/
|
||||
- mixed-content/
|
||||
- upgrade-insecure-requests/
|
||||
|
||||
Subdirectories:
|
||||
- `subresource`:
|
||||
Serves subresources, with support for redirects, stash, etc.
|
||||
The subresource paths are managed by `subresourceMap` and
|
||||
fetched in `requestVia*()` functions in `resources/common.js`.
|
||||
- `scope`:
|
||||
Serves nested contexts, such as iframe documents or workers.
|
||||
Used from `invokeFrom*()` functions in `resources/common.js`.
|
||||
|
@ -5,6 +5,133 @@
|
||||
* method's JSDoc.
|
||||
*/
|
||||
|
||||
// ===============================================================
|
||||
// Types
|
||||
// ===============================================================
|
||||
// Objects of the following types are used to represent what kind of
|
||||
// subresource requests should be sent with what kind of policies,
|
||||
// from what kind of possibly nested source contexts.
|
||||
// The objects are represented as JSON objects (not JavaScript/Python classes
|
||||
// in a strict sense) to be passed between JavaScript/Python code.
|
||||
|
||||
// Note: So far this document covers:
|
||||
// - resources/common.js : client-side test infra code
|
||||
// - scope/ - server-side scripts that serves nested source contexts
|
||||
// but doesn't cover:
|
||||
// - tools/ - generator scripts that generates top-level HTML documents.
|
||||
// There are some policies only handled by generators (e.g. mixed-content
|
||||
// opt-ins) and not yet covered by the docs here.
|
||||
|
||||
/**
|
||||
@typedef PolicyDelivery
|
||||
@type {object}
|
||||
Referrer policy etc. can be applied/delivered in several ways.
|
||||
A PolicyDelivery object specifies what policy is delivered and how.
|
||||
|
||||
@property {string} deliveryType
|
||||
Specifies how the policy is delivered.
|
||||
The valid deliveryType are:
|
||||
|
||||
"attr"
|
||||
[A] DOM attributes e.g. referrerPolicy.
|
||||
|
||||
"rel-noref"
|
||||
[A] <link rel="noreferrer"> (referrer-policy only).
|
||||
|
||||
"http-rp"
|
||||
[B] HTTP response headers.
|
||||
|
||||
"meta"
|
||||
[B] <meta> elements.
|
||||
|
||||
@property {string} key
|
||||
@property {string} value
|
||||
Specifies what policy to be delivered. The valid keys are:
|
||||
|
||||
"referrerPolicy"
|
||||
Referrer Policy
|
||||
https://w3c.github.io/webappsec-referrer-policy/
|
||||
Valid values are those listed in
|
||||
https://w3c.github.io/webappsec-referrer-policy/#referrer-policy
|
||||
(except that "" is represented as null/None)
|
||||
|
||||
A PolicyDelivery can be specified in several ways:
|
||||
|
||||
- (for [A]) Associated with an individual subresource request and
|
||||
specified in `Subresource.policies`,
|
||||
e.g. referrerPolicy attributes of DOM elements.
|
||||
This is handled in invokeRequest().
|
||||
|
||||
- (for [B]) Associated with an nested environmental settings object and
|
||||
specified in `SourceContext.policies`,
|
||||
e.g. HTTP referrer-policy response headers of HTML/worker scripts.
|
||||
This is handled in server-side under /common/security-features/scope/.
|
||||
|
||||
- (for [B]) Associated with the top-level HTML document.
|
||||
This is handled by the generators.d
|
||||
*/
|
||||
|
||||
/**
|
||||
@typedef Subresource
|
||||
@type {object}
|
||||
A Subresource represents how a subresource request is sent.
|
||||
|
||||
@property{SubresourceType} subresourceType
|
||||
How the subresource request is sent,
|
||||
e.g. "img-tag" for sending a request via <img src>.
|
||||
See the keys of `subresourceMap` for valid values.
|
||||
|
||||
@property{string} url
|
||||
subresource's URL.
|
||||
Typically this is constructed by getRequestURLs() below.
|
||||
|
||||
@property{PolicyDelivery} policyDeliveries
|
||||
Policies delivered specific to the subresource request.
|
||||
*/
|
||||
|
||||
/**
|
||||
@typedef SourceContext
|
||||
@type {object}
|
||||
Requests can be possibly sent from various kinds of source contexts, i.e.
|
||||
fetch client's environment settings objects:
|
||||
top-level windows, iframes, or workers.
|
||||
A SourceContext object specifies one environment settings object, and
|
||||
an Array<SourceContext> specifies a possibly nested context,
|
||||
from the outer-most to inner-most environment settings objects.
|
||||
|
||||
For example:
|
||||
[{sourceContextType: "srcdoc"}, {sourceContextType: "classic-worker"}]
|
||||
means that a subresource request is to be sent from
|
||||
a classic dedicated worker created from <iframe srcdoc>
|
||||
inside the top-level HTML document.
|
||||
Note: the top-level document is not included in the array and
|
||||
is assumed implicitly.
|
||||
|
||||
SourceContext (or Array<SourceContext>) is set based on
|
||||
the fetch client's settings object that is used for the subresource request,
|
||||
NOT on module map settings object, and
|
||||
NOT on the inner-most settings object that appears in the test.
|
||||
For example, Array<SourceContext> is `[]` (indicating the top Window)
|
||||
for `worker.js`
|
||||
- When it is the root worker script: `new Worker('worker.js')`, or
|
||||
- When it is imported from the root worker script:
|
||||
`new Worker('top.js', {type: 'module'})`
|
||||
where `top.js` has `import 'worker.js'`.
|
||||
because the request for `worker.js` uses the Window as its fetch client's
|
||||
settings object, while a WorkerGlobalScope is created though.
|
||||
|
||||
@property {string} sourceContextType
|
||||
Kind of the source context to be used.
|
||||
Valid values are the keys of `sourceContextMap` below.
|
||||
|
||||
@property {Array<PolicyDelivery>} policyDeliveries
|
||||
A list of PolicyDelivery applied to the source context.
|
||||
*/
|
||||
|
||||
// ===============================================================
|
||||
// General utility functions
|
||||
// ===============================================================
|
||||
|
||||
function timeoutPromise(t, ms) {
|
||||
return new Promise(resolve => { t.step_timeout(resolve, ms); });
|
||||
}
|
||||
@ -70,8 +197,16 @@ function xhrRequest(url, responseType) {
|
||||
*/
|
||||
function setAttributes(el, attrs) {
|
||||
attrs = attrs || {}
|
||||
for (var attr in attrs)
|
||||
el.setAttribute(attr, attrs[attr]);
|
||||
for (var attr in attrs) {
|
||||
if (attr !== 'src')
|
||||
el.setAttribute(attr, attrs[attr]);
|
||||
}
|
||||
// Workaround for Chromium: set <img>'s src attribute after all other
|
||||
// attributes to ensure the policy is applied.
|
||||
for (var attr in attrs) {
|
||||
if (attr === 'src')
|
||||
el.setAttribute(attr, attrs[attr]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -192,17 +327,89 @@ function createHelperIframe(name, doBindEvents) {
|
||||
doBindEvents);
|
||||
}
|
||||
|
||||
function wrapResult(server_data) {
|
||||
if (typeof(server_data) === "string") {
|
||||
throw server_data;
|
||||
}
|
||||
return {
|
||||
referrer: server_data.headers.referer,
|
||||
headers: server_data.headers
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================================================
|
||||
// Subresources
|
||||
// ===============================================================
|
||||
|
||||
/**
|
||||
* requestVia*() functions return promises that are resolved on successful
|
||||
* requests with objects of the same "type", i.e. objects that contains
|
||||
* the same sets of keys that are fixed within one category of tests (e.g.
|
||||
* within wpt/referrer-policy tests).
|
||||
* wrapResult() (that should be defined outside this file) is used to convert
|
||||
* the response bodies of subresources into the expected result objects in some
|
||||
* cases, and in other cases the result objects are constructed more directly.
|
||||
* TODO(https://crbug.com/906850): Clean up the semantics around this, e.g.
|
||||
* use (or not use) wrapResult() consistently, unify the arguments, etc.
|
||||
*/
|
||||
@typedef RequestResult
|
||||
@type {object}
|
||||
Represents the result of sending an request.
|
||||
All properties are optional. See the comments for
|
||||
requestVia*() and invokeRequest() below to see which properties are set.
|
||||
|
||||
@property {Array<Object<string, string>>} headers
|
||||
HTTP request headers sent to server.
|
||||
@property {string} referrer - Referrer.
|
||||
@property {string} location - The URL of the subresource.
|
||||
@property {string} sourceContextUrl
|
||||
the URL of the global object where the actual request is sent.
|
||||
*/
|
||||
|
||||
/**
|
||||
requestVia*(url, additionalAttributes) functions send a subresource
|
||||
request from the current environment settings object.
|
||||
|
||||
@param {string} url
|
||||
The URL of the subresource.
|
||||
@param {Object<string, string>} additionalAttributes
|
||||
Additional attributes set to DOM elements
|
||||
(element-initiated requests only).
|
||||
|
||||
@returns {Promise} that are resolved with a RequestResult object
|
||||
on successful requests.
|
||||
|
||||
- Category 1:
|
||||
`headers`: set.
|
||||
`referrer`: set via `document.referrer`.
|
||||
`location`: set via `document.location`.
|
||||
See `template/document.html.template`.
|
||||
- Category 2:
|
||||
`headers`: set.
|
||||
`referrer`: set to `headers.referer` by `wrapResult()`.
|
||||
`location`: not set.
|
||||
- Category 3:
|
||||
All the keys listed above are NOT set.
|
||||
`sourceContextUrl` is not set here.
|
||||
|
||||
-------------------------------- -------- --------------------------
|
||||
Function name Category Used in
|
||||
-------- ------- ---------
|
||||
referrer mixed- upgrade-
|
||||
policy content insecure-
|
||||
policy content request
|
||||
-------------------------------- -------- -------- ------- ---------
|
||||
requestViaAnchor 1 Y Y -
|
||||
requestViaArea 1 Y Y -
|
||||
requestViaAudio 3 - Y -
|
||||
requestViaDedicatedWorker 2 Y Y Y
|
||||
requestViaFetch 2 Y Y -
|
||||
requestViaForm 3 - Y -
|
||||
requestViaIframe 1 Y Y -
|
||||
requestViaImage 2 Y Y -
|
||||
requestViaLinkPrefetch 3 - Y -
|
||||
requestViaLinkStylesheet 3 - Y -
|
||||
requestViaObject 3 - Y -
|
||||
requestViaPicture 3 - Y -
|
||||
requestViaScript 2 Y Y -
|
||||
requestViaSendBeacon 3 - Y -
|
||||
requestViaSharedWorker 2 Y - -
|
||||
requestViaVideo 3 - Y -
|
||||
requestViaWebSocket 3 - Y -
|
||||
requestViaWorklet 3 - Y Y
|
||||
requestViaXhr 2 Y Y -
|
||||
-------------------------------- -------- -------- ------- ---------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates a new iframe, binds load and error events, sets the src attribute and
|
||||
@ -218,7 +425,8 @@ function requestViaIframe(url, additionalAttributes) {
|
||||
false);
|
||||
return bindEvents2(window, "message", iframe, "error", window, "error")
|
||||
.then(event => {
|
||||
assert_equals(event.source, iframe.contentWindow);
|
||||
if (event.source !== iframe.contentWindow)
|
||||
return Promise.reject(new Error('Unexpected event.source'));
|
||||
return event.data;
|
||||
});
|
||||
}
|
||||
@ -229,119 +437,64 @@ function requestViaIframe(url, additionalAttributes) {
|
||||
* @param {string} url The src for the image.
|
||||
* @return {Promise} The promise for success/error events.
|
||||
*/
|
||||
function requestViaImage(url) {
|
||||
return createRequestViaElement("img", {"src": url}, document.body);
|
||||
function requestViaImage(url, additionalAttributes) {
|
||||
const img = createElement(
|
||||
"img",
|
||||
// crossOrigin attribute is added to read the pixel data of the response.
|
||||
Object.assign({"src": url, "crossOrigin": "Anonymous"}, additionalAttributes),
|
||||
document.body, true);
|
||||
return img.eventPromise.then(() => wrapResult(decodeImageData(img)));
|
||||
}
|
||||
|
||||
// Helpers for requestViaImageForReferrerPolicy().
|
||||
function loadImageInWindow(src, attributes, w) {
|
||||
return new Promise((resolve, reject) => {
|
||||
var image = new w.Image();
|
||||
image.crossOrigin = "Anonymous";
|
||||
image.onload = function() {
|
||||
resolve(image);
|
||||
};
|
||||
// Helper for requestViaImage().
|
||||
function decodeImageData(img) {
|
||||
var canvas = document.createElement("canvas");
|
||||
var context = canvas.getContext('2d');
|
||||
context.drawImage(img, 0, 0);
|
||||
var imgData = context.getImageData(0, 0, img.clientWidth, img.clientHeight);
|
||||
const rgba = imgData.data;
|
||||
|
||||
// Extend element with attributes. (E.g. "referrerPolicy" or "rel")
|
||||
if (attributes) {
|
||||
for (var attr in attributes) {
|
||||
image[attr] = attributes[attr];
|
||||
}
|
||||
let decodedBytes = new Uint8ClampedArray(rgba.length);
|
||||
let decodedLength = 0;
|
||||
|
||||
for (var i = 0; i + 12 <= rgba.length; i += 12) {
|
||||
// A single byte is encoded in three pixels. 8 pixel octets (among
|
||||
// 9 octets = 3 pixels * 3 channels) are used to encode 8 bits,
|
||||
// the most significant bit first, where `0` and `255` in pixel values
|
||||
// represent `0` and `1` in bits, respectively.
|
||||
// This encoding is used to avoid errors due to different color spaces.
|
||||
const bits = [];
|
||||
for (let j = 0; j < 3; ++j) {
|
||||
bits.push(rgba[i + j * 4 + 0]);
|
||||
bits.push(rgba[i + j * 4 + 1]);
|
||||
bits.push(rgba[i + j * 4 + 2]);
|
||||
// rgba[i + j * 4 + 3]: Skip alpha channel.
|
||||
}
|
||||
// The last one element is not used.
|
||||
bits.pop();
|
||||
|
||||
// Decode a single byte.
|
||||
let byte = 0;
|
||||
for (let j = 0; j < 8; ++j) {
|
||||
byte <<= 1;
|
||||
if (bits[j] >= 128)
|
||||
byte |= 1;
|
||||
}
|
||||
|
||||
image.src = src;
|
||||
w.document.body.appendChild(image)
|
||||
});
|
||||
}
|
||||
|
||||
function extractImageData(img) {
|
||||
var canvas = document.createElement("canvas");
|
||||
var context = canvas.getContext('2d');
|
||||
context.drawImage(img, 0, 0);
|
||||
var imgData = context.getImageData(0, 0, img.clientWidth, img.clientHeight);
|
||||
return imgData.data;
|
||||
}
|
||||
|
||||
function decodeImageData(rgba) {
|
||||
var rgb = new Uint8ClampedArray(rgba.length);
|
||||
|
||||
// RGBA -> RGB.
|
||||
var rgb_length = 0;
|
||||
for (var i = 0; i < rgba.length; ++i) {
|
||||
// Skip alpha component.
|
||||
if (i % 4 == 3)
|
||||
continue;
|
||||
|
||||
// Zero is the string terminator.
|
||||
if (rgba[i] == 0)
|
||||
if (byte == 0)
|
||||
break;
|
||||
|
||||
rgb[rgb_length++] = rgba[i];
|
||||
decodedBytes[decodedLength++] = byte;
|
||||
}
|
||||
|
||||
// Remove trailing nulls from data.
|
||||
rgb = rgb.subarray(0, rgb_length);
|
||||
var string_data = (new TextDecoder("ascii")).decode(rgb);
|
||||
decodedBytes = decodedBytes.subarray(0, decodedLength);
|
||||
var string_data = (new TextDecoder("ascii")).decode(decodedBytes);
|
||||
|
||||
return JSON.parse(string_data);
|
||||
}
|
||||
|
||||
// A variant of requestViaImage for referrer policy tests.
|
||||
// This tests many patterns of <iframe>s to test referrer policy inheritance.
|
||||
// TODO(https://crbug.com/906850): Merge this into requestViaImage().
|
||||
// <iframe>-related code should be moved outside requestViaImage*().
|
||||
function requestViaImageForReferrerPolicy(url, attributes, referrerPolicy) {
|
||||
// For images, we'll test:
|
||||
// - images in a `srcdoc` frame to ensure that it uses the referrer
|
||||
// policy of its parent,
|
||||
// - images in a top-level document,
|
||||
// - and images in a `srcdoc` frame with its own referrer policy to
|
||||
// override its parent.
|
||||
|
||||
var iframeWithoutOwnPolicy = document.createElement('iframe');
|
||||
var noSrcDocPolicy = new Promise((resolve, reject) => {
|
||||
iframeWithoutOwnPolicy.srcdoc = "Hello, world.";
|
||||
iframeWithoutOwnPolicy.onload = resolve;
|
||||
document.body.appendChild(iframeWithoutOwnPolicy);
|
||||
})
|
||||
.then(() => {
|
||||
var nextUrl = url + "&cache_destroyer2=" + (new Date()).getTime();
|
||||
return loadImageInWindow(nextUrl, attributes,
|
||||
iframeWithoutOwnPolicy.contentWindow);
|
||||
})
|
||||
.then(function (img) {
|
||||
return decodeImageData(extractImageData(img));
|
||||
});
|
||||
|
||||
// Give a srcdoc iframe a referrer policy different from the top-level page's policy.
|
||||
var iframePolicy = (referrerPolicy === "no-referrer") ? "unsafe-url" : "no-referrer";
|
||||
var iframeWithOwnPolicy = document.createElement('iframe');
|
||||
var srcDocPolicy = new Promise((resolve, reject) => {
|
||||
iframeWithOwnPolicy.srcdoc = "<meta name='referrer' content='" + iframePolicy + "'>Hello world.";
|
||||
iframeWithOwnPolicy.onload = resolve;
|
||||
document.body.appendChild(iframeWithOwnPolicy);
|
||||
})
|
||||
.then(() => {
|
||||
var nextUrl = url + "&cache_destroyer3=" + (new Date()).getTime();
|
||||
return loadImageInWindow(nextUrl, null,
|
||||
iframeWithOwnPolicy.contentWindow);
|
||||
})
|
||||
.then(function (img) {
|
||||
return decodeImageData(extractImageData(img));
|
||||
});
|
||||
|
||||
var pagePolicy = loadImageInWindow(url, attributes, window)
|
||||
.then(function (img) {
|
||||
return decodeImageData(extractImageData(img));
|
||||
});
|
||||
|
||||
return Promise.all([noSrcDocPolicy, srcDocPolicy, pagePolicy]).then(values => {
|
||||
assert_equals(values[0].headers.referer, values[2].headers.referer, "Referrer inside 'srcdoc' without its own policy should be the same as embedder's referrer.");
|
||||
assert_equals((iframePolicy === "no-referrer" ? undefined : document.location.href), values[1].headers.referer, "Referrer inside 'srcdoc' should use the iframe's policy if it has one");
|
||||
return wrapResult(values[2]);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiates a new XHR GET request to provided URL.
|
||||
* @param {string} url The endpoint URL for the XHR.
|
||||
@ -365,8 +518,9 @@ function requestViaFetch(url) {
|
||||
function dedicatedWorkerUrlThatFetches(url) {
|
||||
return `data:text/javascript,
|
||||
fetch('${url}')
|
||||
.then(() => postMessage(''),
|
||||
() => postMessage(''));`;
|
||||
.then(r => r.json())
|
||||
.then(j => postMessage(j))
|
||||
.catch((e) => postMessage(e.message));`;
|
||||
}
|
||||
|
||||
function workerUrlThatImports(url) {
|
||||
@ -417,8 +571,7 @@ function get_worklet(type) {
|
||||
if (type == 'audio')
|
||||
return new OfflineAudioContext(2,44100*40,44100).audioWorklet;
|
||||
|
||||
assert_unreached('unknown worklet type is passed.');
|
||||
return undefined;
|
||||
throw new Error('unknown worklet type is passed.');
|
||||
}
|
||||
|
||||
function requestViaWorklet(type, url) {
|
||||
@ -446,7 +599,8 @@ function requestViaNavigable(navigableElement, url) {
|
||||
const promise =
|
||||
bindEvents2(window, "message", iframe, "error", window, "error")
|
||||
.then(event => {
|
||||
assert_equals(event.source, iframe.contentWindow, "event.source");
|
||||
if (event.source !== iframe.contentWindow)
|
||||
return Promise.reject(new Error('Unexpected event.source'));
|
||||
return event.data;
|
||||
});
|
||||
navigableElement.click();
|
||||
@ -681,6 +835,348 @@ function requestViaWebSocket(url) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@typedef SubresourceType
|
||||
@type {string}
|
||||
|
||||
Represents how a subresource is sent.
|
||||
The keys of `subresourceMap` below are the valid values.
|
||||
*/
|
||||
|
||||
// Subresource paths and invokers.
|
||||
const subresourceMap = {
|
||||
"a-tag": {
|
||||
path: "/common/security-features/subresource/document.py",
|
||||
invoker: requestViaAnchor,
|
||||
},
|
||||
"area-tag": {
|
||||
path: "/common/security-features/subresource/document.py",
|
||||
invoker: requestViaArea,
|
||||
},
|
||||
"audio-tag": {
|
||||
path: "/common/security-features/subresource/audio.py",
|
||||
invoker: requestViaAudio,
|
||||
},
|
||||
"beacon-request": {
|
||||
path: "/common/security-features/subresource/empty.py",
|
||||
invoker: requestViaSendBeacon,
|
||||
},
|
||||
"fetch-request": {
|
||||
path: "/common/security-features/subresource/xhr.py",
|
||||
invoker: requestViaFetch,
|
||||
},
|
||||
"form-tag": {
|
||||
path: "/common/security-features/subresource/empty.py",
|
||||
invoker: requestViaForm,
|
||||
},
|
||||
"iframe-tag": {
|
||||
path: "/common/security-features/subresource/document.py",
|
||||
invoker: requestViaIframe,
|
||||
},
|
||||
"img-tag": {
|
||||
path: "/common/security-features/subresource/image.py",
|
||||
invoker: requestViaImage,
|
||||
},
|
||||
"link-css-tag": {
|
||||
path: "/common/security-features/subresource/empty.py",
|
||||
invoker: requestViaLinkStylesheet,
|
||||
},
|
||||
"link-prefetch-tag": {
|
||||
path: "/common/security-features/subresource/empty.py",
|
||||
invoker: requestViaLinkPrefetch,
|
||||
},
|
||||
"object-tag": {
|
||||
path: "/common/security-features/subresource/empty.py",
|
||||
invoker: requestViaObject,
|
||||
},
|
||||
"picture-tag": {
|
||||
path: "/common/security-features/subresource/image.py",
|
||||
invoker: requestViaPicture,
|
||||
},
|
||||
"script-tag": {
|
||||
path: "/common/security-features/subresource/script.py",
|
||||
invoker: requestViaScript,
|
||||
},
|
||||
"video-tag": {
|
||||
path: "/common/security-features/subresource/video.py",
|
||||
invoker: requestViaVideo,
|
||||
},
|
||||
"xhr-request": {
|
||||
path: "/common/security-features/subresource/xhr.py",
|
||||
invoker: requestViaXhr,
|
||||
},
|
||||
|
||||
"worker-request": {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url => requestViaDedicatedWorker(url),
|
||||
},
|
||||
// TODO: Merge "module-worker" and "module-worker-top-level".
|
||||
"module-worker": {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url => requestViaDedicatedWorker(url, {type: "module"}),
|
||||
},
|
||||
"module-worker-top-level": {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url => requestViaDedicatedWorker(url, {type: "module"}),
|
||||
},
|
||||
"module-data-worker-import": {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url =>
|
||||
requestViaDedicatedWorker(workerUrlThatImports(url), {type: "module"}),
|
||||
},
|
||||
"shared-worker": {
|
||||
path: "/common/security-features/subresource/shared-worker.py",
|
||||
invoker: requestViaSharedWorker,
|
||||
},
|
||||
|
||||
"websocket-request": {
|
||||
path: "/stash_responder",
|
||||
invoker: requestViaWebSocket,
|
||||
},
|
||||
};
|
||||
for (const workletType of ['animation', 'audio', 'layout', 'paint']) {
|
||||
subresourceMap[`worklet-${workletType}-top-level`] = {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url => requestViaWorklet(workletType, url)
|
||||
};
|
||||
subresourceMap[`worklet-${workletType}-data-import`] = {
|
||||
path: "/common/security-features/subresource/worker.py",
|
||||
invoker: url =>
|
||||
requestViaWorklet(workletType, workerUrlThatImports(url))
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@typedef RedirectionType
|
||||
@type {string}
|
||||
|
||||
Represents what redirects should occur to the subresource request
|
||||
after initial request.
|
||||
See preprocess_redirection() in
|
||||
/common/security-features/subresource/subresource.py for valid values.
|
||||
*/
|
||||
|
||||
/**
|
||||
Construct subresource (and related) URLs.
|
||||
|
||||
@param {SubresourceType} subresourceType
|
||||
@param {OriginType} originType
|
||||
@param {RedirectionType} redirectionType
|
||||
@returns {object} with following properties:
|
||||
{string} testUrl
|
||||
The subresource request URL.
|
||||
{string} announceUrl
|
||||
{string} assertUrl
|
||||
The URLs to be used for detecting whether `testUrl` is actually sent
|
||||
to the server.
|
||||
1. Fetch `announceUrl` first,
|
||||
2. then possibly fetch `testUrl`, and
|
||||
3. finally fetch `assertUrl`.
|
||||
The fetch result of `assertUrl` should indicate whether
|
||||
`testUrl` is actually sent to the server or not.
|
||||
*/
|
||||
function getRequestURLs(subresourceType, originType, redirectionType) {
|
||||
const key = guid();
|
||||
const value = guid();
|
||||
|
||||
// We use the same stash path for both HTTP/S and WS/S stash requests.
|
||||
const stashPath = encodeURIComponent("/mixed-content");
|
||||
|
||||
const stashEndpoint = "/common/security-features/subresource/xhr.py?key=" +
|
||||
key + "&path=" + stashPath;
|
||||
return {
|
||||
testUrl:
|
||||
getSubresourceOrigin(originType) +
|
||||
subresourceMap[subresourceType].path +
|
||||
"?redirection=" + encodeURIComponent(redirectionType) +
|
||||
"&action=purge&key=" + key +
|
||||
"&path=" + stashPath,
|
||||
announceUrl: stashEndpoint + "&action=put&value=" + value,
|
||||
assertUrl: stashEndpoint + "&action=take",
|
||||
};
|
||||
}
|
||||
|
||||
// ===============================================================
|
||||
// Source Context
|
||||
// ===============================================================
|
||||
// Requests can be sent from several source contexts,
|
||||
// such as the main documents, iframes, workers, or so,
|
||||
// possibly nested, and possibly with <meta>/http headers added.
|
||||
// invokeRequest() and invokeFrom*() functions handles
|
||||
// SourceContext-related setup in client-side.
|
||||
|
||||
/**
|
||||
invokeRequest() invokes a subresource request
|
||||
(specified as `subresource`)
|
||||
from a (possibly nested) environment settings object
|
||||
(specified as `sourceContextList`).
|
||||
|
||||
For nested contexts, invokeRequest() calls an invokeFrom*() function
|
||||
that creates a nested environment settings object using
|
||||
/common/security-features/scope/, which calls invokeRequest()
|
||||
again inside the nested environment settings object.
|
||||
This cycle continues until all specified
|
||||
nested environment settings object are created, and
|
||||
finally invokeRequest() calls a requestVia*() function to start the
|
||||
subresource request from the inner-most environment settings object.
|
||||
|
||||
@param {Subresource} subresource
|
||||
@param {Array<SourceContext>} sourceContextList
|
||||
|
||||
@returns {Promise} A promise that is resolved with an RequestResult object.
|
||||
`sourceContextUrl` is always set. For whether other properties are set,
|
||||
see the comments for requestVia*() above.
|
||||
*/
|
||||
function invokeRequest(subresource, sourceContextList) {
|
||||
if (sourceContextList.length === 0) {
|
||||
// No further nested global objects. Send the subresource request here.
|
||||
|
||||
const additionalAttributes = {};
|
||||
/** @type {PolicyDelivery} policyDelivery */
|
||||
for (const policyDelivery of (subresource.policyDeliveries || [])) {
|
||||
// Depending on the delivery method, extend the subresource element with
|
||||
// these attributes.
|
||||
if (policyDelivery.deliveryType === "attr") {
|
||||
additionalAttributes[policyDelivery.key] = policyDelivery.value;
|
||||
} else if (policyDelivery.deliveryType === "rel-noref") {
|
||||
additionalAttributes["rel"] = "noreferrer";
|
||||
}
|
||||
}
|
||||
|
||||
return subresourceMap[subresource.subresourceType].invoker(
|
||||
subresource.url,
|
||||
additionalAttributes)
|
||||
.then(result => Object.assign(
|
||||
{sourceContextUrl: location.toString()},
|
||||
result));
|
||||
}
|
||||
|
||||
// Defines invokers for each valid SourceContext.sourceContextType.
|
||||
const sourceContextMap = {
|
||||
"srcdoc": { // <iframe srcdoc></iframe>
|
||||
invoker: invokeFromIframe,
|
||||
},
|
||||
"iframe": { // <iframe src="same-origin-URL"></iframe>
|
||||
invoker: invokeFromIframe,
|
||||
},
|
||||
"classic-worker": {
|
||||
// Classic dedicated worker loaded from same-origin.
|
||||
invoker: invokeFromWorker.bind(undefined, false, {}),
|
||||
},
|
||||
"classic-data-worker": {
|
||||
// Classic dedicated worker loaded from data: URL.
|
||||
invoker: invokeFromWorker.bind(undefined, true, {}),
|
||||
},
|
||||
"module-worker": {
|
||||
// Module dedicated worker loaded from same-origin.
|
||||
invoker: invokeFromWorker.bind(undefined, false, {type: 'module'}),
|
||||
},
|
||||
"module-data-worker": {
|
||||
// Module dedicated worker loaded from data: URL.
|
||||
invoker: invokeFromWorker.bind(undefined, true, {type: 'module'}),
|
||||
},
|
||||
};
|
||||
|
||||
return sourceContextMap[sourceContextList[0].sourceContextType].invoker(
|
||||
subresource, sourceContextList);
|
||||
}
|
||||
|
||||
// Quick hack to expose invokeRequest when common.js is loaded either
|
||||
// as a classic or module script.
|
||||
self.invokeRequest = invokeRequest;
|
||||
|
||||
/**
|
||||
invokeFrom*() functions are helper functions with the same parameters
|
||||
and return values as invokeRequest(), that are tied to specific types
|
||||
of top-most environment settings objects.
|
||||
For example, invokeFromIframe() is the helper function for the cases where
|
||||
sourceContextList[0] is an iframe.
|
||||
*/
|
||||
|
||||
/**
|
||||
@param {boolean} isDataUrl
|
||||
true if the worker script is loaded from data: URL.
|
||||
Otherwise, the script is loaded from same-origin.
|
||||
@param {object} workerOptions
|
||||
The `options` argument for Worker constructor.
|
||||
|
||||
Other parameters and return values are the same as those of invokeRequest().
|
||||
*/
|
||||
function invokeFromWorker(isDataUrl, workerOptions,
|
||||
subresource, sourceContextList) {
|
||||
const currentSourceContext = sourceContextList[0];
|
||||
let workerUrl =
|
||||
"/common/security-features/scope/worker.py?policyDeliveries=" +
|
||||
encodeURIComponent(JSON.stringify(
|
||||
currentSourceContext.policyDeliveries || []));
|
||||
if (workerOptions.type === 'module') {
|
||||
workerUrl += "&type=module";
|
||||
}
|
||||
|
||||
let promise;
|
||||
if (isDataUrl) {
|
||||
promise = fetch(workerUrl)
|
||||
.then(r => r.text())
|
||||
.then(source => {
|
||||
return 'data:text/javascript;base64,' + btoa(source);
|
||||
});
|
||||
} else {
|
||||
promise = Promise.resolve(workerUrl);
|
||||
}
|
||||
|
||||
return promise
|
||||
.then(url => {
|
||||
const worker = new Worker(url, workerOptions);
|
||||
worker.postMessage({subresource: subresource,
|
||||
sourceContextList: sourceContextList.slice(1)});
|
||||
return bindEvents2(worker, "message", worker, "error", window, "error");
|
||||
})
|
||||
.then(event => {
|
||||
if (event.data.error)
|
||||
return Promise.reject(event.data.error);
|
||||
return event.data;
|
||||
});
|
||||
}
|
||||
|
||||
function invokeFromIframe(subresource, sourceContextList) {
|
||||
const currentSourceContext = sourceContextList[0];
|
||||
const frameUrl =
|
||||
"/common/security-features/scope/document.py?policyDeliveries=" +
|
||||
encodeURIComponent(JSON.stringify(
|
||||
currentSourceContext.policyDeliveries || []));
|
||||
|
||||
let promise;
|
||||
if (currentSourceContext.sourceContextType === 'srcdoc') {
|
||||
promise = fetch(frameUrl)
|
||||
.then(r => r.text())
|
||||
.then(srcdoc => {
|
||||
return createElement("iframe", {srcdoc: srcdoc}, document.body, true);
|
||||
});
|
||||
} else if (currentSourceContext.sourceContextType === 'iframe') {
|
||||
promise = Promise.resolve(
|
||||
createElement("iframe", {src: frameUrl}, document.body, true));
|
||||
}
|
||||
|
||||
return promise
|
||||
.then(iframe => {
|
||||
return iframe.eventPromise
|
||||
.then(() => {
|
||||
const promise = bindEvents2(
|
||||
window, "message", iframe, "error", window, "error");
|
||||
iframe.contentWindow.postMessage(
|
||||
{subresource: subresource,
|
||||
sourceContextList: sourceContextList.slice(1)},
|
||||
"*");
|
||||
return promise;
|
||||
})
|
||||
.then(event => {
|
||||
if (event.data.error)
|
||||
return Promise.reject(event.data.error);
|
||||
return event.data;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// SanityChecker does nothing in release mode. See sanity-checker.js for debug
|
||||
// mode.
|
||||
function SanityChecker() {}
|
||||
|
@ -0,0 +1 @@
|
||||
Access-Control-Allow-Origin: *
|
@ -0,0 +1,35 @@
|
||||
import os, sys, json
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import util
|
||||
|
||||
|
||||
def main(request, response):
|
||||
policyDeliveries = json.loads(request.GET.first("policyDeliveries", "[]"))
|
||||
maybe_additional_headers = {}
|
||||
meta = ''
|
||||
error = ''
|
||||
for delivery in policyDeliveries:
|
||||
if delivery['deliveryType'] == 'meta':
|
||||
if delivery['key'] == 'referrerPolicy':
|
||||
meta += '<meta name="referrer" content="%s">' % delivery['value']
|
||||
else:
|
||||
error = 'invalid delivery key'
|
||||
elif delivery['deliveryType'] == 'http-rp':
|
||||
if delivery['key'] == 'referrerPolicy':
|
||||
maybe_additional_headers['Referrer-Policy'] = delivery['value']
|
||||
else:
|
||||
error = 'invalid delivery key'
|
||||
else:
|
||||
error = 'invalid deliveryType'
|
||||
|
||||
handler = lambda: util.get_template("document.html.template") % ({
|
||||
"meta": meta,
|
||||
"error": error
|
||||
})
|
||||
util.respond(
|
||||
request,
|
||||
response,
|
||||
payload_generator=handler,
|
||||
content_type="text/html",
|
||||
maybe_additional_headers=maybe_additional_headers)
|
@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
%(meta)s
|
||||
<script src="/common/security-features/resources/common.js"></script>
|
||||
<script>
|
||||
// Receive a message from the parent and start the test.
|
||||
function onMessageFromParent(event) {
|
||||
// Because this window might receive messages from child iframe during
|
||||
// tests, we first remove the listener here before staring the test.
|
||||
window.removeEventListener('message', onMessageFromParent);
|
||||
|
||||
const configurationError = "%(error)s";
|
||||
if (configurationError.length > 0) {
|
||||
parent.postMessage({error: configurationError}, "*");
|
||||
return;
|
||||
}
|
||||
|
||||
invokeRequest(event.data.subresource,
|
||||
event.data.sourceContextList)
|
||||
.then(result => parent.postMessage(result, "*"))
|
||||
.catch(e => {
|
||||
const message = (e.error && e.error.stack) || e.message || "Error";
|
||||
parent.postMessage({error: message}, "*");
|
||||
});
|
||||
}
|
||||
window.addEventListener('message', onMessageFromParent);
|
||||
</script>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,24 @@
|
||||
%(import)s
|
||||
|
||||
// Receive a message from the parent and start the test.
|
||||
function onMessageFromParent(event) {
|
||||
// Because this window might receive messages from child context during
|
||||
// tests, we first remove the listener here before staring the test.
|
||||
self.removeEventListener('message', onMessageFromParent);
|
||||
|
||||
const configurationError = "%(error)s";
|
||||
if (configurationError.length > 0) {
|
||||
postMessage({error: configurationError});
|
||||
return;
|
||||
}
|
||||
|
||||
invokeRequest(event.data.subresource,
|
||||
event.data.sourceContextList)
|
||||
.then(result => postMessage(result))
|
||||
.catch(e => {
|
||||
const message = (e.error && e.error.stack) || e.message || "Error";
|
||||
postMessage({error: message});
|
||||
});
|
||||
}
|
||||
|
||||
self.addEventListener('message', onMessageFromParent);
|
@ -0,0 +1,42 @@
|
||||
import os
|
||||
|
||||
|
||||
def get_template(template_basename):
|
||||
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||
template_directory = os.path.abspath(
|
||||
os.path.join(script_directory, "template"))
|
||||
template_filename = os.path.join(template_directory, template_basename)
|
||||
|
||||
with open(template_filename, "r") as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
def __noop(request, response):
|
||||
return ""
|
||||
|
||||
|
||||
def respond(request,
|
||||
response,
|
||||
status_code=200,
|
||||
content_type="text/html",
|
||||
payload_generator=__noop,
|
||||
cache_control="no-cache; must-revalidate",
|
||||
access_control_allow_origin="*",
|
||||
maybe_additional_headers=None):
|
||||
response.add_required_headers = False
|
||||
response.writer.write_status(status_code)
|
||||
|
||||
if access_control_allow_origin != None:
|
||||
response.writer.write_header("access-control-allow-origin",
|
||||
access_control_allow_origin)
|
||||
response.writer.write_header("content-type", content_type)
|
||||
response.writer.write_header("cache-control", cache_control)
|
||||
|
||||
additional_headers = maybe_additional_headers or {}
|
||||
for header, value in additional_headers.items():
|
||||
response.writer.write_header(header, value)
|
||||
|
||||
response.writer.end_headers()
|
||||
|
||||
payload = payload_generator()
|
||||
response.writer.write(payload)
|
@ -0,0 +1,40 @@
|
||||
import os, sys, json
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import util
|
||||
|
||||
|
||||
def main(request, response):
|
||||
policyDeliveries = json.loads(request.GET.first('policyDeliveries', '[]'))
|
||||
worker_type = request.GET.first('type', 'classic')
|
||||
commonjs_url = '%s://%s:%s/common/security-features/resources/common.js' % (
|
||||
request.url_parts.scheme, request.url_parts.hostname,
|
||||
request.url_parts.port)
|
||||
if worker_type == 'classic':
|
||||
import_line = 'importScripts("%s");' % commonjs_url
|
||||
else:
|
||||
import_line = 'import "%s";' % commonjs_url
|
||||
|
||||
maybe_additional_headers = {}
|
||||
error = ''
|
||||
for delivery in policyDeliveries:
|
||||
if delivery['deliveryType'] == 'meta':
|
||||
error = '<meta> cannot be used in WorkerGlobalScope'
|
||||
elif delivery['deliveryType'] == 'http-rp':
|
||||
if delivery['key'] == 'referrerPolicy':
|
||||
maybe_additional_headers['Referrer-Policy'] = delivery['value']
|
||||
else:
|
||||
error = 'invalid delivery key for http-rp: %s' % delivery['key']
|
||||
else:
|
||||
error = 'invalid deliveryType: %s' % delivery['deliveryType']
|
||||
|
||||
handler = lambda: util.get_template('worker.js.template') % ({
|
||||
'import': import_line,
|
||||
'error': error
|
||||
})
|
||||
util.respond(
|
||||
request,
|
||||
response,
|
||||
payload_generator=handler,
|
||||
content_type='text/javascript',
|
||||
maybe_additional_headers=maybe_additional_headers)
|
@ -0,0 +1,17 @@
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
||||
def generate_payload(request, server_data):
|
||||
file = os.path.join(request.doc_root, "webaudio", "resources",
|
||||
"sin_440Hz_-6dBFS_1s.wav")
|
||||
return open(file, "rb").read()
|
||||
|
||||
|
||||
def main(request, response):
|
||||
handler = lambda data: generate_payload(request, data)
|
||||
subresource.respond(request,
|
||||
response,
|
||||
payload_generator = handler,
|
||||
access_control_allow_origin = "*",
|
||||
content_type = "audio/wav")
|
@ -1,6 +1,5 @@
|
||||
import os, json, sys
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
import subresource
|
||||
|
||||
def generate_payload(server_data):
|
@ -0,0 +1,13 @@
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
||||
def generate_payload(server_data):
|
||||
return ''
|
||||
|
||||
def main(request, response):
|
||||
subresource.respond(request,
|
||||
response,
|
||||
payload_generator = generate_payload,
|
||||
access_control_allow_origin = "*",
|
||||
content_type = "text/plain")
|
@ -1,4 +1,4 @@
|
||||
import os, sys, json, base64
|
||||
import os, sys, base64
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
@ -1,4 +1,4 @@
|
||||
import os, sys, array, json, math, StringIO
|
||||
import os, sys, array, math, StringIO
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
||||
@ -60,20 +60,17 @@ class Image:
|
||||
|
||||
def encode_string_as_bmp_image(string_data):
|
||||
data_bytes = array.array("B", string_data)
|
||||
|
||||
num_bytes = len(data_bytes)
|
||||
|
||||
# Convert data bytes to color data (RGB).
|
||||
# Encode data bytes to color data (RGB), one bit per channel.
|
||||
# This is to avoid errors due to different color spaces used in decoding.
|
||||
color_data = []
|
||||
num_components = 3
|
||||
rgb = [0] * num_components
|
||||
i = 0
|
||||
for byte in data_bytes:
|
||||
component_index = i % num_components
|
||||
rgb[component_index] = byte
|
||||
if component_index == (num_components - 1) or i == (num_bytes - 1):
|
||||
color_data.append(tuple(rgb))
|
||||
rgb = [0] * num_components
|
||||
i += 1
|
||||
p = [int(x) * 255 for x in '{0:08b}'.format(byte)]
|
||||
color_data.append((p[0], p[1], p[2]))
|
||||
color_data.append((p[3], p[4], p[5]))
|
||||
color_data.append((p[6], p[7], 0))
|
||||
|
||||
# Render image.
|
||||
num_pixels = len(color_data)
|
@ -1,4 +1,4 @@
|
||||
import os, sys, json
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
||||
@ -10,4 +10,3 @@ def main(request, response):
|
||||
response,
|
||||
payload_generator = generate_payload,
|
||||
content_type = "application/javascript")
|
||||
|
@ -1,4 +1,4 @@
|
||||
import os, sys, json
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
@ -1,4 +1,4 @@
|
||||
import os, sys, json
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
||||
@ -23,23 +23,9 @@ def generate_payload(request, server_data):
|
||||
"property": request.GET["property"]}
|
||||
|
||||
def generate_import_rule(request, server_data):
|
||||
type = 'image'
|
||||
property = None;
|
||||
if "type" in request.GET:
|
||||
type = request.GET["type"]
|
||||
if type == "svg" and "property" in request.GET:
|
||||
property = request.GET["property"]
|
||||
if property is None:
|
||||
return "@import url('%(url)s?id=%(id)s&type=%(type)s');" % {
|
||||
"id": request.GET["id"],
|
||||
"url": subresource.create_redirect_url(request, cross_origin = True),
|
||||
"type": type
|
||||
}
|
||||
return "@import url('%(url)s?id=%(id)s&type=%(type)s&property=%(property)s');" % {
|
||||
"id": request.GET["id"],
|
||||
"url": subresource.create_redirect_url(request, cross_origin = True),
|
||||
"type": type,
|
||||
"property": property
|
||||
return "@import url('%(url)s');" % {
|
||||
"url": subresource.create_url(request, swap_origin=True,
|
||||
query_parameter_to_remove="import-rule")
|
||||
}
|
||||
|
||||
def generate_report_headers_payload(request, server_data):
|
@ -1,38 +1,14 @@
|
||||
import os, sys, json, urlparse, urllib
|
||||
import os, json, urllib, urlparse
|
||||
|
||||
def get_template(template_basename):
|
||||
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||
template_directory = os.path.abspath(os.path.join(script_directory,
|
||||
"..",
|
||||
"template"))
|
||||
template_filename = os.path.join(template_directory, template_basename);
|
||||
|
||||
with open(template_filename, "r") as f:
|
||||
return f.read()
|
||||
|
||||
# TODO(kristijanburnik): subdomain_prefix is a hardcoded value aligned with
|
||||
# referrer-policy-test-case.js. The prefix should be configured in one place.
|
||||
def get_swapped_origin_netloc(netloc, subdomain_prefix = "www1."):
|
||||
if netloc.startswith(subdomain_prefix):
|
||||
return netloc[len(subdomain_prefix):]
|
||||
else:
|
||||
return subdomain_prefix + netloc
|
||||
|
||||
def create_redirect_url(request, cross_origin = False):
|
||||
parsed = urlparse.urlsplit(request.url)
|
||||
destination_netloc = parsed.netloc
|
||||
if cross_origin:
|
||||
destination_netloc = get_swapped_origin_netloc(parsed.netloc)
|
||||
|
||||
destination_url = urlparse.urlunsplit(urlparse.SplitResult(
|
||||
scheme = parsed.scheme,
|
||||
netloc = destination_netloc,
|
||||
path = parsed.path,
|
||||
query = None,
|
||||
fragment = None))
|
||||
|
||||
return destination_url
|
||||
|
||||
|
||||
def redirect(url, response):
|
||||
response.add_required_headers = False
|
||||
@ -43,6 +19,50 @@ def redirect(url, response):
|
||||
response.writer.write("")
|
||||
|
||||
|
||||
# TODO(kristijanburnik): subdomain_prefix is a hardcoded value aligned with
|
||||
# referrer-policy-test-case.js. The prefix should be configured in one place.
|
||||
def __get_swapped_origin_netloc(netloc, subdomain_prefix = "www1."):
|
||||
if netloc.startswith(subdomain_prefix):
|
||||
return netloc[len(subdomain_prefix):]
|
||||
else:
|
||||
return subdomain_prefix + netloc
|
||||
|
||||
|
||||
# Creates a URL (typically a redirect target URL) that is the same as the
|
||||
# current request URL `request.url`, except for:
|
||||
# - When `swap_scheme` or `swap_origin` is True, its scheme/origin is changed
|
||||
# to the other one. (http <-> https, ws <-> wss, etc.)
|
||||
# - `query_parameter_to_remove` parameter is removed from query part.
|
||||
# Its default is "redirection" to avoid redirect loops.
|
||||
def create_url(request, swap_scheme = False, swap_origin = False,
|
||||
query_parameter_to_remove = "redirection"):
|
||||
parsed = urlparse.urlsplit(request.url)
|
||||
destination_netloc = parsed.netloc
|
||||
|
||||
scheme = parsed.scheme
|
||||
if swap_scheme:
|
||||
scheme = "http" if parsed.scheme == "https" else "https"
|
||||
hostname = parsed.netloc.split(':')[0]
|
||||
port = request.server.config["ports"][scheme][0]
|
||||
destination_netloc = ":".join([hostname, str(port)])
|
||||
|
||||
if swap_origin:
|
||||
destination_netloc = __get_swapped_origin_netloc(destination_netloc)
|
||||
|
||||
parsed_query = urlparse.parse_qsl(parsed.query, keep_blank_values=True)
|
||||
parsed_query = filter(lambda x: x[0] != query_parameter_to_remove,
|
||||
parsed_query)
|
||||
|
||||
destination_url = urlparse.urlunsplit(urlparse.SplitResult(
|
||||
scheme = scheme,
|
||||
netloc = destination_netloc,
|
||||
path = parsed.path,
|
||||
query = urllib.urlencode(parsed_query),
|
||||
fragment = None))
|
||||
|
||||
return destination_url
|
||||
|
||||
|
||||
def preprocess_redirection(request, response):
|
||||
if "redirection" not in request.GET:
|
||||
return False
|
||||
@ -51,10 +71,14 @@ def preprocess_redirection(request, response):
|
||||
|
||||
if redirection == "no-redirect":
|
||||
return False
|
||||
elif redirection == "keep-scheme-redirect":
|
||||
redirect_url = create_url(request, swap_scheme=False)
|
||||
elif redirection == "swap-scheme-redirect":
|
||||
redirect_url = create_url(request, swap_scheme=True)
|
||||
elif redirection == "keep-origin-redirect":
|
||||
redirect_url = create_redirect_url(request, cross_origin = False)
|
||||
redirect_url = create_url(request, swap_origin=False)
|
||||
elif redirection == "swap-origin-redirect":
|
||||
redirect_url = create_redirect_url(request, cross_origin = True)
|
||||
redirect_url = create_url(request, swap_origin=True)
|
||||
else:
|
||||
raise ValueError("Invalid redirection type '%s'" % redirection)
|
||||
|
||||
@ -62,6 +86,43 @@ def preprocess_redirection(request, response):
|
||||
return True
|
||||
|
||||
|
||||
def preprocess_stash_action(request, response):
|
||||
if "action" not in request.GET:
|
||||
return False
|
||||
|
||||
action = request.GET["action"]
|
||||
|
||||
key = request.GET["key"]
|
||||
stash = request.server.stash
|
||||
path = request.GET.get("path", request.url.split('?'))[0]
|
||||
|
||||
if action == "put":
|
||||
value = request.GET["value"]
|
||||
stash.take(key=key, path=path)
|
||||
stash.put(key=key, value=value, path=path)
|
||||
response_data = json.dumps({"status": "success", "result": key})
|
||||
elif action == "purge":
|
||||
value = stash.take(key=key, path=path)
|
||||
return False
|
||||
elif action == "take":
|
||||
value = stash.take(key=key, path=path)
|
||||
if value is None:
|
||||
status = "allowed"
|
||||
else:
|
||||
status = "blocked"
|
||||
response_data = json.dumps({"status": status, "result": value})
|
||||
else:
|
||||
return False
|
||||
|
||||
response.add_required_headers = False
|
||||
response.writer.write_status(200)
|
||||
response.writer.write_header("content-type", "text/javascript")
|
||||
response.writer.write_header("cache-control", "no-cache; must-revalidate")
|
||||
response.writer.end_headers()
|
||||
response.writer.write(response_data)
|
||||
return True
|
||||
|
||||
|
||||
def __noop(request, response):
|
||||
return ""
|
||||
|
||||
@ -77,6 +138,9 @@ def respond(request,
|
||||
if preprocess_redirection(request, response):
|
||||
return
|
||||
|
||||
if preprocess_stash_action(request, response):
|
||||
return
|
||||
|
||||
response.add_required_headers = False
|
||||
response.writer.write_status(status_code)
|
||||
|
||||
@ -96,5 +160,3 @@ def respond(request,
|
||||
|
||||
payload = payload_generator(server_data)
|
||||
response.writer.write(payload)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import os, sys, json
|
||||
import os, sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import subresource
|
||||
|
@ -2,7 +2,7 @@
|
||||
font-family: 'wpt';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
src: url(/referrer-policy/generic/subresource/font.py?id=%(id)s) format('truetype');
|
||||
src: url(/common/security-features/subresource/font.py?id=%(id)s) format('truetype');
|
||||
}
|
||||
body {
|
||||
font-family: 'wpt';
|
@ -0,0 +1,3 @@
|
||||
div.styled::before {
|
||||
content:url(/common/security-features/subresource/image.py?id=%(id)s)
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user