fix firefox bug
This commit is contained in:
parent
a1f4cb8b43
commit
bb2220e5ed
|
|
@ -515,13 +515,15 @@ export abstract class BrowserContext extends SdkObject {
|
|||
};
|
||||
const originsToSave = new Set(this._origins);
|
||||
|
||||
const collectScript = `(${storageScript.collect})((${utilityScriptSerializers.source})(), ${this._browser.options.name === 'firefox'})`;
|
||||
|
||||
// First try collecting storage stage from existing pages.
|
||||
for (const page of this.pages()) {
|
||||
const origin = page.mainFrame().origin();
|
||||
if (!origin || !originsToSave.has(origin))
|
||||
continue;
|
||||
try {
|
||||
const storage: storageScript.Storage = await page.mainFrame().nonStallingEvaluateInExistingContext(`(${storageScript.collect})((${utilityScriptSerializers.source})())`, 'utility');
|
||||
const storage: storageScript.Storage = await page.mainFrame().nonStallingEvaluateInExistingContext(collectScript, 'utility');
|
||||
if (storage.localStorage.length || storage.indexedDB.length)
|
||||
result.origins.push({ origin, localStorage: storage.localStorage, indexedDB: storage.indexedDB });
|
||||
originsToSave.delete(origin);
|
||||
|
|
@ -541,7 +543,7 @@ export abstract class BrowserContext extends SdkObject {
|
|||
for (const origin of originsToSave) {
|
||||
const frame = page.mainFrame();
|
||||
await frame.goto(internalMetadata, origin);
|
||||
const storage: Awaited<ReturnType<typeof storageScript.collect>> = await frame.evaluateExpression(`(${storageScript.collect})((${utilityScriptSerializers.source})())`, { world: 'utility' });
|
||||
const storage: storageScript.Storage = await frame.evaluateExpression(collectScript, { world: 'utility' });
|
||||
if (storage.localStorage.length || storage.indexedDB.length)
|
||||
result.origins.push({ origin, localStorage: storage.localStorage, indexedDB: storage.indexedDB });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ import type { source } from './isomorphic/utilityScriptSerializers';
|
|||
|
||||
export type Storage = Omit<channels.OriginStorage, 'origin'>;
|
||||
|
||||
export async function collect(serializers: ReturnType<typeof source>): Promise<Storage> {
|
||||
export async function collect(serializers: ReturnType<typeof source>, isFirefox: boolean): Promise<Storage> {
|
||||
const idbResult = await Promise.all((await indexedDB.databases()).map(async dbInfo => {
|
||||
if (!dbInfo.name)
|
||||
throw new Error('Database name is empty');
|
||||
|
|
@ -33,11 +33,26 @@ export async function collect(serializers: ReturnType<typeof source>): Promise<S
|
|||
});
|
||||
}
|
||||
|
||||
function isPlainObject(v: any) {
|
||||
const ctor = v?.constructor;
|
||||
if (ctor === Object)
|
||||
return true;
|
||||
|
||||
// firefox bug. the above check doesn't work in the utility world.
|
||||
if (isFirefox) {
|
||||
const constructorImpl = ctor?.toString();
|
||||
if (constructorImpl.startsWith('function Object() {') && constructorImpl.includes(' [native code]'))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function trySerialize(value: any): { trivial?: any, encoded?: any } {
|
||||
let trivial = true;
|
||||
const encoded = serializers.serializeAsCallArgument(value, v => {
|
||||
const isTrivial = (
|
||||
v?.constructor === Object
|
||||
isPlainObject(v)
|
||||
|| Array.isArray(v)
|
||||
|| typeof v === 'string'
|
||||
|| typeof v === 'number'
|
||||
|
|
|
|||
Loading…
Reference in a new issue