brave-real-playwright-core
Version:
Brave-optimized Playwright Core (v1.55.0) with comprehensive stealth patches and error stack sanitization
158 lines (157 loc) • 6.1 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var recorderUtils_exports = {};
__export(recorderUtils_exports, {
buildFullSelector: () => buildFullSelector,
collapseActions: () => collapseActions,
frameForAction: () => frameForAction,
generateFrameSelector: () => generateFrameSelector,
mainFrameForAction: () => mainFrameForAction,
metadataToCallLog: () => metadataToCallLog,
shouldMergeAction: () => shouldMergeAction
});
module.exports = __toCommonJS(recorderUtils_exports);
var import_protocolFormatter = require("../../utils/isomorphic/protocolFormatter");
var import_utils = require("../../utils");
var import_timeoutRunner = require("../../utils/isomorphic/timeoutRunner");
function buildFullSelector(framePath, selector) {
return [...framePath, selector].join(" >> internal:control=enter-frame >> ");
}
function metadataToCallLog(metadata, status) {
const title = (0, import_protocolFormatter.renderTitleForCall)(metadata);
if (metadata.error)
status = "error";
const params = {
url: metadata.params?.url,
selector: metadata.params?.selector
};
let duration = metadata.endTime ? metadata.endTime - metadata.startTime : void 0;
if (typeof duration === "number" && metadata.pauseStartTime && metadata.pauseEndTime) {
duration -= metadata.pauseEndTime - metadata.pauseStartTime;
duration = Math.max(duration, 0);
}
const callLog = {
id: metadata.id,
messages: metadata.log,
title: title ?? "",
status,
error: metadata.error?.error?.message,
params,
duration
};
return callLog;
}
function mainFrameForAction(pageAliases, actionInContext) {
const pageAlias = actionInContext.frame.pageAlias;
const page = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)?.[0];
if (!page)
throw new Error(`Internal error: page ${pageAlias} not found in [${[...pageAliases.values()]}]`);
return page.mainFrame();
}
async function frameForAction(pageAliases, actionInContext, action) {
const pageAlias = actionInContext.frame.pageAlias;
const page = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)?.[0];
if (!page)
throw new Error("Internal error: page not found");
const fullSelector = buildFullSelector(actionInContext.frame.framePath, action.selector);
const result = await page.mainFrame().selectors.resolveFrameForSelector(fullSelector);
if (!result)
throw new Error("Internal error: frame not found");
return result.frame;
}
function isSameAction(a, b) {
return a.action.name === b.action.name && a.frame.pageAlias === b.frame.pageAlias && a.frame.framePath.join("|") === b.frame.framePath.join("|");
}
function isSameSelector(action, lastAction) {
return "selector" in action.action && "selector" in lastAction.action && action.action.selector === lastAction.action.selector;
}
function isShortlyAfter(action, lastAction) {
return action.startTime - lastAction.startTime < 500;
}
function shouldMergeAction(action, lastAction) {
if (!lastAction)
return false;
switch (action.action.name) {
case "fill":
return isSameAction(action, lastAction) && isSameSelector(action, lastAction);
case "navigate":
return isSameAction(action, lastAction);
case "click":
return isSameAction(action, lastAction) && isSameSelector(action, lastAction) && isShortlyAfter(action, lastAction) && action.action.clickCount > lastAction.action.clickCount;
}
return false;
}
function collapseActions(actions) {
const result = [];
for (const action of actions) {
const lastAction = result[result.length - 1];
const shouldMerge = shouldMergeAction(action, lastAction);
if (!shouldMerge) {
result.push(action);
continue;
}
const startTime = result[result.length - 1].startTime;
result[result.length - 1] = action;
result[result.length - 1].startTime = startTime;
}
return result;
}
async function generateFrameSelector(frame) {
const selectorPromises = [];
while (frame) {
const parent = frame.parentFrame();
if (!parent)
break;
selectorPromises.push(generateFrameSelectorInParent(parent, frame));
frame = parent;
}
const result = await Promise.all(selectorPromises);
return result.reverse();
}
async function generateFrameSelectorInParent(parent, frame) {
const result = await (0, import_timeoutRunner.raceAgainstDeadline)(async () => {
try {
const frameElement = await frame.frameElement();
if (!frameElement || !parent)
return;
const utility = await parent._utilityContext();
const injected = await utility.injectedScript();
const selector = await injected.evaluate((injected2, element) => {
return injected2.generateSelectorSimple(element);
}, frameElement);
return selector;
} catch (e) {
}
}, (0, import_utils.monotonicTime)() + 2e3);
if (!result.timedOut && result.result)
return result.result;
if (frame.name())
return `iframe[name=${(0, import_utils.quoteCSSAttributeValue)(frame.name())}]`;
return `iframe[src=${(0, import_utils.quoteCSSAttributeValue)(frame.url())}]`;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
buildFullSelector,
collapseActions,
frameForAction,
generateFrameSelector,
mainFrameForAction,
metadataToCallLog,
shouldMergeAction
});