@quick-game/cli
Version:
Command line interface for rapid qg development
122 lines • 5.07 kB
JavaScript
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as Common from '../common/common.js';
import * as Root from '../root/root.js';
import { Cookie } from './Cookie.js';
import { ResourceTreeModel } from './ResourceTreeModel.js';
import { Capability } from './Target.js';
import { SDKModel } from './SDKModel.js';
export class CookieModel extends SDKModel {
#blockedCookies;
#cookieToBlockedReasons;
constructor(target) {
super(target);
this.#blockedCookies = new Map();
this.#cookieToBlockedReasons = new Map();
}
addBlockedCookie(cookie, blockedReasons) {
const key = cookie.key();
const previousCookie = this.#blockedCookies.get(key);
this.#blockedCookies.set(key, cookie);
if (blockedReasons) {
this.#cookieToBlockedReasons.set(cookie, blockedReasons);
}
else {
this.#cookieToBlockedReasons.delete(cookie);
}
if (previousCookie) {
this.#cookieToBlockedReasons.delete(previousCookie);
}
}
getCookieToBlockedReasonsMap() {
return this.#cookieToBlockedReasons;
}
async getCookies(urls) {
const response = await this.target().networkAgent().invoke_getCookies({ urls });
if (response.getError()) {
return [];
}
const normalCookies = response.cookies.map(Cookie.fromProtocolCookie);
return normalCookies.concat(Array.from(this.#blockedCookies.values()));
}
async deleteCookie(cookie) {
await this.deleteCookies([cookie]);
}
async clear(domain, securityOrigin) {
const cookies = await this.getCookiesForDomain(domain || null);
if (securityOrigin) {
const cookiesToDelete = cookies.filter(cookie => {
return cookie.matchesSecurityOrigin(securityOrigin);
});
await this.deleteCookies(cookiesToDelete);
}
else {
await this.deleteCookies(cookies);
}
}
async saveCookie(cookie) {
let domain = cookie.domain();
if (!domain.startsWith('.')) {
domain = '';
}
let expires = undefined;
if (cookie.expires()) {
expires = Math.floor(Date.parse(`${cookie.expires()}`) / 1000);
}
const enabled = Root.Runtime.experiments.isEnabled('experimentalCookieFeatures');
const preserveUnset = (scheme) => scheme === "Unset" /* Protocol.Network.CookieSourceScheme.Unset */ ? scheme : undefined;
const protocolCookie = {
name: cookie.name(),
value: cookie.value(),
url: cookie.url() || undefined,
domain,
path: cookie.path(),
secure: cookie.secure(),
httpOnly: cookie.httpOnly(),
sameSite: cookie.sameSite(),
expires,
priority: cookie.priority(),
partitionKey: cookie.partitionKey(),
sourceScheme: enabled ? cookie.sourceScheme() : preserveUnset(cookie.sourceScheme()),
sourcePort: enabled ? cookie.sourcePort() : undefined,
};
const response = await this.target().networkAgent().invoke_setCookie(protocolCookie);
const error = response.getError();
if (error || !response.success) {
return false;
}
return response.success;
}
/**
* Returns cookies needed by current page's frames whose security origins are |domain|.
*/
getCookiesForDomain(domain) {
const resourceURLs = [];
function populateResourceURLs(resource) {
const documentURL = Common.ParsedURL.ParsedURL.fromString(resource.documentURL);
if (documentURL && (!domain || documentURL.securityOrigin() === domain)) {
resourceURLs.push(resource.url);
}
return false;
}
const resourceTreeModel = this.target().model(ResourceTreeModel);
if (resourceTreeModel) {
// In case the current frame was unreachable, add it's cookies
// because they might help to debug why the frame was unreachable.
if (resourceTreeModel.mainFrame && resourceTreeModel.mainFrame.unreachableUrl()) {
resourceURLs.push(resourceTreeModel.mainFrame.unreachableUrl());
}
resourceTreeModel.forAllResources(populateResourceURLs);
}
return this.getCookies(resourceURLs);
}
async deleteCookies(cookies) {
const networkAgent = this.target().networkAgent();
this.#blockedCookies.clear();
this.#cookieToBlockedReasons.clear();
await Promise.all(cookies.map(cookie => networkAgent.invoke_deleteCookies({ name: cookie.name(), url: undefined, domain: cookie.domain(), path: cookie.path() })));
}
}
SDKModel.register(CookieModel, { capabilities: Capability.Network, autostart: false });
//# sourceMappingURL=CookieModel.js.map