@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 22.7 kB
JavaScript
import*as Common from"../../core/common/common.js";import*as Platform from"../../core/platform/platform.js";import*as ProtocolClientModule from"../../core/protocol_client/protocol_client.js";import*as Root from"../../core/root/root.js";import*as Bindings from"../../models/bindings/bindings.js";import*as Workspace from"../../models/workspace/workspace.js";import*as CodeHighlighter from"../../ui/components/code_highlighter/code_highlighter.js";import*as UI from"../../ui/legacy/legacy.js";self.Platform=self.Platform||{},self.Platform.StringUtilities=Platform.StringUtilities,self.Platform.MapUtilities=Platform.MapUtilities,self.Platform.ArrayUtilities=Platform.ArrayUtilities,self.Platform.DOMUtilities=Platform.DOMUtilities,self.createPlainTextSearchRegex=Platform.StringUtilities.createPlainTextSearchRegex,String.sprintf=Platform.StringUtilities.sprintf,String.regexSpecialCharacters=Platform.StringUtilities.regexSpecialCharacters,String.caseInsensetiveComparator=Platform.StringUtilities.caseInsensetiveComparator;export function isDebugTest(){return!self.testRunner||Boolean(Root.Runtime.Runtime.queryParam("debugFrontend"))}export function _printDevToolsConsole(){isDebugTest()||(console.log=(...e)=>{addResult(`log: ${e}`)},console.error=(...e)=>{addResult(`error: ${e}`)},console.info=(...e)=>{addResult(`info: ${e}`)},console.assert=(e,...t)=>{e||addResult(`ASSERTION FAILURE: ${t.join(" ")}`)})}self.onerror=(e,t,n,o,r)=>{addResult("TEST ENDED IN ERROR: "+r.stack),completeTest()},self.addEventListener("unhandledrejection",(e=>{addResult(`PROMISE FAILURE: ${e.reason.stack}`),completeTest()})),_printDevToolsConsole();let _results=[],_innerAddResult=e=>{_results.push(String(e))};export function setInnerResult(e){_innerAddResult=e}export function addResult(e){_innerAddResult(e)}let completed=!1,_innerCompleteTest=()=>{completed||(completed=!0,flushResults(),self.testRunner.notifyDone())};export function setInnerCompleteTest(e){_innerCompleteTest=e}export function completeTest(){_innerCompleteTest()}function flushResults(){Array.prototype.forEach.call(document.documentElement.childNodes,(e=>e.remove()));const e=document.createElement("div");e.style&&(e.style.whiteSpace="pre",e.style.height="10px",e.style.overflow="hidden"),document.documentElement.appendChild(e);for(let t=0;t<_results.length;t++)e.appendChild(document.createTextNode(_results[t])),e.appendChild(document.createElement("br"));_results=[]}self.TestRunner=self.TestRunner||{};export function addResults(e){if(e)for(let t=0,n=e.length;t<n;++t)addResult(e[t])}export function runTests(e){!function t(){const n=e.shift();if(!n)return void completeTest();addResult("\ntest: "+n.name);let o=n();o instanceof Promise||(o=Promise.resolve());o.then(t)}()}export function addSniffer(e,t,n,o){n=safeWrap(n);const r=e[t];if("function"!=typeof r)throw new Error("Cannot find method to override: "+t);e[t]=function(a){let s;try{s=r.apply(this,arguments)}finally{o||(e[t]=r)}try{Array.prototype.push.call(arguments,s),n.apply(this,arguments)}catch(e){throw new Error("Exception in overriden method '"+t+"': "+e)}return s}}export function addSnifferPromise(e,t){return new Promise((function(n,o){const r=e[t];"function"==typeof r?e[t]=function(a){let s;try{s=r.apply(this,arguments)}finally{e[t]=r}try{Array.prototype.push.call(arguments,s),n.apply(this,arguments)}catch(e){o("Exception in overridden method '"+t+"': "+e),completeTest()}return s}:o("Cannot find method to override: "+t)}))}export function selectTextInTextNode(e,t,n){t=t||0,n=n||e.textContent.length,t<0&&(t=n+t);const o=e.getComponentSelection();o.removeAllRanges();const r=e.ownerDocument.createRange();return r.setStart(e,t),r.setEnd(e,n),o.addRange(r),e}const mappingForLayoutTests=new Map([["panels/animation","animation"],["panels/browser_debugger","browser_debugger"],["panels/changes","changes"],["panels/console","console"],["panels/elements","elements"],["panels/emulation","emulation"],["panels/mobile_throttling","mobile_throttling"],["panels/network","network"],["panels/profiler","profiler"],["panels/application","resources"],["panels/search","search"],["panels/sources","sources"],["panels/snippets","snippets"],["panels/settings","settings"],["panels/timeline","timeline"],["panels/web_audio","web_audio"],["models/persistence","persistence"],["models/workspace_diff","workspace_diff"],["entrypoints/main","main"],["third_party/diff","diff"],["ui/legacy/components/inline_editor","inline_editor"],["ui/legacy/components/data_grid","data_grid"],["ui/legacy/components/perf_ui","perf_ui"],["ui/legacy/components/source_frame","source_frame"],["ui/legacy/components/color_picker","color_picker"],["ui/legacy/components/cookie_table","cookie_table"],["ui/legacy/components/quick_open","quick_open"],["ui/legacy/components/utils","components"]]);export async function loadLegacyModule(e){let t=e;for(const[n,o]of mappingForLayoutTests.entries())o===e&&(t=n);await import(`../../${t}/${t.split("/").reverse()[0]}-legacy.js`)}export function showPanel(e){return UI.ViewManager.ViewManager.instance().showView(e)}export function createKeyEvent(e,t,n,o,r){return new KeyboardEvent("keydown",{key:e,bubbles:!0,cancelable:!0,ctrlKey:Boolean(t),altKey:Boolean(n),shiftKey:Boolean(o),metaKey:Boolean(r)})}export function safeWrap(e,t){return function(){if(!e)return;const n=this;try{return e.apply(n,arguments)}catch(n){addResult("Exception while running: "+e+"\n"+(n.stack||n)),t?safeWrap(t)():completeTest()}}}function safeAsyncWrap(e){return async function(){if(!e)return;const t=this;try{return await e.apply(t,arguments)}catch(t){addResult("Exception while running: "+e+"\n"+(t.stack||t)),completeTest()}}}export function textContentWithLineBreaks(e){function t(t){let n=0;for(;t&&t!==e;)"OL"!==t.nodeName||t.classList&&t.classList.contains("object-properties-section")||++n,t=t.parentNode;return Array(4*n+1).join(" ")}let n="",o=e,r=!1;for(;o.traverseNextNode(e);)if(o=o.traverseNextNode(e),o.nodeType===Node.TEXT_NODE&&o.parentNode?.nodeType!==Node.DOCUMENT_FRAGMENT_NODE)n+=o.nodeValue;else if("LI"===o.nodeName||"TR"===o.nodeName)r?r=!1:n+="\n"+t(o);else{if("STYLE"===o.nodeName){o=o.traverseNextNode(e);continue}o.classList&&o.classList.contains("object-properties-section")&&(r=!0)}return n}export function textContentWithLineBreaksTrimmed(e){return textContentWithLineBreaks(e).replace(/\s{3,}/g," ")}export function textContentWithoutStyles(e){let t="",n=e;for(;n.traverseNextNode(e);)n=n.traverseNextNode(e,"DEVTOOLS-CSS-LENGTH"===n.tagName||"DEVTOOLS-ICON"===n.tagName),n.nodeType===Node.TEXT_NODE?t+=n.nodeValue:"STYLE"===n.nodeName&&(n=n.traverseNextNode(e));return t}export async function evaluateInPageRemoteObject(e){const t=await _evaluateInPage(e);return TestRunner.runtimeModel.createRemoteObject(t.result)}export async function evaluateInPage(e,t){const n=await _evaluateInPage(e);safeWrap(t)(n.result.value,n.exceptionDetails)}let _pageLoadedCallback,_evaluateInPageCounter=0;export async function _evaluateInPage(e){const t=(new Error).stack.split("at "),n=Root.Runtime.Runtime.queryParam("test"),o=t.reduce(((e,t)=>t.includes(n)?t:e),t[t.length-2]).trim().split("/"),r=o[o.length-1].slice(0,-1).split(":"),a=r[0],s=`test://evaluations/${_evaluateInPageCounter++}/`+a,i=parseInt(r[1],10);-1===(e="\n".repeat(i-1)+e).indexOf("sourceURL=")&&(e+=`//# sourceURL=${s}`);const u=await TestRunner.RuntimeAgent.invoke_evaluate({expression:e,objectGroup:"console"}),c=u[ProtocolClientModule.InspectorBackend.ProtocolError];return c?(addResult("Error: "+c),void completeTest()):u}export async function evaluateInPageAnonymously(e,t){const n=await TestRunner.RuntimeAgent.invoke_evaluate({expression:e,objectGroup:"console",userGesture:t});if(!n[ProtocolClientModule.InspectorBackend.ProtocolError])return n.result.value;addResult("Error: "+(n.exceptionDetails&&n.exceptionDetails.text||"exception from evaluateInPageAnonymously.")),completeTest()}export function evaluateInPagePromise(e){return new Promise((t=>evaluateInPage(e,t)))}export async function evaluateInPageAsync(e){const t=await TestRunner.RuntimeAgent.invoke_evaluate({expression:e,objectGroup:"console",includeCommandLineAPI:!1,awaitPromise:!0}),n=t[ProtocolClientModule.InspectorBackend.ProtocolError];if(!n&&!t.exceptionDetails)return t.result.value;let o="Error: ";n?o+=n:t.exceptionDetails&&(o+=t.exceptionDetails.text,t.exceptionDetails.exception&&(o+=" "+t.exceptionDetails.exception.description)),addResult(o),completeTest()}export function callFunctionInPageAsync(e,t){return evaluateInPageAsync(e+"("+(t=t||[]).map((e=>JSON.stringify(e))).join(",")+")")}export function evaluateInPageWithTimeout(e,t){evaluateInPageAnonymously("setTimeout(unescape('"+escape(e)+"'), 1)",t)}export function evaluateFunctionInOverlay(e,t){const n='internals.evaluateInInspectorOverlay("(" + '+e+' + ")()")';TestRunner.runtimeModel.executionContexts()[0].evaluate({expression:n,objectGroup:"",includeCommandLineAPI:!1,silent:!1,returnByValue:!0,generatePreview:!1},!1,!1).then((e=>{t(e.object.value)}))}export function check(e,t){e||addResult("FAIL: "+t)}export function deprecatedRunAfterPendingDispatches(e){ProtocolClient.test.deprecatedRunAfterPendingDispatches(e)}export function loadHTML(e){if(!e.includes("<base")){const t=/(<!DOCTYPE.*?>)/i,n=`<base href="${url()}">`;e=e.match(t)?e.replace(t,"$1"+n):n+e}return evaluateInPageAnonymously(`document.write(\`${e=e.replace(/'/g,"\\'").replace(/\n/g,"\\n")}\`);document.close();`)}export function addScriptTag(e){return evaluateInPageAsync(`\n (function(){\n let script = document.createElement('script');\n script.src = '${e}';\n document.head.append(script);\n return new Promise(f => script.onload = f);\n })();\n `)}export function addStylesheetTag(e){return evaluateInPageAsync(`\n (function(){\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = '${e}';\n link.onload = onload;\n document.head.append(link);\n let resolve;\n const promise = new Promise(r => resolve = r);\n function onload() {\n // TODO(chenwilliam): It shouldn't be necessary to force\n // style recalc here but some tests rely on it.\n window.getComputedStyle(document.body).color;\n resolve();\n }\n return promise;\n })();\n `)}export function addIframe(e,t={}){return t.id=t.id||"",t.name=t.name||"",evaluateInPageAsync(`\n (function(){\n const iframe = document.createElement('iframe');\n iframe.src = '${e}';\n iframe.id = '${t.id}';\n iframe.name = '${t.name}';\n document.body.appendChild(iframe);\n return new Promise(f => iframe.onload = f);\n })();\n `)}export async function deprecatedInitAsync(e){await TestRunner.RuntimeAgent.invoke_evaluate({expression:e,objectGroup:"console"})}export function markStep(e){addResult("\nRunning: "+e)}export function startDumpingProtocolMessages(){ProtocolClient.test.dumpProtocol=self.testRunner.logToStderr.bind(self.testRunner)}export function addScriptForFrame(e,t,n){t+="\n//# sourceURL="+e;const o=TestRunner.runtimeModel.executionContexts().find((e=>e.frameId===n.id));TestRunner.RuntimeAgent.evaluate(t,"console",!1,!1,o.id)}export const formatters={formatAsTypeName:e=>"<"+typeof e+">",formatAsTypeNameOrNull:e=>null===e?"null":formatters.formatAsTypeName(e),formatAsRecentTime(e){if("object"!=typeof e||!(e instanceof Date))return formatters.formatAsTypeName(e);const t=Date.now()-e;return 0<=t&&t<18e5?"<plausible>":e},formatAsURL(e){if(!e)return e;const t=e.lastIndexOf("devtools/");return t<0?e:".../"+e.substr(t)},formatAsDescription:e=>e?'"'+e.replace(/^function [gs]et /,"function ")+'"':e};export function addObject(e,t,n,o){n=n||"",addResult((o=o||n)+"{");const r=Object.keys(e);r.sort();for(let o=0;o<r.length;++o){const a=r[o];if(!e.hasOwnProperty(a))continue;const s=" "+n+a+" : ",i=e[a];if(t&&t[a]){const e=t[a];if("skip"!==e){addResult(s+(0,formatters[e])(i))}}else dump(i,t," "+n,s)}addResult(n+"}")}export function addArray(e,t,n,o){n=n||"",addResult((o=o||n)+"[");for(let o=0;o<e.length;++o)dump(e[o],t,n+" ");addResult(n+"]")}export function dumpDeepInnerHTML(e){!function e(t,n){const o=[];if(n.nodeType===Node.TEXT_NODE)return void(n.parentElement&&"STYLE"===n.parentElement.nodeName||addResult(n.nodeValue));o.push("<"+n.nodeName);const r=n.attributes;for(let e=0;r&&e<r.length;++e)o.push(r[e].name+"="+r[e].value);o.push(">"),addResult(t+o.join(" "));for(let o=n.firstChild;o;o=o.nextSibling)e(t+" ",o);n.shadowRoot&&e(t+" ",n.shadowRoot),addResult(t+"</"+n.nodeName+">")}("",e)}export function deepTextContent(e){if(!e)return"";if(e.nodeType===Node.TEXT_NODE&&e.nodeValue)return e.parentElement&&"STYLE"===e.parentElement.nodeName?"":e.nodeValue;let t="";const n=e.childNodes;for(let e=0;e<n.length;++e)t+=deepTextContent(n[e]);return e.shadowRoot&&(t+=deepTextContent(e.shadowRoot)),t}export function dump(e,t,n,o){(o=o||n)&&o.length>80?addResult(o+"was skipped due to prefix length limit"):null===e?addResult(o+"null"):e&&e.constructor&&"Array"===e.constructor.name?addArray(e,t,n,o):"object"==typeof e?addObject(e,t,n,o):addResult("string"==typeof e?o+'"'+e+'"':o+e)}export function waitForEvent(e,t,n){return n=n||function(){return!0},new Promise((o=>{t.addEventListener(e,(function r(a){if(!n(a.data))return;t.removeEventListener(e,r),o(a.data)}))}))}export function waitForTarget(e){e=e||(e=>!0);for(const t of self.SDK.targetManager.targets())if(e(t))return Promise.resolve(t);return new Promise((t=>{const n={targetAdded:function(o){e(o)&&(self.SDK.targetManager.unobserveTargets(n),t(o))},targetRemoved:function(){}};self.SDK.targetManager.observeTargets(n)}))}export function waitForTargetRemoved(e){return new Promise((t=>{const n={targetRemoved:function(o){o===e&&(self.SDK.targetManager.unobserveTargets(n),t(o))},targetAdded:function(){}};self.SDK.targetManager.observeTargets(n)}))}export function waitForExecutionContext(e){return e.executionContexts().length?Promise.resolve(e.executionContexts()[0]):e.once(SDK.RuntimeModel.Events.ExecutionContextCreated)}export function waitForExecutionContextDestroyed(e){const t=e.runtimeModel;return-1===t.executionContexts().indexOf(e)?Promise.resolve():waitForEvent(SDK.RuntimeModel.Events.ExecutionContextDestroyed,t,(t=>t===e))}export function assertGreaterOrEqual(e,t,n){e<t&&addResult("FAILED: "+(n?n+": ":"")+e+" < "+t)}export function navigate(e,t){_pageLoadedCallback=safeWrap(t),TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load,_pageNavigated),evaluateInPageAnonymously("window.location.replace('"+e+"')")}export function navigatePromise(e){return new Promise((t=>navigate(e,t)))}export function _pageNavigated(){TestRunner.resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load,_pageNavigated),_handlePageLoaded()}export function hardReloadPage(e){_innerReloadPage(!0,void 0,e)}export function reloadPage(e){_innerReloadPage(!1,void 0,e)}export function reloadPageWithInjectedScript(e,t){_innerReloadPage(!1,e,t)}export function reloadPagePromise(){return new Promise((e=>reloadPage(e)))}export function _innerReloadPage(e,t,n){_pageLoadedCallback=safeWrap(n),TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load,pageLoaded),TestRunner.resourceTreeModel.reloadPage(e,t)}export function pageLoaded(){TestRunner.resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load,pageLoaded),addResult("Page reloaded."),_handlePageLoaded()}export async function _handlePageLoaded(){if(await waitForExecutionContext(TestRunner.runtimeModel),_pageLoadedCallback){const e=_pageLoadedCallback;_pageLoadedCallback=void 0,e()}}export function waitForPageLoad(e){TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load,(function t(){TestRunner.resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load,t),e()}))}export function runWhenPageLoads(e){const t=_pageLoadedCallback;_pageLoadedCallback=safeWrap((function(){t&&t(),e()}))}export function runTestSuite(e){const t=e.slice();!function e(){if(!t.length)return void completeTest();const n=t.shift();addResult(""),addResult("Running: "+/function\s([^(]*)/.exec(n)[1]),safeWrap(n)(e)}()}export async function runAsyncTestSuite(e){for(const t of e)addResult(""),addResult("Running: "+/function\s([^(]*)/.exec(t)[1]),await safeAsyncWrap(t)();completeTest()}export function assertEquals(e,t,n){if(e===t)return;let o;throw o=n?"Failure ("+n+"):":"Failure:",new Error(o+" expected <"+e+"> found <"+t+">")}export function assertTrue(e,t){assertEquals(!0,Boolean(e),t)}export function override(e,t,n,o){n=safeWrap(n);const r=e[t];if("function"!=typeof r)throw new Error("Cannot find method to override: "+t);return e[t]=function(a){try{return n.apply(this,arguments)}catch(e){throw new Error("Exception in overriden method '"+t+"': "+e)}finally{o||(e[t]=r)}},r}export function clearSpecificInfoFromStackFrames(e){let t=e.replace(/\(file:\/\/\/(?:[^)]+\)|[\w\/:-]+)/g,"(...)");return t=t.replace(/\(http:\/\/(?:[^)]+\)|[\w\/:-]+)/g,"(...)"),t=t.replace(/\(test:\/\/(?:[^)]+\)|[\w\/:-]+)/g,"(...)"),t=t.replace(/\(<anonymous>:[^)]+\)/g,"(...)"),t=t.replace(/VM\d+/g,"VM"),t.replace(/\s*at[^()]+\(native\)/g,"")}export function hideInspectorView(){UI.InspectorView.InspectorView.instance().element.setAttribute("style","display:none !important")}export function mainFrame(){return TestRunner.resourceTreeModel.mainFrame}export class StringOutputStream{constructor(e){this.callback=e,this.buffer=""}async open(e){return!0}async write(e){this.buffer+=e}async close(){this.callback(this.buffer)}}export class MockSetting{constructor(e){this.value=e}get(){return this.value}set(e){this.value=e}}export function waitForUISourceCode(e,t){function n(n){return(!t||n.project().type()===t)&&(!(!t&&n.project().type()===Workspace.Workspace.projectTypes.Service)&&!(e&&!n.url().endsWith(e)))}for(const t of self.Workspace.workspace.uiSourceCodes())if(e&&n(t))return Promise.resolve(t);return waitForEvent(Workspace.Workspace.Events.UISourceCodeAdded,self.Workspace.workspace,n)}export function waitForUISourceCodeRemoved(e){self.Workspace.workspace.once(Workspace.Workspace.Events.UISourceCodeRemoved).then(e)}export function url(e=""){const t=Root.Runtime.Runtime.queryParam("inspected_test")||Root.Runtime.Runtime.queryParam("test");return new URL(e,t+"/../").href}export function dumpSyntaxHighlight(e,t){const n=document.createElement("span");return n.textContent=e,CodeHighlighter.CodeHighlighter.highlightNode(n,t).then((function(){const t=[];for(let e=0;e<n.childNodes.length;e++)n.childNodes[e].getAttribute?t.push(n.childNodes[e].getAttribute("class")):t.push("*");addResult(e+": "+t.join(", "))}))}const findIndexesOfSubString=function(e,t){const n=[];let o=e.indexOf(t);for(;-1!==o;)n.push(o),o=e.indexOf(t,o+t.length);return n};export const findLineEndingIndexes=function(e){const t=findIndexesOfSubString(e,"\n");return t.push(e.length),t};export async function dumpInspectedPageElementText(e){addResult(await evaluateInPageAsync(`document.querySelector('${e}').innerText`))}export async function waitForPendingLiveLocationUpdates(){await Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance().pendingLiveLocationChangesPromise(),await Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding.instance().pendingLiveLocationChangesPromise()}self.testRunner,TestRunner.StringOutputStream=StringOutputStream,TestRunner.MockSetting=MockSetting,TestRunner.formatters=formatters,TestRunner.completeTest=completeTest,TestRunner.addResult=addResult,TestRunner.addResults=addResults,TestRunner.runTests=runTests,TestRunner.addSniffer=addSniffer,TestRunner.addSnifferPromise=addSnifferPromise,TestRunner.showPanel=showPanel,TestRunner.createKeyEvent=createKeyEvent,TestRunner.safeWrap=safeWrap,TestRunner.textContentWithLineBreaks=textContentWithLineBreaks,TestRunner.textContentWithLineBreaksTrimmed=textContentWithLineBreaksTrimmed,TestRunner.textContentWithoutStyles=textContentWithoutStyles,TestRunner.evaluateInPagePromise=evaluateInPagePromise,TestRunner.callFunctionInPageAsync=callFunctionInPageAsync,TestRunner.evaluateInPageWithTimeout=evaluateInPageWithTimeout,TestRunner.evaluateFunctionInOverlay=evaluateFunctionInOverlay,TestRunner.check=check,TestRunner.deprecatedRunAfterPendingDispatches=deprecatedRunAfterPendingDispatches,TestRunner.loadHTML=loadHTML,TestRunner.addScriptTag=addScriptTag,TestRunner.addStylesheetTag=addStylesheetTag,TestRunner.addIframe=addIframe,TestRunner.markStep=markStep,TestRunner.startDumpingProtocolMessages=startDumpingProtocolMessages,TestRunner.addScriptForFrame=addScriptForFrame,TestRunner.addObject=addObject,TestRunner.addArray=addArray,TestRunner.dumpDeepInnerHTML=dumpDeepInnerHTML,TestRunner.deepTextContent=deepTextContent,TestRunner.dump=dump,TestRunner.waitForEvent=waitForEvent,TestRunner.waitForTarget=waitForTarget,TestRunner.waitForTargetRemoved=waitForTargetRemoved,TestRunner.waitForExecutionContext=waitForExecutionContext,TestRunner.waitForExecutionContextDestroyed=waitForExecutionContextDestroyed,TestRunner.assertGreaterOrEqual=assertGreaterOrEqual,TestRunner.navigate=navigate,TestRunner.navigatePromise=navigatePromise,TestRunner.hardReloadPage=hardReloadPage,TestRunner.reloadPage=reloadPage,TestRunner.reloadPageWithInjectedScript=reloadPageWithInjectedScript,TestRunner.reloadPagePromise=reloadPagePromise,TestRunner.pageLoaded=pageLoaded,TestRunner.waitForPageLoad=waitForPageLoad,TestRunner.runWhenPageLoads=runWhenPageLoads,TestRunner.runTestSuite=runTestSuite,TestRunner.assertEquals=assertEquals,TestRunner.assertTrue=assertTrue,TestRunner.override=override,TestRunner.clearSpecificInfoFromStackFrames=clearSpecificInfoFromStackFrames,TestRunner.hideInspectorView=hideInspectorView,TestRunner.mainFrame=mainFrame,TestRunner.waitForUISourceCode=waitForUISourceCode,TestRunner.waitForUISourceCodeRemoved=waitForUISourceCodeRemoved,TestRunner.url=url,TestRunner.dumpSyntaxHighlight=dumpSyntaxHighlight,TestRunner.loadLegacyModule=loadLegacyModule,TestRunner.evaluateInPageRemoteObject=evaluateInPageRemoteObject,TestRunner.evaluateInPage=evaluateInPage,TestRunner.evaluateInPageAnonymously=evaluateInPageAnonymously,TestRunner.evaluateInPageAsync=evaluateInPageAsync,TestRunner.deprecatedInitAsync=deprecatedInitAsync,TestRunner.runAsyncTestSuite=runAsyncTestSuite,TestRunner.dumpInspectedPageElementText=dumpInspectedPageElementText,TestRunner.waitForPendingLiveLocationUpdates=waitForPendingLiveLocationUpdates,TestRunner.findLineEndingIndexes=findLineEndingIndexes,TestRunner.selectTextInTextNode=selectTextInTextNode,TestRunner.isScrolledToBottom=UI.UIUtils.isScrolledToBottom;