UNPKG

strong-arc

Version:

A visual suite for the StrongLoop API Platform

720 lines (617 loc) 18.3 kB
/* * 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();