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);
48 * @param {!Document} document
51 presentUI: function(document)
53 var rootView = new WebInspector.RootView();
55 this._rootSplitView = new WebInspector.SplitView(false, true, "InspectorView.splitViewState", 300, 300, true);
56 this._rootSplitView.show(rootView.element);
58 WebInspector.inspectorView.show(this._rootSplitView.sidebarElement());
60 this._inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();
61 this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, false), this);
62 this._responsiveDesignView = new WebInspector.ResponsiveDesignView(this._inspectedPagePlaceholder);
63 this._responsiveDesignView.show(this._rootSplitView.mainElement());
65 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._onBeforeDockSideChange, this);
66 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged, this._onDockSideChange, this);
67 WebInspector.dockController.addEventListener(WebInspector.DockController.Events.AfterDockSideChanged, this._onAfterDockSideChange, this);
68 this._onDockSideChange();
70 this._overridesWarningUpdated();
72 WebInspector.inspectorView.showInitialPanel();
73 console.timeStamp("AdvancedApp.attachToBody");
74 rootView.attachToDocument(document);
75 this._inspectedPagePlaceholder.update();
79 * @param {!WebInspector.Event} event
81 _openToolboxWindow: function(event)
83 if (/** @type {string} */ (event.data.to) !== WebInspector.DockController.State.Undocked)
86 if (this._toolboxWindow)
89 var url = window.location.href.replace("devtools.html", "toolbox.html");
90 this._toolboxWindow = window.open(url, undefined);
94 * @param {!Document} toolboxDocument
96 toolboxLoaded: function(toolboxDocument)
98 WebInspector.initializeUIUtils(toolboxDocument.defaultView);
99 WebInspector.installComponentRootStyles(/** @type {!Element} */ (toolboxDocument.body));
100 WebInspector.ContextMenu.installHandler(toolboxDocument);
102 var rootView = new WebInspector.RootView();
103 var inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();
104 inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, true));
105 this._toolboxResponsiveDesignView = new WebInspector.ResponsiveDesignView(inspectedPagePlaceholder);
106 this._toolboxResponsiveDesignView.show(rootView.element);
107 rootView.attachToDocument(toolboxDocument);
109 this._updatePageResizer();
113 * @return {!InspectorFrontendHostAPI}
115 inspectorFrontendHost: function()
117 return window.InspectorFrontendHost;
120 _updatePageResizer: function()
122 if (this._isDocked())
123 this._responsiveDesignView.updatePageResizer();
124 else if (this._toolboxResponsiveDesignView)
125 this._toolboxResponsiveDesignView.updatePageResizer();
129 * @param {!WebInspector.Event} event
131 _onBeforeDockSideChange: function(event)
133 if (/** @type {string} */ (event.data.to) === WebInspector.DockController.State.Undocked && this._toolboxResponsiveDesignView) {
134 // Hide inspectorView and force layout to mimic the undocked state.
135 this._rootSplitView.hideSidebar();
136 this._inspectedPagePlaceholder.update();
139 this._changingDockSide = true;
143 * @param {!WebInspector.Event=} event
145 _onDockSideChange: function(event)
147 this._updatePageResizer();
149 var toDockSide = event ? /** @type {string} */ (event.data.to) : WebInspector.dockController.dockSide();
150 if (toDockSide === WebInspector.DockController.State.Undocked) {
151 this._updateForUndocked();
152 } else if (this._toolboxResponsiveDesignView && event && /** @type {string} */ (event.data.from) === WebInspector.DockController.State.Undocked) {
153 // Don't update yet for smooth transition.
154 this._rootSplitView.hideSidebar();
156 this._updateForDocked(toDockSide);
161 * @param {!WebInspector.Event} event
163 _onAfterDockSideChange: function(event)
165 // We may get here on the first dock side change while loading without BeforeDockSideChange.
166 if (!this._changingDockSide)
168 this._changingDockSide = false;
169 if (/** @type {string} */ (event.data.from) === WebInspector.DockController.State.Undocked) {
170 // Restore docked layout in case of smooth transition.
171 this._updateForDocked(/** @type {string} */ (event.data.to));
173 this._inspectedPagePlaceholder.update();
177 * @param {string} dockSide
179 _updateForDocked: function(dockSide)
181 this._rootSplitView.setVertical(dockSide === WebInspector.DockController.State.DockedToLeft || dockSide === WebInspector.DockController.State.DockedToRight);
182 this._rootSplitView.setSecondIsSidebar(dockSide === WebInspector.DockController.State.DockedToRight || dockSide === WebInspector.DockController.State.DockedToBottom);
183 this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(), true);
184 this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(), dockSide === WebInspector.DockController.State.DockedToBottom);
185 this._rootSplitView.showBoth();
188 _updateForUndocked: function()
190 this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(), false);
191 this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(), false);
192 this._rootSplitView.hideMain();
195 _isDocked: function()
197 return WebInspector.dockController.dockSide() !== WebInspector.DockController.State.Undocked;
201 * @param {boolean} toolbox
202 * @param {!WebInspector.Event} event
204 _onSetInspectedPageBounds: function(toolbox, event)
206 if (this._changingDockSide || (this._isDocked() === toolbox))
208 if (!window.innerWidth || !window.innerHeight)
210 var bounds = /** @type {{x: number, y: number, width: number, height: number}} */ (event.data);
211 console.timeStamp("AdvancedApp.setInspectedPageBounds");
212 InspectorFrontendHost.setInspectedPageBounds(bounds);
215 __proto__: WebInspector.App.prototype
220 * @implements {WebInspector.StatusBarItem.Provider}
222 WebInspector.AdvancedApp.DeviceCounter = function()
224 if (!Runtime.experiments.isEnabled("devicesPanel") || !(WebInspector.app instanceof WebInspector.AdvancedApp)) {
225 this._counter = null;
229 this._counter = new WebInspector.StatusBarCounter(["device-icon-small"]);
230 this._counter.addEventListener("click", showDevices);
232 function showDevices()
234 WebInspector.inspectorView.showViewInDrawer("devices", true);
237 InspectorFrontendHost.setDeviceCountUpdatesEnabled(true);
238 InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DeviceCountUpdated, this._onDeviceCountUpdated, this);
241 WebInspector.AdvancedApp.DeviceCounter.prototype = {
243 * @param {!WebInspector.Event} event
245 _onDeviceCountUpdated: function(event)
247 var count = /** @type {number} */ (event.data);
248 this._counter.setCounter("device-icon-small", count, WebInspector.UIString(count > 1 ? "%d devices found" : "%d device found", count));
249 WebInspector.inspectorView.toolbarItemResized();
253 * @return {?WebInspector.StatusBarItem}
257 return this._counter;
263 * @implements {WebInspector.StatusBarItem.Provider}
265 WebInspector.AdvancedApp.EmulationButtonProvider = function()
269 WebInspector.AdvancedApp.EmulationButtonProvider.prototype = {
271 * @return {?WebInspector.StatusBarItem}
275 if (!(WebInspector.app instanceof WebInspector.AdvancedApp))
277 return WebInspector.app._toggleEmulationButton || null;
283 * @implements {WebInspector.ActionDelegate}
285 WebInspector.AdvancedApp.ToggleDeviceModeActionDelegate = function()
289 WebInspector.AdvancedApp.ToggleDeviceModeActionDelegate.prototype = {
293 handleAction: function()
295 if (!WebInspector.overridesSupport.responsiveDesignAvailable())
297 if (!(WebInspector.app instanceof WebInspector.AdvancedApp))
299 WebInspector.app._toggleEmulationEnabled();