blob: 8a2075ebd5be343fbeacf3817cf6eb554dc94e3b [file] [log] [blame]
/*
* Copyright (C) 2022 Igalia S.L.
*
* 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 INC. 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 INC. 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.
*/
if (!window.InspectorFrontendHost) {
WI.BrowserInspectorFrontendHost = class BrowserInspectorFrontendHost {
constructor()
{
this._pendingMessages = null;
this._socket = null;
}
// Public
get supportsShowCertificate()
{
return false;
}
get isRemote()
{
return true;
}
get inspectionLevel()
{
return 1;
}
get debuggableInfo()
{
return {
debuggableType: "web-page",
targetPlatformName: undefined,
targetBuildVersion: undefined,
targetProductVersion: undefined,
targetIsSimulator: false,
};
}
get platform()
{
const match = navigator.platform.match(/mac|win|linux/i);
if (match) {
const platform = match[0].toLowerCase();
if (platform == "win")
return "windows";
return platform;
}
return "unknown";
}
get platformVersionName()
{
return "";
}
get supportsDiagnosticLogging()
{
return false;
}
get supportsWebExtensions()
{
return false;
}
connect()
{
const queryParams = parseQueryString(window.location.search.substring(1));
let url = "ws" in queryParams ? "ws://" + queryParams.ws : null;
if (!url)
return;
const socket = new WebSocket(url);
socket.addEventListener("message", message => InspectorBackend.dispatch(message.data));
socket.addEventListener("error", console.error);
socket.addEventListener("open", () => { this._socket = socket; });
socket.addEventListener("close", () => {
this._socket = null;
window.close();
});
}
loaded()
{
}
closeWindow()
{
this._windowVisible = false;
}
reopen()
{
window.location.reload();
}
reset()
{
this.reopen();
}
bringToFront()
{
this._windowVisible = true;
}
inspectedURLChanged(title)
{
document.title = title;
}
showCertificate(certificate)
{
throw "unimplemented";
}
setZoomFactor(zoom)
{
}
zoomFactor()
{
return 1;
}
setForcedAppearance(appearance)
{
}
userInterfaceLayoutDirection()
{
return "ltr";
}
supportsDockSide(side)
{
return false;
}
requestDockSide(side)
{
throw "unimplemented";
}
setAttachedWindowHeight(height)
{
}
setAttachedWindowWidth(width)
{
}
setSheetRect(x, y, width, height)
{
}
startWindowDrag()
{
}
moveWindowBy(x, y)
{
}
copyText(text)
{
this.killText(text, false, true);
}
killText(text, shouldPrependToKillRing, shouldStartNewSequence)
{
// FIXME: restore focus to previously focused element.
let textarea = document.createElement("textarea");
document.body.appendChild(textarea);
if (shouldStartNewSequence) {
textarea.textContent = text;
} else {
textarea.select();
if (!document.execCommand("paste"))
console.error("BrowserInspectorFrontendHost.killText: could not paste from clipboard");
if (shouldPrependToKillRing)
textarea.textContent = text + textarea.textContent;
else
textarea.textContent = textarea.textContent + text;
}
textarea.select();
if (!document.execCommand("copy"))
console.error("BrowserInspectorFrontendHost.copyText: could not copy to clipboard");
document.body.removeChild(textarea);
}
openURLExternally(url)
{
window.open(url, "_blank");
}
canSave(saveMode)
{
return false;
}
save(saveDatas, forceSaveAs)
{
// FIXME: Create a Blob from the content, get an object URL, open it to trigger a download.
throw "unimplemented";
}
canLoad()
{
return false;
}
load(path)
{
throw "unimplemented";
}
getPath(file)
{
return null;
}
canPickColorFromScreen()
{
return false;
}
pickColorFromScreen()
{
throw "unimplemented";
}
revealFileExternally(path)
{
}
getCurrentX(context)
{
return 0.0;
}
getCurrentY(context)
{
return 0.0;
}
setPath(context, path2d)
{
console.log("setPath", context, path2d);
}
showContextMenu(event, items)
{
this._contextMenu = WI.SoftContextMenu(items);
this._contextMenu.show(event);
}
dispatchEventAsContextMenuEvent(event)
{
if (this._contextMenu)
this._contextMenu.show(event);
}
sendMessageToBackend(message)
{
if (!this._socket) {
if (!this._pendingMessages)
this._pendingMessages = [];
this._pendingMessages.push(message);
} else {
this._sendPendingMessagesToBackendIfNeeded();
this._socket.send(message);
}
}
unbufferedLog(message)
{
console.log(message);
}
isUnderTest()
{
return false;
}
beep()
{
// FIXME: Implement using Audio/AudioContext.
}
inspectInspector()
{
throw "unimplemented";
}
isBeingInspected()
{
return false;
}
setAllowsInspectingInspector(allow)
{
}
logDiagnosticEvent(eventName, content)
{
throw "unimplemented";
}
didShowExtensionTab(extensionID, extensionTabID, extensionFrame)
{
throw "unimplemented";
}
didHideExtensionTab(extensionID, extensionTabID)
{
throw "unimplemented";
}
didNavigateExtensionTab(extensionID, extensionTabID, newURL)
{
throw "unimplemented";
}
inspectedPageDidNavigate(newURL)
{
throw "unimplemented";
}
evaluateScriptInExtensionTab(extensionFrame, scriptSource)
{
throw "unimplemented";
}
// Private
_sendPendingMessagesToBackendIfNeeded()
{
if (this._pendingMessages) {
this._pendingMessages.forEach(message => this._socket.send(message));
this._pendingMessages = null;
}
}
};
InspectorFrontendHost = new WI.BrowserInspectorFrontendHost();
WI.dontLocalizeUserInterface = true;
}