mirror of
https://github.com/Feodor2/Mypal68.git
synced 2025-06-18 23:05:40 -04:00
68.14.2 - testing
This commit is contained in:
parent
0c2dfe37ab
commit
40ed9513e6
@ -1,10 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"size": 13426698,
|
|
||||||
"visibility": "internal",
|
|
||||||
"digest": "d2b45d3e2fab867152e2063785af48ead3f4d34b4dd614c1e0867f3eeef0c8088a4ffe811400234827293ff8b75f34f45b45eca991e4eed7de37934a7400a9ac",
|
|
||||||
"algorithm": "sha512",
|
|
||||||
"filename": "node-linux-x86.tar.gz",
|
|
||||||
"unpack": true
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,10 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"size": 13958999,
|
|
||||||
"visibility": "internal",
|
|
||||||
"digest": "ce5c0c20dfa83821284a1b69b226fe13224b82345622fc43d216332484ec8c89a2f171ad3dd2ac83cd5777510306d349bc4fbf00fc692e3542dfb7db70876489",
|
|
||||||
"algorithm": "sha512",
|
|
||||||
"filename": "node-linux-x64.tar.gz",
|
|
||||||
"unpack": true
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,10 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"size": 12148545,
|
|
||||||
"visibility": "internal",
|
|
||||||
"digest": "a79b5efc30b560fbfb48210b4e0b4c6418ebc8472b07460c7cb2042db6ea1b7a6473cb9fa35604b8abbc93df3d3689b91919dd21e8d4f382033d3c07c7ec6a3f",
|
|
||||||
"algorithm": "sha512",
|
|
||||||
"filename": "node-osx.tar.gz",
|
|
||||||
"unpack": true
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,9 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"size": 15066656,
|
|
||||||
"visibility": "internal",
|
|
||||||
"digest": "edf96781042db513700c4a092ef367c05933967b036db9b0f716b75da613a7eaea055d0f60b1e12f6e41a545962cec97a7b78c6b86363ee1ec7a9f42699a5531",
|
|
||||||
"algorithm": "sha512",
|
|
||||||
"filename": "node-win32.exe"
|
|
||||||
}
|
|
||||||
]
|
|
@ -30,6 +30,7 @@
|
|||||||
#include "sslproto.h"
|
#include "sslproto.h"
|
||||||
#include "plhash.h"
|
#include "plhash.h"
|
||||||
#include "mozilla/Sprintf.h"
|
#include "mozilla/Sprintf.h"
|
||||||
|
#include "mozilla/Unused.h"
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
using namespace mozilla::psm;
|
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);
|
SSL_OptionSet(ssl_socket, SSL_HANDSHAKE_AS_SERVER, true);
|
||||||
|
|
||||||
if (clientAuth != caNone) {
|
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_REQUEST_CERTIFICATE, true);
|
||||||
SSL_OptionSet(ssl_socket, SSL_REQUIRE_CERTIFICATE, clientAuth == caRequire);
|
SSL_OptionSet(ssl_socket, SSL_REQUIRE_CERTIFICATE, clientAuth == caRequire);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
config = {
|
config = {
|
||||||
# We bake this directly into the tester image now...
|
# We bake this directly into the tester image now...
|
||||||
"download_nodejs": False,
|
|
||||||
"nodejs_path": "/usr/local/bin/node",
|
"nodejs_path": "/usr/local/bin/node",
|
||||||
"exes": {}
|
"exes": {}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,10 @@ ADJUST_MOUSE_AND_SCREEN = False
|
|||||||
# Note: keep these Valgrind .sup file names consistent with those
|
# Note: keep these Valgrind .sup file names consistent with those
|
||||||
# in testing/mochitest/mochitest_options.py.
|
# in testing/mochitest/mochitest_options.py.
|
||||||
VALGRIND_SUPP_DIR = os.path.join(os.getcwd(), "build/tests/mochitest")
|
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,
|
VALGRIND_SUPP_CROSS_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||||
"cross-architecture.sup")
|
"cross-architecture.sup")
|
||||||
VALGRIND_SUPP_ARCH = None
|
VALGRIND_SUPP_ARCH = None
|
||||||
@ -22,14 +26,11 @@ if platform.architecture()[0] == "64bit":
|
|||||||
MINIDUMP_STACKWALK_PATH = "linux64-minidump_stackwalk"
|
MINIDUMP_STACKWALK_PATH = "linux64-minidump_stackwalk"
|
||||||
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||||
"x86_64-pc-linux-gnu.sup")
|
"x86_64-pc-linux-gnu.sup")
|
||||||
NODEJS_PATH = "node-linux-x64/bin/node"
|
|
||||||
NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux64/nodejs.manifest"
|
|
||||||
else:
|
else:
|
||||||
TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/releng.manifest"
|
TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/releng.manifest"
|
||||||
MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
|
MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
|
||||||
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
|
||||||
"i386-pc-linux-gnu.sup")
|
"i386-pc-linux-gnu.sup")
|
||||||
NODEJS_PATH = "node-linux-x86/bin/node"
|
|
||||||
NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/nodejs.manifest"
|
NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/nodejs.manifest"
|
||||||
|
|
||||||
#####
|
#####
|
||||||
@ -260,8 +261,6 @@ config = {
|
|||||||
"minidump_stackwalk_path": MINIDUMP_STACKWALK_PATH,
|
"minidump_stackwalk_path": MINIDUMP_STACKWALK_PATH,
|
||||||
"minidump_tooltool_manifest_path": TOOLTOOL_MANIFEST_PATH,
|
"minidump_tooltool_manifest_path": TOOLTOOL_MANIFEST_PATH,
|
||||||
"tooltool_cache": "/builds/worker/tooltool-cache",
|
"tooltool_cache": "/builds/worker/tooltool-cache",
|
||||||
"download_nodejs": True,
|
|
||||||
"nodejs_path": NODEJS_PATH,
|
"nodejs_path": NODEJS_PATH,
|
||||||
"nodejs_tooltool_manifest_path": NODEJS_TOOLTOOL_MANIFEST_PATH,
|
|
||||||
# "log_format": "%(levelname)8s - %(message)s",
|
# "log_format": "%(levelname)8s - %(message)s",
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,10 @@ import os
|
|||||||
|
|
||||||
# OS Specifics
|
# OS Specifics
|
||||||
INSTALLER_PATH = os.path.join(os.getcwd(), "installer.dmg")
|
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'
|
XPCSHELL_NAME = 'xpcshell'
|
||||||
EXE_SUFFIX = ''
|
EXE_SUFFIX = ''
|
||||||
DISABLE_SCREEN_SAVER = False
|
DISABLE_SCREEN_SAVER = False
|
||||||
@ -209,7 +213,5 @@ config = {
|
|||||||
"minidump_stackwalk_path": "macosx64-minidump_stackwalk",
|
"minidump_stackwalk_path": "macosx64-minidump_stackwalk",
|
||||||
"minidump_tooltool_manifest_path": "config/tooltool-manifests/macosx64/releng.manifest",
|
"minidump_tooltool_manifest_path": "config/tooltool-manifests/macosx64/releng.manifest",
|
||||||
"tooltool_cache": "/builds/tooltool_cache",
|
"tooltool_cache": "/builds/tooltool_cache",
|
||||||
"download_nodejs": True,
|
"nodejs_path": NODEJS_PATH,
|
||||||
"nodejs_path": "node-osx/bin/node",
|
|
||||||
"nodejs_tooltool_manifest_path": "config/tooltool-manifests/macosx64/nodejs.manifest",
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,10 @@ import sys
|
|||||||
ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
|
ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
|
||||||
BINARY_PATH = os.path.join(ABS_WORK_DIR, "firefox", "firefox.exe")
|
BINARY_PATH = os.path.join(ABS_WORK_DIR, "firefox", "firefox.exe")
|
||||||
INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.zip")
|
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'
|
XPCSHELL_NAME = 'xpcshell.exe'
|
||||||
EXE_SUFFIX = '.exe'
|
EXE_SUFFIX = '.exe'
|
||||||
DISABLE_SCREEN_SAVER = False
|
DISABLE_SCREEN_SAVER = False
|
||||||
@ -282,7 +286,5 @@ config = {
|
|||||||
},
|
},
|
||||||
"minidump_stackwalk_path": "win32-minidump_stackwalk.exe",
|
"minidump_stackwalk_path": "win32-minidump_stackwalk.exe",
|
||||||
"minidump_tooltool_manifest_path": "config/tooltool-manifests/win32/releng.manifest",
|
"minidump_tooltool_manifest_path": "config/tooltool-manifests/win32/releng.manifest",
|
||||||
"download_nodejs": True,
|
"nodejs_path": NODEJS_PATH,
|
||||||
"nodejs_path": "node-win32.exe",
|
|
||||||
"nodejs_tooltool_manifest_path": "config/tooltool-manifests/win32/nodejs.manifest",
|
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,6 @@ class TestingMixin(VirtualenvMixin, AutomationMixin, ResourceMonitoringMixin,
|
|||||||
symbols_path = None
|
symbols_path = None
|
||||||
jsshell_url = None
|
jsshell_url = None
|
||||||
minidump_stackwalk_path = None
|
minidump_stackwalk_path = None
|
||||||
nodejs_path = None
|
|
||||||
default_tools_repo = 'https://hg.mozilla.org/build/tools'
|
default_tools_repo = 'https://hg.mozilla.org/build/tools'
|
||||||
|
|
||||||
def query_build_dir_url(self, file_name):
|
def query_build_dir_url(self, file_name):
|
||||||
@ -572,69 +571,6 @@ Did you run with --create-virtualenv? Is mozinstall in virtualenv_modules?""")
|
|||||||
else:
|
else:
|
||||||
self.fatal('We could not determine the minidump\'s filename.')
|
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):
|
def query_minidump_stackwalk(self, manifest=None):
|
||||||
if self.minidump_stackwalk_path:
|
if self.minidump_stackwalk_path:
|
||||||
return self.minidump_stackwalk_path
|
return self.minidump_stackwalk_path
|
||||||
|
@ -862,8 +862,8 @@ class DesktopUnittest(TestingMixin, MercurialScript, MozbaseMixin,
|
|||||||
|
|
||||||
if self.query_minidump_stackwalk():
|
if self.query_minidump_stackwalk():
|
||||||
env['MINIDUMP_STACKWALK'] = self.minidump_stackwalk_path
|
env['MINIDUMP_STACKWALK'] = self.minidump_stackwalk_path
|
||||||
if self.query_nodejs():
|
if self.config['nodejs_path']:
|
||||||
env['MOZ_NODE_PATH'] = self.nodejs_path
|
env['MOZ_NODE_PATH'] = self.config['nodejs_path']
|
||||||
env['MOZ_UPLOAD_DIR'] = self.query_abs_dirs()['abs_blob_upload_dir']
|
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['MINIDUMP_SAVE_PATH'] = self.query_abs_dirs()['abs_blob_upload_dir']
|
||||||
env['RUST_BACKTRACE'] = 'full'
|
env['RUST_BACKTRACE'] = 'full'
|
||||||
|
@ -23,7 +23,7 @@ user_pref("places.history.enabled", false);
|
|||||||
// Suppress automatic safe mode after crashes
|
// Suppress automatic safe mode after crashes
|
||||||
user_pref("toolkit.startup.max_resumed_crashes", -1);
|
user_pref("toolkit.startup.max_resumed_crashes", -1);
|
||||||
// Disable antialiasing for the Ahem font.
|
// 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
|
// Disable antiphishing popup
|
||||||
user_pref("network.http.phishy-userpass-length", 255);
|
user_pref("network.http.phishy-userpass-length", 255);
|
||||||
// Disable safebrowsing components
|
// Disable safebrowsing components
|
||||||
@ -34,3 +34,13 @@ user_pref("browser.safebrowsing.malware.enabled", false);
|
|||||||
user_pref("browser.safebrowsing.phishing.enabled", false);
|
user_pref("browser.safebrowsing.phishing.enabled", false);
|
||||||
// Automatically unload beforeunload alerts
|
// Automatically unload beforeunload alerts
|
||||||
user_pref("dom.disable_beforeunload", true);
|
user_pref("dom.disable_beforeunload", true);
|
||||||
|
// Enable implicit keyframes since the common animation interpolation test
|
||||||
|
// function assumes this is available.
|
||||||
|
user_pref("dom.animations-api.implicit-keyframes.enabled", true);
|
||||||
|
// sometime wpt runs test even before the document becomes visible, which would
|
||||||
|
// delay video.play() and cause play() running in wrong order.
|
||||||
|
user_pref("media.block-autoplay-until-in-foreground", false);
|
||||||
|
user_pref("media.block-autoplay-until-in-foreground", false);
|
||||||
|
// Enable AppCache globally for now whilst it's being removed in Bug 1584984
|
||||||
|
user_pref("browser.cache.offline.storage.enable", true);
|
||||||
|
user_pref("browser.cache.offline.enable", true);
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
[bidi-001.xht]
|
||||||
|
fuzzy:
|
||||||
|
if os == "mac": maxDifference=3;totalPixels=0-1
|
@ -0,0 +1,3 @@
|
|||||||
|
[bidi-002.xht]
|
||||||
|
fuzzy:
|
||||||
|
if os == "mac": maxDifference=1;totalPixels=0-1
|
@ -1,5 +1,4 @@
|
|||||||
[c43-rpl-ibx-000.xht]
|
[c43-rpl-ibx-000.xht]
|
||||||
expected:
|
expected:
|
||||||
if os == "mac": FAIL
|
|
||||||
if (os == "android") and not e10s: FAIL
|
if (os == "android") and not e10s: FAIL
|
||||||
if (os == "android") and e10s: FAIL
|
if (os == "android") and e10s: FAIL
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
[clear-applies-to-008.xht]
|
|
||||||
expected:
|
|
||||||
if (os == "mac"): FAIL
|
|
@ -1,3 +0,0 @@
|
|||||||
[contain-paint-independent-formatting-context-002.html]
|
|
||||||
expected:
|
|
||||||
if (os == "mac"): FAIL
|
|
@ -1,4 +0,0 @@
|
|||||||
[display-contents-details.html]
|
|
||||||
expected:
|
|
||||||
if (os == "mac"): PASS
|
|
||||||
FAIL
|
|
@ -1,3 +0,0 @@
|
|||||||
[display-contents-fieldset.html]
|
|
||||||
expected:
|
|
||||||
if os == "mac": FAIL
|
|
@ -1,5 +0,0 @@
|
|||||||
[multi-line-wrap-reverse-column-reverse.html]
|
|
||||||
expected:
|
|
||||||
if (os == "mac") and (version == "OS X 10.14.5") and (processor == "x86_64") and (bits == 64): FAIL
|
|
||||||
if (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[multi-line-wrap-with-column-reverse.html]
|
|
||||||
expected:
|
|
||||||
if (os == "mac") and (version == "OS X 10.14.5") and (processor == "x86_64") and (bits == 64): FAIL
|
|
||||||
if (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
|
|
@ -1,4 +1,5 @@
|
|||||||
[text-emphasis-style-006.html]
|
[text-emphasis-style-006.html]
|
||||||
disabled:
|
disabled:
|
||||||
if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview)
|
if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview)
|
||||||
|
fuzzy:
|
||||||
if os == "mac": maxDifference=0-96;totalPixels=0-12
|
if os == "mac": maxDifference=0-96;totalPixels=0-12
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
[word-break-break-all-004.html]
|
|
||||||
expected:
|
|
||||||
if (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
|
|
@ -2,9 +2,6 @@
|
|||||||
[HTTP cache reuses an unknown response with Last-Modified based upon heuristic freshness when Cache-Control: public is present.]
|
[HTTP cache reuses an unknown response with Last-Modified based upon heuristic freshness when Cache-Control: public is present.]
|
||||||
expected: FAIL
|
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.]
|
[HTTP cache reuses a 404 Not Found response with Last-Modified based upon heuristic freshness.]
|
||||||
expected: FAIL
|
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]
|
[HTTP cache reuses an unknown response with Last-Modified based upon heuristic freshness when Cache-Control: public is present]
|
||||||
expected: FAIL
|
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]
|
[HTTP cache reuses a 404 Not Found response with Last-Modified based upon heuristic freshness]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
[status.html]
|
[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.]
|
[HTTP cache avoids going to the network if it has a fresh 299 response.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -29,9 +26,6 @@
|
|||||||
[HTTP cache avoids going to the network if it has a fresh 599 response.]
|
[HTTP cache avoids going to the network if it has a fresh 599 response.]
|
||||||
expected: FAIL
|
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]
|
[HTTP cache avoids going to the network if it has a fresh 299 response]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
[appcache.tentative.https.sub.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||||
|
[Appcache!]
|
||||||
|
expected: FAIL
|
||||||
|
|
@ -0,0 +1,35 @@
|
|||||||
|
[redirect-http-upgrade.tentative.sub.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[Http upgrade embed]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Http upgrade top level navigation]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Http upgrade iframe]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Http upgrade script => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Http upgrade image => No headers]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Http upgrade font => No headers]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Http upgrade object]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Http upgrade stylesheet]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
[Http upgrade prefetch => No headers]
|
||||||
|
expected: [FAIL, TIMEOUT]
|
||||||
|
|
||||||
|
[Http upgrade track]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Http upgrade fetch() api]
|
||||||
|
expected: FAIL
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
[redirect-https-downgrade.tentative.sub.html]
|
||||||
|
[redirect-https-downgrade]
|
||||||
|
expected: FAIL
|
@ -0,0 +1,3 @@
|
|||||||
|
[fetch.tentative.sub.html]
|
||||||
|
[http->https fetch (cross-scheme => cross-site)]
|
||||||
|
expected: FAIL
|
@ -0,0 +1,3 @@
|
|||||||
|
[iframe.tentative.sub.html]
|
||||||
|
[Secure, cross-site (cross-scheme, same-host) iframe]
|
||||||
|
expected: FAIL
|
@ -0,0 +1,2 @@
|
|||||||
|
lsan-allowed: [Alloc, Create, Malloc, Realloc, mozilla::BasePrincipal::CreateContentPrincipal, mozilla::SchedulerGroup::CreateEventTargetFor, mozilla::WeakPtr, mozilla::net::CookieSettings::Create, mozilla::net::nsStandardURL::TemplatedMutator, nsNodeSupportsWeakRefTearoff::GetWeakReference, nsPrefetchService::EnqueueURI]
|
||||||
|
leak-threshold: [tab:51200]
|
@ -0,0 +1,46 @@
|
|||||||
|
[multiple-redirect-https-downgrade-upgrade.tentative.sub.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[Https downgrade-upgrade stylesheet => No headers]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
[Https downgrade-upgrade iframe => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade top level navigation => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade image => No headers]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Https downgrade-upgrade script => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade track => No headers]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Https downgrade-upgrade fetch() api => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade font => No headers]
|
||||||
|
expected: NOTRUN
|
||||||
|
|
||||||
|
[Https downgrade-upgrade prefetch => No headers]
|
||||||
|
disabled:
|
||||||
|
if (os == "win") and debug and webrender: wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and webrender and debug: wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and webrender and not debug: wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and not webrender and not debug and (processor == "x86_64"): wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and not webrender and not debug and (processor == "x86"): wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and not webrender and debug and sw-e10s: wpt-sync Bug 1565002
|
||||||
|
if (os == "linux") and not webrender and debug and not sw-e10s: wpt-sync Bug 1565002
|
||||||
|
wpt-sync Bug 1565002
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade embed => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Https downgrade-upgrade object => No headers]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[multiple-redirect-https-downgrade-upgrade]
|
||||||
|
expected: FAIL
|
@ -1,19 +0,0 @@
|
|||||||
[redirect-https-downgrade.tentative.sub.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Https downgrade track => No headers]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[Https downgrade font => No headers]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[Https downgrade prefetch => No headers]
|
|
||||||
expected:
|
|
||||||
if (os == "linux"): ["FAIL", "TIMEOUT"]
|
|
||||||
if os == "android": PASS
|
|
||||||
FAIL
|
|
||||||
|
|
||||||
[Https downgrade stylesheet => No headers]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[Https downgrade image => No headers]
|
|
||||||
expected: NOTRUN
|
|
@ -0,0 +1,2 @@
|
|||||||
|
[appcache-iframe.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -1,4 +1,5 @@
|
|||||||
[appcache-worker.https.html]
|
[appcache-worker.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true]
|
||||||
disabled:
|
disabled:
|
||||||
if verify: fails in verify mode
|
if verify: fails in verify mode
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_checking-manual.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_downloading-manual.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_idle.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_obsolete-manual.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_uncached.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_status_updateready-manual.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_swapcache-manual.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_swapcache_error.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[api_update.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -1,4 +1,5 @@
|
|||||||
[api_update_error.https.html]
|
[api_update_error.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||||
[INVALID_STATE_ERR error test]
|
[INVALID_STATE_ERR error test]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
[secure_context.html]
|
[secure_context.html]
|
||||||
prefs: [browser.cache.offline.insecure.enable:false]
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
[manifest_url_check.https.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,4 @@
|
|||||||
|
[no-appcache-in-shared-workers-historical.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
||||||
|
disabled:
|
||||||
|
if (os == "win"): Bug 1581711
|
@ -480,9 +480,6 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
|||||||
[External interface: operation IsSearchProviderInstalled()]
|
[External interface: operation IsSearchProviderInstalled()]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[SVGElement interface: attribute nonce]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[TextMetrics interface: attribute fontBoundingBoxAscent]
|
[TextMetrics interface: attribute fontBoundingBoxAscent]
|
||||||
expected: FAIL
|
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)]
|
[OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Navigator interface: operation registerProtocolHandler(DOMString, USVString)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
||||||
[idlharness.https.html?include=(Document|Window)]
|
[idlharness.https.html?include=(Document|Window)]
|
||||||
[Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type]
|
[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]
|
[HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLLinkElement interface: attribute imageSizes]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type]
|
[HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -939,9 +936,6 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
|||||||
[HTMLDialogElement interface: attribute open]
|
[HTMLDialogElement interface: attribute open]
|
||||||
expected: FAIL
|
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]
|
[HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -999,18 +993,12 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
|||||||
[HTMLDialogElement interface: attribute returnValue]
|
[HTMLDialogElement interface: attribute returnValue]
|
||||||
expected: FAIL
|
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]
|
[HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type]
|
[HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLElement interface: attribute nonce]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
|
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -1020,15 +1008,9 @@ prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.head
|
|||||||
[HTMLElement interface: attribute autocapitalize]
|
[HTMLElement interface: attribute autocapitalize]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLLinkElement interface: attribute imageSrcset]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type]
|
[HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type]
|
||||||
expected: FAIL
|
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]
|
[HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
[autoplay-with-broken-track.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
disabled:
|
|
||||||
if debug and (os == "linux") and (processor == "x86"): https://bugzilla.mozilla.org/show_bug.cgi?id=1482405
|
|
||||||
[<video autoplay> with <track src="invalid://url" default=""> child]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and not e10s: PASS
|
|
||||||
if (os == "android") and e10s: PASS
|
|
||||||
TIMEOUT
|
|
||||||
|
|
||||||
[<video autoplay> with <track src="" default=""> child]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
[src-clear-cues.html]
|
|
||||||
[track element changing "track URL" and clearing cues, set mode, add cue, set src]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[track element changing "track URL" and clearing cues, set mode, set src, add cue, change src]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[track element changing "track URL" and clearing cues, set mode, add cue, change mode to disabled, set src]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
[src-empty-string.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Setting HTMLTrackElement.src to the empty string fires 'error' and sets readyState to ERROR]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[track-default-attribute.html]
|
|
||||||
[A track with the "default" attribute loads automatically]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[track-element-src-change-error.html]
|
|
||||||
[HTMLTrackElement 'src' attribute mutations]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[track-element-src-change.html]
|
|
||||||
[HTMLTrackElement 'src' attribute mutations]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[track-mode-not-changed-by-new-track.html]
|
|
||||||
[A track appended after the initial track configuration does not change other tracks]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
[track-mode-triggers-loading.html]
|
|
||||||
[A "metadata" track does not load automatically, but it does load when the mode is changed]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -23,9 +23,6 @@
|
|||||||
[onsecuritypolicyviolation: the content attribute must execute when an event is dispatched]
|
[onsecuritypolicyviolation: the content attribute must execute when an event is dispatched]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[GlobalEventHandlers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[onslotchange: must be on the appropriate locations for GlobalEventHandlers]
|
[onslotchange: must be on the appropriate locations for GlobalEventHandlers]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -37,3 +34,4 @@
|
|||||||
|
|
||||||
[onslotchange: the content attribute must execute when an event is dispatched]
|
[onslotchange: the content attribute must execute when an event is dispatched]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
1
testing/web-platform/meta/loading/lazyload/__dir__.ini
Normal file
1
testing/web-platform/meta/loading/lazyload/__dir__.ini
Normal file
@ -0,0 +1 @@
|
|||||||
|
prefs: [dom.image-lazy-loading.enabled:true]
|
@ -1,2 +0,0 @@
|
|||||||
[link-header-preload-delay-onload.html]
|
|
||||||
disabled: Regressed by bug 1618322, will be fixed by bug 1618548
|
|
@ -1,4 +0,0 @@
|
|||||||
[link-header-preload-imagesrcset.html]
|
|
||||||
[Makes sure that Link headers preload images with imagesrcset/imagesizes attributes.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
[link-header-preload.html]
|
|
||||||
disabled:
|
|
||||||
if verify: fails in verify mode
|
|
||||||
[Makes sure that Link headers preload resources]
|
|
||||||
expected: FAIL
|
|
@ -1,6 +0,0 @@
|
|||||||
[preload-xhr.html]
|
|
||||||
[Make an XHR request after loading link rel=preload.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Make an XHR request immediately after creating link rel=preload.]
|
|
||||||
disabled: Bug 1529173
|
|
@ -14,149 +14,6 @@
|
|||||||
[PushManager interface: attribute supportedContentEncodings]
|
[PushManager interface: attribute supportedContentEncodings]
|
||||||
expected: FAIL
|
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]
|
[idlharness.https.any.worker.html]
|
||||||
[PushManager interface object length]
|
[PushManager interface object length]
|
||||||
@ -174,115 +31,10 @@
|
|||||||
[PushManager interface: attribute supportedContentEncodings]
|
[PushManager interface: attribute supportedContentEncodings]
|
||||||
expected: FAIL
|
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]
|
[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")]
|
[PushSubscriptionChangeEvent must be primary interface of new PushSubscriptionChangeEvent("pushsubscriptionchange")]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -334,229 +86,6 @@
|
|||||||
[PushSubscriptionChangeEvent interface object name]
|
[PushSubscriptionChangeEvent interface object name]
|
||||||
expected: FAIL
|
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]
|
[idlharness.https.any.sharedworker.html]
|
||||||
[PushManager interface object length]
|
[PushManager interface object length]
|
||||||
@ -573,110 +102,3 @@
|
|||||||
|
|
||||||
[PushManager interface: attribute supportedContentEncodings]
|
[PushManager interface: attribute supportedContentEncodings]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[PushSubscription interface: attribute options]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: operation permissionState(PushSubscriptionOptionsInit)]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: operation getSubscription()]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: existence and properties of interface object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: operation subscribe(PushSubscriptionOptionsInit)]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface object name]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface: existence and properties of interface object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: operation toJSON()]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: existence and properties of interface prototype object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: operation unsubscribe()]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface: attribute applicationServerKey]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface object name]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: attribute endpoint]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: existence and properties of interface object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface object length]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushManager interface: existence and properties of interface prototype object]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[PushSubscriptionOptions interface object name]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[ServiceWorkerRegistration interface: attribute pushManager]
|
|
||||||
expected:
|
|
||||||
if (os == "android") and e10s: FAIL
|
|
||||||
|
|
||||||
[idl_test setup]
|
|
||||||
expected: FAIL
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[appcache-ordering-main.https.html]
|
[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
|
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1305877
|
||||||
expected:
|
expected:
|
||||||
if (e10s and (os == "win")) or ((os == "linux") and (bits == 64)): TIMEOUT
|
if (e10s and (os == "win")) or ((os == "linux") and (bits == 64)): TIMEOUT
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[claim-fetch-with-appcache.https.html]
|
[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.]
|
[fetch() should be intercepted after the client is claimed.]
|
||||||
expected:
|
expected:
|
||||||
if (os == "linux") and debug and not webrender and e10s and not sw-e10s: FAIL
|
if (os == "linux") and debug and not webrender and e10s and not sw-e10s: FAIL
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
[claim-fetch.https.html]
|
|
||||||
[fetch() should be intercepted after the client is claimed.]
|
|
||||||
expected:
|
|
||||||
if (os == "linux") and debug and e10s and not sw-e10s and (processor == "x86"): FAIL
|
|
||||||
if (os == "linux") and debug and not webrender and e10s and sw-e10s: FAIL
|
|
||||||
if (os == "linux") and debug and webrender: FAIL
|
|
||||||
if (os == "linux") and not debug: FAIL
|
|
||||||
if os == "win": FAIL
|
|
||||||
if os == "mac": FAIL
|
|
||||||
if (os == "android") and not e10s: FAIL
|
|
||||||
if (os == "linux") and debug and not webrender and e10s: FAIL
|
|
||||||
FAIL
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
|||||||
|
[clients-get.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true,browser.cache.offline.enable:true]
|
@ -0,0 +1,2 @@
|
|||||||
|
[clients-get.https.html]
|
||||||
|
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1305877
|
@ -1,4 +1,5 @@
|
|||||||
[sxg-inner-resp-over-appcache.tentative.https.html]
|
[sxg-inner-resp-over-appcache.tentative.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true]
|
||||||
[SignedHTTPExchange inner resp should take precedence to appcache.]
|
[SignedHTTPExchange inner resp should take precedence to appcache.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[sxg-served-from-appcache.tentative.https.html]
|
[sxg-served-from-appcache.tentative.https.html]
|
||||||
|
prefs: [browser.cache.offline.storage.enable:true]
|
||||||
[SignedHTTPExchange cached in appcache should work.]
|
[SignedHTTPExchange cached in appcache should work.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -0,0 +1,138 @@
|
|||||||
|
[presentation-attributes-irrelevant.html]
|
||||||
|
[clip-path presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[clip-rule presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[color-interpolation-filters presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[direction presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[display presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[dominant-baseline presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[filter presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[flood-color presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[flood-opacity presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-family presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-size presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-size-adjust presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-stretch presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-style presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-variant presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-weight presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[height presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[letter-spacing presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[lighting-color presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-end presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-mid presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-start presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[mask-type presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[mask presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[opacity presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[overflow presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[pointer-events presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[r presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[rx presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[ry presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stop-color presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stop-opacity presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-anchor presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-decoration presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-overflow presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform-origin presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[unicode-bidi presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[vector-effect presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[visibility presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[white-space presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[width presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[word-spacing presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[writing-mode presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[x presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[y presentation attribute supported on an irrelevant element]
|
||||||
|
expected: FAIL
|
@ -0,0 +1,13 @@
|
|||||||
|
[presentation-attributes-relevant.html]
|
||||||
|
[color-interpolation presentation attribute supported on a relevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-overflow presentation attribute supported on a relevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform presentation attribute supported on a relevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[white-space presentation attribute supported on a relevant element]
|
||||||
|
expected: FAIL
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
[presentation-attributes-special-cases.html]
|
||||||
|
[x, y, width, and height presentation attributes supported on svg element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[x, y, width, and height presentation attributes supported on symbol element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[x, y, width, and height presentation attributes supported on use element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform presentation attribute supported on g]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[patternTransform presentation attribute supported on pattern]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[patternTransform presentation attribute supported on linearGradient]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[patternTransform presentation attribute supported on radialGradient]
|
||||||
|
expected: FAIL
|
@ -0,0 +1,192 @@
|
|||||||
|
[presentation-attributes-unknown.html]
|
||||||
|
[clip-path presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[clip-rule presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[color presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[color-interpolation-filters presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[color-interpolation presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[cursor presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[direction presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[display presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[dominant-baseline presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[fill presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[fill-opacity presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[fill-rule presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[filter presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[flood-color presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[flood-opacity presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-family presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-size presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-size-adjust presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-stretch presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-style presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-variant presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[font-weight presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[height presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[image-rendering presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[letter-spacing presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[lighting-color presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-end presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-mid presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[marker-start presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[mask-type presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[mask presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[opacity presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[overflow presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[paint-order presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[pointer-events presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[r presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[rx presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[ry presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[shape-rendering presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stop-color presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stop-opacity presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-dasharray presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-dashoffset presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-linecap presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-linejoin presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-miterlimit presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-opacity presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[stroke-width presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-anchor presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-decoration presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-overflow presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[text-rendering presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform-origin presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[transform presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[unicode-bidi presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[vector-effect presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[visibility presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[white-space presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[width presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[word-spacing presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[writing-mode presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[x presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[y presentation attribute supported on an unknown SVG element]
|
||||||
|
expected: FAIL
|
@ -1,7 +1,7 @@
|
|||||||
[idlharness.https.window.html]
|
[idlharness.https.window.html]
|
||||||
expected:
|
expected:
|
||||||
if not debug and (os == "linux"): TIMEOUT
|
if not debug and not webrender and (os == "win") and (processor == "x86"): ["OK", "TIMEOUT"]
|
||||||
if not debug and (os == "win"): TIMEOUT
|
if not debug and not webrender and (os == "linux"): ["OK", "TIMEOUT"]
|
||||||
[MediaStreamTrack interface: track must inherit property "isolated" with the proper type]
|
[MediaStreamTrack interface: track must inherit property "isolated" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
@ -61,5 +61,6 @@
|
|||||||
|
|
||||||
[idl_test setup]
|
[idl_test setup]
|
||||||
expected:
|
expected:
|
||||||
if not debug and (os == "linux"): TIMEOUT
|
if not debug and not webrender and (os == "win") and (processor == "x86"): ["PASS", "TIMEOUT"]
|
||||||
if not debug and (os == "win"): TIMEOUT
|
if not debug and not webrender and (os == "linux"): ["PASS", "TIMEOUT"]
|
||||||
|
|
||||||
|
@ -1,49 +1,45 @@
|
|||||||
[RTCPeerConnection-createDataChannel.html]
|
[RTCPeerConnection-createDataChannel.html]
|
||||||
[createDataChannel attribute default values]
|
[createDataChannel attribute default values]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with provided parameters should initialize attributes to provided values]
|
[createDataChannel with provided parameters should initialize attributes to provided values]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531900
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531900
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with negotiated true should succeed]
|
[createDataChannel with negotiated true should succeed]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1529695
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1529695
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with priority "high" should succeed]
|
[createDataChannel with priority "high" should succeed]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with invalid priority should throw TypeError]
|
[createDataChannel with invalid priority should throw TypeError]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[Channels created after SCTP transport is established should have id assigned]
|
[Channels created after SCTP transport is established should have id assigned]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1526253
|
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]
|
[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
|
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]
|
[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
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[Reusing a data channel id that is in use should throw OperationError]
|
[Reusing a data channel id that is in use should throw OperationError]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1547106
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with negotiated true and id null should throw TypeError]
|
[createDataChannel with negotiated true and id null should throw TypeError]
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
[createDataChannel with both maxPacketLifeTime and maxRetransmits null should succeed]
|
[createDataChannel with both maxPacketLifeTime and maxRetransmits null should succeed]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1550497
|
||||||
|
|
||||||
[Channels created (after setRemoteDescription) should have id assigned]
|
|
||||||
expected: FAIL
|
|
||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=797135
|
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1531100
|
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]
|
[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
|
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]
|
[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
|
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1551589
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -2,3 +2,12 @@ This directory contains the common infrastructure for the following tests.
|
|||||||
- referrer-policy/
|
- referrer-policy/
|
||||||
- mixed-content/
|
- mixed-content/
|
||||||
- upgrade-insecure-requests/
|
- upgrade-insecure-requests/
|
||||||
|
|
||||||
|
Subdirectories:
|
||||||
|
- `subresource`:
|
||||||
|
Serves subresources, with support for redirects, stash, etc.
|
||||||
|
The subresource paths are managed by `subresourceMap` and
|
||||||
|
fetched in `requestVia*()` functions in `resources/common.js`.
|
||||||
|
- `scope`:
|
||||||
|
Serves nested contexts, such as iframe documents or workers.
|
||||||
|
Used from `invokeFrom*()` functions in `resources/common.js`.
|
||||||
|
@ -5,6 +5,133 @@
|
|||||||
* method's JSDoc.
|
* 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) {
|
function timeoutPromise(t, ms) {
|
||||||
return new Promise(resolve => { t.step_timeout(resolve, ms); });
|
return new Promise(resolve => { t.step_timeout(resolve, ms); });
|
||||||
}
|
}
|
||||||
@ -70,8 +197,16 @@ function xhrRequest(url, responseType) {
|
|||||||
*/
|
*/
|
||||||
function setAttributes(el, attrs) {
|
function setAttributes(el, attrs) {
|
||||||
attrs = attrs || {}
|
attrs = attrs || {}
|
||||||
for (var attr in attrs)
|
for (var attr in attrs) {
|
||||||
el.setAttribute(attr, attrs[attr]);
|
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);
|
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
|
@typedef RequestResult
|
||||||
* requests with objects of the same "type", i.e. objects that contains
|
@type {object}
|
||||||
* the same sets of keys that are fixed within one category of tests (e.g.
|
Represents the result of sending an request.
|
||||||
* within wpt/referrer-policy tests).
|
All properties are optional. See the comments for
|
||||||
* wrapResult() (that should be defined outside this file) is used to convert
|
requestVia*() and invokeRequest() below to see which properties are set.
|
||||||
* the response bodies of subresources into the expected result objects in some
|
|
||||||
* cases, and in other cases the result objects are constructed more directly.
|
@property {Array<Object<string, string>>} headers
|
||||||
* TODO(https://crbug.com/906850): Clean up the semantics around this, e.g.
|
HTTP request headers sent to server.
|
||||||
* use (or not use) wrapResult() consistently, unify the arguments, etc.
|
@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
|
* Creates a new iframe, binds load and error events, sets the src attribute and
|
||||||
@ -218,7 +425,8 @@ function requestViaIframe(url, additionalAttributes) {
|
|||||||
false);
|
false);
|
||||||
return bindEvents2(window, "message", iframe, "error", window, "error")
|
return bindEvents2(window, "message", iframe, "error", window, "error")
|
||||||
.then(event => {
|
.then(event => {
|
||||||
assert_equals(event.source, iframe.contentWindow);
|
if (event.source !== iframe.contentWindow)
|
||||||
|
return Promise.reject(new Error('Unexpected event.source'));
|
||||||
return event.data;
|
return event.data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -229,119 +437,64 @@ function requestViaIframe(url, additionalAttributes) {
|
|||||||
* @param {string} url The src for the image.
|
* @param {string} url The src for the image.
|
||||||
* @return {Promise} The promise for success/error events.
|
* @return {Promise} The promise for success/error events.
|
||||||
*/
|
*/
|
||||||
function requestViaImage(url) {
|
function requestViaImage(url, additionalAttributes) {
|
||||||
return createRequestViaElement("img", {"src": url}, document.body);
|
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().
|
// Helper for requestViaImage().
|
||||||
function loadImageInWindow(src, attributes, w) {
|
function decodeImageData(img) {
|
||||||
return new Promise((resolve, reject) => {
|
var canvas = document.createElement("canvas");
|
||||||
var image = new w.Image();
|
var context = canvas.getContext('2d');
|
||||||
image.crossOrigin = "Anonymous";
|
context.drawImage(img, 0, 0);
|
||||||
image.onload = function() {
|
var imgData = context.getImageData(0, 0, img.clientWidth, img.clientHeight);
|
||||||
resolve(image);
|
const rgba = imgData.data;
|
||||||
};
|
|
||||||
|
|
||||||
// Extend element with attributes. (E.g. "referrerPolicy" or "rel")
|
let decodedBytes = new Uint8ClampedArray(rgba.length);
|
||||||
if (attributes) {
|
let decodedLength = 0;
|
||||||
for (var attr in attributes) {
|
|
||||||
image[attr] = attributes[attr];
|
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.
|
// Zero is the string terminator.
|
||||||
if (rgba[i] == 0)
|
if (byte == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
rgb[rgb_length++] = rgba[i];
|
decodedBytes[decodedLength++] = byte;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove trailing nulls from data.
|
// Remove trailing nulls from data.
|
||||||
rgb = rgb.subarray(0, rgb_length);
|
decodedBytes = decodedBytes.subarray(0, decodedLength);
|
||||||
var string_data = (new TextDecoder("ascii")).decode(rgb);
|
var string_data = (new TextDecoder("ascii")).decode(decodedBytes);
|
||||||
|
|
||||||
return JSON.parse(string_data);
|
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.
|
* Initiates a new XHR GET request to provided URL.
|
||||||
* @param {string} url The endpoint URL for the XHR.
|
* @param {string} url The endpoint URL for the XHR.
|
||||||
@ -365,8 +518,9 @@ function requestViaFetch(url) {
|
|||||||
function dedicatedWorkerUrlThatFetches(url) {
|
function dedicatedWorkerUrlThatFetches(url) {
|
||||||
return `data:text/javascript,
|
return `data:text/javascript,
|
||||||
fetch('${url}')
|
fetch('${url}')
|
||||||
.then(() => postMessage(''),
|
.then(r => r.json())
|
||||||
() => postMessage(''));`;
|
.then(j => postMessage(j))
|
||||||
|
.catch((e) => postMessage(e.message));`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function workerUrlThatImports(url) {
|
function workerUrlThatImports(url) {
|
||||||
@ -417,8 +571,7 @@ function get_worklet(type) {
|
|||||||
if (type == 'audio')
|
if (type == 'audio')
|
||||||
return new OfflineAudioContext(2,44100*40,44100).audioWorklet;
|
return new OfflineAudioContext(2,44100*40,44100).audioWorklet;
|
||||||
|
|
||||||
assert_unreached('unknown worklet type is passed.');
|
throw new Error('unknown worklet type is passed.');
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function requestViaWorklet(type, url) {
|
function requestViaWorklet(type, url) {
|
||||||
@ -446,7 +599,8 @@ function requestViaNavigable(navigableElement, url) {
|
|||||||
const promise =
|
const promise =
|
||||||
bindEvents2(window, "message", iframe, "error", window, "error")
|
bindEvents2(window, "message", iframe, "error", window, "error")
|
||||||
.then(event => {
|
.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;
|
return event.data;
|
||||||
});
|
});
|
||||||
navigableElement.click();
|
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
|
// SanityChecker does nothing in release mode. See sanity-checker.js for debug
|
||||||
// mode.
|
// mode.
|
||||||
function SanityChecker() {}
|
function SanityChecker() {}
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Access-Control-Allow-Origin: *
|
@ -0,0 +1,35 @@
|
|||||||
|
import os, sys, json
|
||||||
|
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
import util
|
||||||
|
|
||||||
|
|
||||||
|
def main(request, response):
|
||||||
|
policyDeliveries = json.loads(request.GET.first("policyDeliveries", "[]"))
|
||||||
|
maybe_additional_headers = {}
|
||||||
|
meta = ''
|
||||||
|
error = ''
|
||||||
|
for delivery in policyDeliveries:
|
||||||
|
if delivery['deliveryType'] == 'meta':
|
||||||
|
if delivery['key'] == 'referrerPolicy':
|
||||||
|
meta += '<meta name="referrer" content="%s">' % delivery['value']
|
||||||
|
else:
|
||||||
|
error = 'invalid delivery key'
|
||||||
|
elif delivery['deliveryType'] == 'http-rp':
|
||||||
|
if delivery['key'] == 'referrerPolicy':
|
||||||
|
maybe_additional_headers['Referrer-Policy'] = delivery['value']
|
||||||
|
else:
|
||||||
|
error = 'invalid delivery key'
|
||||||
|
else:
|
||||||
|
error = 'invalid deliveryType'
|
||||||
|
|
||||||
|
handler = lambda: util.get_template("document.html.template") % ({
|
||||||
|
"meta": meta,
|
||||||
|
"error": error
|
||||||
|
})
|
||||||
|
util.respond(
|
||||||
|
request,
|
||||||
|
response,
|
||||||
|
payload_generator=handler,
|
||||||
|
content_type="text/html",
|
||||||
|
maybe_additional_headers=maybe_additional_headers)
|
@ -0,0 +1,30 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
%(meta)s
|
||||||
|
<script src="/common/security-features/resources/common.js"></script>
|
||||||
|
<script>
|
||||||
|
// Receive a message from the parent and start the test.
|
||||||
|
function onMessageFromParent(event) {
|
||||||
|
// Because this window might receive messages from child iframe during
|
||||||
|
// tests, we first remove the listener here before staring the test.
|
||||||
|
window.removeEventListener('message', onMessageFromParent);
|
||||||
|
|
||||||
|
const configurationError = "%(error)s";
|
||||||
|
if (configurationError.length > 0) {
|
||||||
|
parent.postMessage({error: configurationError}, "*");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeRequest(event.data.subresource,
|
||||||
|
event.data.sourceContextList)
|
||||||
|
.then(result => parent.postMessage(result, "*"))
|
||||||
|
.catch(e => {
|
||||||
|
const message = (e.error && e.error.stack) || e.message || "Error";
|
||||||
|
parent.postMessage({error: message}, "*");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
window.addEventListener('message', onMessageFromParent);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
</html>
|
@ -0,0 +1,24 @@
|
|||||||
|
%(import)s
|
||||||
|
|
||||||
|
// Receive a message from the parent and start the test.
|
||||||
|
function onMessageFromParent(event) {
|
||||||
|
// Because this window might receive messages from child context during
|
||||||
|
// tests, we first remove the listener here before staring the test.
|
||||||
|
self.removeEventListener('message', onMessageFromParent);
|
||||||
|
|
||||||
|
const configurationError = "%(error)s";
|
||||||
|
if (configurationError.length > 0) {
|
||||||
|
postMessage({error: configurationError});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeRequest(event.data.subresource,
|
||||||
|
event.data.sourceContextList)
|
||||||
|
.then(result => postMessage(result))
|
||||||
|
.catch(e => {
|
||||||
|
const message = (e.error && e.error.stack) || e.message || "Error";
|
||||||
|
postMessage({error: message});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
self.addEventListener('message', onMessageFromParent);
|
@ -0,0 +1,42 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def get_template(template_basename):
|
||||||
|
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
template_directory = os.path.abspath(
|
||||||
|
os.path.join(script_directory, "template"))
|
||||||
|
template_filename = os.path.join(template_directory, template_basename)
|
||||||
|
|
||||||
|
with open(template_filename, "r") as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
|
|
||||||
|
def __noop(request, response):
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def respond(request,
|
||||||
|
response,
|
||||||
|
status_code=200,
|
||||||
|
content_type="text/html",
|
||||||
|
payload_generator=__noop,
|
||||||
|
cache_control="no-cache; must-revalidate",
|
||||||
|
access_control_allow_origin="*",
|
||||||
|
maybe_additional_headers=None):
|
||||||
|
response.add_required_headers = False
|
||||||
|
response.writer.write_status(status_code)
|
||||||
|
|
||||||
|
if access_control_allow_origin != None:
|
||||||
|
response.writer.write_header("access-control-allow-origin",
|
||||||
|
access_control_allow_origin)
|
||||||
|
response.writer.write_header("content-type", content_type)
|
||||||
|
response.writer.write_header("cache-control", cache_control)
|
||||||
|
|
||||||
|
additional_headers = maybe_additional_headers or {}
|
||||||
|
for header, value in additional_headers.items():
|
||||||
|
response.writer.write_header(header, value)
|
||||||
|
|
||||||
|
response.writer.end_headers()
|
||||||
|
|
||||||
|
payload = payload_generator()
|
||||||
|
response.writer.write(payload)
|
@ -0,0 +1,40 @@
|
|||||||
|
import os, sys, json
|
||||||
|
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
import util
|
||||||
|
|
||||||
|
|
||||||
|
def main(request, response):
|
||||||
|
policyDeliveries = json.loads(request.GET.first('policyDeliveries', '[]'))
|
||||||
|
worker_type = request.GET.first('type', 'classic')
|
||||||
|
commonjs_url = '%s://%s:%s/common/security-features/resources/common.js' % (
|
||||||
|
request.url_parts.scheme, request.url_parts.hostname,
|
||||||
|
request.url_parts.port)
|
||||||
|
if worker_type == 'classic':
|
||||||
|
import_line = 'importScripts("%s");' % commonjs_url
|
||||||
|
else:
|
||||||
|
import_line = 'import "%s";' % commonjs_url
|
||||||
|
|
||||||
|
maybe_additional_headers = {}
|
||||||
|
error = ''
|
||||||
|
for delivery in policyDeliveries:
|
||||||
|
if delivery['deliveryType'] == 'meta':
|
||||||
|
error = '<meta> cannot be used in WorkerGlobalScope'
|
||||||
|
elif delivery['deliveryType'] == 'http-rp':
|
||||||
|
if delivery['key'] == 'referrerPolicy':
|
||||||
|
maybe_additional_headers['Referrer-Policy'] = delivery['value']
|
||||||
|
else:
|
||||||
|
error = 'invalid delivery key for http-rp: %s' % delivery['key']
|
||||||
|
else:
|
||||||
|
error = 'invalid deliveryType: %s' % delivery['deliveryType']
|
||||||
|
|
||||||
|
handler = lambda: util.get_template('worker.js.template') % ({
|
||||||
|
'import': import_line,
|
||||||
|
'error': error
|
||||||
|
})
|
||||||
|
util.respond(
|
||||||
|
request,
|
||||||
|
response,
|
||||||
|
payload_generator=handler,
|
||||||
|
content_type='text/javascript',
|
||||||
|
maybe_additional_headers=maybe_additional_headers)
|
@ -0,0 +1,17 @@
|
|||||||
|
import os, sys
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
import subresource
|
||||||
|
|
||||||
|
def generate_payload(request, server_data):
|
||||||
|
file = os.path.join(request.doc_root, "webaudio", "resources",
|
||||||
|
"sin_440Hz_-6dBFS_1s.wav")
|
||||||
|
return open(file, "rb").read()
|
||||||
|
|
||||||
|
|
||||||
|
def main(request, response):
|
||||||
|
handler = lambda data: generate_payload(request, data)
|
||||||
|
subresource.respond(request,
|
||||||
|
response,
|
||||||
|
payload_generator = handler,
|
||||||
|
access_control_allow_origin = "*",
|
||||||
|
content_type = "audio/wav")
|
@ -1,6 +1,5 @@
|
|||||||
import os, json, sys
|
import os, sys
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
import subresource
|
import subresource
|
||||||
|
|
||||||
def generate_payload(server_data):
|
def generate_payload(server_data):
|
@ -0,0 +1,13 @@
|
|||||||
|
import os, sys
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
import subresource
|
||||||
|
|
||||||
|
def generate_payload(server_data):
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def main(request, response):
|
||||||
|
subresource.respond(request,
|
||||||
|
response,
|
||||||
|
payload_generator = generate_payload,
|
||||||
|
access_control_allow_origin = "*",
|
||||||
|
content_type = "text/plain")
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, json, base64
|
import os, sys, base64
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, array, json, math, StringIO
|
import os, sys, array, math, StringIO
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
||||||
@ -60,20 +60,17 @@ class Image:
|
|||||||
|
|
||||||
def encode_string_as_bmp_image(string_data):
|
def encode_string_as_bmp_image(string_data):
|
||||||
data_bytes = array.array("B", string_data)
|
data_bytes = array.array("B", string_data)
|
||||||
|
|
||||||
num_bytes = len(data_bytes)
|
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 = []
|
color_data = []
|
||||||
num_components = 3
|
|
||||||
rgb = [0] * num_components
|
|
||||||
i = 0
|
|
||||||
for byte in data_bytes:
|
for byte in data_bytes:
|
||||||
component_index = i % num_components
|
p = [int(x) * 255 for x in '{0:08b}'.format(byte)]
|
||||||
rgb[component_index] = byte
|
color_data.append((p[0], p[1], p[2]))
|
||||||
if component_index == (num_components - 1) or i == (num_bytes - 1):
|
color_data.append((p[3], p[4], p[5]))
|
||||||
color_data.append(tuple(rgb))
|
color_data.append((p[6], p[7], 0))
|
||||||
rgb = [0] * num_components
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# Render image.
|
# Render image.
|
||||||
num_pixels = len(color_data)
|
num_pixels = len(color_data)
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, json
|
import os, sys
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
||||||
@ -10,4 +10,3 @@ def main(request, response):
|
|||||||
response,
|
response,
|
||||||
payload_generator = generate_payload,
|
payload_generator = generate_payload,
|
||||||
content_type = "application/javascript")
|
content_type = "application/javascript")
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, json
|
import os, sys
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, json
|
import os, sys
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
||||||
@ -23,23 +23,9 @@ def generate_payload(request, server_data):
|
|||||||
"property": request.GET["property"]}
|
"property": request.GET["property"]}
|
||||||
|
|
||||||
def generate_import_rule(request, server_data):
|
def generate_import_rule(request, server_data):
|
||||||
type = 'image'
|
return "@import url('%(url)s');" % {
|
||||||
property = None;
|
"url": subresource.create_url(request, swap_origin=True,
|
||||||
if "type" in request.GET:
|
query_parameter_to_remove="import-rule")
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def generate_report_headers_payload(request, server_data):
|
def generate_report_headers_payload(request, server_data):
|
@ -1,38 +1,14 @@
|
|||||||
import os, sys, json, urlparse, urllib
|
import os, json, urllib, urlparse
|
||||||
|
|
||||||
def get_template(template_basename):
|
def get_template(template_basename):
|
||||||
script_directory = os.path.dirname(os.path.abspath(__file__))
|
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||||
template_directory = os.path.abspath(os.path.join(script_directory,
|
template_directory = os.path.abspath(os.path.join(script_directory,
|
||||||
"..",
|
|
||||||
"template"))
|
"template"))
|
||||||
template_filename = os.path.join(template_directory, template_basename);
|
template_filename = os.path.join(template_directory, template_basename);
|
||||||
|
|
||||||
with open(template_filename, "r") as f:
|
with open(template_filename, "r") as f:
|
||||||
return f.read()
|
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):
|
def redirect(url, response):
|
||||||
response.add_required_headers = False
|
response.add_required_headers = False
|
||||||
@ -43,6 +19,50 @@ def redirect(url, response):
|
|||||||
response.writer.write("")
|
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):
|
def preprocess_redirection(request, response):
|
||||||
if "redirection" not in request.GET:
|
if "redirection" not in request.GET:
|
||||||
return False
|
return False
|
||||||
@ -51,10 +71,14 @@ def preprocess_redirection(request, response):
|
|||||||
|
|
||||||
if redirection == "no-redirect":
|
if redirection == "no-redirect":
|
||||||
return False
|
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":
|
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":
|
elif redirection == "swap-origin-redirect":
|
||||||
redirect_url = create_redirect_url(request, cross_origin = True)
|
redirect_url = create_url(request, swap_origin=True)
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid redirection type '%s'" % redirection)
|
raise ValueError("Invalid redirection type '%s'" % redirection)
|
||||||
|
|
||||||
@ -62,6 +86,43 @@ def preprocess_redirection(request, response):
|
|||||||
return True
|
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):
|
def __noop(request, response):
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
@ -77,6 +138,9 @@ def respond(request,
|
|||||||
if preprocess_redirection(request, response):
|
if preprocess_redirection(request, response):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if preprocess_stash_action(request, response):
|
||||||
|
return
|
||||||
|
|
||||||
response.add_required_headers = False
|
response.add_required_headers = False
|
||||||
response.writer.write_status(status_code)
|
response.writer.write_status(status_code)
|
||||||
|
|
||||||
@ -96,5 +160,3 @@ def respond(request,
|
|||||||
|
|
||||||
payload = payload_generator(server_data)
|
payload = payload_generator(server_data)
|
||||||
response.writer.write(payload)
|
response.writer.write(payload)
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
import os, sys, json
|
import os, sys
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
import subresource
|
import subresource
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
font-family: 'wpt';
|
font-family: 'wpt';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 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 {
|
body {
|
||||||
font-family: 'wpt';
|
font-family: 'wpt';
|
@ -0,0 +1,3 @@
|
|||||||
|
div.styled::before {
|
||||||
|
content:url(/common/security-features/subresource/image.py?id=%(id)s)
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user