Bug 1776109 - Part 2: Add ServiceWorkersEnabled() for service worker interfaces exposure r=asuth

Differential Revision: https://phabricator.services.mozilla.com/D150441
This commit is contained in:
Kagami Sascha Rosylight 2022-06-30 11:33:56 +00:00
Родитель 4bbf6a056b
Коммит 6786c826fa
19 изменённых файлов: 411 добавлений и 108 удалений

Просмотреть файл

@ -16,6 +16,7 @@
#include "mozilla/dom/PushSubscriptionOptionsBinding.h"
#include "mozilla/dom/PushUtil.h"
#include "mozilla/dom/RootedDictionary.h"
#include "mozilla/dom/ServiceWorker.h"
#include "mozilla/dom/WorkerRunnable.h"
#include "mozilla/dom/WorkerScope.h"
@ -409,6 +410,10 @@ already_AddRefed<PushManager> PushManager::Constructor(GlobalObject& aGlobal,
return ret.forget();
}
bool PushManager::IsEnabled(JSContext* aCx, JSObject* aGlobal) {
return StaticPrefs::dom_push_enabled() && ServiceWorkerVisible(aCx, aGlobal);
}
already_AddRefed<Promise> PushManager::Subscribe(
const PushSubscriptionOptionsInit& aOptions, ErrorResult& aRv) {
if (mImpl) {

Просмотреть файл

@ -74,6 +74,8 @@ class PushManager final : public nsISupports, public nsWrapperCache {
const nsAString& aScope,
ErrorResult& aRv);
static bool IsEnabled(JSContext* aCx, JSObject* aGlobal);
already_AddRefed<Promise> PerformSubscriptionActionFromWorker(
SubscriptionAction aAction, ErrorResult& aRv);

Просмотреть файл

@ -7,14 +7,14 @@
#include "NavigationPreloadManager.h"
#include "ServiceWorkerUtils.h"
#include "nsNetUtil.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/dom/NavigationPreloadManagerBinding.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/ServiceWorker.h"
#include "mozilla/ipc/MessageChannel.h"
namespace mozilla::dom {
using mozilla::ipc::ResponseRejectReason;
NS_IMPL_CYCLE_COLLECTING_ADDREF(NavigationPreloadManager)
NS_IMPL_CYCLE_COLLECTING_RELEASE(NavigationPreloadManager)
@ -30,6 +30,11 @@ bool NavigationPreloadManager::IsValidHeader(const nsACString& aHeader) {
return NS_IsReasonableHTTPHeaderValue(aHeader);
}
bool NavigationPreloadManager::IsEnabled(JSContext* aCx, JSObject* aGlobal) {
return StaticPrefs::dom_serviceWorkers_navigationPreload_enabled() &&
ServiceWorkerVisible(aCx, aGlobal);
}
NavigationPreloadManager::NavigationPreloadManager(
nsCOMPtr<nsIGlobalObject>&& aGlobal,
RefPtr<ServiceWorkerRegistration::Inner>& aInner)

Просмотреть файл

@ -28,6 +28,8 @@ class NavigationPreloadManager final : public nsISupports,
static bool IsValidHeader(const nsACString& aHeader);
static bool IsEnabled(JSContext* aCx, JSObject* aGlobal);
NavigationPreloadManager(nsCOMPtr<nsIGlobalObject>&& aGlobal,
RefPtr<ServiceWorkerRegistration::Inner>& aInner);

Просмотреть файл

@ -19,9 +19,11 @@
#include "mozilla/dom/ClientIPCTypes.h"
#include "mozilla/dom/ClientState.h"
#include "mozilla/dom/MessagePortBinding.h"
#include "mozilla/dom/Navigator.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/ServiceWorkerGlobalScopeBinding.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/StorageAccess.h"
@ -29,17 +31,67 @@
# undef PostMessage
#endif
using mozilla::ErrorResult;
using namespace mozilla::dom;
namespace mozilla::dom {
bool ServiceWorkerVisible(JSContext* aCx, JSObject* aObj) {
if (NS_IsMainThread()) {
return StaticPrefs::dom_serviceWorkers_enabled();
static bool IsServiceWorkersTestingEnabledInWindow(JSObject* const aGlobal) {
if (const nsCOMPtr<nsPIDOMWindowInner> innerWindow =
Navigator::GetWindowFromGlobal(aGlobal)) {
if (auto* bc = innerWindow->GetBrowsingContext()) {
return bc->Top()->ServiceWorkersTestingEnabled();
}
}
return false;
}
bool ServiceWorkersEnabled(JSContext* aCx, JSObject* aGlobal) {
MOZ_ASSERT(NS_IsMainThread());
if (!StaticPrefs::dom_serviceWorkers_enabled()) {
return false;
}
return IS_INSTANCE_OF(ServiceWorkerGlobalScope, aObj);
// xpc::CurrentNativeGlobal below requires rooting
JS::Rooted<JSObject*> global(aCx, aGlobal);
if (const nsCOMPtr<nsIGlobalObject> global = xpc::CurrentNativeGlobal(aCx)) {
if (global->GetStorageAccess() == StorageAccess::ePrivateBrowsing) {
return false;
}
}
// Allow a webextension principal to register a service worker script with
// a moz-extension url only if 'extensions.service_worker_register.allowed'
// is true.
if (!StaticPrefs::extensions_serviceWorkerRegister_allowed()) {
nsIPrincipal* principal = nsContentUtils::SubjectPrincipal(aCx);
if (principal && BasePrincipal::Cast(principal)->AddonPolicy()) {
return false;
}
}
if (IsSecureContextOrObjectIsFromSecureContext(aCx, aGlobal)) {
return true;
}
return StaticPrefs::dom_serviceWorkers_testing_enabled() ||
IsServiceWorkersTestingEnabledInWindow(aGlobal);
}
bool ServiceWorkerVisible(JSContext* aCx, JSObject* aGlobal) {
if (NS_IsMainThread()) {
// We want to expose ServiceWorker interface only when
// navigator.serviceWorker is available. Currently it may not be available
// with some reasons:
// 1. navigator.serviceWorker is not supported in workers. (bug 1131324)
// 2. `dom.serviceWorkers.hide_in_pbmode.enabled` wants to hide it in
// private browsing mode.
return ServiceWorkersEnabled(aCx, aGlobal);
}
// We are already in ServiceWorker and interfaces need to be exposed for e.g.
// globalThis.registration.serviceWorker. Note that navigator.serviceWorker
// is still not supported. (bug 1131324)
return IS_INSTANCE_OF(ServiceWorkerGlobalScope, aGlobal);
}
// static

Просмотреть файл

@ -30,7 +30,9 @@ struct StructuredSerializeOptions;
} \
}
bool ServiceWorkerVisible(JSContext* aCx, JSObject* aObj);
bool ServiceWorkersEnabled(JSContext* aCx, JSObject* aGlobal);
bool ServiceWorkerVisible(JSContext* aCx, JSObject* aGlobal);
class ServiceWorker final : public DOMEventTargetHelper {
public:

Просмотреть файл

@ -20,7 +20,6 @@
#include "nsCycleCollectionParticipant.h"
#include "nsServiceManagerUtils.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/LoadInfo.h"
#include "mozilla/SchedulerGroup.h"
#include "mozilla/StaticPrefs_extensions.h"
@ -59,63 +58,6 @@ NS_IMPL_RELEASE_INHERITED(ServiceWorkerContainer, DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_INHERITED(ServiceWorkerContainer, DOMEventTargetHelper,
mControllerWorker, mReadyPromise)
namespace {
bool IsInPrivateBrowsing(JSContext* const aCx) {
if (const nsCOMPtr<nsIGlobalObject> global = xpc::CurrentNativeGlobal(aCx)) {
if (const nsCOMPtr<nsIPrincipal> principal = global->PrincipalOrNull()) {
return principal->GetPrivateBrowsingId() > 0;
}
}
return false;
}
bool IsServiceWorkersTestingEnabledInWindow(JSObject* const aGlobal) {
if (const nsCOMPtr<nsPIDOMWindowInner> innerWindow =
Navigator::GetWindowFromGlobal(aGlobal)) {
if (auto* bc = innerWindow->GetBrowsingContext()) {
return bc->Top()->ServiceWorkersTestingEnabled();
}
}
return false;
}
} // namespace
/* static */
bool ServiceWorkerContainer::IsEnabled(JSContext* aCx, JSObject* aGlobal) {
MOZ_ASSERT(NS_IsMainThread());
// FIXME: Why does this need to root? Shouldn't the caller root aGlobal for
// us?
JS::Rooted<JSObject*> global(aCx, aGlobal);
if (!StaticPrefs::dom_serviceWorkers_enabled()) {
return false;
}
if (IsInPrivateBrowsing(aCx)) {
return false;
}
// Allow a webextension principal to register a service worker script with
// a moz-extension url only if 'extensions.service_worker_register.allowed'
// is true.
if (!StaticPrefs::extensions_serviceWorkerRegister_allowed()) {
nsIPrincipal* principal = nsContentUtils::SubjectPrincipal(aCx);
if (principal && BasePrincipal::Cast(principal)->AddonPolicy()) {
return false;
}
}
if (IsSecureContextOrObjectIsFromSecureContext(aCx, global)) {
return true;
}
return StaticPrefs::dom_serviceWorkers_testing_enabled() ||
IsServiceWorkersTestingEnabledInWindow(global);
}
// static
already_AddRefed<ServiceWorkerContainer> ServiceWorkerContainer::Create(
nsIGlobalObject* aGlobal) {

Просмотреть файл

@ -940,14 +940,11 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PublicKeyCredential" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushManager", insecureContext: true },
"PushManager",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushSubscription", insecureContext: true },
"PushSubscription",
// IMPORTANT: Do not change this list without review from a DOM peer!
{
name: "PushSubscriptionOptions",
insecureContext: true,
},
"PushSubscriptionOptions",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "RadioNodeList", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
@ -1021,11 +1018,11 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "Selection", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ServiceWorker", insecureContext: true },
"ServiceWorker",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ServiceWorkerContainer", insecureContext: false },
"ServiceWorkerContainer",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ServiceWorkerRegistration", insecureContext: true },
"ServiceWorkerRegistration",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ScopedCredential", insecureContext: true, disabled: true },
// IMPORTANT: Do not change this list without review from a DOM peer!

Просмотреть файл

@ -7,7 +7,7 @@
* https://w3c.github.io/ServiceWorker/#navigation-preload-manager
*/
[Pref="dom.serviceWorkers.navigationPreload.enabled", SecureContext,
[Func="NavigationPreloadManager::IsEnabled", SecureContext,
Exposed=(Window,Worker)]
interface NavigationPreloadManager {
[NewObject]

Просмотреть файл

@ -263,7 +263,7 @@ partial interface Navigator {
// Service Workers/Navigation Controllers
partial interface Navigator {
[Func="ServiceWorkerContainer::IsEnabled", SameObject]
[Func="ServiceWorkersEnabled", SameObject]
readonly attribute ServiceWorkerContainer serviceWorker;
};

Просмотреть файл

@ -26,7 +26,7 @@ interface PushManagerImpl {
Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};
[Exposed=(Window,Worker), Pref="dom.push.enabled"]
[Exposed=(Window,Worker), Func="PushManager::IsEnabled"]
interface PushManager {
[Throws, ChromeOnly]
constructor(DOMString scope);

Просмотреть файл

@ -41,7 +41,7 @@ dictionary PushSubscriptionInit
EpochTimeStamp? expirationTime = null;
};
[Exposed=(Window,Worker), Pref="dom.push.enabled"]
[Exposed=(Window,Worker), Func="ServiceWorkerVisible"]
interface PushSubscription
{
[Throws, ChromeOnly]

Просмотреть файл

@ -7,7 +7,7 @@
* https://w3c.github.io/push-api/
*/
[Exposed=(Window,Worker), Pref="dom.push.enabled"]
[Exposed=(Window,Worker), Func="ServiceWorkerVisible"]
interface PushSubscriptionOptions
{
[SameObject, Throws]

Просмотреть файл

@ -8,7 +8,7 @@
*
*/
[Func="ServiceWorkerContainer::IsEnabled",
[Func="ServiceWorkersEnabled",
Exposed=Window]
interface ServiceWorkerContainer : EventTarget {
// FIXME(nsm):

Просмотреть файл

@ -9,7 +9,7 @@
* https://notifications.spec.whatwg.org/
*/
[Pref="dom.serviceWorkers.enabled",
[Func="ServiceWorkerVisible",
Exposed=(Window,Worker)]
interface ServiceWorkerRegistration : EventTarget {
readonly attribute ServiceWorker? installing;

Просмотреть файл

@ -224,8 +224,6 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "MessagePort", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
"NavigationPreloadManager",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "NetworkInformation", insecureContext: true, disabled: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "Notification", insecureContext: true },
@ -252,14 +250,6 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PromiseRejectionEvent", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushManager", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushSubscription", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{
name: "PushSubscriptionOptions",
insecureContext: true,
},
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ReadableByteStreamController", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
@ -279,8 +269,6 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "Scheduler", insecureContext: true, nightly: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ServiceWorkerRegistration", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "StorageManager", fennec: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "SubtleCrypto" },

Просмотреть файл

@ -91,6 +91,12 @@ prefs: [dom.webnotifications.requireinteraction.enabled:true, dom.webnotificatio
[Notification interface: attribute badge]
expected: FAIL
[ServiceWorkerRegistration interface: operation showNotification(DOMString, optional NotificationOptions)]
expected: FAIL
[ServiceWorkerRegistration interface: operation getNotifications(optional GetNotificationOptions)]
expected: FAIL
[idlharness.https.any.sharedworker.html]
[Notification interface: attribute image]
@ -126,3 +132,8 @@ prefs: [dom.webnotifications.requireinteraction.enabled:true, dom.webnotificatio
[Notification interface: attribute badge]
expected: FAIL
[ServiceWorkerRegistration interface: operation showNotification(DOMString, optional NotificationOptions)]
expected: FAIL
[ServiceWorkerRegistration interface: operation getNotifications(optional GetNotificationOptions)]
expected: FAIL

Просмотреть файл

@ -33,13 +33,86 @@
[PushManager interface: attribute supportedContentEncodings]
expected: FAIL
[PushManager interface: existence and properties of interface object]
expected: FAIL
[PushManager interface object name]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushManager interface: operation subscribe(optional PushSubscriptionOptionsInit)]
expected: FAIL
[PushManager interface: operation getSubscription()]
expected: FAIL
[PushManager interface: operation permissionState(optional PushSubscriptionOptionsInit)]
expected: FAIL
[ServiceWorkerRegistration interface: attribute pushManager]
expected: FAIL
[PushSubscription interface: existence and properties of interface object]
expected: FAIL
[PushSubscription interface object name]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushSubscription interface: attribute endpoint]
expected: FAIL
[PushSubscription interface: attribute expirationTime]
expected:
if (os == "mac") and debug: PASS
if (os == "android") and swgl: PASS
if (os == "linux") and debug: PASS
if os == "win": PASS
[PASS, FAIL]
expected: FAIL
[PushSubscription interface: attribute options]
expected: FAIL
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
expected: FAIL
[PushSubscription interface: operation unsubscribe()]
expected: FAIL
[PushSubscription interface: operation toJSON()]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface object]
expected: FAIL
[PushSubscriptionOptions interface object length]
expected: FAIL
[PushSubscriptionOptions interface object name]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushSubscriptionOptions interface: attribute applicationServerKey]
expected: FAIL
[idlharness.https.any.serviceworker.html]
@ -113,10 +186,83 @@
[PushManager interface: attribute supportedContentEncodings]
expected: FAIL
[PushManager interface: existence and properties of interface object]
expected: FAIL
[PushManager interface object name]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushManager interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushManager interface: operation subscribe(optional PushSubscriptionOptionsInit)]
expected: FAIL
[PushManager interface: operation getSubscription()]
expected: FAIL
[PushManager interface: operation permissionState(optional PushSubscriptionOptionsInit)]
expected: FAIL
[ServiceWorkerRegistration interface: attribute pushManager]
expected: FAIL
[PushSubscription interface: existence and properties of interface object]
expected: FAIL
[PushSubscription interface object name]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushSubscription interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushSubscription interface: attribute endpoint]
expected: FAIL
[PushSubscription interface: attribute expirationTime]
expected:
if (os == "mac") and debug: PASS
if (os == "linux") and debug: PASS
if (os == "android") and swgl: PASS
if os == "win": PASS
[PASS, FAIL]
expected: FAIL
[PushSubscription interface: attribute options]
expected: FAIL
[PushSubscription interface: operation getKey(PushEncryptionKeyName)]
expected: FAIL
[PushSubscription interface: operation unsubscribe()]
expected: FAIL
[PushSubscription interface: operation toJSON()]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface object]
expected: FAIL
[PushSubscriptionOptions interface object length]
expected: FAIL
[PushSubscriptionOptions interface object name]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PushSubscriptionOptions interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PushSubscriptionOptions interface: attribute applicationServerKey]
expected: FAIL

Просмотреть файл

@ -122,6 +122,81 @@
[ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions)]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface object]
expected: FAIL
[ServiceWorkerRegistration interface object length]
expected: FAIL
[ServiceWorkerRegistration interface object name]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[ServiceWorkerRegistration interface: attribute installing]
expected: FAIL
[ServiceWorkerRegistration interface: attribute waiting]
expected: FAIL
[ServiceWorkerRegistration interface: attribute active]
expected: FAIL
[ServiceWorkerRegistration interface: attribute navigationPreload]
expected: FAIL
[ServiceWorkerRegistration interface: attribute scope]
expected: FAIL
[ServiceWorkerRegistration interface: attribute updateViaCache]
expected: FAIL
[ServiceWorkerRegistration interface: operation update()]
expected: FAIL
[ServiceWorkerRegistration interface: operation unregister()]
expected: FAIL
[ServiceWorkerRegistration interface: attribute onupdatefound]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface object]
expected: FAIL
[NavigationPreloadManager interface object length]
expected: FAIL
[NavigationPreloadManager interface object name]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[NavigationPreloadManager interface: operation enable()]
expected: FAIL
[NavigationPreloadManager interface: operation disable()]
expected: FAIL
[NavigationPreloadManager interface: operation setHeaderValue(ByteString)]
expected: FAIL
[NavigationPreloadManager interface: operation getState()]
expected: FAIL
[idlharness.https.any.worker.html]
[ServiceWorkerContainer interface: operation startMessages()]
@ -247,11 +322,87 @@
[ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions)]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface object]
expected: FAIL
[ServiceWorkerRegistration interface object length]
expected: FAIL
[ServiceWorkerRegistration interface object name]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[ServiceWorkerRegistration interface: attribute installing]
expected: FAIL
[ServiceWorkerRegistration interface: attribute waiting]
expected: FAIL
[ServiceWorkerRegistration interface: attribute active]
expected: FAIL
[ServiceWorkerRegistration interface: attribute navigationPreload]
expected: FAIL
[ServiceWorkerRegistration interface: attribute scope]
expected: FAIL
[ServiceWorkerRegistration interface: attribute updateViaCache]
expected: FAIL
[ServiceWorkerRegistration interface: operation update()]
expected: FAIL
[ServiceWorkerRegistration interface: operation unregister()]
expected: FAIL
[ServiceWorkerRegistration interface: attribute onupdatefound]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface object]
expected: FAIL
[NavigationPreloadManager interface object length]
expected: FAIL
[NavigationPreloadManager interface object name]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[NavigationPreloadManager interface: operation enable()]
expected: FAIL
[NavigationPreloadManager interface: operation disable()]
expected: FAIL
[NavigationPreloadManager interface: operation setHeaderValue(ByteString)]
expected: FAIL
[NavigationPreloadManager interface: operation getState()]
expected: FAIL
[idlharness.https.any.html]
[CacheStorage interface object length]
expected: FAIL
[idlharness.https.any.serviceworker.html]
[ServiceWorker interface: serviceWorker must inherit property "scriptURL" with the proper type]
expected: FAIL