68.14.2 - testing

This commit is contained in:
Fedor 2024-06-01 19:25:45 +03:00
parent 0c2dfe37ab
commit 40ed9513e6
205 changed files with 4714 additions and 2697 deletions

View File

@ -1,10 +0,0 @@
[
{
"size": 13426698,
"visibility": "internal",
"digest": "d2b45d3e2fab867152e2063785af48ead3f4d34b4dd614c1e0867f3eeef0c8088a4ffe811400234827293ff8b75f34f45b45eca991e4eed7de37934a7400a9ac",
"algorithm": "sha512",
"filename": "node-linux-x86.tar.gz",
"unpack": true
}
]

View File

@ -1,10 +0,0 @@
[
{
"size": 13958999,
"visibility": "internal",
"digest": "ce5c0c20dfa83821284a1b69b226fe13224b82345622fc43d216332484ec8c89a2f171ad3dd2ac83cd5777510306d349bc4fbf00fc692e3542dfb7db70876489",
"algorithm": "sha512",
"filename": "node-linux-x64.tar.gz",
"unpack": true
}
]

View File

@ -1,10 +0,0 @@
[
{
"size": 12148545,
"visibility": "internal",
"digest": "a79b5efc30b560fbfb48210b4e0b4c6418ebc8472b07460c7cb2042db6ea1b7a6473cb9fa35604b8abbc93df3d3689b91919dd21e8d4f382033d3c07c7ec6a3f",
"algorithm": "sha512",
"filename": "node-osx.tar.gz",
"unpack": true
}
]

View File

@ -1,9 +0,0 @@
[
{
"size": 15066656,
"visibility": "internal",
"digest": "edf96781042db513700c4a092ef367c05933967b036db9b0f716b75da613a7eaea055d0f60b1e12f6e41a545962cec97a7b78c6b86363ee1ec7a9f42699a5531",
"algorithm": "sha512",
"filename": "node-win32.exe"
}
]

View File

@ -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);
}

View File

@ -1,6 +1,5 @@
config = {
# We bake this directly into the tester image now...
"download_nodejs": False,
"nodejs_path": "/usr/local/bin/node",
"exes": {}
}

View File

@ -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",
}

View File

@ -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,
}

View File

@ -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,
}

View File

@ -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

View File

@ -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'

View File

@ -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);

View File

@ -0,0 +1,3 @@
[bidi-001.xht]
fuzzy:
if os == "mac": maxDifference=3;totalPixels=0-1

View File

@ -0,0 +1,3 @@
[bidi-002.xht]
fuzzy:
if os == "mac": maxDifference=1;totalPixels=0-1

View File

@ -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

View File

@ -1,3 +0,0 @@
[clear-applies-to-008.xht]
expected:
if (os == "mac"): FAIL

View File

@ -1,3 +0,0 @@
[contain-paint-independent-formatting-context-002.html]
expected:
if (os == "mac"): FAIL

View File

@ -1,4 +0,0 @@
[display-contents-details.html]
expected:
if (os == "mac"): PASS
FAIL

View File

@ -1,3 +0,0 @@
[display-contents-fieldset.html]
expected:
if os == "mac": FAIL

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,5 @@
[appcache.tentative.https.sub.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
[Appcache!]
expected: FAIL

View File

@ -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

View File

@ -0,0 +1,3 @@
[redirect-https-downgrade.tentative.sub.html]
[redirect-https-downgrade]
expected: FAIL

View File

@ -0,0 +1,3 @@
[fetch.tentative.sub.html]
[http->https fetch (cross-scheme => cross-site)]
expected: FAIL

View File

@ -0,0 +1,3 @@
[iframe.tentative.sub.html]
[Secure, cross-site (cross-scheme, same-host) iframe]
expected: FAIL

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
[appcache-iframe.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -1,4 +1,5 @@
[appcache-worker.https.html]
prefs: [browser.cache.offline.storage.enable:true]
disabled:
if verify: fails in verify mode
expected: TIMEOUT

View File

@ -0,0 +1,2 @@
[api_status_checking-manual.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_status_downloading-manual.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_status_idle.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_status_obsolete-manual.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_status_uncached.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_status_updateready-manual.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_swapcache-manual.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_swapcache_error.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[api_update.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -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

View File

@ -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]

View File

@ -0,0 +1,2 @@
[manifest_url_check.https.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,4 +0,0 @@
[track-default-attribute.html]
[A track with the "default" attribute loads automatically]
expected: FAIL

View File

@ -1,4 +0,0 @@
[track-element-src-change-error.html]
[HTMLTrackElement 'src' attribute mutations]
expected: FAIL

View File

@ -1,4 +0,0 @@
[track-element-src-change.html]
[HTMLTrackElement 'src' attribute mutations]
expected: FAIL

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
prefs: [dom.image-lazy-loading.enabled:true]

View File

@ -1,2 +0,0 @@
[link-header-preload-delay-onload.html]
disabled: Regressed by bug 1618322, will be fixed by bug 1618548

View File

@ -1,4 +0,0 @@
[link-header-preload-imagesrcset.html]
[Makes sure that Link headers preload images with imagesrcset/imagesizes attributes.]
expected: FAIL

View File

@ -1,5 +0,0 @@
[link-header-preload.html]
disabled:
if verify: fails in verify mode
[Makes sure that Link headers preload resources]
expected: FAIL

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
[clients-get.https.html]
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]

View File

@ -0,0 +1,2 @@
[clients-get.https.html]
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1305877

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"]

View File

@ -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

View File

@ -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

View File

@ -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`.

View File

@ -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() {}

View File

@ -0,0 +1 @@
Access-Control-Allow-Origin: *

View File

@ -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)

View File

@ -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>

View File

@ -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);

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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):

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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")

View File

@ -1,4 +1,4 @@
import os, sys, json
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource

View File

@ -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):

View File

@ -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)

View File

@ -1,4 +1,4 @@
import os, sys, json
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource

View File

@ -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';

View File

@ -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