blob: 60eb42500be880053f13e878480ae2f59c1c7d9d [file] [log] [blame]
/*
* Copyright (C) 2009 Google 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:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
* OWNER OR 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.
*/
/** @interface */
function InspectorFrontendHostAPI()
{
}
/** @typedef {{type:string, id:(number|undefined),
label:(string|undefined), enabled:(boolean|undefined), checked:(boolean|undefined),
subItems:(!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>|undefined)}} */
InspectorFrontendHostAPI.ContextMenuDescriptor;
InspectorFrontendHostAPI.Events = {
AppendedToURL: "appendedToURL",
CanceledSaveURL: "canceledSaveURL",
ContextMenuCleared: "contextMenuCleared",
ContextMenuItemSelected: "contextMenuItemSelected",
DeviceCountUpdated: "deviceCountUpdated",
DevicesUpdated: "devicesUpdated",
DispatchMessage: "dispatchMessage",
EnterInspectElementMode: "enterInspectElementMode",
FileSystemsLoaded: "fileSystemsLoaded",
FileSystemRemoved: "fileSystemRemoved",
FileSystemAdded: "fileSystemAdded",
IndexingTotalWorkCalculated: "indexingTotalWorkCalculated",
IndexingWorked: "indexingWorked",
IndexingDone: "indexingDone",
KeyEventUnhandled: "keyEventUnhandled",
RevealSourceLine: "revealSourceLine",
SavedURL: "savedURL",
SearchCompleted: "searchCompleted",
SetToolbarColors: "setToolbarColors",
SetUseSoftMenu: "setUseSoftMenu",
ShowConsole: "showConsole"
}
InspectorFrontendHostAPI.EventDescriptors = [
[InspectorFrontendHostAPI.Events.AppendedToURL, ["url"]],
[InspectorFrontendHostAPI.Events.CanceledSaveURL, ["url"]],
[InspectorFrontendHostAPI.Events.ContextMenuCleared, []],
[InspectorFrontendHostAPI.Events.ContextMenuItemSelected, ["id"]],
[InspectorFrontendHostAPI.Events.DeviceCountUpdated, ["count"]],
[InspectorFrontendHostAPI.Events.DevicesUpdated, ["devices"]],
[InspectorFrontendHostAPI.Events.DispatchMessage, ["messageObject"]],
[InspectorFrontendHostAPI.Events.EnterInspectElementMode, [], true],
[InspectorFrontendHostAPI.Events.FileSystemsLoaded, ["fileSystems"]],
[InspectorFrontendHostAPI.Events.FileSystemRemoved, ["fileSystemPath"]],
[InspectorFrontendHostAPI.Events.FileSystemAdded, ["errorMessage", "fileSystem"]],
[InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, ["requestId", "fileSystemPath", "totalWork"]],
[InspectorFrontendHostAPI.Events.IndexingWorked, ["requestId", "fileSystemPath", "worked"]],
[InspectorFrontendHostAPI.Events.IndexingDone, ["requestId", "fileSystemPath"]],
[InspectorFrontendHostAPI.Events.KeyEventUnhandled, ["event"], true],
[InspectorFrontendHostAPI.Events.RevealSourceLine, ["url", "lineNumber", "columnNumber"], true],
[InspectorFrontendHostAPI.Events.SavedURL, ["url"]],
[InspectorFrontendHostAPI.Events.SearchCompleted, ["requestId", "fileSystemPath", "files"]],
[InspectorFrontendHostAPI.Events.SetToolbarColors, ["backgroundColor", "color"]],
[InspectorFrontendHostAPI.Events.SetUseSoftMenu, ["useSoftMenu"]],
[InspectorFrontendHostAPI.Events.ShowConsole, [], true]
];
InspectorFrontendHostAPI.prototype = {
addFileSystem: function() { },
/**
* @param {string} url
* @param {string} content
*/
append: function(url, content) { },
/**
* @param {number} requestId
* @param {string} fileSystemPath
*/
indexPath: function(requestId, fileSystemPath) { },
/**
* @return {string}
*/
getSelectionBackgroundColor: function() { },
/**
* @return {string}
*/
getSelectionForegroundColor: function() { },
/**
* Requests inspected page to be placed atop of the inspector frontend with specified bounds.
* @param {{x: number, y: number, width: number, height: number}} bounds
*/
setInspectedPageBounds: function(bounds) { },
/**
* Requests inspected page to be placed atop of the inspector frontend
* with passed insets from the frontend sides, respecting minimum size passed.
* @param {{top: number, left: number, right: number, bottom: number}} insets
* @param {{width: number, height: number}} minSize
*/
setContentsResizingStrategy: function(insets, minSize) { },
/**
* @param {string} shortcuts
*/
setWhitelistedShortcuts: function(shortcuts) { },
inspectElementCompleted: function() { },
/**
* @param {number} x
* @param {number} y
*/
moveWindowBy: function(x, y) { },
/**
* @param {string} url
*/
openInNewTab: function(url) { },
/**
* @param {string} fileSystemPath
*/
removeFileSystem: function(fileSystemPath) { },
requestFileSystems: function() { },
/**
* @param {string} url
* @param {string} content
* @param {boolean} forceSaveAs
*/
save: function(url, content, forceSaveAs) { },
/**
* @param {number} requestId
* @param {string} fileSystemPath
* @param {string} query
*/
searchInPath: function(requestId, fileSystemPath, query) { },
/**
* @param {number} requestId
*/
stopIndexing: function(requestId) { },
bringToFront: function() { },
/**
* @param {string} browserId
* @param {string} url
*/
openUrlOnRemoteDeviceAndInspect: function(browserId, url) { },
closeWindow: function() { },
copyText: function(text) { },
/**
* @param {string} url
*/
inspectedURLChanged: function(url) { },
/**
* @param {string} fileSystemId
* @param {string} registeredName
* @return {?DOMFileSystem}
*/
isolatedFileSystem: function(fileSystemId, registeredName) { },
/**
* @param {!FileSystem} fileSystem
*/
upgradeDraggedFileSystemPermissions: function(fileSystem) { },
/**
* @return {string}
*/
platform: function() { },
/**
* @return {string}
*/
port: function() { },
/**
* @param {number} actionCode
*/
recordActionTaken: function(actionCode) { },
/**
* @param {number} panelCode
*/
recordPanelShown: function(panelCode) { },
/**
* @param {string} message
*/
sendMessageToBackend: function(message) { },
/**
* @param {string} message
*/
sendMessageToEmbedder: function(message) { },
/**
* @param {boolean} enabled
*/
setDeviceCountUpdatesEnabled: function(enabled) { },
/**
* @param {boolean} enabled
*/
setDevicesUpdatesEnabled: function(enabled) { },
/**
* @param {string} origin
* @param {string} script
*/
setInjectedScriptForOrigin: function(origin, script) { },
/**
* @param {boolean} isDocked
* @param {!function()} callback
*/
setIsDocked: function(isDocked, callback) { },
/**
* @param {number} zoom
*/
setZoomFactor: function(zoom) { },
/**
* @return {number}
*/
zoomFactor: function() { },
zoomIn: function() { },
zoomOut: function() { },
resetZoom: function() { },
/**
* @param {number} x
* @param {number} y
* @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
*/
showContextMenuAtPoint: function(x, y, items) { },
/**
* @return {boolean}
*/
isUnderTest: function() { },
/**
* @return {boolean}
*/
isHostedMode: function() { }
}
/**
* @constructor
* @implements {InspectorFrontendHostAPI}
*/
WebInspector.InspectorFrontendHostStub = function()
{
}
WebInspector.InspectorFrontendHostStub.prototype = {
/**
* @return {string}
*/
getSelectionBackgroundColor: function()
{
return "#6e86ff";
},
/**
* @return {string}
*/
getSelectionForegroundColor: function()
{
return "#ffffff";
},
/**
* @return {string}
*/
platform: function()
{
var match = navigator.userAgent.match(/Windows NT/);
if (match)
return "windows";
match = navigator.userAgent.match(/Mac OS X/);
if (match)
return "mac";
return "linux";
},
/**
* @return {string}
*/
port: function()
{
return "unknown";
},
bringToFront: function()
{
this._windowVisible = true;
},
closeWindow: function()
{
this._windowVisible = false;
},
/**
* @param {boolean} isDocked
* @param {!function()} callback
*/
setIsDocked: function(isDocked, callback)
{
},
/**
* Requests inspected page to be placed atop of the inspector frontend with specified bounds.
* @param {{x: number, y: number, width: number, height: number}} bounds
*/
setInspectedPageBounds: function(bounds)
{
},
/**
* Requests inspected page to be placed atop of the inspector frontend
* with passed insets from the frontend sides, respecting minimum size passed.
* @param {{top: number, left: number, right: number, bottom: number}} insets
* @param {{width: number, height: number}} minSize
*/
setContentsResizingStrategy: function(insets, minSize)
{
},
inspectElementCompleted: function()
{
},
/**
* @param {number} x
* @param {number} y
*/
moveWindowBy: function(x, y)
{
},
/**
* @param {string} origin
* @param {string} script
*/
setInjectedScriptForOrigin: function(origin, script)
{
},
/**
* @param {string} url
*/
inspectedURLChanged: function(url)
{
document.title = WebInspector.UIString("Developer Tools - %s", url);
},
/**
* @param {string} text
*/
copyText: function(text)
{
WebInspector.console.error("Clipboard is not enabled in hosted mode. Please inspect using chrome://inspect");
},
/**
* @param {string} url
*/
openInNewTab: function(url)
{
window.open(url, "_blank");
},
/**
* @param {string} url
* @param {string} content
* @param {boolean} forceSaveAs
*/
save: function(url, content, forceSaveAs)
{
WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");
this.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.CanceledSaveURL, url);
},
/**
* @param {string} url
* @param {string} content
*/
append: function(url, content)
{
WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");
},
/**
* @param {string} message
*/
sendMessageToBackend: function(message)
{
},
/**
* @param {string} message
*/
sendMessageToEmbedder: function(message)
{
},
/**
* @param {number} actionCode
*/
recordActionTaken: function(actionCode)
{
},
/**
* @param {number} panelCode
*/
recordPanelShown: function(panelCode)
{
},
requestFileSystems: function()
{
},
addFileSystem: function()
{
},
/**
* @param {string} fileSystemPath
*/
removeFileSystem: function(fileSystemPath)
{
},
/**
* @param {string} fileSystemId
* @param {string} registeredName
* @return {?DOMFileSystem}
*/
isolatedFileSystem: function(fileSystemId, registeredName)
{
return null;
},
/**
* @param {!FileSystem} fileSystem
*/
upgradeDraggedFileSystemPermissions: function(fileSystem)
{
},
/**
* @param {number} requestId
* @param {string} fileSystemPath
*/
indexPath: function(requestId, fileSystemPath)
{
},
/**
* @param {number} requestId
*/
stopIndexing: function(requestId)
{
},
/**
* @param {number} requestId
* @param {string} fileSystemPath
* @param {string} query
*/
searchInPath: function(requestId, fileSystemPath, query)
{
},
/**
* @param {number} zoom
*/
setZoomFactor: function(zoom)
{
},
/**
* @return {number}
*/
zoomFactor: function()
{
return 1;
},
zoomIn: function()
{
},
zoomOut: function()
{
},
resetZoom: function()
{
},
setWhitelistedShortcuts: function(shortcuts)
{
},
/**
* @return {boolean}
*/
isUnderTest: function()
{
return false;
},
/**
* @param {string} browserId
* @param {string} url
*/
openUrlOnRemoteDeviceAndInspect: function(browserId, url)
{
},
/**
* @param {boolean} enabled
*/
setDeviceCountUpdatesEnabled: function(enabled)
{
},
/**
* @param {boolean} enabled
*/
setDevicesUpdatesEnabled: function(enabled)
{
},
/**
* @param {number} x
* @param {number} y
* @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
*/
showContextMenuAtPoint: function(x, y, items)
{
throw "Soft context menu should be used";
},
/**
* @return {boolean}
*/
isHostedMode: function()
{
return true;
}
};
/**
* @type {!InspectorFrontendHostAPI}
*/
var InspectorFrontendHost = window.InspectorFrontendHost || null;
(function() {
if (!InspectorFrontendHost) {
// Instantiate stub for web-hosted mode if necessary.
InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
} else {
// Otherwise add stubs for missing methods that are declared in the interface.
var proto = WebInspector.InspectorFrontendHostStub.prototype;
for (var name in proto) {
var value = proto[name];
if (typeof value !== "function" || InspectorFrontendHost[name])
continue;
InspectorFrontendHost[name] = stub.bind(null, name);
}
}
/**
* @param {string} name
*/
function stub(name)
{
console.error("Incompatible embedder: method InspectorFrontendHost." + name + " is missing. Using stub instead.");
var args = Array.prototype.slice.call(arguments, 1);
return proto[name].apply(InspectorFrontendHost, args);
}
// Attach the events object.
InspectorFrontendHost.events = new WebInspector.Object();
})();
/**
* @constructor
*/
function InspectorFrontendAPIImpl()
{
this._isLoaded = false;
this._pendingCommands = [];
this._debugFrontend = !!WebInspector.queryParam("debugFrontend");
var descriptors = InspectorFrontendHostAPI.EventDescriptors;
for (var i = 0; i < descriptors.length; ++i)
this[descriptors[i][0]] = this._dispatch.bind(this, descriptors[i][0], descriptors[i][1], descriptors[i][2]);
}
InspectorFrontendAPIImpl.prototype = {
loadCompleted: function()
{
this._isLoaded = true;
for (var i = 0; i < this._pendingCommands.length; ++i)
this._pendingCommands[i]();
this._pendingCommands = [];
if (window.opener)
window.opener.postMessage(["loadCompleted"], "*");
},
/**
* @param {string} name
* @param {!Array.<string>} signature
* @param {boolean} runOnceLoaded
*/
_dispatch: function(name, signature, runOnceLoaded)
{
var params = Array.prototype.slice.call(arguments, 3);
if (this._debugFrontend)
setImmediate(innerDispatch.bind(this));
else
innerDispatch.call(this);
/**
* @this {!InspectorFrontendAPIImpl}
*/
function innerDispatch()
{
if (runOnceLoaded)
this._runOnceLoaded(dispatchAfterLoad);
else
dispatchAfterLoad();
function dispatchAfterLoad()
{
// Single argument methods get dispatched with the param.
if (signature.length < 2) {
InspectorFrontendHost.events.dispatchEventToListeners(name, params[0]);
return;
}
var data = {};
for (var i = 0; i < signature.length; ++i)
data[signature[i]] = params[i];
InspectorFrontendHost.events.dispatchEventToListeners(name, data);
}
}
},
/**
* @param {function()} command
*/
_runOnceLoaded: function(command)
{
if (this._isLoaded) {
command();
return;
}
this._pendingCommands.push(command);
},
/**
* @param {number} id
* @param {?string} error
*/
embedderMessageAck: function(id, error)
{
InspectorFrontendHost["embedderMessageAck"](id, error);
}
}
var InspectorFrontendAPI = new InspectorFrontendAPIImpl();