ScriptPromise ServiceWorkerClients::openWindow(ScriptState* scriptState, const String& url) { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); ExecutionContext* context = scriptState->getExecutionContext(); KURL parsedUrl = KURL(toWorkerGlobalScope(context)->location()->url(), url); if (!parsedUrl.isValid()) { resolver->reject(V8ThrowException::createTypeError( scriptState->isolate(), "'" + url + "' is not a valid URL.")); return promise; } if (!context->getSecurityOrigin()->canDisplay(parsedUrl)) { resolver->reject(V8ThrowException::createTypeError( scriptState->isolate(), "'" + parsedUrl.elidedString() + "' cannot be opened.")); return promise; } if (!context->isWindowInteractionAllowed()) { resolver->reject(DOMException::create(InvalidAccessError, "Not allowed to open a window.")); return promise; } context->consumeWindowInteraction(); ServiceWorkerGlobalScopeClient::from(context)->openWindow( parsedUrl, WTF::makeUnique<NavigateClientCallback>(resolver)); return promise; }