| Index: chrome_linux64/resources/inspector/inspector.js
 | 
| ===================================================================
 | 
| --- chrome_linux64/resources/inspector/inspector.js	(revision 197568)
 | 
| +++ chrome_linux64/resources/inspector/inspector.js	(working copy)
 | 
| @@ -1797,12 +1797,9 @@
 | 
|  this.selected = false;
 | 
|  this.treeOutline = this;
 | 
|  this.comparator = null;
 | 
| -this.searchable = false;
 | 
| -this.searchInputElement = null;
 | 
|  
 | 
|  this.setFocusable(!nonFocusable);
 | 
|  this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
 | 
| -this._childrenListNode.addEventListener("keypress", this._treeKeyPress.bind(this), true);
 | 
|  
 | 
|  this._treeElementsMap = new Map();
 | 
|  this._expandedStateMap = new Map();
 | 
| @@ -2028,20 +2025,6 @@
 | 
|  return null;
 | 
|  }
 | 
|  
 | 
| -TreeOutline.prototype._treeKeyPress = function(event)
 | 
| -{
 | 
| -if (!this.searchable || WebInspector.isBeingEdited(this._childrenListNode))
 | 
| -return;
 | 
| -
 | 
| -var searchText = String.fromCharCode(event.charCode);
 | 
| -
 | 
| -if (searchText.trim() !== searchText)
 | 
| -return;
 | 
| -
 | 
| -this._startSearch(searchText);
 | 
| -event.consume(true);
 | 
| -}
 | 
| -
 | 
|  TreeOutline.prototype._treeKeyDown = function(event)
 | 
|  {
 | 
|  if (event.target !== this._childrenListNode)
 | 
| @@ -2145,156 +2128,6 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -TreeOutline.prototype._startSearch = function(searchText)
 | 
| -{
 | 
| -if (!this.searchInputElement || !this.searchable)
 | 
| -return;
 | 
| -
 | 
| -this._searching = true;
 | 
| -
 | 
| -if (this.searchStarted)
 | 
| -this.searchStarted();
 | 
| -
 | 
| -this.searchInputElement.value = searchText;
 | 
| -
 | 
| -function focusSearchInput()
 | 
| -{
 | 
| -this.searchInputElement.focus();
 | 
| -}
 | 
| -window.setTimeout(focusSearchInput.bind(this), 0);
 | 
| -this._searchTextChanged();
 | 
| -this._boundSearchTextChanged = this._searchTextChanged.bind(this);
 | 
| -this.searchInputElement.addEventListener("paste", this._boundSearchTextChanged);
 | 
| -this.searchInputElement.addEventListener("cut", this._boundSearchTextChanged);
 | 
| -this.searchInputElement.addEventListener("keypress", this._boundSearchTextChanged);
 | 
| -this._boundSearchInputKeyDown = this._searchInputKeyDown.bind(this);
 | 
| -this.searchInputElement.addEventListener("keydown", this._boundSearchInputKeyDown);
 | 
| -this._boundSearchInputBlur = this._searchInputBlur.bind(this);
 | 
| -this.searchInputElement.addEventListener("blur", this._boundSearchInputBlur);
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype._searchTextChanged = function()
 | 
| -{
 | 
| -function updateSearch()
 | 
| -{
 | 
| -var nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.selectedTreeElement, false);
 | 
| -if (!nextSelectedElement)
 | 
| -nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.children[0], false);
 | 
| -this._showSearchMatchElement(nextSelectedElement);
 | 
| -}
 | 
| -
 | 
| -window.setTimeout(updateSearch.bind(this), 0);
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype._showSearchMatchElement = function(treeElement)
 | 
| -{
 | 
| -this._currentSearchMatchElement = treeElement;
 | 
| -if (treeElement) {
 | 
| -this._childrenListNode.classList.add("search-match-found");
 | 
| -this._childrenListNode.classList.remove("search-match-not-found");
 | 
| -treeElement.revealAndSelect(true);
 | 
| -} else {
 | 
| -this._childrenListNode.classList.remove("search-match-found");
 | 
| -this._childrenListNode.classList.add("search-match-not-found");
 | 
| -}
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype._searchInputKeyDown = function(event)
 | 
| -{
 | 
| -if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey)
 | 
| -return;
 | 
| -
 | 
| -var handled = false;
 | 
| -var nextSelectedElement;
 | 
| -if (event.keyIdentifier === "Down") {
 | 
| -nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.selectedTreeElement, true);
 | 
| -handled = true;
 | 
| -} else if (event.keyIdentifier === "Up") {
 | 
| -nextSelectedElement = this._previousSearchMatch(this.searchInputElement.value, this.selectedTreeElement);
 | 
| -handled = true;
 | 
| -} else if (event.keyCode === 27  ) {
 | 
| -this._searchFinished();
 | 
| -handled = true;
 | 
| -} else if (isEnterKey(event)) {
 | 
| -var lastSearchMatchElement = this._currentSearchMatchElement;
 | 
| -this._searchFinished();
 | 
| -lastSearchMatchElement.onenter();
 | 
| -handled = true;
 | 
| -}
 | 
| -
 | 
| -if (nextSelectedElement)
 | 
| -this._showSearchMatchElement(nextSelectedElement);
 | 
| -
 | 
| -if (handled)
 | 
| -event.consume(true);
 | 
| -else
 | 
| -window.setTimeout(this._boundSearchTextChanged, 0); 
 | 
| -}
 | 
| -
 | 
| -
 | 
| -TreeOutline.prototype._nextSearchMatch = function(searchText, startTreeElement, skipStartTreeElement)
 | 
| -{
 | 
| -var currentTreeElement = startTreeElement;
 | 
| -var skipCurrentTreeElement = skipStartTreeElement;
 | 
| -while (currentTreeElement && (skipCurrentTreeElement || !currentTreeElement.matchesSearchText || !currentTreeElement.matchesSearchText(searchText))) {
 | 
| -currentTreeElement = currentTreeElement.traverseNextTreeElement(true, null, true);
 | 
| -skipCurrentTreeElement = false;
 | 
| -}
 | 
| -
 | 
| -return currentTreeElement;
 | 
| -}
 | 
| -
 | 
| -
 | 
| -TreeOutline.prototype._previousSearchMatch = function(searchText, startTreeElement)
 | 
| -{
 | 
| -var currentTreeElement = startTreeElement;
 | 
| -var skipCurrentTreeElement = true;
 | 
| -while (currentTreeElement && (skipCurrentTreeElement || !currentTreeElement.matchesSearchText || !currentTreeElement.matchesSearchText(searchText))) {
 | 
| -currentTreeElement = currentTreeElement.traversePreviousTreeElement(true, true);
 | 
| -skipCurrentTreeElement = false;
 | 
| -}
 | 
| -
 | 
| -return currentTreeElement;
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype._searchInputBlur = function(event)
 | 
| -{
 | 
| -this._searchFinished();
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype._searchFinished = function()
 | 
| -{
 | 
| -if (!this._searching)
 | 
| -return;
 | 
| -
 | 
| -delete this._searching;
 | 
| -this._childrenListNode.classList.remove("search-match-found");
 | 
| -this._childrenListNode.classList.remove("search-match-not-found");
 | 
| -delete this._currentSearchMatchElement;
 | 
| -
 | 
| -this.searchInputElement.value = "";
 | 
| -this.searchInputElement.removeEventListener("paste", this._boundSearchTextChanged);
 | 
| -this.searchInputElement.removeEventListener("cut", this._boundSearchTextChanged);
 | 
| -delete this._boundSearchTextChanged;
 | 
| -
 | 
| -this.searchInputElement.removeEventListener("keydown", this._boundSearchInputKeyDown);
 | 
| -delete this._boundSearchInputKeyDown;
 | 
| -
 | 
| -this.searchInputElement.removeEventListener("blur", this._boundSearchInputBlur);
 | 
| -delete this._boundSearchInputBlur;
 | 
| -
 | 
| -if (this.searchFinished)
 | 
| -this.searchFinished();
 | 
| -
 | 
| -this.treeOutline._childrenListNode.focus();
 | 
| -}
 | 
| -
 | 
| -TreeOutline.prototype.stopSearch = function()
 | 
| -{
 | 
| -this._searchFinished();
 | 
| -}
 | 
| -
 | 
| -
 | 
|  function TreeElement(title, representedObject, hasChildren)
 | 
|  {
 | 
|  this._title = title;
 | 
| @@ -2861,35 +2694,27 @@
 | 
|  if (!this._toggleConsoleButton.enabled())
 | 
|  return;
 | 
|  
 | 
| -this._toggleConsoleButton.toggled = !this._toggleConsoleButton.toggled;
 | 
| +var animationType = window.event && window.event.shiftKey ? WebInspector.Drawer.AnimationType.Slow : WebInspector.Drawer.AnimationType.Normal;
 | 
|  
 | 
| -var animationType = window.event && window.event.shiftKey ? WebInspector.Drawer.AnimationType.Slow : WebInspector.Drawer.AnimationType.Normal;
 | 
| -if (this._toggleConsoleButton.toggled) {
 | 
| -this._toggleConsoleButton.title = WebInspector.UIString("Hide console.");
 | 
| -this.drawer.show(this.consoleView, animationType);
 | 
| -this._consoleWasShown = true;
 | 
| -} else {
 | 
| -this._toggleConsoleButton.title = WebInspector.UIString("Show console.");
 | 
| -this.drawer.hide(animationType);
 | 
| -delete this._consoleWasShown;
 | 
| -}
 | 
| +if (this._toggleConsoleButton.toggled)
 | 
| +this.closeConsole(animationType);
 | 
| +else
 | 
| +this.showConsole(animationType);
 | 
|  },
 | 
|  
 | 
|  
 | 
|  showViewInDrawer: function(statusBarElement, view, onclose)
 | 
|  {
 | 
| -this._toggleConsoleButton.title = WebInspector.UIString("Hide console.");
 | 
| +this._toggleConsoleButton.title = WebInspector.UIString("Show console.");
 | 
|  this._toggleConsoleButton.toggled = false;
 | 
| -this._closePreviousDrawerView();
 | 
| +this._removeDrawerView();
 | 
|  
 | 
|  var drawerStatusBarHeader = document.createElement("div");
 | 
|  drawerStatusBarHeader.className = "drawer-header status-bar-item";
 | 
|  drawerStatusBarHeader.appendChild(statusBarElement);
 | 
|  drawerStatusBarHeader.onclose = onclose;
 | 
|  
 | 
| -var closeButton = drawerStatusBarHeader.createChild("span");
 | 
| -closeButton.textContent = WebInspector.UIString("\u00D7");
 | 
| -closeButton.addStyleClass("drawer-header-close-button");
 | 
| +var closeButton = drawerStatusBarHeader.createChild("div", "close-button");
 | 
|  closeButton.addEventListener("click", this.closeViewInDrawer.bind(this), false);
 | 
|  
 | 
|  var panelStatusBar = document.getElementById("panel-status-bar");
 | 
| @@ -2902,26 +2727,58 @@
 | 
|  closeViewInDrawer: function()
 | 
|  {
 | 
|  if (this._drawerStatusBarHeader) {
 | 
| -this._closePreviousDrawerView();
 | 
| +this._removeDrawerView();
 | 
|  
 | 
|  
 | 
| -if (!this._consoleWasShown)
 | 
| +if (this._consoleWasShown)
 | 
| +this.showConsole();
 | 
| +else
 | 
|  this.drawer.hide(WebInspector.Drawer.AnimationType.Immediately);
 | 
| -else
 | 
| -this._toggleConsoleButtonClicked();
 | 
|  }
 | 
|  },
 | 
|  
 | 
| -_closePreviousDrawerView: function()
 | 
| +_removeDrawerView: function()
 | 
|  {
 | 
|  if (this._drawerStatusBarHeader) {
 | 
| -this._drawerStatusBarHeader.parentElement.removeChild(this._drawerStatusBarHeader);
 | 
| +this._drawerStatusBarHeader.removeSelf();
 | 
|  if (this._drawerStatusBarHeader.onclose)
 | 
|  this._drawerStatusBarHeader.onclose();
 | 
|  delete this._drawerStatusBarHeader;
 | 
|  }
 | 
|  },
 | 
|  
 | 
| +
 | 
| +showConsole: function(animationType)
 | 
| +{
 | 
| +animationType = animationType || WebInspector.Drawer.AnimationType.Normal;
 | 
| +
 | 
| +if (this.consoleView.isShowing())
 | 
| +return;
 | 
| +
 | 
| +if (WebInspector.drawer.visible)
 | 
| +this._removeDrawerView();
 | 
| +
 | 
| +this._toggleConsoleButton.toggled = true;
 | 
| +this._toggleConsoleButton.title = WebInspector.UIString("Hide console.");
 | 
| +this.drawer.show(this.consoleView, animationType);
 | 
| +this._consoleWasShown = true;
 | 
| +},
 | 
| +
 | 
| +
 | 
| +closeConsole: function(animationType)
 | 
| +{
 | 
| +animationType = animationType || WebInspector.Drawer.AnimationType.Normal;
 | 
| +
 | 
| +if (!this.consoleView.isShowing() || !WebInspector.drawer.visible)
 | 
| +return;
 | 
| +
 | 
| +this._toggleConsoleButton.toggled = false;
 | 
| +this._toggleConsoleButton.title = WebInspector.UIString("Show console.");
 | 
| +this.drawer.hide(animationType);
 | 
| +this._consoleWasShown = false;
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _updateErrorAndWarningCounts: function()
 | 
|  {
 | 
|  var errorWarningElement = document.getElementById("error-warning-count");
 | 
| @@ -2940,23 +2797,17 @@
 | 
|  errorWarningElement.removeChildren();
 | 
|  
 | 
|  if (errors) {
 | 
| -var errorImageElement = document.createElement("img");
 | 
| -errorImageElement.id = "error-count-img";
 | 
| -errorWarningElement.appendChild(errorImageElement);
 | 
| -var errorElement = document.createElement("span");
 | 
| +var errorImageElement = errorWarningElement.createChild("div", "error-icon-small");
 | 
| +var errorElement = errorWarningElement.createChild("span");
 | 
|  errorElement.id = "error-count";
 | 
|  errorElement.textContent = errors;
 | 
| -errorWarningElement.appendChild(errorElement);
 | 
|  }
 | 
|  
 | 
|  if (warnings) {
 | 
| -var warningsImageElement = document.createElement("img");
 | 
| -warningsImageElement.id = "warning-count-img";
 | 
| -errorWarningElement.appendChild(warningsImageElement);
 | 
| -var warningsElement = document.createElement("span");
 | 
| +var warningsImageElement = errorWarningElement.createChild("div", "warning-icon-small");
 | 
| +var warningsElement = errorWarningElement.createChild("span");
 | 
|  warningsElement.id = "warning-count";
 | 
|  warningsElement.textContent = warnings;
 | 
| -errorWarningElement.appendChild(warningsElement);
 | 
|  }
 | 
|  
 | 
|  if (errors) {
 | 
| @@ -3027,9 +2878,49 @@
 | 
|  {
 | 
|  
 | 
|  WebInspector.panel("scripts");
 | 
| +},
 | 
| +
 | 
| +_setupTethering: function()
 | 
| +{
 | 
| +if (!this._portForwardings) {
 | 
| +this._portForwardings = {};
 | 
| +WebInspector.settings.portForwardings.addChangeListener(this._setupTethering.bind(this));
 | 
|  }
 | 
| +var entries = WebInspector.settings.portForwardings.get();
 | 
| +var newForwardings = {};
 | 
| +for (var i = 0; i < entries.length; ++i)
 | 
| +newForwardings[entries[i].port] = entries[i].location;
 | 
| +
 | 
| +for (var port in this._portForwardings) {
 | 
| +if (!newForwardings[port])
 | 
| +unbind(port);
 | 
|  }
 | 
|  
 | 
| +for (var port in newForwardings) {
 | 
| +if (this._portForwardings[port] && newForwardings[port] === this._portForwardings[port])
 | 
| +continue;
 | 
| +if (this._portForwardings[port])
 | 
| +unbind(port);
 | 
| +bind(port, newForwardings[port]);
 | 
| +}
 | 
| +this._portForwardings = newForwardings;
 | 
| +
 | 
| +
 | 
| +function bind(port, location)
 | 
| +{
 | 
| +var command = { method: "Tethering.bind", params: { port: parseInt(port, 10), location: location }, id: InspectorBackend.nextCallbackId() };
 | 
| +InspectorBackend.sendMessageObjectToBackend(command);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +function unbind(port)
 | 
| +{
 | 
| +var command = { method: "Tethering.unbind", params: { port: parseInt(port, 10) }, id: InspectorBackend.nextCallbackId() };
 | 
| +InspectorBackend.sendMessageObjectToBackend(command);
 | 
| +}
 | 
| +}
 | 
| +}
 | 
| +
 | 
|  WebInspector.Events = {
 | 
|  InspectorLoaded: "InspectorLoaded",
 | 
|  InspectorClosing: "InspectorClosing"
 | 
| @@ -3163,6 +3054,7 @@
 | 
|  this.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);
 | 
|  this.networkLog = new WebInspector.NetworkLog();
 | 
|  this.domAgent = new WebInspector.DOMAgent();
 | 
| +this.domAgent.addEventListener(WebInspector.DOMAgent.Events.InspectNodeRequested, this._inspectNodeRequested, this);
 | 
|  this.runtimeModel = new WebInspector.RuntimeModel(this.resourceTreeModel);
 | 
|  
 | 
|  this.consoleView = new WebInspector.ConsoleView(WebInspector.WorkerManager.isWorkerFrontend());
 | 
| @@ -3257,9 +3149,6 @@
 | 
|  if (WebInspector.settings.continuousPainting.get())
 | 
|  PageAgent.setContinuousPaintingEnabled(true);
 | 
|  
 | 
| -if (WebInspector.settings.javaScriptDisabled.get())
 | 
| -PageAgent.setScriptExecutionDisabled(true);
 | 
| -
 | 
|  if (WebInspector.settings.showFPSCounter.get())
 | 
|  PageAgent.setShowFPSCounter(true);
 | 
|  
 | 
| @@ -3268,6 +3157,9 @@
 | 
|  WebInspector.WorkerManager.loadCompleted();
 | 
|  InspectorFrontendAPI.loadCompleted();
 | 
|  
 | 
| +if (WebInspector.experimentsSettings.tethering.isEnabled())
 | 
| +this._setupTethering();
 | 
| +
 | 
|  WebInspector.notifications.dispatchEventToListeners(WebInspector.Events.InspectorLoaded);
 | 
|  }
 | 
|  
 | 
| @@ -3435,7 +3327,7 @@
 | 
|  
 | 
|  if (event.keyIdentifier === "F1" ||
 | 
|  (event.keyIdentifier === helpKey && event.shiftKey && (!WebInspector.isBeingEdited(event.target) || event.metaKey))) {
 | 
| -this.settingsController.showSettingsScreen(WebInspector.SettingsScreen.Tabs.Shortcuts);
 | 
| +this.settingsController.showSettingsScreen(WebInspector.SettingsScreen.Tabs.General);
 | 
|  event.consume(true);
 | 
|  return;
 | 
|  }
 | 
| @@ -3553,15 +3445,6 @@
 | 
|  event.preventDefault();
 | 
|  }
 | 
|  
 | 
| -WebInspector.showConsole = function()
 | 
| -{
 | 
| -if (WebInspector._toggleConsoleButton && !WebInspector._toggleConsoleButton.toggled) {
 | 
| -if (WebInspector.drawer.visible)
 | 
| -this._closePreviousDrawerView();
 | 
| -WebInspector._toggleConsoleButtonClicked();
 | 
| -}
 | 
| -}
 | 
| -
 | 
|  WebInspector.showPanel = function(panel)
 | 
|  {
 | 
|  return WebInspector.inspectorView.showPanel(panel);
 | 
| @@ -3690,6 +3573,11 @@
 | 
|  WebInspector.UIString("Inspected target has crashed. Once it reloads we will attach to it automatically."))).showModal();
 | 
|  }
 | 
|  
 | 
| +WebInspector._inspectNodeRequested = function(event)
 | 
| +{
 | 
| +WebInspector._updateFocusedNode(event.data);
 | 
| +}
 | 
| +
 | 
|  WebInspector._updateFocusedNode = function(nodeId)
 | 
|  {
 | 
|  if (WebInspector.inspectElementModeController && WebInspector.inspectElementModeController.enabled()) {
 | 
| @@ -3812,9 +3700,15 @@
 | 
|  }
 | 
|  
 | 
|  InspectorBackendClass.prototype = {
 | 
| +
 | 
| +nextCallbackId: function()
 | 
| +{
 | 
| +return this._lastCallbackId++;
 | 
| +},
 | 
| +
 | 
|  _wrap: function(callback, method)
 | 
|  {
 | 
| -var callbackId = this._lastCallbackId++;
 | 
| +var callbackId = this.nextCallbackId();
 | 
|  if (!callback)
 | 
|  callback = function() {};
 | 
|  
 | 
| @@ -4245,7 +4139,7 @@
 | 
|  
 | 
|  
 | 
|  InspectorBackend.registerConsoleDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Console");
 | 
| -InspectorBackend.registerEnum("Console.ConsoleMessageSource", {XML: "xml", Javascript: "javascript", Network: "network", ConsoleAPI: "console-api", Storage: "storage", Appcache: "appcache", Rendering: "rendering", Css: "css", Security: "security", Other: "other"});
 | 
| +InspectorBackend.registerEnum("Console.ConsoleMessageSource", {XML: "xml", Javascript: "javascript", Network: "network", ConsoleAPI: "console-api", Storage: "storage", Appcache: "appcache", Rendering: "rendering", Css: "css", Security: "security", Other: "other", Deprecation: "deprecation"});
 | 
|  InspectorBackend.registerEnum("Console.ConsoleMessageLevel", {Log: "log", Warning: "warning", Error: "error", Debug: "debug"});
 | 
|  InspectorBackend.registerEnum("Console.ConsoleMessageType", {Log: "log", Dir: "dir", DirXML: "dirxml", Table: "table", Trace: "trace", Clear: "clear", StartGroup: "startGroup", StartGroupCollapsed: "startGroupCollapsed", EndGroup: "endGroup", Assert: "assert", Timing: "timing", Profile: "profile", ProfileEnd: "profileEnd"});
 | 
|  InspectorBackend.registerEvent("Console.messageAdded", ["message"]);
 | 
| @@ -4340,6 +4234,7 @@
 | 
|  
 | 
|  InspectorBackend.registerDOMDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "DOM");
 | 
|  InspectorBackend.registerEvent("DOM.documentUpdated", []);
 | 
| +InspectorBackend.registerEvent("DOM.inspectNodeRequested", ["nodeId"]);
 | 
|  InspectorBackend.registerEvent("DOM.setChildNodes", ["parentId", "nodes"]);
 | 
|  InspectorBackend.registerEvent("DOM.attributeModified", ["nodeId", "name", "value"]);
 | 
|  InspectorBackend.registerEvent("DOM.attributeRemoved", ["nodeId", "name"]);
 | 
| @@ -4393,6 +4288,8 @@
 | 
|  InspectorBackend.registerEnum("CSS.RegionRegionOverset", {Overset: "overset", Fit: "fit", Empty: "empty"});
 | 
|  InspectorBackend.registerEvent("CSS.mediaQueryResultChanged", []);
 | 
|  InspectorBackend.registerEvent("CSS.styleSheetChanged", ["styleSheetId"]);
 | 
| +InspectorBackend.registerEvent("CSS.styleSheetAdded", ["header"]);
 | 
| +InspectorBackend.registerEvent("CSS.styleSheetRemoved", ["styleSheetId"]);
 | 
|  InspectorBackend.registerEvent("CSS.namedFlowCreated", ["namedFlow"]);
 | 
|  InspectorBackend.registerEvent("CSS.namedFlowRemoved", ["documentNodeId", "flowName"]);
 | 
|  InspectorBackend.registerEvent("CSS.regionLayoutUpdated", ["namedFlow"]);
 | 
| @@ -4490,7 +4387,11 @@
 | 
|  InspectorBackend.registerEvent("HeapProfiler.finishHeapSnapshot", ["uid"]);
 | 
|  InspectorBackend.registerEvent("HeapProfiler.resetProfiles", []);
 | 
|  InspectorBackend.registerEvent("HeapProfiler.reportHeapSnapshotProgress", ["done", "total"]);
 | 
| +InspectorBackend.registerEvent("HeapProfiler.lastSeenObjectId", ["lastSeenObjectId", "timestamp"]);
 | 
| +InspectorBackend.registerEvent("HeapProfiler.heapStatsUpdate", ["statsUpdate"]);
 | 
|  InspectorBackend.registerCommand("HeapProfiler.getProfileHeaders", [], ["headers"]);
 | 
| +InspectorBackend.registerCommand("HeapProfiler.startTrackingHeapObjects", [], []);
 | 
| +InspectorBackend.registerCommand("HeapProfiler.stopTrackingHeapObjects", [], []);
 | 
|  InspectorBackend.registerCommand("HeapProfiler.getHeapSnapshot", [{"name": "uid", "type": "number", "optional": false}], []);
 | 
|  InspectorBackend.registerCommand("HeapProfiler.removeProfile", [{"name": "uid", "type": "number", "optional": false}], []);
 | 
|  InspectorBackend.registerCommand("HeapProfiler.clearProfiles", [], []);
 | 
| @@ -4877,7 +4778,7 @@
 | 
|  this.eventListenerBreakpoints = this.createSetting("eventListenerBreakpoints", []);
 | 
|  this.domBreakpoints = this.createSetting("domBreakpoints", []);
 | 
|  this.xhrBreakpoints = this.createSetting("xhrBreakpoints", []);
 | 
| -this.sourceMapsEnabled = this.createSetting("sourceMapsEnabled", false);
 | 
| +this.sourceMapsEnabled = this.createSetting("sourceMapsEnabled", true);
 | 
|  this.cacheDisabled = this.createSetting("cacheDisabled", false);
 | 
|  this.overrideUserAgent = this.createSetting("overrideUserAgent", "");
 | 
|  this.userAgent = this.createSetting("userAgent", "");
 | 
| @@ -4912,6 +4813,8 @@
 | 
|  this.messageURLFilters = this.createSetting("messageURLFilters", {});
 | 
|  this.splitVerticallyWhenDockedToRight = this.createSetting("splitVerticallyWhenDockedToRight", true);
 | 
|  this.visiblePanels = this.createSetting("visiblePanels", {});
 | 
| +this.shortcutPanelSwitch = this.createSetting("shortcutPanelSwitch", false);
 | 
| +this.portForwardings = this.createSetting("portForwardings", []);
 | 
|  }
 | 
|  
 | 
|  WebInspector.Settings.prototype = {
 | 
| @@ -4987,21 +4890,20 @@
 | 
|  this._enabledForTest = {};
 | 
|  
 | 
|  
 | 
| -this.snippetsSupport = this._createExperiment("snippetsSupport", "Snippets support");
 | 
|  this.nativeMemorySnapshots = this._createExperiment("nativeMemorySnapshots", "Native memory profiling");
 | 
|  this.nativeMemoryTimeline = this._createExperiment("nativeMemoryTimeline", "Native memory timeline");
 | 
|  this.fileSystemInspection = this._createExperiment("fileSystemInspection", "FileSystem inspection");
 | 
|  this.canvasInspection = this._createExperiment("canvasInspection ", "Canvas inspection");
 | 
|  this.sass = this._createExperiment("sass", "Support for Sass");
 | 
| -this.codemirror = this._createExperiment("codemirror", "Use CodeMirror editor");
 | 
|  this.cssRegions = this._createExperiment("cssRegions", "CSS Regions Support");
 | 
|  this.showOverridesInDrawer = this._createExperiment("showOverridesInDrawer", "Show Overrides in drawer");
 | 
|  this.fileSystemProject = this._createExperiment("fileSystemProject", "File system folders in Sources Panel");
 | 
|  this.showWhitespaceInEditor = this._createExperiment("showWhitespaceInEditor", "Show whitespace characters in editor");
 | 
| -this.textEditorSmartBraces = this._createExperiment("textEditorSmartBraces", "Enable smart braces in text editor");
 | 
|  this.customizableToolbar = this._createExperiment("customizableToolbar", "Enable toolbar customization");
 | 
|  this.cpuFlameChart = this._createExperiment("cpuFlameChart", "Show Flame Chart in CPU Profiler");
 | 
| -this.shortcutPanelSwitch = this._createExperiment("shortcutPanelSwitch", "Enable Ctrl/Cmd + 1-9 shortcut to switch panels");
 | 
| +this.tethering = this._createExperiment("tethering", "Enable reverse port forwarding");
 | 
| +this.drawerOverlay = this._createExperiment("drawerOverlay", "Open console as overlay");
 | 
| +this.heapObjectsTracking = this._createExperiment("heapObjectsTracking", "Enable heap objects tracking profile type");
 | 
|  
 | 
|  this._cleanUpSetting();
 | 
|  }
 | 
| @@ -5732,7 +5634,7 @@
 | 
|  
 | 
|  WebInspector.isBeingEdited = function(element)
 | 
|  {
 | 
| -if (element.hasStyleClass("text-prompt") || element.nodeName === "INPUT")
 | 
| +if (element.hasStyleClass("text-prompt") || element.nodeName === "INPUT" || element.nodeName === "TEXTAREA")
 | 
|  return true;
 | 
|  
 | 
|  if (!WebInspector.__editingCount)
 | 
| @@ -5751,11 +5653,13 @@
 | 
|  if (value) {
 | 
|  if (element.__editing)
 | 
|  return false;
 | 
| +element.addStyleClass("being-edited");
 | 
|  element.__editing = true;
 | 
|  WebInspector.__editingCount = (WebInspector.__editingCount || 0) + 1;
 | 
|  } else {
 | 
|  if (!element.__editing)
 | 
|  return false;
 | 
| +element.removeStyleClass("being-edited");
 | 
|  delete element.__editing;
 | 
|  --WebInspector.__editingCount;
 | 
|  }
 | 
| @@ -6009,6 +5913,7 @@
 | 
|  theme: config.theme,
 | 
|  value: oldText
 | 
|  });
 | 
| +codeMirror.getWrapperElement().addStyleClass("source-code");
 | 
|  } else {
 | 
|  element.addStyleClass("editing");
 | 
|  
 | 
| @@ -6627,9 +6532,8 @@
 | 
|  WebInspector.HelpScreen.prototype = {
 | 
|  _createCloseButton: function()
 | 
|  {
 | 
| -var closeButton = document.createElement("button");
 | 
| -closeButton.className = "help-close-button";
 | 
| -closeButton.textContent = "\u2716"; 
 | 
| +var closeButton = document.createElement("div");
 | 
| +closeButton.className = "help-close-button close-button-gray";
 | 
|  closeButton.addEventListener("click", this.hide.bind(this), false);
 | 
|  return closeButton;
 | 
|  },
 | 
| @@ -6769,10 +6673,6 @@
 | 
|  {
 | 
|  },
 | 
|  
 | 
| -setAttachedWindowWidth: function(width)
 | 
| -{
 | 
| -},
 | 
| -
 | 
|  moveWindowBy: function(x, y)
 | 
|  {
 | 
|  },
 | 
| @@ -9472,7 +9372,7 @@
 | 
|  this._tabs = [];
 | 
|  this._tabsHistory = [];
 | 
|  this._tabsById = {};
 | 
| -this.element.addEventListener("click", this.focus.bind(this), false);
 | 
| +this.element.addEventListener("click", this.focus.bind(this), true);
 | 
|  this.element.addEventListener("mouseup", this.onMouseUp.bind(this), false);
 | 
|  
 | 
|  this._dropDownButton = this._createDropDownButton();
 | 
| @@ -10041,10 +9941,8 @@
 | 
|  if (!measuring)
 | 
|  this._titleElement = titleElement;
 | 
|  
 | 
| -if (this._closeable) {
 | 
| -var closeButtonSpan = tabElement.createChild("span", "tabbed-pane-header-tab-close-button");
 | 
| -closeButtonSpan.textContent = "\u00D7"; 
 | 
| -}
 | 
| +if (this._closeable)
 | 
| +tabElement.createChild("div", "close-button-gray");
 | 
|  
 | 
|  if (measuring)
 | 
|  tabElement.addStyleClass("measuring");
 | 
| @@ -10064,14 +9962,14 @@
 | 
|  
 | 
|  _tabClicked: function(event)
 | 
|  {
 | 
| -if (this._closeable && (event.button === 1 || event.target.hasStyleClass("tabbed-pane-header-tab-close-button")))
 | 
| +if (this._closeable && (event.button === 1 || event.target.hasStyleClass("close-button-gray")))
 | 
|  this._closeTabs([this.id]);
 | 
|  },
 | 
|  
 | 
|  
 | 
|  _tabMouseDown: function(event)
 | 
|  {
 | 
| -if (event.target.hasStyleClass("tabbed-pane-header-tab-close-button") || event.button === 1)
 | 
| +if (event.target.hasStyleClass("close-button-gray") || event.button === 1)
 | 
|  return;
 | 
|  this._tabbedPane.selectTab(this.id, true);
 | 
|  },
 | 
| @@ -10113,7 +10011,7 @@
 | 
|  
 | 
|  _startTabDragging: function(event)
 | 
|  {
 | 
| -if (event.target.hasStyleClass("tabbed-pane-header-tab-close-button"))
 | 
| +if (event.target.hasStyleClass("close-button-gray"))
 | 
|  return false;
 | 
|  this._dragStartX = event.pageX;
 | 
|  return true;
 | 
| @@ -10224,9 +10122,13 @@
 | 
|  if (!this.element.clientHeight)
 | 
|  return;  
 | 
|  
 | 
| +this._contentElement.removeChildren();
 | 
|  var itemCount = this._provider.itemCount();
 | 
| -if (!itemCount)
 | 
| +if (!itemCount) {
 | 
| +this._firstVisibleIndex = -1;
 | 
| +this._lastVisibleIndex = -1;
 | 
|  return;
 | 
| +}
 | 
|  
 | 
|  if (!this._rowHeight) {
 | 
|  var firstElement = this._provider.itemElement(0);
 | 
| @@ -10242,7 +10144,6 @@
 | 
|  this._topGapElement.style.height = (this._rowHeight * this._firstVisibleIndex) + "px";
 | 
|  this._bottomGapElement.style.height = (this._rowHeight * (itemCount - this._lastVisibleIndex - 1)) + "px"; 
 | 
|  
 | 
| -this._contentElement.removeChildren();
 | 
|  for (var i = this._firstVisibleIndex; i <= this._lastVisibleIndex; ++i)
 | 
|  this._contentElement.appendChild(this._provider.itemElement(i));
 | 
|  },
 | 
| @@ -10302,6 +10203,8 @@
 | 
|  WebInspector.Drawer = function()
 | 
|  {
 | 
|  this.element = document.getElementById("drawer");
 | 
| +this.element.style.height = 0;
 | 
| +
 | 
|  this._savedHeight = 200; 
 | 
|  this._mainElement = document.getElementById("main");
 | 
|  this._toolbarElement = document.getElementById("toolbar");
 | 
| @@ -10317,6 +10220,11 @@
 | 
|  this._viewStatusBar.addEventListener("webkitTransitionEnd", this.immediatelyFinishAnimation.bind(this), false);
 | 
|  this._viewStatusBar.style.opacity = 0;
 | 
|  this._bottomStatusBar = document.getElementById("bottom-status-bar-container");
 | 
| +
 | 
| +var drawerIsOverlay = WebInspector.experimentsSettings.drawerOverlay.isEnabled();
 | 
| +this._elementToAdjust = drawerIsOverlay ?  this._floatingStatusBarContainer : this._mainElement;
 | 
| +
 | 
| +document.body.enableStyleClass("drawer-overlay", drawerIsOverlay);
 | 
|  }
 | 
|  
 | 
|  WebInspector.Drawer.AnimationType = {
 | 
| @@ -10368,8 +10276,6 @@
 | 
|  
 | 
|  this._floatingStatusBarContainer.style.paddingLeft = this._bottomStatusBar.offsetLeft + "px";
 | 
|  
 | 
| -this._getAnimationStyles(animationType).forEach(document.body.addStyleClass, document.body);
 | 
| -
 | 
|  function animationFinished()
 | 
|  {
 | 
|  WebInspector.inspectorView.currentPanel().doResize();
 | 
| @@ -10382,13 +10288,21 @@
 | 
|  
 | 
|  console.assert(this._viewStatusBar.style.opacity === "0");
 | 
|  
 | 
| -if (animationType === WebInspector.Drawer.AnimationType.Immediately)
 | 
| -this.immediatelyFinishAnimation();
 | 
| +function adjustStyles()
 | 
| +{
 | 
| +this._animationStyles(animationType).forEach(document.body.addStyleClass, document.body);
 | 
|  
 | 
|  this.element.style.height = height + "px";
 | 
| -this._mainElement.style.bottom = height + "px";
 | 
| +this._elementToAdjust.style.bottom = height + "px";
 | 
|  this._floatingStatusBarContainer.style.paddingLeft = 0;
 | 
|  this._viewStatusBar.style.opacity = 1;
 | 
| +}
 | 
| +
 | 
| +if (animationType === WebInspector.Drawer.AnimationType.Immediately) {
 | 
| +adjustStyles.call(this);
 | 
| +this.immediatelyFinishAnimation();
 | 
| +} else
 | 
| +setTimeout(adjustStyles.bind(this), 0);
 | 
|  },
 | 
|  
 | 
|  hide: function(animationType)
 | 
| @@ -10407,8 +10321,6 @@
 | 
|  WebInspector.inspectorView.currentPanel().statusBarResized();
 | 
|  document.body.addStyleClass("drawer-visible");
 | 
|  
 | 
| -this._getAnimationStyles(animationType).forEach(document.body.addStyleClass, document.body);
 | 
| -
 | 
|  function animationFinished()
 | 
|  {
 | 
|  WebInspector.inspectorView.currentPanel().doResize();
 | 
| @@ -10425,13 +10337,21 @@
 | 
|  
 | 
|  console.assert(this._viewStatusBar.style.opacity === "1");
 | 
|  
 | 
| -if (animationType === WebInspector.Drawer.AnimationType.Immediately)
 | 
| -this.immediatelyFinishAnimation();
 | 
| +function adjustStyles()
 | 
| +{
 | 
| +this._animationStyles(animationType).forEach(document.body.addStyleClass, document.body);
 | 
|  
 | 
|  this.element.style.height = 0;
 | 
| -this._mainElement.style.bottom = 0;
 | 
| +this._elementToAdjust.style.bottom = 0;
 | 
|  this._floatingStatusBarContainer.style.paddingLeft = this._bottomStatusBar.offsetLeft + "px";
 | 
|  this._viewStatusBar.style.opacity = 0;
 | 
| +}
 | 
| +
 | 
| +if (animationType === WebInspector.Drawer.AnimationType.Immediately) {
 | 
| +adjustStyles.call(this);
 | 
| +this.immediatelyFinishAnimation();
 | 
| +} else
 | 
| +setTimeout(adjustStyles.bind(this), 0);
 | 
|  },
 | 
|  
 | 
|  resize: function()
 | 
| @@ -10441,7 +10361,7 @@
 | 
|  
 | 
|  this._view.storeScrollPositions();
 | 
|  var height = this._constrainHeight(parseInt(this.element.style.height, 10));
 | 
| -this._mainElement.style.bottom = height + "px";
 | 
| +this._elementToAdjust.style.bottom = height + "px";
 | 
|  this.element.style.height = height + "px";
 | 
|  this._view.doResize();
 | 
|  },
 | 
| @@ -10456,7 +10376,7 @@
 | 
|  }
 | 
|  },
 | 
|  
 | 
| -_getAnimationStyles: function(animationType)
 | 
| +_animationStyles: function(animationType)
 | 
|  {
 | 
|  switch (animationType) {
 | 
|  case WebInspector.Drawer.AnimationType.Slow:
 | 
| @@ -10484,7 +10404,7 @@
 | 
|  var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
 | 
|  height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop() - Preferences.minConsoleHeight);
 | 
|  
 | 
| -this._mainElement.style.bottom = height + "px";
 | 
| +this._elementToAdjust.style.bottom = height + "px";
 | 
|  this.element.style.height = height + "px";
 | 
|  if (WebInspector.inspectorView.currentPanel())
 | 
|  WebInspector.inspectorView.currentPanel().doResize();
 | 
| @@ -10675,7 +10595,8 @@
 | 
|  Rendering: "rendering",
 | 
|  CSS: "css",
 | 
|  Security: "security",
 | 
| -Other: "other"
 | 
| +Other: "other",
 | 
| +Deprecation: "deprecation"
 | 
|  }
 | 
|  
 | 
|  WebInspector.ConsoleMessage.MessageType = {
 | 
| @@ -12791,7 +12712,7 @@
 | 
|  return;
 | 
|  
 | 
|  
 | 
| -var panelShortcutEnabled = WebInspector.experimentsSettings.shortcutPanelSwitch.isEnabled();
 | 
| +var panelShortcutEnabled = WebInspector.settings.shortcutPanelSwitch.get();
 | 
|  if (panelShortcutEnabled && !event.shiftKey && !event.altKey && event.keyCode > 0x30 && event.keyCode < 0x3A) {
 | 
|  var panelName = this._panelOrder[event.keyCode - 0x31];
 | 
|  if (panelName) {
 | 
| @@ -13943,41 +13864,42 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| -_setWindow: function(left, right)
 | 
| +_setWindow: function(windowLeft, windowRight)
 | 
|  {
 | 
|  var clientWidth = this._parentElement.clientWidth;
 | 
| -this._setWindowPosition(left * clientWidth, right * clientWidth);
 | 
| -},
 | 
| +const rulerAdjustment = 1 / clientWidth;
 | 
|  
 | 
| +this.windowLeft = windowLeft;
 | 
| +this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
 | 
| +this.windowRight = windowRight;
 | 
| +this._rightResizeElement.style.left = this.windowRight * 100 + "%";
 | 
|  
 | 
| -_setWindowPosition: function(start, end)
 | 
| -{
 | 
| -var clientWidth = this._parentElement.clientWidth;
 | 
| -const rulerAdjustment = 1 / clientWidth;
 | 
| -if (typeof start === "number") {
 | 
| -this.windowLeft = start / clientWidth;
 | 
| -this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
 | 
|  this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";
 | 
|  this._overviewWindowBordersElement.style.left = (this.windowLeft - rulerAdjustment) * 100 + "%";
 | 
| -}
 | 
| -if (typeof end === "number") {
 | 
| -this.windowRight = end / clientWidth;
 | 
| -this._rightResizeElement.style.left = this.windowRight * 100 + "%";
 | 
| -}
 | 
|  this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";
 | 
|  this._overviewWindowBordersElement.style.right = (1 - this.windowRight + 2 * rulerAdjustment) * 100 + "%";
 | 
| +
 | 
|  this.dispatchEventToListeners(WebInspector.OverviewGrid.Events.WindowChanged);
 | 
|  },
 | 
|  
 | 
|  
 | 
| +_setWindowPosition: function(start, end)
 | 
| +{
 | 
| +var clientWidth = this._parentElement.clientWidth;
 | 
| +var windowLeft = typeof start === "number" ? start / clientWidth : this.windowLeft;
 | 
| +var windowRight = typeof end === "number" ? end / clientWidth : this.windowRight;
 | 
| +this._setWindow(windowLeft, windowRight);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _onMouseWheel: function(event)
 | 
|  {
 | 
| +if (typeof event.wheelDeltaY === "number" && event.wheelDeltaY) {
 | 
|  const zoomFactor = 1.1;
 | 
|  const mouseWheelZoomSpeed = 1 / 120;
 | 
|  
 | 
| -if (typeof event.wheelDeltaY === "number" && event.wheelDeltaY) {
 | 
| -var referencePoint = event.offsetX;
 | 
| -this._zoom(Math.pow(zoomFactor, -event.wheelDeltaY * mouseWheelZoomSpeed), referencePoint);
 | 
| +var reference = event.offsetX / event.target.clientWidth;
 | 
| +this._zoom(Math.pow(zoomFactor, -event.wheelDeltaY * mouseWheelZoomSpeed), reference);
 | 
|  }
 | 
|  if (typeof event.wheelDeltaX === "number" && event.wheelDeltaX) {
 | 
|  var offset = Math.round(event.wheelDeltaX * WebInspector.OverviewGrid.WindowScrollSpeedFactor);
 | 
| @@ -13997,20 +13919,23 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| -_zoom: function(factor, referencePoint)
 | 
| +_zoom: function(factor, reference)
 | 
|  {
 | 
| -var left = this._leftResizeElement.offsetLeft + WebInspector.OverviewGrid.ResizerOffset;
 | 
| -var right = this._rightResizeElement.offsetLeft + WebInspector.OverviewGrid.ResizerOffset;
 | 
| +var left = this.windowLeft;
 | 
| +var right = this.windowRight;
 | 
| +var windowSize = right - left;
 | 
| +var newWindowSize = factor * windowSize;
 | 
| +var minWindowSize = WebInspector.OverviewGrid.MinSelectableSize / this._parentElement.clientWidth;
 | 
|  
 | 
| -var delta = factor * (right - left);
 | 
| -if (factor < 1 && delta < WebInspector.OverviewGrid.MinSelectableSize)
 | 
| -return;
 | 
| -var max = this._parentElement.clientWidth;
 | 
| -if (typeof referencePoint !== "number")
 | 
| -referencePoint = (right + left) / 2;
 | 
| -left = Math.max(0, Math.min(max - delta, referencePoint + (left - referencePoint) * factor));
 | 
| -right = Math.min(max, left + delta);
 | 
| -this._setWindowPosition(left, right);
 | 
| +newWindowSize = Number.constrain(newWindowSize, minWindowSize, 1);
 | 
| +factor = newWindowSize / windowSize;
 | 
| +
 | 
| +left = reference + (left - reference) * factor;
 | 
| +left = Number.constrain(left, 0, 1 - newWindowSize);
 | 
| +
 | 
| +right = reference + (right - reference) * factor;
 | 
| +right = Number.constrain(right, newWindowSize, 1);
 | 
| +this._setWindow(left, right);
 | 
|  },
 | 
|  
 | 
|  __proto__: WebInspector.Object.prototype
 | 
| @@ -14102,6 +14027,7 @@
 | 
|  if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) === "\r")
 | 
|  lineContent = lineContent.substring(0, lineContent.length - 1)
 | 
|  
 | 
| +regex.lastIndex = 0;
 | 
|  if (regex.exec(lineContent))
 | 
|  result.push(new WebInspector.ContentProvider.SearchMatch(i, lineContent));
 | 
|  }
 | 
| @@ -15006,7 +14932,7 @@
 | 
|  return;
 | 
|  }
 | 
|  if (typeof this._content !== "undefined") {
 | 
| -callback(this.content || null, this._contentEncoded, this.type.canonicalMimeType());
 | 
| +callback(this.content || null, this._contentEncoded, this.type.canonicalMimeType() || this._mimeType);
 | 
|  return;
 | 
|  }
 | 
|  this._pendingContentCallbacks.push(callback);
 | 
| @@ -15365,9 +15291,8 @@
 | 
|  revision._persist();
 | 
|  }
 | 
|  
 | 
| -var oldWorkingCopy = this._workingCopy;
 | 
| -delete this._workingCopy;
 | 
| -this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted, {oldWorkingCopy: oldWorkingCopy, workingCopy: this.workingCopy()});
 | 
| +this._innerResetWorkingCopy();
 | 
| +this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);
 | 
|  if (this._url && WebInspector.fileManager.isURLSaved(this._url)) {
 | 
|  WebInspector.fileManager.save(this._url, this._content, false);
 | 
|  WebInspector.fileManager.close(this._url);
 | 
| @@ -15476,6 +15401,10 @@
 | 
|  
 | 
|  workingCopy: function()
 | 
|  {
 | 
| +if (this._workingCopyGetter) {
 | 
| +this._workingCopy = this._workingCopyGetter();
 | 
| +delete this._workingCopyGetter;
 | 
| +}
 | 
|  if (this.isDirty())
 | 
|  return this._workingCopy;
 | 
|  return this._content;
 | 
| @@ -15483,23 +15412,40 @@
 | 
|  
 | 
|  resetWorkingCopy: function()
 | 
|  {
 | 
| -this.setWorkingCopy(this._content);
 | 
| +this._innerResetWorkingCopy();
 | 
| +this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
 | 
|  },
 | 
|  
 | 
| +_innerResetWorkingCopy: function()
 | 
| +{
 | 
| +delete this._workingCopy;
 | 
| +delete this._workingCopyGetter;
 | 
| +},
 | 
|  
 | 
| +
 | 
|  setWorkingCopy: function(newWorkingCopy)
 | 
|  {
 | 
| -var wasDirty = this.isDirty();        
 | 
|  this._mimeType = this.canonicalMimeType();
 | 
| -var oldWorkingCopy = this._workingCopy;
 | 
| -if (this._content === newWorkingCopy)
 | 
| -delete this._workingCopy;
 | 
| -else
 | 
|  this._workingCopy = newWorkingCopy;
 | 
| -this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged, {oldWorkingCopy: oldWorkingCopy, workingCopy: this.workingCopy(), wasDirty: wasDirty});
 | 
| +delete this._workingCopyGetter;
 | 
| +this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
 | 
|  },
 | 
|  
 | 
| +setWorkingCopyGetter: function(workingCopyGetter)
 | 
| +{
 | 
| +this._workingCopyGetter = workingCopyGetter;
 | 
| +this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
 | 
| +},
 | 
|  
 | 
| +removeWorkingCopyGetter: function()
 | 
| +{
 | 
| +if (!this._workingCopyGetter)
 | 
| +return;
 | 
| +this._workingCopy = this._workingCopyGetter();
 | 
| +delete this._workingCopyGetter;
 | 
| +},
 | 
| +
 | 
| +
 | 
|  commitWorkingCopy: function(callback)
 | 
|  {
 | 
|  if (!this.isDirty()) {
 | 
| @@ -15507,7 +15453,7 @@
 | 
|  return;
 | 
|  }
 | 
|  
 | 
| -this._commitContent(this._workingCopy, true);
 | 
| +this._commitContent(this.workingCopy(), true);
 | 
|  callback(null);
 | 
|  
 | 
|  WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
 | 
| @@ -15519,7 +15465,7 @@
 | 
|  
 | 
|  isDirty: function()
 | 
|  {
 | 
| -return typeof this._workingCopy !== "undefined" && this._workingCopy !== this._content;
 | 
| +return typeof this._workingCopy !== "undefined" || typeof this._workingCopyGetter !== "undefined";
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -15678,7 +15624,7 @@
 | 
|  function formattedChanged(content, formatterMapping)
 | 
|  {
 | 
|  this._content = content;
 | 
| -delete this._workingCopy;
 | 
| +this._innerResetWorkingCopy();
 | 
|  this._formatterMapping = formatterMapping;
 | 
|  this.dispatchEventToListeners(WebInspector.UISourceCode.Events.FormattedChanged, {content: content});
 | 
|  this.updateLiveLocations();
 | 
| @@ -15983,7 +15929,9 @@
 | 
|  }
 | 
|  
 | 
|  WebInspector.CSSStyleModel.Events = {
 | 
| +StyleSheetAdded: "StyleSheetAdded",
 | 
|  StyleSheetChanged: "StyleSheetChanged",
 | 
| +StyleSheetRemoved: "StyleSheetRemoved",
 | 
|  MediaQueryResultChanged: "MediaQueryResultChanged",
 | 
|  NamedFlowCreated: "NamedFlowCreated",
 | 
|  NamedFlowRemoved: "NamedFlowRemoved",
 | 
| @@ -16192,6 +16140,12 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| +styleSheetHeaders: function()
 | 
| +{
 | 
| +return Object.values(this._resourceBinding._styleSheetIdToHeader);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _ownerDocumentId: function(nodeId)
 | 
|  {
 | 
|  var node = WebInspector.domAgent.nodeForId(nodeId);
 | 
| @@ -16215,6 +16169,22 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| +_styleSheetAdded: function(header)
 | 
| +{
 | 
| +this._resourceBinding._setHeaderForStyleSheetId(header.styleSheetId, header);
 | 
| +this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetAdded, header);
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_styleSheetRemoved: function(id)
 | 
| +{
 | 
| +var header = this._resourceBinding._styleSheetIdToHeader[id];
 | 
| +console.assert(header);
 | 
| +this._resourceBinding._setHeaderForStyleSheetId(id, null);
 | 
| +this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, header);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _namedFlowCreated: function(namedFlowPayload)
 | 
|  {
 | 
|  var namedFlow = WebInspector.NamedFlow.parsePayload(namedFlowPayload);
 | 
| @@ -16279,13 +16249,11 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| -getViaInspectorResourceForRule: function(rule, callback)
 | 
| +viaInspectorResourceForRule: function(rule)
 | 
|  {
 | 
| -if (!rule.id) {
 | 
| -callback(null);
 | 
| -return;
 | 
| -}
 | 
| -this._resourceBinding._requestViaInspectorResource(rule.id.styleSheetId, callback);
 | 
| +if (!rule.id)
 | 
| +return null;
 | 
| +return this._resourceBinding._inspectorResource(rule.id.styleSheetId);
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -16847,6 +16815,42 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +WebInspector.CSSStyleSheetHeader = function(payload)
 | 
| +{
 | 
| +this.id = payload.styleSheetId;
 | 
| +this.frameId = payload.frameId;
 | 
| +this.sourceURL = payload.sourceURL;
 | 
| +this.origin = payload.origin;
 | 
| +this.title = payload.title;
 | 
| +this.disabled = payload.disabled;
 | 
| +}
 | 
| +
 | 
| +WebInspector.CSSStyleSheetHeader.prototype = {
 | 
| +
 | 
| +resourceURL: function()
 | 
| +{
 | 
| +return this.origin === "inspector" ? this._viaInspectorResourceURL() : this.sourceURL;
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_key: function()
 | 
| +{
 | 
| +return this.frameId + ":" + this.resourceURL();
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_viaInspectorResourceURL: function()
 | 
| +{
 | 
| +var parsedURL = new WebInspector.ParsedURL(this.sourceURL);
 | 
| +var fakeURL = "inspector://" + parsedURL.host + parsedURL.folderPathComponents;
 | 
| +if (!fakeURL.endsWith("/"))
 | 
| +fakeURL += "/";
 | 
| +fakeURL += "inspector-stylesheet";
 | 
| +return fakeURL;
 | 
| +}
 | 
| +}
 | 
| +
 | 
| +
 | 
|  WebInspector.CSSStyleSheet = function(payload)
 | 
|  {
 | 
|  this.id = payload.styleSheetId;
 | 
| @@ -16910,145 +16914,93 @@
 | 
|  
 | 
|  WebInspector.CSSStyleModelResourceBinding.prototype = {
 | 
|  
 | 
| -requestStyleSheetIdForResource: function(resource, callback)
 | 
| +_setHeaderForStyleSheetId: function(styleSheetId, header)
 | 
|  {
 | 
| -function innerCallback()
 | 
| -{
 | 
| -callback(this._styleSheetIdForResource(resource));
 | 
| +var oldHeader = this._styleSheetIdToHeader[styleSheetId];
 | 
| +if (oldHeader) {
 | 
| +delete this._styleSheetIdToHeader[styleSheetId];
 | 
| +delete this._frameAndURLToStyleSheetId[oldHeader._key()];
 | 
|  }
 | 
| -
 | 
| -if (this._styleSheetIdForResource(resource))
 | 
| -innerCallback.call(this);
 | 
| +if (header) {
 | 
| +var styleSheetHeader = new WebInspector.CSSStyleSheetHeader(header);
 | 
| +this._styleSheetIdToHeader[styleSheetId] = styleSheetHeader;
 | 
| +if (styleSheetHeader.origin === "inspector")
 | 
| +this._createInspectorResource(styleSheetHeader);
 | 
|  else
 | 
| -this._loadStyleSheetHeaders(innerCallback.bind(this));
 | 
| +this._frameAndURLToStyleSheetId[styleSheetHeader._key()] = styleSheetHeader.id;
 | 
| +}
 | 
|  },
 | 
|  
 | 
|  
 | 
| -requestResourceURLForStyleSheetId: function(styleSheetId, callback)
 | 
| +resourceURLForStyleSheetId: function(styleSheetId)
 | 
|  {
 | 
| -function innerCallback()
 | 
| -{
 | 
|  var header = this._styleSheetIdToHeader[styleSheetId];
 | 
| -if (!header) {
 | 
| -callback(null);
 | 
| -return;
 | 
| -}
 | 
| +if (!header)
 | 
| +return null;
 | 
|  
 | 
|  var frame = WebInspector.resourceTreeModel.frameForId(header.frameId);
 | 
| -if (!frame) {
 | 
| -callback(null);
 | 
| -return;
 | 
| -}
 | 
| +if (!frame)
 | 
| +return null;
 | 
|  
 | 
| -var styleSheetURL = header.origin === "inspector" ? this._viaInspectorResourceURL(header.sourceURL) : header.sourceURL;
 | 
| -callback(styleSheetURL);
 | 
| -}
 | 
| -
 | 
| -if (this._styleSheetIdToHeader[styleSheetId])
 | 
| -innerCallback.call(this);
 | 
| -else
 | 
| -this._loadStyleSheetHeaders(innerCallback.bind(this));
 | 
| +return header.resourceURL();
 | 
|  },
 | 
|  
 | 
|  
 | 
| -_styleSheetIdForResource: function(resource)
 | 
| +styleSheetIdForResource: function(resource)
 | 
|  {
 | 
| -return this._frameAndURLToStyleSheetId[resource.frameId + ":" + resource.url];
 | 
| +return this._frameAndURLToStyleSheetId[resource.frameId + ":" + resource.url] || null;
 | 
|  },
 | 
|  
 | 
|  
 | 
| -_loadStyleSheetHeaders: function(callback)
 | 
| +_createInspectorResource: function(header)
 | 
|  {
 | 
| -
 | 
| -function didGetAllStyleSheets(error, infos)
 | 
| -{
 | 
| -if (error) {
 | 
| -callback(error);
 | 
| -return;
 | 
| -}
 | 
| -
 | 
| -for (var i = 0; i < infos.length; ++i) {
 | 
| -var info = infos[i];
 | 
| -if (info.origin === "inspector") {
 | 
| -this._getOrCreateInspectorResource(info);
 | 
| -continue;
 | 
| -}
 | 
| -this._frameAndURLToStyleSheetId[info.frameId + ":" + info.sourceURL] = info.styleSheetId;
 | 
| -this._styleSheetIdToHeader[info.styleSheetId] = info;
 | 
| -}
 | 
| -callback(null);
 | 
| -}
 | 
| -CSSAgent.getAllStyleSheets(didGetAllStyleSheets.bind(this));
 | 
| -},
 | 
| -
 | 
| -
 | 
| -_requestViaInspectorResource: function(styleSheetId, callback)
 | 
| -{
 | 
| -var header = this._styleSheetIdToHeader[styleSheetId];
 | 
| -if (header) {
 | 
| -callback(this._getOrCreateInspectorResource(header));
 | 
| -return;
 | 
| -}
 | 
| -
 | 
| -function headersLoaded()
 | 
| -{
 | 
| -var header = this._styleSheetIdToHeader[styleSheetId];
 | 
| -if (header)
 | 
| -callback(this._getOrCreateInspectorResource(header));
 | 
| -else
 | 
| -callback(null);
 | 
| -}
 | 
| -this._loadStyleSheetHeaders(headersLoaded.bind(this));
 | 
| -},
 | 
| -
 | 
| -
 | 
| -_getOrCreateInspectorResource: function(header)
 | 
| -{
 | 
|  var frame = WebInspector.resourceTreeModel.frameForId(header.frameId);
 | 
|  if (!frame)
 | 
| -return null;
 | 
| +return;
 | 
|  
 | 
| -var viaInspectorURL = this._viaInspectorResourceURL(header.sourceURL);    
 | 
| -var inspectorResource = frame.resourceForURL(viaInspectorURL);
 | 
| -if (inspectorResource)
 | 
| -return inspectorResource;
 | 
| +var viaInspectorURL = header._viaInspectorResourceURL();
 | 
| +console.assert(!frame.resourceForURL(viaInspectorURL));
 | 
|  
 | 
|  var resource = frame.resourceForURL(header.sourceURL);
 | 
|  if (!resource)
 | 
| -return null;
 | 
| +return;
 | 
|  
 | 
| -this._frameAndURLToStyleSheetId[header.frameId + ":" + viaInspectorURL] = header.styleSheetId;
 | 
| -this._styleSheetIdToHeader[header.styleSheetId] = header;
 | 
| -inspectorResource = new WebInspector.Resource(null, viaInspectorURL, resource.documentURL, resource.frameId, resource.loaderId, WebInspector.resourceTypes.Stylesheet, "text/css", true);
 | 
| +this._frameAndURLToStyleSheetId[header._key()] = header.id;
 | 
| +var inspectorResource = new WebInspector.Resource(null, viaInspectorURL, resource.documentURL, resource.frameId, resource.loaderId, WebInspector.resourceTypes.Stylesheet, "text/css", true);
 | 
|  
 | 
| +
 | 
|  function overrideRequestContent(callback)
 | 
|  {
 | 
|  function callbackWrapper(error, content)
 | 
|  {
 | 
|  callback(error ? "" : content, false, "text/css");
 | 
|  }
 | 
| -CSSAgent.getStyleSheetText(header.styleSheetId, callbackWrapper);
 | 
| +CSSAgent.getStyleSheetText(header.id, callbackWrapper);
 | 
|  }
 | 
|  inspectorResource.requestContent = overrideRequestContent;
 | 
|  frame.addResource(inspectorResource);
 | 
| -return inspectorResource;
 | 
|  },
 | 
|  
 | 
|  
 | 
| -_viaInspectorResourceURL: function(documentURL)
 | 
| +_inspectorResource: function(styleSheetId)
 | 
|  {
 | 
| -var parsedURL = new WebInspector.ParsedURL(documentURL);
 | 
| -var fakeURL = "inspector://" + parsedURL.host + parsedURL.folderPathComponents;
 | 
| -if (!fakeURL.endsWith("/"))
 | 
| -fakeURL += "/";
 | 
| -fakeURL += "inspector-stylesheet";
 | 
| -return fakeURL;
 | 
| +var header = this._styleSheetIdToHeader[styleSheetId];
 | 
| +if (!header)
 | 
| +return null;
 | 
| +var frame = WebInspector.resourceTreeModel.frameForId(header.frameId);
 | 
| +if (!frame)
 | 
| +return null;
 | 
| +
 | 
| +var viaInspectorURL = header._viaInspectorResourceURL();
 | 
| +return frame.resourceForURL(viaInspectorURL);
 | 
|  },
 | 
|  
 | 
|  _reset: function()
 | 
|  {
 | 
|  
 | 
| +
 | 
|  this._frameAndURLToStyleSheetId = {};
 | 
| +
 | 
|  this._styleSheetIdToHeader = {};
 | 
|  }
 | 
|  }
 | 
| @@ -17072,6 +17024,18 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| +styleSheetAdded: function(header)
 | 
| +{
 | 
| +this._cssModel._styleSheetAdded(header);
 | 
| +},
 | 
| +
 | 
| +
 | 
| +styleSheetRemoved: function(id)
 | 
| +{
 | 
| +this._cssModel._styleSheetRemoved(id);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  namedFlowCreated: function(namedFlowPayload)
 | 
|  {
 | 
|  this._cssModel._namedFlowCreated(namedFlowPayload);
 | 
| @@ -22746,29 +22710,30 @@
 | 
|  
 | 
|  color: function()
 | 
|  {
 | 
| -return WebInspector.Color.fromHSVA(this._hsv, this._outputColorFormat());
 | 
| +return WebInspector.Color.fromHSVA(this._hsv);
 | 
|  },
 | 
|  
 | 
| -_outputColorFormat: function()
 | 
| +_colorString: function()
 | 
|  {
 | 
|  var cf = WebInspector.Color.Format;
 | 
|  var format = this._originalFormat;
 | 
| +var color = this.color();
 | 
| +var originalFormatString = color.toString(this._originalFormat);
 | 
| +if (originalFormatString)
 | 
| +return originalFormatString;
 | 
|  
 | 
| -if (this._hsv[3] === 1) {
 | 
| +if (color.hasAlpha()) {
 | 
|  
 | 
| -if (format === cf.RGBA)
 | 
| -format = cf.RGB;
 | 
| -else if (format === cf.HSLA)
 | 
| -format = cf.HSL;
 | 
| -} else {
 | 
| -
 | 
| -if (format === cf.HSL || format === cf.HSLA)
 | 
| -format = cf.HSLA;
 | 
| +if (format === cf.HSLA || format === cf.HSL)
 | 
| +return color.toString(cf.HSLA);
 | 
|  else
 | 
| -format = cf.RGBA;
 | 
| +return color.toString(cf.RGBA);
 | 
|  }
 | 
|  
 | 
| -return format;
 | 
| +if (format === cf.ShortHEX)
 | 
| +return color.toString(cf.HEX);
 | 
| +console.assert(format === cf.Nickname);
 | 
| +return color.toString(cf.RGB);
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -22780,7 +22745,7 @@
 | 
|  _onchange: function()
 | 
|  {
 | 
|  this._updateUI();
 | 
| -this.dispatchEventToListeners(WebInspector.Spectrum.Events.ColorChanged, this.color());
 | 
| +this.dispatchEventToListeners(WebInspector.Spectrum.Events.ColorChanged, this._colorString());
 | 
|  },
 | 
|  
 | 
|  _updateHelperLocations: function()
 | 
| @@ -23146,6 +23111,7 @@
 | 
|  "\u2002": "ensp",
 | 
|  "\u2003": "emsp",
 | 
|  "\u2009": "thinsp",
 | 
| +"\u200a": "#8202", 
 | 
|  "\u200b": "#8203", 
 | 
|  "\u200c": "zwnj",
 | 
|  "\u200d": "zwj",
 | 
| @@ -27677,8 +27643,8 @@
 | 
|  WebInspector.Color = function(rgba, format, originalText)
 | 
|  {
 | 
|  this._rgba = rgba;
 | 
| -this._originalText = originalText;
 | 
| -this._format = format;
 | 
| +this._originalText = originalText || null;
 | 
| +this._format = format || null;
 | 
|  if (typeof this._rgba[3] === "undefined")
 | 
|  this._rgba[3] = 1;
 | 
|  for (var i = 0; i < 4; ++i) {
 | 
| @@ -27777,17 +27743,20 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -WebInspector.Color.fromHSVA = function(hsva, format)
 | 
| +WebInspector.Color.fromHSVA = function(hsva)
 | 
|  {
 | 
|  var h = hsva[0];
 | 
|  var s = hsva[1];
 | 
|  var v = hsva[2];
 | 
|  
 | 
|  var t = (2 - s) * v;
 | 
| +if (v === 0 || s === 0)
 | 
| +s = 0;
 | 
| +else
 | 
|  s *= v / (t < 1 ? t : 2 - t);
 | 
|  var hsla = [h, s, t / 2, hsva[3]];
 | 
|  
 | 
| -return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla), format);
 | 
| +return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla), WebInspector.Color.Format.HSLA);
 | 
|  }
 | 
|  
 | 
|  WebInspector.Color.prototype = {
 | 
| @@ -27843,24 +27812,23 @@
 | 
|  var l = hsla[2];
 | 
|  
 | 
|  s *= l < 0.5 ? l : 1 - l;
 | 
| -return [h, s, (l + s), hsla[3]];
 | 
| +return [h, s !== 0 ? 2 * s / (l + s) : 0, (l + s), hsla[3]];
 | 
|  },
 | 
|  
 | 
|  
 | 
|  hasAlpha: function()
 | 
|  {
 | 
| -if (this._rgba[3] !== 1)
 | 
| -return true;
 | 
| -return this._format === WebInspector.Color.Format.RGBA ||
 | 
| -this._format === WebInspector.Color.Format.HSLA;
 | 
| +return this._rgba[3] !== 1;
 | 
|  },
 | 
|  
 | 
|  
 | 
|  canBeShortHex: function()
 | 
|  {
 | 
| +if (this.hasAlpha())
 | 
| +return false;
 | 
|  for (var i = 0; i < 3; ++i) {
 | 
|  var c = Math.round(this._rgba[i] * 255);
 | 
| -if ((c >> 4) !== (c & 0xF))
 | 
| +if (c % 17)
 | 
|  return false;
 | 
|  }
 | 
|  return true;
 | 
| @@ -27888,25 +27856,33 @@
 | 
|  
 | 
|  function toShortHexValue(value)
 | 
|  {
 | 
| -return (Math.round(value * 255) >> 4).toString(16);
 | 
| +return (Math.round(value * 255) / 17).toString(16);
 | 
|  }
 | 
|  
 | 
|  switch (format) {
 | 
|  case WebInspector.Color.Format.Original:
 | 
|  return this._originalText;
 | 
|  case WebInspector.Color.Format.RGB:
 | 
| +if (this.hasAlpha())
 | 
| +return null;
 | 
|  return String.sprintf("rgb(%d, %d, %d)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]));
 | 
|  case WebInspector.Color.Format.RGBA:
 | 
|  return String.sprintf("rgba(%d, %d, %d, %f)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]), this._rgba[3]);
 | 
|  case WebInspector.Color.Format.HSL:
 | 
| +if (this.hasAlpha())
 | 
| +return null;
 | 
|  var hsl = this.hsla();
 | 
|  return String.sprintf("hsl(%d, %d%, %d%)", Math.round(hsl[0] * 360), Math.round(hsl[1] * 100), Math.round(hsl[2] * 100));
 | 
|  case WebInspector.Color.Format.HSLA:
 | 
|  var hsla = this.hsla();
 | 
|  return String.sprintf("hsla(%d, %d%, %d%, %f)", Math.round(hsla[0] * 360), Math.round(hsla[1] * 100), Math.round(hsla[2] * 100), hsla[3]);
 | 
|  case WebInspector.Color.Format.HEX:
 | 
| +if (this.hasAlpha())
 | 
| +return null;
 | 
|  return String.sprintf("#%s%s%s", toHexValue(this._rgba[0]), toHexValue(this._rgba[1]), toHexValue(this._rgba[2])).toUpperCase();
 | 
|  case WebInspector.Color.Format.ShortHEX:
 | 
| +if (!this.canBeShortHex())
 | 
| +return null;
 | 
|  return String.sprintf("#%s%s%s", toShortHexValue(this._rgba[0]), toShortHexValue(this._rgba[1]), toShortHexValue(this._rgba[2])).toUpperCase();
 | 
|  case WebInspector.Color.Format.Nickname:
 | 
|  return this.nickname();
 | 
| @@ -27937,7 +27913,7 @@
 | 
|  }
 | 
|  }
 | 
|  
 | 
| -return WebInspector.Color._rgbaToNickname[this._canonicalRGBA()];
 | 
| +return WebInspector.Color._rgbaToNickname[this._canonicalRGBA()] || null;
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -28175,7 +28151,8 @@
 | 
|  Border: WebInspector.Color.fromRGBA([255, 229, 153, .66]),
 | 
|  BorderLight: WebInspector.Color.fromRGBA([255, 229, 153, .5]),
 | 
|  Margin: WebInspector.Color.fromRGBA([246, 178, 107, .66]),
 | 
| -MarginLight: WebInspector.Color.fromRGBA([246, 178, 107, .5])
 | 
| +MarginLight: WebInspector.Color.fromRGBA([246, 178, 107, .5]),
 | 
| +EventTarget: WebInspector.Color.fromRGBA([255, 196, 196, .66])
 | 
|  }
 | 
|  
 | 
|  WebInspector.Color.Format = {
 | 
| @@ -29132,6 +29109,27 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +WebInspector.StatusBarText = function(text, className)
 | 
| +{
 | 
| +WebInspector.StatusBarItem.call(this, document.createElement("span"));
 | 
| +this.element.className = "status-bar-item status-bar-text";
 | 
| +if (className)
 | 
| +this.element.addStyleClass(className);
 | 
| +this.element.textContent = text;
 | 
| +}
 | 
| +
 | 
| +WebInspector.StatusBarText.prototype = {
 | 
| +
 | 
| +setText: function(text)
 | 
| +{
 | 
| +this.element.textContent = text;
 | 
| +},
 | 
| +
 | 
| +__proto__: WebInspector.StatusBarItem.prototype
 | 
| +}
 | 
| +
 | 
| +
 | 
| +
 | 
|  WebInspector.StatusBarButton = function(title, className, states)
 | 
|  {
 | 
|  WebInspector.StatusBarItem.call(this, document.createElement("button"));
 | 
| @@ -29164,8 +29162,8 @@
 | 
|  _clicked: function()
 | 
|  {
 | 
|  this.dispatchEventToListeners("click");
 | 
| -if (this._showOptionsTimer)
 | 
| -clearTimeout(this._showOptionsTimer);
 | 
| +if (this._longClickInterval)
 | 
| +clearInterval(this._longClickInterval);
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -29235,38 +29233,54 @@
 | 
|  this._visible = x;
 | 
|  },
 | 
|  
 | 
| -
 | 
| -makeLongClickEnabled: function(buttonsProvider)
 | 
| +makeLongClickEnabled: function()
 | 
|  {
 | 
| -this.longClickGlyph = document.createElement("div");
 | 
| -this.longClickGlyph.className = "fill long-click-glyph";
 | 
| -this.element.appendChild(this.longClickGlyph);
 | 
| -
 | 
| -this.longClickGlyphShadow = document.createElement("div");
 | 
| -this.longClickGlyphShadow.className = "fill long-click-glyph shadow";
 | 
| -this.element.appendChild(this.longClickGlyphShadow);
 | 
| -
 | 
|  this.element.addEventListener("mousedown", mouseDown.bind(this), false);
 | 
|  this.element.addEventListener("mouseout", mouseUp.bind(this), false);
 | 
|  this.element.addEventListener("mouseup", mouseUp.bind(this), false);
 | 
|  
 | 
| +var longClicks = 0;
 | 
| +
 | 
|  function mouseDown(e)
 | 
|  {
 | 
|  if (e.which !== 1)
 | 
|  return;
 | 
| -this._showOptionsTimer = setTimeout(this._showOptions.bind(this, buttonsProvider), 200);
 | 
| +longClicks = 0;
 | 
| +this._longClickInterval = setInterval(longClicked.bind(this), 200);
 | 
|  }
 | 
|  
 | 
|  function mouseUp(e)
 | 
|  {
 | 
|  if (e.which !== 1)
 | 
|  return;
 | 
| -if (this._showOptionsTimer)
 | 
| -clearTimeout(this._showOptionsTimer);
 | 
| +if (this._longClickInterval)
 | 
| +clearInterval(this._longClickInterval);
 | 
|  }
 | 
| +
 | 
| +function longClicked()
 | 
| +{
 | 
| +++longClicks;
 | 
| +this.dispatchEventToListeners(longClicks === 1 ? "longClickDown" : "longClickPress");
 | 
| +}
 | 
|  },
 | 
|  
 | 
|  
 | 
| +makeLongClickOptionsEnabled: function(buttonsProvider)
 | 
| +{
 | 
| +this.makeLongClickEnabled();
 | 
| +
 | 
| +this.longClickGlyph = document.createElement("div");
 | 
| +this.longClickGlyph.className = "fill long-click-glyph";
 | 
| +this.element.appendChild(this.longClickGlyph);
 | 
| +
 | 
| +this.longClickGlyphShadow = document.createElement("div");
 | 
| +this.longClickGlyphShadow.className = "fill long-click-glyph shadow";
 | 
| +this.element.appendChild(this.longClickGlyphShadow);
 | 
| +
 | 
| +this.addEventListener("longClickDown", this._showOptions.bind(this, buttonsProvider), this);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _showOptions: function(buttonsProvider)
 | 
|  {
 | 
|  var buttons = buttonsProvider();
 | 
| @@ -29317,10 +29331,13 @@
 | 
|  document.documentElement.removeEventListener("mouseup", mouseUpListener, false);
 | 
|  
 | 
|  for (var i = 0; i < buttons.length; ++i) {
 | 
| -if (buttons[i].element.hasStyleClass("emulate-active"))
 | 
| +if (buttons[i].element.hasStyleClass("emulate-active")) {
 | 
| +buttons[i].element.removeStyleClass("emulate-active");
 | 
|  buttons[i]._clicked();
 | 
| +break;
 | 
|  }
 | 
|  }
 | 
| +}
 | 
|  },
 | 
|  
 | 
|  __proto__: WebInspector.StatusBarItem.prototype
 | 
| @@ -29333,6 +29350,7 @@
 | 
|  this.element.className = "status-bar-select-container";
 | 
|  
 | 
|  this._selectElement = this.element.createChild("select", "status-bar-item");
 | 
| +this.element.createChild("div", "status-bar-select-arrow");
 | 
|  if (changeHandler)
 | 
|  this._selectElement.addEventListener("change", changeHandler, false);
 | 
|  if (className)
 | 
| @@ -29395,6 +29413,18 @@
 | 
|  this._selectElement.selectedIndex = Array.prototype.indexOf.call(this._selectElement, option);
 | 
|  },
 | 
|  
 | 
| +
 | 
| +setSelectedIndex: function(index)
 | 
| +{
 | 
| +this._selectElement.selectedIndex = index;
 | 
| +},
 | 
| +
 | 
| +
 | 
| +selectedIndex: function()
 | 
| +{
 | 
| +return this._selectElement.selectedIndex;
 | 
| +},
 | 
| +
 | 
|  __proto__: WebInspector.StatusBarItem.prototype
 | 
|  }
 | 
|  
 | 
| @@ -29414,6 +29444,11 @@
 | 
|  
 | 
|  WebInspector.TextEditor.prototype = {
 | 
|  
 | 
| +undo: function() { },
 | 
| +
 | 
| +redo: function() { },
 | 
| +
 | 
| +
 | 
|  isClean: function() { },
 | 
|  
 | 
|  markClean: function() { },
 | 
| @@ -29636,6 +29671,17 @@
 | 
|  
 | 
|  WebInspector.DefaultTextEditor.prototype = {
 | 
|  
 | 
| +undo: function()
 | 
| +{
 | 
| +this._mainPanel.undo();
 | 
| +},
 | 
| +
 | 
| +redo: function()
 | 
| +{
 | 
| +this._mainPanel.redo();
 | 
| +},
 | 
| +
 | 
| +
 | 
|  isClean: function()
 | 
|  {
 | 
|  return this._textModel.isClean();
 | 
| @@ -30877,6 +30923,9 @@
 | 
|  
 | 
|  _handleKeyPress: function(event)
 | 
|  {
 | 
| +if (event.target.enclosingNodeOrSelfWithClass("webkit-line-decorations"))
 | 
| +return;
 | 
| +
 | 
|  var char = String.fromCharCode(event.which);
 | 
|  var handler = this._charOverrides[char];
 | 
|  if (handler && handler()) {
 | 
| @@ -31160,7 +31209,17 @@
 | 
|  this._cachedRows = [];
 | 
|  },
 | 
|  
 | 
| +undo: function()
 | 
| +{
 | 
| +this._handleUndoRedo(false);
 | 
| +},
 | 
|  
 | 
| +redo: function()
 | 
| +{
 | 
| +this._handleUndoRedo(true);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _handleUndoRedo: function(redo)
 | 
|  {
 | 
|  if (this.readOnly())
 | 
| @@ -32682,9 +32741,6 @@
 | 
|  
 | 
|  registerShortcuts: function(shortcuts)
 | 
|  {
 | 
| -if (!WebInspector.experimentsSettings.textEditorSmartBraces.isEnabled())
 | 
| -return;
 | 
| -
 | 
|  var keys = WebInspector.KeyboardShortcut.Keys;
 | 
|  var modifiers = WebInspector.KeyboardShortcut.Modifiers;
 | 
|  
 | 
| @@ -32694,8 +32750,6 @@
 | 
|  
 | 
|  registerCharOverrides: function(charOverrides)
 | 
|  {
 | 
| -if (!WebInspector.experimentsSettings.textEditorSmartBraces.isEnabled())
 | 
| -return;
 | 
|  charOverrides["("] = this._handleBracePairInsertion.bind(this, "()");
 | 
|  charOverrides[")"] = this._handleClosingBraceOverride.bind(this, ")");
 | 
|  charOverrides["{"] = this._handleBracePairInsertion.bind(this, "{}");
 | 
| @@ -32785,11 +32839,8 @@
 | 
|  
 | 
|  var textEditorDelegate = new WebInspector.TextEditorDelegateForSourceFrame(this);
 | 
|  
 | 
| -if (WebInspector.experimentsSettings.codemirror.isEnabled()) {
 | 
|  loadScript("CodeMirrorTextEditor.js");
 | 
|  this._textEditor = new WebInspector.CodeMirrorTextEditor(this._url, textEditorDelegate);
 | 
| -} else
 | 
| -this._textEditor = new WebInspector.DefaultTextEditor(this._url, textEditorDelegate);
 | 
|  
 | 
|  this._currentSearchResultIndex = -1;
 | 
|  this._searchResults = [];
 | 
| @@ -32804,8 +32855,7 @@
 | 
|  this._shortcuts[WebInspector.KeyboardShortcut.makeKey("s", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)] = this._commitEditing.bind(this);
 | 
|  this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
 | 
|  
 | 
| -this._sourcePositionElement = document.createElement("div");
 | 
| -this._sourcePositionElement.className = "source-frame-cursor-position";
 | 
| +this._sourcePosition = new WebInspector.StatusBarText("", "source-frame-cursor-position");
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -32860,7 +32910,7 @@
 | 
|  
 | 
|  statusBarText: function()
 | 
|  {
 | 
| -return this._sourcePositionElement;
 | 
| +return this._sourcePosition.element;
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -33027,14 +33077,26 @@
 | 
|  this.clearMessages();
 | 
|  },
 | 
|  
 | 
| +_simplifyMimeType: function(mimeType)
 | 
| +{
 | 
| +if (!mimeType)
 | 
| +return "";
 | 
| +if (mimeType.indexOf("javascript") >= 0 ||
 | 
| +mimeType.indexOf("jscript") >= 0 ||
 | 
| +mimeType.indexOf("ecmascript") >= 0)
 | 
| +return "text/javascript";
 | 
| +return mimeType;
 | 
| +},
 | 
|  
 | 
| +
 | 
|  setContent: function(content, contentEncoded, mimeType)
 | 
|  {
 | 
| -this._textEditor.mimeType = mimeType;
 | 
| +this._textEditor.mimeType = this._simplifyMimeType(mimeType);
 | 
|  
 | 
|  if (!this._loaded) {
 | 
|  this._loaded = true;
 | 
|  this._textEditor.setText(content || "");
 | 
| +this._textEditor.markClean();
 | 
|  } else
 | 
|  this._textEditor.editRange(this._textEditor.range(), content || "");
 | 
|  
 | 
| @@ -33252,15 +33314,15 @@
 | 
|  this._textEditor.addDecoration(lineNumber, messageBubbleElement);
 | 
|  }
 | 
|  
 | 
| -var imageURL;
 | 
| +var imageElement = document.createElement("div");
 | 
|  switch (msg.level) {
 | 
|  case WebInspector.ConsoleMessage.MessageLevel.Error:
 | 
|  messageBubbleElement.addStyleClass("webkit-html-error-message");
 | 
| -imageURL = "Images/errorIcon.png";
 | 
| +imageElement.className = "error-icon-small";
 | 
|  break;
 | 
|  case WebInspector.ConsoleMessage.MessageLevel.Warning:
 | 
|  messageBubbleElement.addStyleClass("webkit-html-warning-message");
 | 
| -imageURL = "Images/warningIcon.png";
 | 
| +imageElement.className = "warning-icon-small";
 | 
|  break;
 | 
|  }
 | 
|  
 | 
| @@ -33269,10 +33331,7 @@
 | 
|  messageBubbleElement.appendChild(messageLineElement);
 | 
|  
 | 
|  
 | 
| -var image = document.createElement("img");
 | 
| -image.src = imageURL;
 | 
| -image.className = "webkit-html-message-icon";
 | 
| -messageLineElement.appendChild(image);
 | 
| +messageLineElement.appendChild(imageElement);
 | 
|  messageLineElement.appendChild(document.createTextNode(msg.message));
 | 
|  
 | 
|  rowMessage.element = messageLineElement;
 | 
| @@ -33361,16 +33420,16 @@
 | 
|  return;
 | 
|  
 | 
|  if (textRange.isEmpty()) {
 | 
| -this._sourcePositionElement.textContent = WebInspector.UIString("Line %d, Column %d", textRange.endLine + 1, textRange.endColumn + 1);
 | 
| +this._sourcePosition.setText(WebInspector.UIString("Line %d, Column %d", textRange.endLine + 1, textRange.endColumn + 1));
 | 
|  return;
 | 
|  }
 | 
|  textRange = textRange.normalize();
 | 
|  
 | 
|  var selectedText = this._textEditor.copyRange(textRange);
 | 
|  if (textRange.startLine === textRange.endLine)
 | 
| -this._sourcePositionElement.textContent = WebInspector.UIString("%d characters selected", selectedText.length);
 | 
| +this._sourcePosition.setText(WebInspector.UIString("%d characters selected", selectedText.length));
 | 
|  else
 | 
| -this._sourcePositionElement.textContent = WebInspector.UIString("%d lines, %d characters selected", textRange.endLine - textRange.startLine + 1, selectedText.length);
 | 
| +this._sourcePosition.setText(WebInspector.UIString("%d lines, %d characters selected", textRange.endLine - textRange.startLine + 1, selectedText.length));
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -33515,10 +33574,37 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +WebInspector.ResourceSourceFrameFallback = function(resource)
 | 
| +{
 | 
| +WebInspector.View.call(this);
 | 
| +this._resource = resource;
 | 
| +this.element.addStyleClass("fill");
 | 
| +this.element.addStyleClass("script-view");
 | 
| +this._content = this.element.createChild("div", "script-view-fallback monospace");
 | 
| +}
 | 
|  
 | 
| +WebInspector.ResourceSourceFrameFallback.prototype = {
 | 
| +wasShown: function()
 | 
| +{
 | 
| +if (!this._contentRequested) {
 | 
| +this._contentRequested = true;
 | 
| +this._resource.requestContent(this._contentLoaded.bind(this));
 | 
| +}
 | 
| +},
 | 
|  
 | 
|  
 | 
| +_contentLoaded: function(content, contentEncoded, mimeType)
 | 
| +{
 | 
| +this._content.textContent = content;
 | 
| +},
 | 
|  
 | 
| +__proto__: WebInspector.View.prototype
 | 
| +}
 | 
| +
 | 
| +
 | 
| +
 | 
| +
 | 
| +
 | 
|  WebInspector.FontView = function(resource)
 | 
|  {
 | 
|  WebInspector.ResourceView.call(this, resource);
 | 
| @@ -36777,12 +36863,14 @@
 | 
|  
 | 
|  WebInspector.TextEditorModel.prototype = {
 | 
|  
 | 
| -isClean: function() {
 | 
| -return !this._undoStack.length;
 | 
| +isClean: function()
 | 
| +{
 | 
| +return this._cleanState === this._undoStack.length;
 | 
|  },
 | 
|  
 | 
| -markClean: function() {
 | 
| -this._resetUndoStack();
 | 
| +markClean: function()
 | 
| +{
 | 
| +this._cleanState = this._undoStack.length;
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -37037,8 +37125,11 @@
 | 
|  if (this._inUndo)
 | 
|  this._redoStack.push(command);
 | 
|  else {
 | 
| -if (!this._inRedo)
 | 
| +if (!this._inRedo) {
 | 
|  this._redoStack = [];
 | 
| +if (typeof this._cleanState === "number" && this._cleanState > this._undoStack.length)
 | 
| +delete this._cleanState;
 | 
| +}
 | 
|  this._undoStack.push(command);
 | 
|  }
 | 
|  return command;
 | 
| @@ -37102,7 +37193,9 @@
 | 
|  
 | 
|  _resetUndoStack: function()
 | 
|  {
 | 
| +delete this._cleanState;
 | 
|  this._undoStack = [];
 | 
| +this._redoStack = [];
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -43940,7 +44033,10 @@
 | 
|  var originalToCanonicalURLMap = {};
 | 
|  for (var i = 0; i < map.sources.length; ++i) {
 | 
|  var originalSourceURL = map.sources[i];
 | 
| -var href = (map.sourceRoot ? map.sourceRoot + "/" : "") + originalSourceURL;
 | 
| +var sourceRoot = map.sourceRoot || "";
 | 
| +if (sourceRoot && !sourceRoot.endsWith("/"))
 | 
| +sourceRoot += "/";
 | 
| +var href = sourceRoot + originalSourceURL;
 | 
|  var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href;
 | 
|  originalToCanonicalURLMap[originalSourceURL] = url;
 | 
|  sources.push(url);
 | 
| @@ -44426,7 +44522,7 @@
 | 
|  var script =   (event.data);
 | 
|  this._defaultMapping.addScript(script);
 | 
|  
 | 
| -if (WebInspector.experimentsSettings.snippetsSupport.isEnabled() && script.isSnippet()) {
 | 
| +if (script.isSnippet()) {
 | 
|  this._snippetMapping.addScript(script);
 | 
|  return;
 | 
|  }
 | 
| @@ -44573,6 +44669,7 @@
 | 
|  }
 | 
|  
 | 
|  WebInspector.FileSystemProjectDelegate._scriptExtensions = ["js", "java", "cc", "cpp", "h", "cs", "py", "php"].keySet();
 | 
| +WebInspector.FileSystemProjectDelegate._styleSheetExtensions = ["css", "scss", "sass"].keySet();
 | 
|  
 | 
|  WebInspector.FileSystemProjectDelegate.projectId = function(fileSystemPath)
 | 
|  {
 | 
| @@ -44660,13 +44757,13 @@
 | 
|  var extensionIndex = fileName.lastIndexOf(".");
 | 
|  var extension = "";
 | 
|  if (extensionIndex !== -1)
 | 
| -extension = fileName.substring(extensionIndex + 1);
 | 
| +extension = fileName.substring(extensionIndex + 1).toLowerCase();
 | 
|  var contentType = WebInspector.resourceTypes.Other;
 | 
|  if (WebInspector.FileSystemProjectDelegate._scriptExtensions[extension])
 | 
|  return WebInspector.resourceTypes.Script;
 | 
| -if (extension === "css")
 | 
| +if (WebInspector.FileSystemProjectDelegate._styleSheetExtensions[extension])
 | 
|  return WebInspector.resourceTypes.Stylesheet;
 | 
| -if (extension === "html")
 | 
| +if (extension === "html" || extension === "htm")
 | 
|  return WebInspector.resourceTypes.Document;
 | 
|  return WebInspector.resourceTypes.Other;
 | 
|  },
 | 
| @@ -46169,7 +46266,6 @@
 | 
|  for (var j = 0; j < breakpoints.length; ++j) { 
 | 
|  var breakpoint = breakpoints[j];
 | 
|  this._breakpoints.remove(breakpoint);
 | 
| -delete breakpoint._primaryUILocation;
 | 
|  }
 | 
|  
 | 
|  var sourceFileId = WebInspector.BreakpointManager.sourceFileId(uiSourceCode);
 | 
| @@ -47435,14 +47531,10 @@
 | 
|  
 | 
|  if (isAddingRevision)
 | 
|  return;
 | 
| -this._cssModel.resourceBinding().requestResourceURLForStyleSheetId(event.data.styleSheetId, callback.bind(this));
 | 
| -
 | 
| -function callback(url)
 | 
| -{
 | 
| +var url = this._cssModel.resourceBinding().resourceURLForStyleSheetId(event.data.styleSheetId);
 | 
|  if (!url)
 | 
|  return;
 | 
|  this._cssModel.setSourceMapping(url, null);
 | 
| -}
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -48296,7 +48388,8 @@
 | 
|  ChildNodeCountUpdated: "ChildNodeCountUpdated",
 | 
|  InspectElementRequested: "InspectElementRequested",
 | 
|  UndoRedoRequested: "UndoRedoRequested",
 | 
| -UndoRedoCompleted: "UndoRedoCompleted"
 | 
| +UndoRedoCompleted: "UndoRedoCompleted",
 | 
| +InspectNodeRequested: "InspectNodeRequested"
 | 
|  }
 | 
|  
 | 
|  WebInspector.DOMAgent.prototype = {
 | 
| @@ -48540,6 +48633,12 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| +_inspectNodeRequested: function(nodeId)
 | 
| +{
 | 
| +this.dispatchEventToListeners(WebInspector.DOMAgent.Events.InspectNodeRequested, nodeId);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  performSearch: function(query, searchCallback)
 | 
|  {
 | 
|  this.cancelSearch();
 | 
| @@ -48626,7 +48725,8 @@
 | 
|  
 | 
|  setInspectModeEnabled: function(enabled, callback)
 | 
|  {
 | 
| -DOMAgent.setInspectModeEnabled(enabled, this._buildHighlightConfig(), callback);
 | 
| +var callbackCast =   (callback);
 | 
| +this._dispatchWhenDocumentAvailable(DOMAgent.setInspectModeEnabled.bind(DOMAgent, enabled, this._buildHighlightConfig()), callbackCast);
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -48646,6 +48746,9 @@
 | 
|  if (mode === "all" || mode === "margin")
 | 
|  highlightConfig.marginColor = WebInspector.Color.PageHighlight.Margin.toProtocolRGBA();
 | 
|  
 | 
| +if (mode === "all")
 | 
| +highlightConfig.eventTargetColor = WebInspector.Color.PageHighlight.EventTarget.toProtocolRGBA();
 | 
| +
 | 
|  return highlightConfig;
 | 
|  },
 | 
|  
 | 
| @@ -48745,6 +48848,12 @@
 | 
|  },
 | 
|  
 | 
|  
 | 
| +inspectNodeRequested: function(nodeId)
 | 
| +{
 | 
| +this._domAgent._inspectNodeRequested(nodeId);
 | 
| +},
 | 
| +
 | 
| +
 | 
|  attributeModified: function(nodeId, name, value)
 | 
|  {
 | 
|  this._domAgent._attributeModified(nodeId, name, value);
 | 
| @@ -49207,6 +49316,8 @@
 | 
|  this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Overrides, WebInspector.UIString("Overrides"), new WebInspector.OverridesSettingsTab());
 | 
|  if (WebInspector.experimentsSettings.fileSystemProject.isEnabled())
 | 
|  this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Workspace, WebInspector.UIString("Workspace"), new WebInspector.WorkspaceSettingsTab());
 | 
| +if (WebInspector.experimentsSettings.tethering.isEnabled())
 | 
| +this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Tethering, WebInspector.UIString("Port forwarding"), new WebInspector.TetheringSettingsTab());
 | 
|  if (WebInspector.experimentsSettings.experimentsEnabled)
 | 
|  this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Experiments, WebInspector.UIString("Experiments"), new WebInspector.ExperimentsSettingsTab());
 | 
|  this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Shortcuts, WebInspector.UIString("Shortcuts"), WebInspector.shortcutsScreen.createShortcutsTabView());
 | 
| @@ -49222,6 +49333,7 @@
 | 
|  General: "general",
 | 
|  Overrides: "overrides",
 | 
|  Workspace: "workspace",
 | 
| +Tethering: "tethering",
 | 
|  Experiments: "experiments",
 | 
|  Shortcuts: "shortcuts"
 | 
|  }
 | 
| @@ -49422,7 +49534,7 @@
 | 
|  
 | 
|  WebInspector.GenericSettingsTab = function()
 | 
|  {
 | 
| -WebInspector.SettingsTab.call(this, WebInspector.UIString("General"));
 | 
| +WebInspector.SettingsTab.call(this, WebInspector.UIString("General"), "general-tab-content");
 | 
|  
 | 
|  var p = this._appendSection();
 | 
|  p.appendChild(this._createCheckboxSetting(WebInspector.UIString("Disable cache (while DevTools is open)"), WebInspector.settings.cacheDisabled));
 | 
| @@ -49501,6 +49613,10 @@
 | 
|  p = this._appendSection(WebInspector.UIString("Extensions"));
 | 
|  p.appendChild(this._createCustomSetting(WebInspector.UIString("Open links in"), handlerSelector.element));
 | 
|  }
 | 
| +
 | 
| +p = this._appendSection();
 | 
| +var panelShortcutTitle = WebInspector.UIString("Enable %s + 1-9 shortcut to switch panels", WebInspector.isMac() ? "Cmd" : "Ctrl");
 | 
| +p.appendChild(this._createCheckboxSetting(panelShortcutTitle, WebInspector.settings.shortcutPanelSwitch));
 | 
|  }
 | 
|  
 | 
|  WebInspector.GenericSettingsTab.prototype = {
 | 
| @@ -49791,6 +49907,127 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +WebInspector.TetheringSettingsTab = function()
 | 
| +{
 | 
| +WebInspector.SettingsTab.call(this, WebInspector.UIString("Port Forwarding"), "workspace-tab-content");
 | 
| +}
 | 
| +
 | 
| +WebInspector.TetheringSettingsTab.prototype = {
 | 
| +wasShown: function()
 | 
| +{
 | 
| +if (this._paragraphElement)
 | 
| +return;
 | 
| +
 | 
| +this._paragraphElement = this._appendSection(WebInspector.UIString("Mappings"));
 | 
| +WebInspector.SettingsTab.prototype.wasShown.call(this);
 | 
| +var mappingEntries = WebInspector.settings.portForwardings.get();
 | 
| +for (var i = 0; i < mappingEntries.length; ++i)
 | 
| +this._addMappingRow(mappingEntries[i].port, mappingEntries[i].location, false);
 | 
| +if (!mappingEntries.length)
 | 
| +this._addMappingRow("", "", true);
 | 
| +this._save();
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_addMappingRow: function(port, location, focus)
 | 
| +{
 | 
| +var mappingRow = this._paragraphElement.createChild("div", "workspace-settings-row");
 | 
| +var portElement = mappingRow.createChild("input");
 | 
| +portElement.type = "text";
 | 
| +portElement.value = port || "";
 | 
| +if (!port)
 | 
| +portElement.placeholder = "8080";
 | 
| +portElement.addEventListener("keydown", this._editTextInputKey.bind(this, true), true);
 | 
| +portElement.addEventListener("blur", this._save.bind(this), true);
 | 
| +portElement.addEventListener("input", this._validatePort.bind(this, portElement), true);
 | 
| +
 | 
| +var locationElement = mappingRow.createChild("input");
 | 
| +locationElement.type = "text";
 | 
| +locationElement.value = location || "127.0.0.1:";
 | 
| +locationElement.addEventListener("keydown", this._editTextInputKey.bind(this, false), true);
 | 
| +locationElement.addEventListener("blur", this._save.bind(this), true);
 | 
| +locationElement.addEventListener("input", this._validateLocation.bind(this, locationElement), true);
 | 
| +
 | 
| +var removeButton = mappingRow.createChild("button", "button remove-button");
 | 
| +removeButton.value = WebInspector.UIString("Remove");
 | 
| +removeButton.tabIndex = -1;
 | 
| +removeButton.addEventListener("click", removeMappingClicked.bind(this), false);
 | 
| +
 | 
| +function removeMappingClicked()
 | 
| +{
 | 
| +mappingRow.removeSelf();
 | 
| +if (!this._paragraphElement.querySelector(".workspace-settings-row"))
 | 
| +this._addMappingRow();
 | 
| +this._save();
 | 
| +}
 | 
| +if (focus)
 | 
| +setTimeout(function() { portElement.focus(); }, 0); 
 | 
| +return mappingRow;
 | 
| +},
 | 
| +
 | 
| +_save: function()
 | 
| +{
 | 
| +var portForwardings = [];
 | 
| +for (var rowElement = this._paragraphElement.firstChild.nextSibling; rowElement; rowElement = rowElement.nextSibling) {
 | 
| +var portElement = rowElement.firstChild;
 | 
| +var locationElement = portElement.nextSibling;
 | 
| +var port = this._validatePort(portElement);
 | 
| +var location = this._validateLocation(locationElement);
 | 
| +if (!port || !location)
 | 
| +continue;
 | 
| +portForwardings.push({ port : parseInt(port, 10), location : location });
 | 
| +}
 | 
| +WebInspector.settings.portForwardings.set(portForwardings);
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_editTextInputKey: function(isPort, event)
 | 
| +{
 | 
| +if (!WebInspector.KeyboardShortcut.hasNoModifiers(  (event)))
 | 
| +return;
 | 
| +
 | 
| +if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code ||
 | 
| +event.keyCode === WebInspector.KeyboardShortcut.Keys.Tab.code) {
 | 
| +if (isPort)
 | 
| +event.target.nextElementSibling.focus();
 | 
| +else {
 | 
| +if (event.target.parentElement.nextSibling)
 | 
| +event.target.parentElement.nextSibling.firstChild.focus();
 | 
| +else
 | 
| +this._addMappingRow("", "", true);
 | 
| +}
 | 
| +event.consume(true);
 | 
| +}
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_validatePort: function(element, event)
 | 
| +{
 | 
| +var port = element.value;
 | 
| +if (isNaN(port) || port < 5000 || port > 10000) {
 | 
| +element.addStyleClass("workspace-settings-error");
 | 
| +return 0;
 | 
| +}
 | 
| +element.removeStyleClass("workspace-settings-error");
 | 
| +return parseInt(port, 10);
 | 
| +},
 | 
| +
 | 
| +
 | 
| +_validateLocation: function(element, event)
 | 
| +{
 | 
| +var location = element.value;
 | 
| +if (!/.*:\d+/.test(location)) {
 | 
| +element.addStyleClass("workspace-settings-error");
 | 
| +return "";
 | 
| +}
 | 
| +element.removeStyleClass("workspace-settings-error");
 | 
| +return location;
 | 
| +},
 | 
| +
 | 
| +__proto__: WebInspector.SettingsTab.prototype
 | 
| +}
 | 
| +
 | 
| +
 | 
|  WebInspector.ExperimentsSettingsTab = function()
 | 
|  {
 | 
|  WebInspector.SettingsTab.call(this, WebInspector.UIString("Experiments"), "experiments-tab-content");
 | 
| @@ -51346,23 +51583,22 @@
 | 
|  panelDescriptor._toolbarElement = this._createPanelToolbarItem(panelDescriptor);
 | 
|  if (!this._isToolbarCustomizable() || this._isPanelVisible(panelDescriptor.name()))
 | 
|  this.element.insertBefore(panelDescriptor._toolbarElement, this._panelInsertLocation(panelDescriptor));
 | 
| -this._updateAddPanelState();
 | 
| +this._updatePanelsMenuState();
 | 
|  this.resize();
 | 
|  },
 | 
|  
 | 
|  
 | 
|  _panelInsertLocation: function(panelDescriptor)
 | 
|  {
 | 
| -var newPanelElement = document.getElementById("toolbar-panels-menu").parentElement;
 | 
|  if (!this._isToolbarCustomizable())
 | 
| -return newPanelElement;
 | 
| +return null;
 | 
|  
 | 
|  if (this._isDefaultPanel(panelDescriptor.name()))
 | 
| -return this._firstNonDefaultPanel || newPanelElement;
 | 
| +return this._firstNonDefaultPanel || null;
 | 
|  
 | 
|  if (!this._firstNonDefaultPanel)
 | 
|  this._firstNonDefaultPanel = panelDescriptor._toolbarElement;
 | 
| -return newPanelElement;
 | 
| +return null;
 | 
|  },
 | 
|  
 | 
|  
 | 
| @@ -51441,27 +51677,34 @@
 | 
|  }
 | 
|  }
 | 
|  }
 | 
| -document.getElementById("toolbar-panels-menu").removeStyleClass("disabled");
 | 
| +this._updatePanelsMenuState();
 | 
|  this.resize();
 | 
|  },
 | 
|  
 | 
| -_updateAddPanelState: function()
 | 
| +_updatePanelsMenuState: function()
 | 
|  {
 | 
| -if (this._panelDescriptors.every(function (descr) { return this._isPanelVisible(descr.name()); }, this))
 | 
| +if (this._panelDescriptors.every(function (descr) { return this._isPanelVisible(descr.name()); }, this) && this._allItemsFitOntoToolbar())
 | 
|  document.getElementById("toolbar-panels-menu").addStyleClass("disabled");
 | 
|  else
 | 
|  document.getElementById("toolbar-panels-menu").removeStyleClass("disabled");
 | 
|  },
 | 
|  
 | 
|  
 | 
| +_allItemsFitOntoToolbar: function()
 | 
| +{
 | 
| +var toolbarItems = this.element.querySelectorAll(".toolbar-item.toggleable");
 | 
| +return toolbarItems.length === 0 || this.element.scrollHeight < toolbarItems[0].offsetHeight * 2;
 | 
| +},
 | 
| +
 | 
| +
 | 
|  _showPanel: function(panelDescriptor)
 | 
|  {
 | 
|  if (this._isPanelVisible(panelDescriptor.name()))
 | 
|  return;
 | 
| -this.element.insertBefore(panelDescriptor._toolbarElement, document.getElementById("toolbar-panels-menu").parentElement);
 | 
| +this.element.appendChild(panelDescriptor._toolbarElement);
 | 
|  panelDescriptor._toolbarElement.removeStyleClass("hidden");
 | 
|  this._setPanelVisible(panelDescriptor.name(), true);
 | 
| -this._updateAddPanelState();
 | 
| +this._updatePanelsMenuState();
 | 
|  this.resize();
 | 
|  },
 | 
|  
 | 
| @@ -51509,8 +51752,7 @@
 | 
|  var iconElement = toolbarItem.createChild("div", "toolbar-icon");
 | 
|  toolbarItem.createChild("div", "toolbar-label").textContent = panelDescriptor.title();
 | 
|  if (this._isToolbarCustomizable() && !this._isDefaultPanel(panelDescriptor.name()) && !noCloseButton) {
 | 
| -var closeButton = toolbarItem.createChild("div", "toolbar-item-close-button");
 | 
| -closeButton.textContent = "\u00d7";
 | 
| +var closeButton = toolbarItem.createChild("div", "close-button");
 | 
|  closeButton.addEventListener("click", onToolbarItemCloseButtonClicked.bind(this), false);
 | 
|  }
 | 
|  if (panelDescriptor.iconURL()) {
 | 
| @@ -51634,6 +51876,18 @@
 | 
|  }
 | 
|  
 | 
|  var contextMenu = new WebInspector.ContextMenu(event);
 | 
| +var currentPanelName = WebInspector.inspectorView.currentPanel().name;
 | 
| +var toolbarItems = this.element.querySelectorAll(".toolbar-item.toggleable");
 | 
| +for (var i = 0; i < toolbarItems.length; ++i) {
 | 
| +if (toolbarItems[i].offsetTop >= toolbarItems[0].offsetHeight) {
 | 
| +var descr = toolbarItems[i].panelDescriptor;
 | 
| +if (descr.name() === currentPanelName)
 | 
| +contextMenu.appendCheckboxItem(descr.title(), activatePanel.bind(this, descr), true);
 | 
| +else
 | 
| +contextMenu.appendItem(descr.title(), activatePanel.bind(this, descr));
 | 
| +}
 | 
| +}
 | 
| +contextMenu.appendSeparator();
 | 
|  for (var i = 0; i < this._panelDescriptors.length; ++i) {
 | 
|  var descr = this._panelDescriptors[i];
 | 
|  if (this._isPanelVisible(descr.name()))
 | 
| @@ -51651,6 +51905,10 @@
 | 
|  
 | 
|  _innerUpdateDropdownButtonAndHideDropdown: function()
 | 
|  {
 | 
| +if (this._isToolbarCustomizable()) {
 | 
| +this._updatePanelsMenuState();
 | 
| +return;
 | 
| +}
 | 
|  this._setDropdownVisible(false);
 | 
|  
 | 
|  if (this.element.scrollHeight > this.element.offsetHeight)
 | 
| @@ -54083,23 +54341,12 @@
 | 
|  return;
 | 
|  }
 | 
|  
 | 
| -this._cssModel.resourceBinding().requestStyleSheetIdForResource(resource, callback.bind(this));
 | 
| -
 | 
| -
 | 
| -function callback(styleSheetId)
 | 
| -{
 | 
| +var styleSheetId = this._cssModel.resourceBinding().styleSheetIdForResource(resource);
 | 
|  if (!styleSheetId) {
 | 
|  userCallback("No stylesheet found: " + resource.frameId + ":" + resource.url);
 | 
|  return;
 | 
|  }
 | 
|  
 | 
| -this._innerSetContent(styleSheetId, content, majorChange, userCallback, null);
 | 
| -}
 | 
| -},
 | 
| -
 | 
| -
 | 
| -_innerSetContent: function(styleSheetId, content, majorChange, userCallback)
 | 
| -{
 | 
|  this._isSettingContent = true;
 | 
|  function callback(error)
 | 
|  {
 | 
| @@ -54130,22 +54377,17 @@
 | 
|  
 | 
|  _innerStyleSheetChanged: function(styleSheetId, content)
 | 
|  {
 | 
| -
 | 
| -function callback(styleSheetURL)
 | 
| -{
 | 
| +var styleSheetURL = this._cssModel.resourceBinding().resourceURLForStyleSheetId(styleSheetId);
 | 
|  if (typeof styleSheetURL !== "string")
 | 
|  return;
 | 
|  
 | 
| -var uiSourceCode = this._workspace.uiSourceCodeForURL(styleSheetURL);
 | 
| +var uiSourceCode = this._workspace.uiSourceCodeForURL(styleSheetURL)
 | 
|  if (!uiSourceCode)
 | 
|  return;
 | 
|  
 | 
|  if (uiSourceCode.styleFile())
 | 
|  uiSourceCode.styleFile().addRevision(content);
 | 
|  }
 | 
| -
 | 
| -this._cssModel.resourceBinding().requestResourceURLForStyleSheetId(styleSheetId, callback.bind(this));
 | 
| -},
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -54188,10 +54430,8 @@
 | 
|  _parsedScriptSource: function(event)
 | 
|  {
 | 
|  var script =   (event.data);
 | 
| -if (!script.sourceURL || script.isInlineScript())
 | 
| +if (!script.sourceURL || script.isInlineScript() || script.isSnippet())
 | 
|  return;
 | 
| -if (WebInspector.experimentsSettings.snippetsSupport.isEnabled() && script.isSnippet())
 | 
| -return;
 | 
|  var isDynamicAnonymousScript;
 | 
|  
 | 
|  
 | 
| @@ -54417,9 +54657,21 @@
 | 
|  }
 | 
|  
 | 
|  WebInspector.ProfilesPanelDescriptor.prototype = {
 | 
| +registerShortcuts: function()
 | 
| +{
 | 
| +var section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Profiles Panel"));
 | 
| +section.addAlternateKeys(WebInspector.ProfilesPanelDescriptor.ShortcutKeys.StartStopRecording, WebInspector.UIString("Start/stop recording"));
 | 
| +},
 | 
| +
 | 
|  __proto__: WebInspector.PanelDescriptor.prototype
 | 
|  }
 | 
|  
 | 
| +WebInspector.ProfilesPanelDescriptor.ShortcutKeys = {
 | 
| +StartStopRecording: [
 | 
| +WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
 | 
| +]
 | 
| +}
 | 
| +
 | 
|  WebInspector.ProfilesPanelDescriptor.ProfileURLRegExp = /webkit-profile:\/\/(.+)\/(.+)/;
 | 
|  
 | 
|  WebInspector.ProfilesPanelDescriptor.UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
 | 
| @@ -54523,6 +54775,10 @@
 | 
|  }
 | 
|  
 | 
|  WebInspector.ScriptsPanelDescriptor.ShortcutKeys = {
 | 
| +RunSnippet: [
 | 
| +WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Enter, WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
 | 
| +],
 | 
| +
 | 
|  PauseContinue: [
 | 
|  WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F8),
 | 
|  WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Slash, WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
 | 
| @@ -54611,7 +54867,7 @@
 | 
|  this._dockToggleButtonOption = new WebInspector.StatusBarButton("", "dock-status-bar-item", 3);
 | 
|  this._dockToggleButton.addEventListener("click", this._toggleDockState, this);
 | 
|  this._dockToggleButtonOption.addEventListener("click", this._toggleDockState, this);
 | 
| -this._dockToggleButton.makeLongClickEnabled(this._createDockOptions.bind(this));
 | 
| +this._dockToggleButton.makeLongClickOptionsEnabled(this._createDockOptions.bind(this));
 | 
|  
 | 
|  this.setDockSide(WebInspector.queryParamsObject["dockSide"] || "bottom");
 | 
|  WebInspector.settings.showToolbarIcons.addChangeListener(this._updateUI.bind(this));
 | 
| 
 |