blob: a02649d56bdb3d285c1f0d7f800cfe4108922641 [file] [log] [blame]
/*
* Copyright (C) 2012 Samsung Electronics. All rights reserved.
* Copyright (C) 2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// This namespace is injected into every test page. Its functions are invoked by
// ProtocolTest methods on the inspector page via a TestHarness subclass.
TestPage = {};
TestPage._initializers = [];
// Helper scripts like `console-test.js` must register their initialization
// function with this method so it will be marshalled to the inspector page.
TestPage.registerInitializer = function(initializer)
{
if (typeof initializer === "function")
this._initializers.push(initializer.toString());
};
let outputElement;
TestPage.debugLog = window.debugLog = function(text)
{
alert(text);
}
TestPage.log = window.log = function(text)
{
if (!outputElement) {
let intermediate = document.createElement("div");
document.body.appendChild(intermediate);
let intermediate2 = document.createElement("div");
intermediate.appendChild(intermediate2);
outputElement = document.createElement("div");
outputElement.className = "output";
outputElement.id = "output";
outputElement.style.whiteSpace = "pre";
intermediate2.appendChild(outputElement);
}
outputElement.appendChild(document.createTextNode(text));
outputElement.appendChild(document.createElement("br"));
};
TestPage.closeTest = window.closeTest = function()
{
window.internals.closeDummyInspectorFrontend();
// This code might be executed while the debugger is still running through a stack based EventLoop.
// Use a setTimeout to defer to a clean stack before letting the testRunner load the next test.
setTimeout(() => { testRunner.notifyDone(); }, 0);
};
TestPage.runTest = window.runTest = function()
{
if (!window.testRunner) {
console.error("This test must be run via DumpRenderTree or WebKitTestRunner.");
return;
}
testRunner.dumpAsText();
testRunner.waitUntilDone();
testRunner.setCanOpenWindows(true);
let testFunction = window.test;
if (typeof testFunction !== "function") {
alert("Failed to send test() because it is not a function.");
testRunner.notifyDone();
}
let url = testRunner.inspectorTestStubURL;
if (!url) {
alert("Failed to obtain inspector test stub URL.");
testRunner.notifyDone();
}
function runInitializationMethodsInFrontend(initializers)
{
for (let initializer of initializers) {
try {
initializer();
} catch (e) {
ProtocolTest.log("Exception in test initialization: " + e, e.stack || "(no stack trace)");
ProtocolTest.completeTest();
}
}
}
function runTestMethodInFrontend(testFunction)
{
try {
testFunction();
} catch (e) {
ProtocolTest.log("Exception during test execution: " + e, e.stack || "(no stack trace)");
ProtocolTest.completeTest();
}
}
TestPage.inspectorFrontend = window.internals.openDummyInspectorFrontend(url);
TestPage.inspectorFrontend.addEventListener("load", (event) => {
let initializationCodeString = `(${runInitializationMethodsInFrontend.toString()})([${TestPage._initializers}]);`;
let testFunctionCodeString = `(${runTestMethodInFrontend.toString()})(${testFunction.toString()});`;
TestPage.inspectorFrontend.postMessage(initializationCodeString, "*");
TestPage.inspectorFrontend.postMessage(testFunctionCodeString, "*");
});
};
TestPage.dispatchEventToFrontend = function(eventName, data)
{
let dispatchEventCodeString = `ProtocolTest.dispatchEventToListeners(${JSON.stringify(eventName)}, ${JSON.stringify(data)});`;
TestPage.inspectorFrontend.postMessage(dispatchEventCodeString, "*");
};