monaca-lib
Version:
Monaca cloud API bindings for JavaScript
710 lines (617 loc) • 18.3 kB
JavaScript
/*
* 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()
{
/**
* @type {!WebInspector.EventTarget}
*/
this.events;
}
/** @typedef {{type:string, id:(number|undefined),
label:(string|undefined), enabled:(boolean|undefined), checked:(boolean|undefined),
subItems:(!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>|undefined)}} */
InspectorFrontendHostAPI.ContextMenuDescriptor;
InspectorFrontendHostAPI.Events = {
AddExtensions: "addExtensions",
AppendedToURL: "appendedToURL",
CanceledSaveURL: "canceledSaveURL",
ContextMenuCleared: "contextMenuCleared",
ContextMenuItemSelected: "contextMenuItemSelected",
DeviceCountUpdated: "deviceCountUpdated",
DevicesUpdated: "devicesUpdated",
DispatchMessage: "dispatchMessage",
DispatchMessageChunk: "dispatchMessageChunk",
EnterInspectElementMode: "enterInspectElementMode",
FileSystemsLoaded: "fileSystemsLoaded",
FileSystemRemoved: "fileSystemRemoved",
FileSystemAdded: "fileSystemAdded",
IndexingTotalWorkCalculated: "indexingTotalWorkCalculated",
IndexingWorked: "indexingWorked",
IndexingDone: "indexingDone",
KeyEventUnhandled: "keyEventUnhandled",
RevealSourceLine: "revealSourceLine",
SavedURL: "savedURL",
SearchCompleted: "searchCompleted",
SetInspectedTabId: "setInspectedTabId",
SetToolbarColors: "setToolbarColors",
SetUseSoftMenu: "setUseSoftMenu",
ShowConsole: "showConsole"
}
InspectorFrontendHostAPI.EventDescriptors = [
[InspectorFrontendHostAPI.Events.AddExtensions, ["extensions"]],
[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.DispatchMessageChunk, ["messageChunk", "messageSize"]],
[InspectorFrontendHostAPI.Events.EnterInspectElementMode, []],
[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"]],
[InspectorFrontendHostAPI.Events.RevealSourceLine, ["url", "lineNumber", "columnNumber"]],
[InspectorFrontendHostAPI.Events.SavedURL, ["url"]],
[InspectorFrontendHostAPI.Events.SearchCompleted, ["requestId", "fileSystemPath", "files"]],
[InspectorFrontendHostAPI.Events.SetInspectedTabId, ["tabId"]],
[InspectorFrontendHostAPI.Events.SetToolbarColors, ["backgroundColor", "color"]],
[InspectorFrontendHostAPI.Events.SetUseSoftMenu, ["useSoftMenu"]],
[InspectorFrontendHostAPI.Events.ShowConsole, []]
];
InspectorFrontendHostAPI.prototype = {
addFileSystem: function() { },
/**
* @param {string} url
* @param {string} content
*/
append: function(url, content) { },
loadCompleted: function() { },
/**
* @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) { },
/**
* @param {string} shortcuts
*/
setWhitelistedShortcuts: function(shortcuts) { },
inspectElementCompleted: function() { },
/**
* @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() { },
/**
* @param {number} actionCode
*/
recordActionTaken: function(actionCode) { },
/**
* @param {number} panelCode
*/
recordPanelShown: function(panelCode) { },
/**
* @param {string} message
*/
sendMessageToBackend: 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) { },
/**
* @return {number}
*/
zoomFactor: function() { },
zoomIn: function() { },
zoomOut: function() { },
resetZoom: function() { },
/**
* @param {number} x
* @param {number} y
* @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
* @param {!Document} document
*/
showContextMenuAtPoint: function(x, y, items, document) { },
/**
* @return {boolean}
*/
isUnderTest: function() { },
/**
* @return {boolean}
*/
isHostedMode: function() { }
}
/**
* @constructor
* @implements {InspectorFrontendHostAPI}
* @suppressGlobalPropertiesCheck
*/
WebInspector.InspectorFrontendHostStub = function()
{
/**
* @param {!Event} event
*/
function stopEventPropagation(event)
{
// Let browser handle Ctrl+/Ctrl- shortcuts in hosted mode.
var zoomModifier = WebInspector.isMac() ? event.metaKey : event.ctrlKey;
if (zoomModifier && (event.keyCode === 187 || event.keyCode === 189))
event.stopPropagation();
}
document.addEventListener("keydown", stopEventPropagation, true);
}
WebInspector.InspectorFrontendHostStub.prototype = {
/**
* @override
* @return {string}
*/
getSelectionBackgroundColor: function()
{
return "#6e86ff";
},
/**
* @override
* @return {string}
*/
getSelectionForegroundColor: function()
{
return "#ffffff";
},
/**
* @override
* @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";
},
/**
* @override
*/
loadCompleted: function()
{
},
/**
* @override
*/
bringToFront: function()
{
this._windowVisible = true;
},
/**
* @override
*/
closeWindow: function()
{
this._windowVisible = false;
},
/**
* @override
* @param {boolean} isDocked
* @param {function()} callback
*/
setIsDocked: function(isDocked, callback)
{
setTimeout(callback, 0);
},
/**
* Requests inspected page to be placed atop of the inspector frontend with specified bounds.
* @override
* @param {{x: number, y: number, width: number, height: number}} bounds
*/
setInspectedPageBounds: function(bounds)
{
},
/**
* @override
*/
inspectElementCompleted: function()
{
},
/**
* @override
* @param {string} origin
* @param {string} script
*/
setInjectedScriptForOrigin: function(origin, script)
{
},
/**
* @override
* @param {string} url
* @suppressGlobalPropertiesCheck
*/
inspectedURLChanged: function(url)
{
document.title = WebInspector.UIString("Developer Tools - %s", url);
},
/**
* @override
* @param {string} text
*/
copyText: function(text)
{
WebInspector.console.error("Clipboard is not enabled in hosted mode. Please inspect using chrome://inspect");
},
/**
* @override
* @param {string} url
*/
openInNewTab: function(url)
{
window.open(url, "_blank");
},
/**
* @override
* @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);
},
/**
* @override
* @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");
},
/**
* @override
* @param {string} message
*/
sendMessageToBackend: function(message)
{
},
/**
* @override
* @param {number} actionCode
*/
recordActionTaken: function(actionCode)
{
},
/**
* @override
* @param {number} panelCode
*/
recordPanelShown: function(panelCode)
{
},
/**
* @override
*/
requestFileSystems: function()
{
},
/**
* @override
*/
addFileSystem: function()
{
},
/**
* @override
* @param {string} fileSystemPath
*/
removeFileSystem: function(fileSystemPath)
{
},
/**
* @override
* @param {string} fileSystemId
* @param {string} registeredName
* @return {?DOMFileSystem}
*/
isolatedFileSystem: function(fileSystemId, registeredName)
{
return null;
},
/**
* @override
* @param {!FileSystem} fileSystem
*/
upgradeDraggedFileSystemPermissions: function(fileSystem)
{
},
/**
* @override
* @param {number} requestId
* @param {string} fileSystemPath
*/
indexPath: function(requestId, fileSystemPath)
{
},
/**
* @override
* @param {number} requestId
*/
stopIndexing: function(requestId)
{
},
/**
* @override
* @param {number} requestId
* @param {string} fileSystemPath
* @param {string} query
*/
searchInPath: function(requestId, fileSystemPath, query)
{
},
/**
* @override
* @return {number}
*/
zoomFactor: function()
{
return 1;
},
/**
* @override
*/
zoomIn: function()
{
},
/**
* @override
*/
zoomOut: function()
{
},
/**
* @override
*/
resetZoom: function()
{
},
/**
* @override
* @param {string} shortcuts
*/
setWhitelistedShortcuts: function(shortcuts)
{
},
/**
* @override
* @return {boolean}
*/
isUnderTest: function()
{
return false;
},
/**
* @override
* @param {string} browserId
* @param {string} url
*/
openUrlOnRemoteDeviceAndInspect: function(browserId, url)
{
},
/**
* @override
* @param {boolean} enabled
*/
setDeviceCountUpdatesEnabled: function(enabled)
{
},
/**
* @override
* @param {boolean} enabled
*/
setDevicesUpdatesEnabled: function(enabled)
{
},
/**
* @override
* @param {number} x
* @param {number} y
* @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
* @param {!Document} document
*/
showContextMenuAtPoint: function(x, y, items, document)
{
throw "Soft context menu should be used";
},
/**
* @override
* @return {boolean}
*/
isHostedMode: function()
{
return true;
}
};
/**
* @type {!InspectorFrontendHostAPI}
*/
var InspectorFrontendHost = window.InspectorFrontendHost || null;
(function(){
function initializeInspectorFrontendHost()
{
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._debugFrontend = !!Runtime.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 = {
/**
* @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);
else
innerDispatch();
function innerDispatch()
{
// 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);
}
}
}
// FIXME: This file is included into both apps, since the devtools_app needs the InspectorFrontendHostAPI only,
// so the host instance should not initialized there.
if (!window.DevToolsHost) {
initializeInspectorFrontendHost();
window.InspectorFrontendAPI = new InspectorFrontendAPIImpl();
WebInspector.setLocalizationPlatform(InspectorFrontendHost.platform());
} else {
WebInspector.setLocalizationPlatform(DevToolsHost.platform());
}
})();