1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 * @extends {WebInspector.App}
9 WebInspector.AdvancedApp = function()
11 WebInspector.App.call(this);
12 if (WebInspector.overridesSupport.responsiveDesignAvailable()) {
13 this._toggleEmulationButton = new WebInspector.StatusBarButton(WebInspector.UIString("Toggle device mode."), "emulation-status-bar-item");
14 this._toggleEmulationButton.toggled = WebInspector.overridesSupport.emulationEnabled();
15 this._toggleEmulationButton.addEventListener("click", this._toggleEmulationEnabled, this);
16 WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, this._emulationEnabledChanged, this);
17 WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, this._overridesWarningUpdated, this);
19 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._openToolboxWindow, this);
22 WebInspector.AdvancedApp.prototype = {
23 _toggleEmulationEnabled: function()
25 var enabled = !this._toggleEmulationButton.toggled;
27 WebInspector.userMetrics.DeviceModeEnabled.record();
28 WebInspector.overridesSupport.setEmulationEnabled(enabled);
31 _emulationEnabledChanged: function()
33 this._toggleEmulationButton.toggled = WebInspector.overridesSupport.emulationEnabled();
34 if (!WebInspector.overridesSupport.responsiveDesignAvailable() && WebInspector.overridesSupport.emulationEnabled())
35 WebInspector.inspectorView.showViewInDrawer("emulation", true);
38 _overridesWarningUpdated: function()
40 if (!this._toggleEmulationButton)
42 var message = WebInspector.overridesSupport.warningMessage();
43 this._toggleEmulationButton.title = message || WebInspector.UIString("Toggle device mode.");
44 this._toggleEmulationButton.element.classList.toggle("warning", !!message);
47 createRootView: function()
49 var rootView = new WebInspector.RootView();
51 this._rootSplitView = new WebInspector.SplitView(false, true, "InspectorView.splitViewState", 300, 300, true);
52 this._rootSplitView.show(rootView.element);
54 WebInspector.inspectorView.show(this._rootSplitView.sidebarElement());
56 this._inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();
57 this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, false), this);
58 this._responsiveDesignView = new WebInspector.ResponsiveDesignView(this._inspectedPagePlaceholder);
59 this._responsiveDesignView.show(this._rootSplitView.mainElement());
61 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._onBeforeDockSideChange, this);
62 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged, this._onDockSideChange, this);
63 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.AfterDockSideChanged, this._onAfterDockSideChange, this);
64 this._onDockSideChange();
66 console.timeStamp("AdvancedApp.attachToBody");
67 rootView.attachToBody();
68 this._inspectedPagePlaceholder.update();
72 * @param {!WebInspector.Target} mainTarget
74 presentUI: function(mainTarget)
76 WebInspector.App.prototype.presentUI.call(this, mainTarget);
77 this._overridesWarningUpdated();
81 * @param {!WebInspector.Event} event
83 _openToolboxWindow: function(event)
85 if (/** @type {string} */ (event.data.to) !== WebInspector.DockController.State.Undocked)
88 if (this._toolboxWindow)
91 var toolbox = (window.location.search ? "&" : "?") + "toolbox=true";
92 var hash = window.location.hash;
93 var url = window.location.href.replace(hash, "") + toolbox + hash;
94 this._toolboxWindow = window.open(url, undefined);
98 * @param {!WebInspector.ResponsiveDesignView} responsiveDesignView
99 * @param {!WebInspector.InspectedPagePlaceholder} placeholder
101 toolboxLoaded: function(responsiveDesignView, placeholder)
103 this._toolboxResponsiveDesignView = responsiveDesignView;
104 placeholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, true));
105 this._updatePageResizer();
108 _updatePageResizer: function()
110 if (this._isDocked())
111 this._responsiveDesignView.updatePageResizer();
112 else if (this._toolboxResponsiveDesignView)
113 this._toolboxResponsiveDesignView.updatePageResizer();
117 * @param {!WebInspector.Event} event
119 _onBeforeDockSideChange: function(event)
121 if (/** @type {string} */ (event.data.to) === WebInspector.DockController.State.Undocked && this._toolboxResponsiveDesignView) {
122 // Hide inspectorView and force layout to mimic the undocked state.
123 this._rootSplitView.hideSidebar();
124 this._inspectedPagePlaceholder.update();
127 this._changingDockSide = true;
131 * @param {!WebInspector.Event=} event
133 _onDockSideChange: function(event)
135 this._updatePageResizer();
137 var toDockSide = event ? /** @type {string} */ (event.data.to) : WebInspector.dockController.dockSide();
138 if (toDockSide === WebInspector.DockController.State.Undocked) {
139 this._updateForUndocked();
140 } else if (this._toolboxResponsiveDesignView && event && /** @type {string} */ (event.data.from) === WebInspector.DockController.State.Undocked) {
141 // Don't update yet for smooth transition.
142 this._rootSplitView.hideSidebar();
144 this._updateForDocked(toDockSide);
149 * @param {!WebInspector.Event} event
151 _onAfterDockSideChange: function(event)
153 // We may get here on the first dock side change while loading without BeforeDockSideChange.
154 if (!this._changingDockSide)
156 this._changingDockSide = false;
157 if (/** @type {string} */ (event.data.from) === WebInspector.DockController.State.Undocked) {
158 // Restore docked layout in case of smooth transition.
159 this._updateForDocked(/** @type {string} */ (event.data.to));
161 this._inspectedPagePlaceholder.update();
165 * @param {string} dockSide
167 _updateForDocked: function(dockSide)
169 this._rootSplitView.setVertical(dockSide === WebInspector.DockController.State.DockedToLeft || dockSide === WebInspector.DockController.State.DockedToRight);
170 this._rootSplitView.setSecondIsSidebar(dockSide === WebInspector.DockController.State.DockedToRight || dockSide === WebInspector.DockController.State.DockedToBottom);
171 this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(), true);
172 this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(), dockSide === WebInspector.DockController.State.DockedToBottom);
173 this._rootSplitView.showBoth();
176 _updateForUndocked: function()
178 this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(), false);
179 this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(), false);
180 this._rootSplitView.hideMain();
183 _isDocked: function()
185 return WebInspector.dockController.dockSide() !== WebInspector.DockController.State.Undocked;
189 * @param {boolean} toolbox
190 * @param {!WebInspector.Event} event
192 _onSetInspectedPageBounds: function(toolbox, event)
194 if (this._changingDockSide || (this._isDocked() === toolbox))
196 if (!window.innerWidth || !window.innerHeight)
198 var bounds = /** @type {{x: number, y: number, width: number, height: number}} */ (event.data);
199 console.timeStamp("AdvancedApp.setInspectedPageBounds");
200 InspectorFrontendHost.setInspectedPageBounds(bounds);
203 __proto__: WebInspector.App.prototype
208 * @implements {WebInspector.StatusBarItem.Provider}
210 WebInspector.AdvancedApp.DeviceCounter = function()
212 if (!WebInspector.experimentsSettings.devicesPanel.isEnabled() || !(WebInspector.app instanceof WebInspector.AdvancedApp)) {
213 this._counter = null;
217 this._counter = new WebInspector.StatusBarCounter(["device-icon-small"]);
218 this._counter.addEventListener("click", showDevices);
220 function showDevices()
222 WebInspector.inspectorView.showViewInDrawer("devices", true);
225 InspectorFrontendHost.setDeviceCountUpdatesEnabled(true);
226 InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DeviceCountUpdated, this._onDeviceCountUpdated, this);
229 WebInspector.AdvancedApp.DeviceCounter.prototype = {
231 * @param {!WebInspector.Event} event
233 _onDeviceCountUpdated: function(event)
235 var count = /** @type {number} */ (event.data);
236 this._counter.setCounter("device-icon-small", count, WebInspector.UIString(count > 1 ? "%d devices found" : "%d device found", count));
237 WebInspector.inspectorView.toolbarItemResized();
241 * @return {?WebInspector.StatusBarItem}
245 return this._counter;
251 * @implements {WebInspector.StatusBarItem.Provider}
253 WebInspector.AdvancedApp.EmulationButtonProvider = function()
257 WebInspector.AdvancedApp.EmulationButtonProvider.prototype = {
259 * @return {?WebInspector.StatusBarItem}
263 if (!(WebInspector.app instanceof WebInspector.AdvancedApp))
265 return WebInspector.app._toggleEmulationButton || null;
271 * @implements {WebInspector.ActionDelegate}
273 WebInspector.AdvancedApp.ToggleDeviceModeActionDelegate = function()
277 WebInspector.AdvancedApp.ToggleDeviceModeActionDelegate.prototype = {
281 handleAction: function()
283 if (!WebInspector.overridesSupport.responsiveDesignAvailable())
285 if (!(WebInspector.app instanceof WebInspector.AdvancedApp))
287 WebInspector.app._toggleEmulationEnabled();