monaca-lib
Version:
Monaca cloud API bindings for JavaScript
687 lines (625 loc) • 26.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.
*/
/**
* @constructor
*/
WebInspector.Settings = function()
{
this._eventSupport = new WebInspector.Object();
this._registry = /** @type {!Object.<string, !WebInspector.Setting>} */ ({});
this.colorFormat = this.createSetting("colorFormat", "original");
this.consoleHistory = this.createSetting("consoleHistory", []);
this.domWordWrap = this.createSetting("domWordWrap", true);
this.eventListenersFilter = this.createSetting("eventListenersFilter", "all");
this.lastViewedScriptFile = this.createSetting("lastViewedScriptFile", "application");
this.monitoringXHREnabled = this.createSetting("monitoringXHREnabled", false);
this.hideNetworkMessages = this.createSetting("hideNetworkMessages", false);
this.preserveConsoleLog = this.createSetting("preserveConsoleLog", false);
this.consoleTimestampsEnabled = this.createSetting("consoleTimestampsEnabled", false);
this.resourceViewTab = this.createSetting("resourceViewTab", "preview");
this.showInheritedComputedStyleProperties = this.createSetting("showInheritedComputedStyleProperties", false);
this.showUserAgentStyles = this.createSetting("showUserAgentStyles", true);
this.watchExpressions = this.createSetting("watchExpressions", []);
this.breakpoints = this.createSetting("breakpoints", []);
this.eventListenerBreakpoints = this.createSetting("eventListenerBreakpoints", []);
this.domBreakpoints = this.createSetting("domBreakpoints", []);
this.xhrBreakpoints = this.createSetting("xhrBreakpoints", []);
this.jsSourceMapsEnabled = this.createSetting("sourceMapsEnabled", true);
this.cssSourceMapsEnabled = this.createSetting("cssSourceMapsEnabled", true);
this.cacheDisabled = this.createSetting("cacheDisabled", false);
this.showUAShadowDOM = this.createSetting("showUAShadowDOM", false);
this.savedURLs = this.createSetting("savedURLs", {});
this.javaScriptDisabled = this.createSetting("javaScriptDisabled", false);
this.showAdvancedHeapSnapshotProperties = this.createSetting("showAdvancedHeapSnapshotProperties", false);
this.recordAllocationStacks = this.createSetting("recordAllocationStacks", false);
this.highResolutionCpuProfiling = this.createSetting("highResolutionCpuProfiling", false);
this.searchInContentScripts = this.createSetting("searchInContentScripts", false);
this.textEditorIndent = this.createSetting("textEditorIndent", " ");
this.textEditorAutoDetectIndent = this.createSetting("textEditorAutoIndentIndent", true);
this.textEditorAutocompletion = this.createSetting("textEditorAutocompletion", true);
this.textEditorBracketMatching = this.createSetting("textEditorBracketMatching", true);
this.cssReloadEnabled = this.createSetting("cssReloadEnabled", false);
this.timelineLiveUpdate = this.createSetting("timelineLiveUpdate", true);
this.showMetricsRulers = this.createSetting("showMetricsRulers", false);
this.workerInspectorWidth = this.createSetting("workerInspectorWidth", 600);
this.workerInspectorHeight = this.createSetting("workerInspectorHeight", 600);
this.messageURLFilters = this.createSetting("messageURLFilters", {});
this.networkLogHideColumns = this.createSetting("networkLogHideColumns", false);
this.networkLogLargeRows = this.createSetting("networkLogLargeRows", false);
this.networkHideDataURL = this.createSetting("networkHideDataURL", false);
this.networkResourceTypeFilters = this.createSetting("networkResourceTypeFilters", {});
this.networkShowPrimaryLoadWaterfall = this.createSetting("networkShowPrimaryLoadWaterfall", false);
this.networkColorCodeResourceTypes = this.createSetting("networkColorCodeResourceTypes", false);
this.messageLevelFilters = this.createSetting("messageLevelFilters", {});
this.splitVerticallyWhenDockedToRight = this.createSetting("splitVerticallyWhenDockedToRight", true);
this.visiblePanels = this.createSetting("visiblePanels", {});
this.shortcutPanelSwitch = this.createSetting("shortcutPanelSwitch", false);
this.showWhitespacesInEditor = this.createSetting("showWhitespacesInEditor", false);
this.skipStackFramesPattern = this.createRegExpSetting("skipStackFramesPattern", "");
this.skipContentScripts = this.createSetting("skipContentScripts", false);
this.pauseOnExceptionEnabled = this.createSetting("pauseOnExceptionEnabled", false);
this.pauseOnCaughtException = this.createSetting("pauseOnCaughtException", false);
this.enableAsyncStackTraces = this.createSetting("enableAsyncStackTraces", false);
this.showMediaQueryInspector = this.createSetting("showMediaQueryInspector", false);
this.disableOverridesWarning = this.createSetting("disableOverridesWarning", false);
this.disablePausedStateOverlay = this.createSetting("disablePausedStateOverlay", false);
this.testPath = this.createSetting("testPath", "");
this.frameViewerHideChromeWindow = this.createSetting("frameViewerHideChromeWindow", false);
this.highlightDOMUpdates = this.createSetting("highlightDOMUpdates", true);
this.enableCustomFormatters = this.createSetting("customFormatters", false);
// Rendering options
this.showPaintRects = this.createSetting("showPaintRects", false);
this.showDebugBorders = this.createSetting("showDebugBorders", false);
this.showFPSCounter = this.createSetting("showFPSCounter", false);
this.continuousPainting = this.createSetting("continuousPainting", false);
this.showScrollBottleneckRects = this.createSetting("showScrollBottleneckRects", false);
}
WebInspector.Settings.prototype = {
/**
* @param {string} key
* @param {*} defaultValue
* @return {!WebInspector.Setting}
*/
createSetting: function(key, defaultValue)
{
if (!this._registry[key])
this._registry[key] = new WebInspector.Setting(key, defaultValue, this._eventSupport, window.localStorage);
return this._registry[key];
},
/**
* @param {string} key
* @param {string} defaultValue
* @param {string=} regexFlags
* @return {!WebInspector.Setting}
*/
createRegExpSetting: function(key, defaultValue, regexFlags)
{
if (!this._registry[key])
this._registry[key] = new WebInspector.RegExpSetting(key, defaultValue, this._eventSupport, window.localStorage, regexFlags);
return this._registry[key];
}
}
/**
* @constructor
* @param {string} name
* @param {V} defaultValue
* @param {!WebInspector.Object} eventSupport
* @param {?Storage} storage
* @template V
*/
WebInspector.Setting = function(name, defaultValue, eventSupport, storage)
{
this._name = name;
this._defaultValue = defaultValue;
this._eventSupport = eventSupport;
this._storage = storage;
}
WebInspector.Setting.prototype = {
/**
* @param {function(!WebInspector.Event)} listener
* @param {!Object=} thisObject
*/
addChangeListener: function(listener, thisObject)
{
this._eventSupport.addEventListener(this._name, listener, thisObject);
},
/**
* @param {function(!WebInspector.Event)} listener
* @param {!Object=} thisObject
*/
removeChangeListener: function(listener, thisObject)
{
this._eventSupport.removeEventListener(this._name, listener, thisObject);
},
get name()
{
return this._name;
},
/**
* @return {V}
*/
get: function()
{
if (typeof this._value !== "undefined")
return this._value;
this._value = this._defaultValue;
if (this._storage && this._name in this._storage) {
try {
this._value = JSON.parse(this._storage[this._name]);
} catch(e) {
delete this._storage[this._name];
}
}
return this._value;
},
/**
* @param {V} value
*/
set: function(value)
{
this._value = value;
if (this._storage) {
try {
var settingString = JSON.stringify(value);
try {
this._storage[this._name] = settingString;
} catch(e) {
this._printSettingsSavingError(e.message, this._name, settingString);
}
} catch(e) {
WebInspector.console.error("Cannot stringify setting with name: " + this._name + ", error: " + e.message);
}
}
this._eventSupport.dispatchEventToListeners(this._name, value);
},
/**
* @param {string} message
* @param {string} name
* @param {string} value
*/
_printSettingsSavingError: function(message, name, value)
{
var errorMessage = "Error saving setting with name: " + this._name + ", value length: " + value.length + ". Error: " + message;
console.error(errorMessage);
WebInspector.console.error(errorMessage);
WebInspector.console.log("Ten largest settings: ");
var sizes = { __proto__: null };
for (var key in this._storage)
sizes[key] = this._storage.getItem(key).length;
var keys = Object.keys(sizes);
function comparator(key1, key2)
{
return sizes[key2] - sizes[key1];
}
keys.sort(comparator);
for (var i = 0; i < 10 && i < keys.length; ++i)
WebInspector.console.log("Setting: '" + keys[i] + "', size: " + sizes[keys[i]]);
},
}
/**
* @constructor
* @extends {WebInspector.Setting}
* @param {string} name
* @param {string} defaultValue
* @param {!WebInspector.Object} eventSupport
* @param {?Storage} storage
* @param {string=} regexFlags
*/
WebInspector.RegExpSetting = function(name, defaultValue, eventSupport, storage, regexFlags)
{
WebInspector.Setting.call(this, name, defaultValue ? [{ pattern: defaultValue }] : [], eventSupport, storage);
this._regexFlags = regexFlags;
}
WebInspector.RegExpSetting.prototype = {
/**
* @override
* @return {string}
*/
get: function()
{
var result = [];
var items = this.getAsArray();
for (var i = 0; i < items.length; ++i) {
var item = items[i];
if (item.pattern && !item.disabled)
result.push(item.pattern);
}
return result.join("|");
},
/**
* @return {!Array.<{pattern: string, disabled: (boolean|undefined)}>}
*/
getAsArray: function()
{
return WebInspector.Setting.prototype.get.call(this);
},
/**
* @override
* @param {string} value
*/
set: function(value)
{
this.setAsArray([{ pattern: value }]);
},
/**
* @param {!Array.<{pattern: string, disabled: (boolean|undefined)}>} value
*/
setAsArray: function(value)
{
delete this._regex;
WebInspector.Setting.prototype.set.call(this, value);
},
/**
* @return {?RegExp}
*/
asRegExp: function()
{
if (typeof this._regex !== "undefined")
return this._regex;
this._regex = null;
try {
var pattern = this.get();
if (pattern)
this._regex = new RegExp(pattern, this._regexFlags || "");
} catch (e) {
}
return this._regex;
},
__proto__: WebInspector.Setting.prototype
}
/**
* @constructor
*/
WebInspector.VersionController = function()
{
}
WebInspector.VersionController.currentVersion = 11;
WebInspector.VersionController.prototype = {
updateVersion: function()
{
var versionSetting = WebInspector.settings.createSetting("inspectorVersion", 0);
var currentVersion = WebInspector.VersionController.currentVersion;
var oldVersion = versionSetting.get();
var methodsToRun = this._methodsToRunToUpdateVersion(oldVersion, currentVersion);
for (var i = 0; i < methodsToRun.length; ++i)
this[methodsToRun[i]].call(this);
versionSetting.set(currentVersion);
},
/**
* @param {number} oldVersion
* @param {number} currentVersion
*/
_methodsToRunToUpdateVersion: function(oldVersion, currentVersion)
{
var result = [];
for (var i = oldVersion; i < currentVersion; ++i)
result.push("_updateVersionFrom" + i + "To" + (i + 1));
return result;
},
_updateVersionFrom0To1: function()
{
this._clearBreakpointsWhenTooMany(WebInspector.settings.breakpoints, 500000);
},
_updateVersionFrom1To2: function()
{
var versionSetting = WebInspector.settings.createSetting("previouslyViewedFiles", []);
versionSetting.set([]);
},
_updateVersionFrom2To3: function()
{
var fileSystemMappingSetting = WebInspector.settings.createSetting("fileSystemMapping", {});
fileSystemMappingSetting.set({});
if (window.localStorage)
delete window.localStorage["fileMappingEntries"];
},
_updateVersionFrom3To4: function()
{
var advancedMode = WebInspector.settings.createSetting("showHeaSnapshotObjectsHiddenProperties", false).get();
WebInspector.settings.showAdvancedHeapSnapshotProperties.set(advancedMode);
},
_updateVersionFrom4To5: function()
{
if (!window.localStorage)
return;
var settingNames = {
"FileSystemViewSidebarWidth": "fileSystemViewSplitViewState",
"canvasProfileViewReplaySplitLocation": "canvasProfileViewReplaySplitViewState",
"canvasProfileViewSplitLocation": "canvasProfileViewSplitViewState",
"elementsSidebarWidth": "elementsPanelSplitViewState",
"StylesPaneSplitRatio": "stylesPaneSplitViewState",
"heapSnapshotRetainersViewSize": "heapSnapshotSplitViewState",
"InspectorView.splitView": "InspectorView.splitViewState",
"InspectorView.screencastSplitView": "InspectorView.screencastSplitViewState",
"Inspector.drawerSplitView": "Inspector.drawerSplitViewState",
"layerDetailsSplitView": "layerDetailsSplitViewState",
"networkSidebarWidth": "networkPanelSplitViewState",
"sourcesSidebarWidth": "sourcesPanelSplitViewState",
"scriptsPanelNavigatorSidebarWidth": "sourcesPanelNavigatorSplitViewState",
"sourcesPanelSplitSidebarRatio": "sourcesPanelDebuggerSidebarSplitViewState",
"timeline-details": "timelinePanelDetailsSplitViewState",
"timeline-split": "timelinePanelRecorsSplitViewState",
"timeline-view": "timelinePanelTimelineStackSplitViewState",
"auditsSidebarWidth": "auditsPanelSplitViewState",
"layersSidebarWidth": "layersPanelSplitViewState",
"profilesSidebarWidth": "profilesPanelSplitViewState",
"resourcesSidebarWidth": "resourcesPanelSplitViewState"
};
for (var oldName in settingNames) {
var newName = settingNames[oldName];
var oldNameH = oldName + "H";
var newValue = null;
var oldSetting = WebInspector.settings.createSetting(oldName, undefined).get();
if (oldSetting) {
newValue = newValue || {};
newValue.vertical = {};
newValue.vertical.size = oldSetting;
delete window.localStorage[oldName];
}
var oldSettingH = WebInspector.settings.createSetting(oldNameH, undefined).get();
if (oldSettingH) {
newValue = newValue || {};
newValue.horizontal = {};
newValue.horizontal.size = oldSettingH;
delete window.localStorage[oldNameH];
}
var newSetting = WebInspector.settings.createSetting(newName, {});
if (newValue)
newSetting.set(newValue);
}
},
_updateVersionFrom5To6: function()
{
if (!window.localStorage)
return;
var settingNames = {
"debuggerSidebarHidden": "sourcesPanelSplitViewState",
"navigatorHidden": "sourcesPanelNavigatorSplitViewState",
"WebInspector.Drawer.showOnLoad": "Inspector.drawerSplitViewState"
};
for (var oldName in settingNames) {
var newName = settingNames[oldName];
var oldSetting = WebInspector.settings.createSetting(oldName, undefined).get();
var invert = "WebInspector.Drawer.showOnLoad" === oldName;
var hidden = !!oldSetting !== invert;
delete window.localStorage[oldName];
var showMode = hidden ? "OnlyMain" : "Both";
var newSetting = WebInspector.settings.createSetting(newName, null);
var newValue = newSetting.get() || {};
newValue.vertical = newValue.vertical || {};
newValue.vertical.showMode = showMode;
newValue.horizontal = newValue.horizontal || {};
newValue.horizontal.showMode = showMode;
newSetting.set(newValue);
}
},
_updateVersionFrom6To7: function()
{
if (!window.localStorage)
return;
var settingNames = {
"sourcesPanelNavigatorSplitViewState": "sourcesPanelNavigatorSplitViewState",
"elementsPanelSplitViewState": "elementsPanelSplitViewState",
"canvasProfileViewReplaySplitViewState": "canvasProfileViewReplaySplitViewState",
"stylesPaneSplitViewState": "stylesPaneSplitViewState",
"sourcesPanelDebuggerSidebarSplitViewState": "sourcesPanelDebuggerSidebarSplitViewState"
};
for (var name in settingNames) {
if (!(name in window.localStorage))
continue;
var setting = WebInspector.settings.createSetting(name, undefined);
var value = setting.get();
if (!value)
continue;
// Zero out saved percentage sizes, and they will be restored to defaults.
if (value.vertical && value.vertical.size && value.vertical.size < 1)
value.vertical.size = 0;
if (value.horizontal && value.horizontal.size && value.horizontal.size < 1)
value.horizontal.size = 0;
setting.set(value);
}
},
_updateVersionFrom7To8: function()
{
var settingName = "deviceMetrics";
if (!window.localStorage || !(settingName in window.localStorage))
return;
var setting = WebInspector.settings.createSetting(settingName, undefined);
var value = setting.get();
if (!value)
return;
var components = value.split("x");
if (components.length >= 3) {
var width = parseInt(components[0], 10);
var height = parseInt(components[1], 10);
var deviceScaleFactor = parseFloat(components[2]);
if (deviceScaleFactor) {
components[0] = "" + Math.round(width / deviceScaleFactor);
components[1] = "" + Math.round(height / deviceScaleFactor);
}
}
value = components.join("x");
setting.set(value);
},
_updateVersionFrom8To9: function()
{
if (!window.localStorage)
return;
var settingNames = [
"skipStackFramesPattern",
"workspaceFolderExcludePattern"
];
for (var i = 0; i < settingNames.length; ++i) {
var settingName = settingNames[i];
if (!(settingName in window.localStorage))
continue;
try {
var value = JSON.parse(window.localStorage[settingName]);
if (!value)
continue;
if (typeof value === "string")
value = [value];
for (var j = 0; j < value.length; ++j) {
if (typeof value[j] === "string")
value[j] = { pattern: value[j] };
}
window.localStorage[settingName] = JSON.stringify(value);
} catch(e) {
}
}
},
_updateVersionFrom9To10: function()
{
if (!window.localStorage)
return;
for (var key in window.localStorage) {
if (key.startsWith("revision-history"))
window.localStorage.removeItem(key);
}
},
_updateVersionFrom10To11: function()
{
var setting = "customDevicePresets";
var newSetting = "customEmulatedDeviceList";
if (!window.localStorage)
return;
if (!(setting in window.localStorage))
return;
try {
var list = JSON.parse(window.localStorage[setting]);
if (!Array.isArray(list))
return;
var newList = [];
for (var i = 0; i < list.length; ++i) {
var value = list[i];
var device = {};
device["title"] = value["title"];
device["type"] = "unknown";
device["user-agent"] = value["userAgent"];
device["capabilities"] = [];
if (value["touch"])
device["capabilities"].push("touch");
if (value["mobile"])
device["capabilities"].push("mobile");
device["screen"] = {};
device["screen"]["vertical"] = {width: value["width"], height: value["height"]};
device["screen"]["horizontal"] = {width: value["height"], height: value["width"]};
device["screen"]["device-pixel-ratio"] = value["deviceScaleFactor"];
device["modes"] = [];
device["show-by-default"] = true;
device["show"] = "Default";
newList.push(device);
}
window.localStorage[newSetting] = JSON.stringify(newList);
delete window.localStorage[setting];
} catch(e) {
}
},
/**
* @param {!WebInspector.Setting} breakpointsSetting
* @param {number} maxBreakpointsCount
*/
_clearBreakpointsWhenTooMany: function(breakpointsSetting, maxBreakpointsCount)
{
// If there are too many breakpoints in a storage, it is likely due to a recent bug that caused
// periodical breakpoints duplication leading to inspector slowness.
if (breakpointsSetting.get().length > maxBreakpointsCount)
breakpointsSetting.set([]);
}
}
/**
* @type {!WebInspector.Settings}
*/
WebInspector.settings;
// These methods are added for backwards compatibility with Devtools CodeSchool extension.
// DO NOT REMOVE
/**
* @constructor
*/
WebInspector.PauseOnExceptionStateSetting = function()
{
WebInspector.settings.pauseOnExceptionEnabled.addChangeListener(this._enabledChanged, this);
WebInspector.settings.pauseOnCaughtException.addChangeListener(this._pauseOnCaughtChanged, this);
this._name = "pauseOnExceptionStateString";
this._eventSupport = new WebInspector.Object();
this._value = this._calculateValue();
}
WebInspector.PauseOnExceptionStateSetting.prototype = {
/**
* @param {function(!WebInspector.Event)} listener
* @param {!Object=} thisObject
*/
addChangeListener: function(listener, thisObject)
{
this._eventSupport.addEventListener(this._name, listener, thisObject);
},
/**
* @param {function(!WebInspector.Event)} listener
* @param {!Object=} thisObject
*/
removeChangeListener: function(listener, thisObject)
{
this._eventSupport.removeEventListener(this._name, listener, thisObject);
},
/**
* @return {string}
*/
get: function()
{
return this._value;
},
/**
* @return {string}
*/
_calculateValue: function()
{
if (!WebInspector.settings.pauseOnExceptionEnabled.get())
return "none";
// The correct code here would be
// return WebInspector.settings.pauseOnCaughtException.get() ? "all" : "uncaught";
// But the CodeSchool DevTools relies on the fact that we used to enable pausing on ALL extensions by default, so we trick it here.
return "all";
},
_enabledChanged: function(event)
{
this._fireChangedIfNeeded();
},
_pauseOnCaughtChanged: function(event)
{
this._fireChangedIfNeeded();
},
_fireChangedIfNeeded: function()
{
var newValue = this._calculateValue();
if (newValue === this._value)
return;
this._value = newValue;
this._eventSupport.dispatchEventToListeners(this._name, this._value);
}
}