380 lines
8.9 KiB
JavaScript
380 lines
8.9 KiB
JavaScript
/*
|
|
* 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()
|
|
{
|
|
WI.updateVisibilityState(true);
|
|
}
|
|
|
|
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;
|
|
}
|