[DevTools] Dock to left mode.

BUG=134282

Review URL: https://codereview.chromium.org/146733002

git-svn-id: svn://svn.chromium.org/blink/trunk@165820 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/Source/devtools/front_end/DockController.js b/Source/devtools/front_end/DockController.js
index 3a767df..5342f7b 100644
--- a/Source/devtools/front_end/DockController.js
+++ b/Source/devtools/front_end/DockController.js
@@ -42,10 +42,16 @@
 
     WebInspector.settings.currentDockState = WebInspector.settings.createSetting("currentDockState", "");
     WebInspector.settings.lastDockState = WebInspector.settings.createSetting("lastDockState", "");
+    var states = [WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked, WebInspector.DockController.State.DockedToRight];
+    var titles = [WebInspector.UIString("Dock to main window."), WebInspector.UIString("Undock into separate window."), WebInspector.UIString("Dock to main window.")];
+    if (WebInspector.experimentsSettings.dockToLeft.isEnabled()) {
+        states.push(WebInspector.DockController.State.DockedToLeft);
+        titles.push(WebInspector.UIString("Dock to main window."));
+    }
     this._dockToggleButton = new WebInspector.StatusBarStatesSettingButton(
         "dock-status-bar-item",
-        [WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked, WebInspector.DockController.State.DockedToRight],
-        [WebInspector.UIString("Dock to main window."), WebInspector.UIString("Undock into separate window."), WebInspector.UIString("Dock to main window.")],
+        states,
+        titles,
         WebInspector.settings.currentDockState,
         WebInspector.settings.lastDockState,
         this._dockSideChanged.bind(this));
@@ -54,6 +60,7 @@
 WebInspector.DockController.State = {
     DockedToBottom: "bottom",
     DockedToRight: "right",
+    DockedToLeft: "left",
     Undocked: "undocked"
 }
 
@@ -79,6 +86,14 @@
     },
 
     /**
+     * @return {boolean}
+     */
+    isVertical: function()
+    {
+        return this._dockSide === WebInspector.DockController.State.DockedToRight || this._dockSide === WebInspector.DockController.State.DockedToLeft;
+    },
+
+    /**
      * @param {string} dockSide
      */
     _dockSideChanged: function(dockSide)
@@ -101,16 +116,25 @@
         case WebInspector.DockController.State.DockedToBottom:
             body.classList.remove("undocked");
             body.classList.remove("dock-to-right");
+            body.classList.remove("dock-to-left");
             body.classList.add("dock-to-bottom");
             break;
         case WebInspector.DockController.State.DockedToRight: 
             body.classList.remove("undocked");
             body.classList.add("dock-to-right");
+            body.classList.remove("dock-to-left");
             body.classList.remove("dock-to-bottom");
             break;
-        case WebInspector.DockController.State.Undocked: 
+        case WebInspector.DockController.State.DockedToLeft:
+            body.classList.remove("undocked");
+            body.classList.remove("dock-to-right");
+            body.classList.add("dock-to-left");
+            body.classList.remove("dock-to-bottom");
+            break;
+        case WebInspector.DockController.State.Undocked:
             body.classList.add("undocked");
             body.classList.remove("dock-to-right");
+            body.classList.remove("dock-to-left");
             body.classList.remove("dock-to-bottom");
             break;
         }
diff --git a/Source/devtools/front_end/ElementsPanel.js b/Source/devtools/front_end/ElementsPanel.js
index 5eadf83..dffcddc 100644
--- a/Source/devtools/front_end/ElementsPanel.js
+++ b/Source/devtools/front_end/ElementsPanel.js
@@ -1187,8 +1187,7 @@
 
     _dockSideChanged: function()
     {
-        var dockSide = WebInspector.dockController.dockSide();
-        var vertically = dockSide === WebInspector.DockController.State.DockedToRight && WebInspector.settings.splitVerticallyWhenDockedToRight.get();
+        var vertically = WebInspector.dockController.isVertical() && WebInspector.settings.splitVerticallyWhenDockedToRight.get();
         this._splitVertically(vertically);
     },
 
diff --git a/Source/devtools/front_end/Images/src/statusbarButtonGlyphs.svg b/Source/devtools/front_end/Images/src/statusbarButtonGlyphs.svg
index 3cb16db..92aae01 100644
--- a/Source/devtools/front_end/Images/src/statusbarButtonGlyphs.svg
+++ b/Source/devtools/front_end/Images/src/statusbarButtonGlyphs.svg
@@ -30,7 +30,7 @@
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
      inkscape:window-width="1920"
-     inkscape:window-height="1178"
+     inkscape:window-height="1124"
      id="namedview3315"
      showgrid="true"
      width="640px"
@@ -38,7 +38,7 @@
      inkscape:cx="157.49088"
      inkscape:cy="65.78401"
      inkscape:window-x="0"
-     inkscape:window-y="0"
+     inkscape:window-y="24"
      inkscape:window-maximized="1"
      inkscape:current-layer="svg2"><inkscape:grid
        empspacing="2"
@@ -866,6 +866,7 @@
      id="tspan5303"
      x="161.33199"
      y="146.8199">!</tspan></text>
+
 <path
    d="m 206,110 2,0 0,2.30275 -0.28334,1.67983 -1.43333,0 L 206,112.30275 206,110 m 0,4.56933 2,0 0,1.43067 -2,0 0,-1"
    id="path5364"
@@ -1011,6 +1012,7 @@
      x="217.81799"
      y="115.13864"
      style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;font-family:Serif;-inkscape-font-specification:Serif Bold">i</tspan></text>
+
 </g><rect
      rx="0.25"
      ry="0.25"
@@ -1028,4 +1030,8 @@
        inkscape:connector-curvature="0"
        id="path4032"
        d="m 10.75,140.75 10.5,-17.5"
-       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></svg>
\ No newline at end of file
+       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
+     inkscape:connector-curvature="0"
+     style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+     id="path190-0"
+     d="m 46,128 7,0 0,8 -7,0 0,-8 z m 9,-2 -14,0 0,12 14,0 0,-12 z" /></svg>
\ No newline at end of file
diff --git a/Source/devtools/front_end/Images/statusbarButtonGlyphs.png b/Source/devtools/front_end/Images/statusbarButtonGlyphs.png
index 9abb072..aebfcec 100644
--- a/Source/devtools/front_end/Images/statusbarButtonGlyphs.png
+++ b/Source/devtools/front_end/Images/statusbarButtonGlyphs.png
Binary files differ
diff --git a/Source/devtools/front_end/Images/statusbarButtonGlyphs2x.png b/Source/devtools/front_end/Images/statusbarButtonGlyphs2x.png
index 18d1cf5..a906726 100644
--- a/Source/devtools/front_end/Images/statusbarButtonGlyphs2x.png
+++ b/Source/devtools/front_end/Images/statusbarButtonGlyphs2x.png
Binary files differ
diff --git a/Source/devtools/front_end/InspectorView.js b/Source/devtools/front_end/InspectorView.js
index 28dea2f..81d3873 100644
--- a/Source/devtools/front_end/InspectorView.js
+++ b/Source/devtools/front_end/InspectorView.js
@@ -54,12 +54,13 @@
     this._zoomFactor = WebInspector.zoomFactor();
     WebInspector.settings.zoomLevel.addChangeListener(this._onZoomChanged, this);
 
-    this._devtoolsElement = this._splitView.sidebarElement();
-    this._devtoolsElement.classList.add("vbox");
+    this._devtoolsView = new WebInspector.View();
+    this._devtoolsView.element.className = "vbox fill";
+    this._splitView.setSidebarView(this._devtoolsView);
 
     this._tabbedPane = new WebInspector.TabbedPane();
     this._tabbedPane.setRetainTabOrder(true, WebInspector.moduleManager.orderComparator(WebInspector.Panel, "name", "order"));
-    this._splitView.setSidebarView(this._tabbedPane);
+    this._tabbedPane.show(this._devtoolsView.element);
 
     this._toolbarElement = document.createElement("div");
     this._toolbarElement.className = "toolbar toolbar-background";
@@ -149,7 +150,7 @@
      */
     devtoolsElement: function()
     {
-        return this._devtoolsElement;
+        return this._devtoolsView.element;
     },
 
     /**
@@ -408,17 +409,24 @@
     {
         var dockSide = WebInspector.dockController.dockSide();
         if (dockSide !== WebInspector.DockController.State.Undocked) {
-            this._splitView.showBoth();
-            var vertical = dockSide === WebInspector.DockController.State.DockedToRight;
+            var vertical = WebInspector.dockController.isVertical();
             this._splitView.setVertical(vertical);
             if (vertical) {
+                this._splitView.setSecondIsSidebar(dockSide === WebInspector.DockController.State.DockedToRight);
                 this._splitView.uninstallResizer(this._tabbedPane.headerElement());
                 this._splitView.installResizer(this._splitView.resizerElement());
             } else {
+                this._splitView.setSecondIsSidebar(true);
                 this._splitView.uninstallResizer(this._splitView.resizerElement());
                 this._splitView.installResizer(this._tabbedPane.headerElement());
             }
+            this._splitView.setMainView(this._overlayView);
+            this._splitView.setSidebarView(this._devtoolsView);
+            this._splitView.showBoth();
         } else {
+            this._splitView.setSecondIsSidebar(true);
+            this._splitView.setMainView(this._overlayView);
+            this._splitView.setSidebarView(this._devtoolsView);
             this._splitView.showOnlySecond();
             this._splitView.uninstallResizer(this._tabbedPane.headerElement());
             this._splitView.uninstallResizer(this._splitView.resizerElement());
@@ -441,11 +449,13 @@
     _setContentsInsets: function()
     {
         delete this._setContentsInsetsId;
-        // Leave 3px room for resizer.
         var sidebarSize = Math.ceil(this._splitView.sidebarSize() * WebInspector.zoomFactor());
         var bottom = this._splitView.isVertical() ? 0 : sidebarSize;
-        var right = this._splitView.isVertical() ? sidebarSize + 3 : 0;
-        InspectorFrontendHost.setContentsInsets(0, 0, bottom, right);
+        // Leave 3px room for resizer.
+        var vertical = this._splitView.isVertical() ? sidebarSize + 3 : 0;
+        var right = this._splitView.isSidebarSecond() ? vertical : 0;
+        var left = this._splitView.isSidebarSecond() ? 0 : vertical;
+        InspectorFrontendHost.setContentsInsets(0, left, bottom, right);
     },
 
     _onZoomChanged: function()
diff --git a/Source/devtools/front_end/Settings.js b/Source/devtools/front_end/Settings.js
index 915c7d4..aec1800 100644
--- a/Source/devtools/front_end/Settings.js
+++ b/Source/devtools/front_end/Settings.js
@@ -288,6 +288,7 @@
     this.gpuTimeline = this._createExperiment("gpuTimeline", "Show GPU data on timeline");
     this.applyCustomStylesheet = this._createExperiment("applyCustomStylesheet", "Allow custom UI themes");
     this.workersInMainWindow = this._createExperiment("workersInMainWindow", "Show workers in main window");
+    this.dockToLeft = this._createExperiment("dockToLeft", "Enable dock to left mode");
 
     this._cleanUpSetting();
 }
diff --git a/Source/devtools/front_end/SettingsScreen.js b/Source/devtools/front_end/SettingsScreen.js
index 8ef962f..ffd350d 100644
--- a/Source/devtools/front_end/SettingsScreen.js
+++ b/Source/devtools/front_end/SettingsScreen.js
@@ -283,7 +283,8 @@
     this._appendDrawerNote(p.lastElementChild);
     p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show 'Rendering' view in console drawer."), WebInspector.settings.showRenderingViewInDrawer));
     this._appendDrawerNote(p.lastElementChild);
-    p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Split panels vertically when docked to right"), WebInspector.settings.splitVerticallyWhenDockedToRight));
+    var splitVerticallyTitle = WebInspector.UIString("Split panels vertically when docked to %s", WebInspector.experimentsSettings.dockToLeft.isEnabled() ? "left or right" : "right");
+    p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(splitVerticallyTitle, WebInspector.settings.splitVerticallyWhenDockedToRight));
 
     p = this._appendSection(WebInspector.UIString("Elements"));
     var colorFormatElement = this._createSelectSetting(WebInspector.UIString("Color format"), [
diff --git a/Source/devtools/front_end/SourcesPanel.js b/Source/devtools/front_end/SourcesPanel.js
index 3908a82..feeb237 100644
--- a/Source/devtools/front_end/SourcesPanel.js
+++ b/Source/devtools/front_end/SourcesPanel.js
@@ -1662,8 +1662,7 @@
 
     _dockSideChanged: function()
     {
-        var dockSide = WebInspector.dockController.dockSide();
-        var vertically = dockSide === WebInspector.DockController.State.DockedToRight && WebInspector.settings.splitVerticallyWhenDockedToRight.get();
+        var vertically = WebInspector.dockController.isVertical() && WebInspector.settings.splitVerticallyWhenDockedToRight.get();
         this._splitVertically(vertically);
     },
 
diff --git a/Source/devtools/front_end/inspector.css b/Source/devtools/front_end/inspector.css
index 8ddf71c..7a9eb4f 100644
--- a/Source/devtools/front_end/inspector.css
+++ b/Source/devtools/front_end/inspector.css
@@ -588,6 +588,10 @@
     -webkit-mask-position: -256px -48px;
 }
 
+button.status-bar-item.dock-status-bar-item.toggled-left .glyph {
+    -webkit-mask-position: -32px -120px;
+}
+
 body.undocked .alternate-status-bar-buttons-bar {
     margin-left: 1px;
 }
@@ -2856,3 +2860,7 @@
 body.dock-to-bottom #inspector-split-view > .split-view-resizer {
     display: none;
 }
+
+#inspector-split-view > .split-view-sidebar {
+    position: relative;
+}