Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / devtools / front_end / toolbox / ResponsiveDesignView.js
index 2c12862..c0ec9b5 100644 (file)
@@ -20,49 +20,66 @@ WebInspector.ResponsiveDesignView = function(inspectedPagePlaceholder)
 
     this._createToolbar();
 
-    this._mediaInspector = new WebInspector.MediaQueryInspector();
-    this._mediaInspectorContainer = this._responsiveDesignContainer.element.createChild("div", "responsive-design-media-container");
-    this._updateMediaQueryInspector();
-
     this._canvasContainer = new WebInspector.View();
     this._canvasContainer.element.classList.add("responsive-design");
     this._canvasContainer.show(this._responsiveDesignContainer.element);
 
-    this._canvas = this._canvasContainer.element.createChild("canvas", "fill");
+    this._canvas = this._canvasContainer.element.createChild("canvas", "fill responsive-design-canvas");
 
-    this._rulerGlasspane = this._canvasContainer.element.createChild("div", "responsive-design-ruler-glasspane");
-    this._rulerGlasspane.appendChild(this._mediaInspector.rulerDecorationLayer());
+    this._mediaInspectorContainer = this._canvasContainer.element.createChild("div", "responsive-design-media-container");
+    this._mediaInspector = new WebInspector.MediaQueryInspector();
+    this._updateMediaQueryInspector();
 
     this._warningMessage = this._canvasContainer.element.createChild("div", "responsive-design-warning hidden");
     this._warningMessage.createChild("div", "warning-icon-small");
     this._warningMessage.createChild("span");
+    var warningDisableButton = this._warningMessage.createChild("div", "disable-warning");
+    warningDisableButton.textContent = WebInspector.UIString("Never show");
+    warningDisableButton.addEventListener("click", this._disableOverridesWarnings.bind(this), false);
     var warningCloseButton = this._warningMessage.createChild("div", "close-button");
     warningCloseButton.addEventListener("click", WebInspector.overridesSupport.clearWarningMessage.bind(WebInspector.overridesSupport), false);
     WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, this._overridesWarningUpdated, this);
+    WebInspector.settings.disableOverridesWarning.addChangeListener(this._overridesWarningUpdated, this);
 
     this._slidersContainer = this._canvasContainer.element.createChild("div", "vbox responsive-design-sliders-container");
-    var hbox = this._slidersContainer.createChild("div", "hbox flex-auto");
-    this._heightSliderContainer = this._slidersContainer.createChild("div", "hbox responsive-design-slider-height");
-    this._pageContainer = hbox.createChild("div", "vbox flex-auto");
-    this._widthSliderContainer = hbox.createChild("div", "vbox responsive-design-slider-width");
-
-    this._widthSlider = this._widthSliderContainer.createChild("div", "responsive-design-slider-thumb");
-    this._widthSlider.createChild("div", "responsive-design-thumb-handle");
-    this._createResizer(this._widthSlider, false);
-    this._heightSlider = this._heightSliderContainer.createChild("div", "responsive-design-slider-thumb");
-    this._heightSlider.createChild("div", "responsive-design-thumb-handle");
-    this._createResizer(this._heightSlider, true);
+    var genericDeviceOutline = this._slidersContainer.createChild("div", "responsive-design-generic-outline-container");
+    genericDeviceOutline.createChild("div", "responsive-design-generic-outline");
+    var widthSlider = this._slidersContainer.createChild("div", "responsive-design-slider-width");
+    widthSlider.createChild("div", "responsive-design-thumb-handle");
+    this._createResizer(widthSlider, false);
+    var heightSlider = this._slidersContainer.createChild("div", "responsive-design-slider-height");
+    heightSlider.createChild("div", "responsive-design-thumb-handle");
+    this._createResizer(heightSlider, true);
+    this._pageContainer = this._slidersContainer.createChild("div", "vbox flex-auto");
+
+    // Page scale controls.
+    this._pageScaleContainer = this._canvasContainer.element.createChild("div", "hbox responsive-design-page-scale-container");
+    this._decreasePageScaleButton = new WebInspector.StatusBarButton(WebInspector.UIString(""), "responsive-design-page-scale-button responsive-design-page-scale-decrease");
+    this._decreasePageScaleButton.element.tabIndex = -1;
+    this._decreasePageScaleButton.addEventListener("click", this._pageScaleButtonClicked.bind(this, false), this);
+    this._pageScaleContainer.appendChild(this._decreasePageScaleButton.element);
+
+    this._pageScaleLabel = this._pageScaleContainer.createChild("label", "responsive-design-page-scale-label");
+    this._pageScaleLabel.title = WebInspector.UIString("For a simpler way to change the current page scale, hold down Shift and drag with your mouse.");
+    this._pageScaleLabel.addEventListener("dblclick", this._resetPageScale.bind(this), false);
+
+    this._increasePageScaleButton = new WebInspector.StatusBarButton(WebInspector.UIString(""), "responsive-design-page-scale-button responsive-design-page-scale-increase");
+    this._increasePageScaleButton.element.tabIndex = -1;
+    this._increasePageScaleButton.addEventListener("click", this._pageScaleButtonClicked.bind(this, true), this);
+    this._pageScaleContainer.appendChild(this._increasePageScaleButton.element);
 
     this._inspectedPagePlaceholder = inspectedPagePlaceholder;
     inspectedPagePlaceholder.show(this.element);
 
     this._enabled = false;
-    this._viewport = { scrollX: 0, scrollY: 0, contentsWidth: 0, contentsHeight: 0, pageScaleFactor: 1 };
+    this._viewport = { scrollX: 0, scrollY: 0, contentsWidth: 0, contentsHeight: 0, pageScaleFactor: 1, minimumPageScaleFactor: 1, maximumPageScaleFactor: 1 };
     this._drawContentsSize = true;
     this._viewportChangedThrottler = new WebInspector.Throttler(0);
+    this._pageScaleFactorThrottler = new WebInspector.Throttler(50);
 
     WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._onZoomChanged, this);
     WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, this._emulationEnabledChanged, this);
+    this._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.CountUpdated, this._updateMediaQueryInspectorButton, this);
     this._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.HeightUpdated, this.onResize, this);
     WebInspector.targetManager.observeTargets(this);
 
@@ -71,8 +88,10 @@ WebInspector.ResponsiveDesignView = function(inspectedPagePlaceholder)
 };
 
 // Measured in DIP.
-WebInspector.ResponsiveDesignView.SliderWidth = 19;
-WebInspector.ResponsiveDesignView.RulerWidth = 22;
+WebInspector.ResponsiveDesignView.RulerWidth = 34;
+WebInspector.ResponsiveDesignView.RulerHeight = 22;
+WebInspector.ResponsiveDesignView.RulerTopHeight = 11;
+WebInspector.ResponsiveDesignView.RulerBottomHeight = 9;
 
 WebInspector.ResponsiveDesignView.prototype = {
 
@@ -108,6 +127,7 @@ WebInspector.ResponsiveDesignView.prototype = {
         delete this._cachedZoomFactor;
         delete this._cachedViewport;
         delete this._cachedDrawContentsSize;
+        delete this._cachedMediaInspectorHeight;
         delete this._availableSize;
     },
 
@@ -164,8 +184,9 @@ WebInspector.ResponsiveDesignView.prototype = {
         if (typeof this._availableSize === "undefined") {
             var zoomFactor = WebInspector.zoomManager.zoomFactor();
             var rect = this._canvasContainer.element.getBoundingClientRect();
+            var rulerTotalHeight = this._rulerTotalHeightDIP();
             this._availableSize = new Size(Math.max(rect.width * zoomFactor - WebInspector.ResponsiveDesignView.RulerWidth, 1),
-                                           Math.max(rect.height * zoomFactor - WebInspector.ResponsiveDesignView.RulerWidth, 1));
+                                           Math.max(rect.height * zoomFactor - rulerTotalHeight, 1));
         }
         return this._availableSize;
     },
@@ -235,8 +256,9 @@ WebInspector.ResponsiveDesignView.prototype = {
      * Canvas contains grid and rulers.
      * @param {number} cssCanvasWidth
      * @param {number} cssCanvasHeight
+     * @param {number} rulerHeight
      */
-    _drawCanvas: function(cssCanvasWidth, cssCanvasHeight)
+    _drawCanvas: function(cssCanvasWidth, cssCanvasHeight, rulerHeight)
     {
         if (!this._enabled)
             return;
@@ -256,7 +278,6 @@ WebInspector.ResponsiveDesignView.prototype = {
         context.scale(canvas.width / dipCanvasWidth, canvas.height / dipCanvasHeight);
         context.font = "11px " + WebInspector.fontFamily();
 
-        const rulerBackgroundColor = "rgb(0, 0, 0)";
         const backgroundColor = "rgb(102, 102, 102)";
         const lightLineColor = "rgb(132, 132, 132)";
         const darkLineColor = "rgb(114, 114, 114)";
@@ -276,15 +297,12 @@ WebInspector.ResponsiveDesignView.prototype = {
         var rulerStepCount = 20;
 
         var rulerWidth = WebInspector.ResponsiveDesignView.RulerWidth;
+
         var dipGridWidth = dipCanvasWidth - rulerWidth;
-        var dipGridHeight = dipCanvasHeight - rulerWidth;
+        var dipGridHeight = dipCanvasHeight - rulerHeight;
         var dipScrollX = this._viewport.scrollX * scale;
         var dipScrollY = this._viewport.scrollY * scale;
-        context.translate(rulerWidth, rulerWidth);
-
-        context.fillStyle = rulerBackgroundColor;
-        context.fillRect(-rulerWidth, -rulerWidth, dipGridWidth + rulerWidth, rulerWidth);
-        context.fillRect(-rulerWidth, 0, rulerWidth, dipGridHeight);
+        context.translate(rulerWidth, rulerHeight);
 
         context.fillStyle = backgroundColor;
         context.fillRect(0, 0, dipGridWidth, dipGridHeight);
@@ -294,52 +312,62 @@ WebInspector.ResponsiveDesignView.prototype = {
         context.fillStyle = textColor;
         context.lineWidth = 1;
 
-        // Draw vertical ruler.
+        // Draw horizontal ruler.
         context.save();
+
         var minXIndex = Math.ceil(dipScrollX / rulerSubStep);
         var maxXIndex = Math.floor((dipScrollX + dipGridWidth) / rulerSubStep);
+        if (minXIndex) {
+            context.beginPath();
+            context.moveTo(0, -rulerHeight);
+            context.lineTo(0, 0);
+            context.stroke();
+        }
+
         context.translate(-dipScrollX, 0);
         for (var index = minXIndex; index <= maxXIndex; index++) {
             var x = index * rulerSubStep;
-            var y = -rulerWidth / 4;
+            var height = WebInspector.ResponsiveDesignView.RulerHeight * 0.25;
+
             if (!(index % (rulerStepCount / 4)))
-                y = -rulerWidth / 2;
+                height = WebInspector.ResponsiveDesignView.RulerHeight * 0.5;
+
             if (!(index % (rulerStepCount / 2)))
-                y = -rulerWidth + 2;
+                height = rulerHeight;
 
             if (!(index % rulerStepCount)) {
                 context.save();
                 context.translate(x, 0);
-                context.fillText(Math.round(x / scale), 2, -rulerWidth / 2);
+                context.fillText(Math.round(x / scale), 2, -rulerHeight + 10);
                 context.restore();
-                y = -rulerWidth;
+                height = rulerHeight;
             }
 
             context.beginPath();
-            context.moveTo(x, y);
+            context.moveTo(x, - height);
             context.lineTo(x, 0);
             context.stroke();
         }
         context.restore();
 
-        // Draw horizontal ruler.
+        // Draw vertical ruler.
         context.save();
         var minYIndex = Math.ceil(dipScrollY / rulerSubStep);
         var maxYIndex = Math.floor((dipScrollY + dipGridHeight) / rulerSubStep);
         context.translate(0, -dipScrollY);
         for (var index = minYIndex; index <= maxYIndex; index++) {
             var y = index * rulerSubStep;
-            var x = -rulerWidth / 4;
+            var x = -rulerWidth * 0.25;
             if (!(index % (rulerStepCount / 4)))
-                x = -rulerWidth / 2;
+                x = -rulerWidth * 0.5;
             if (!(index % (rulerStepCount / 2)))
-                x = -rulerWidth + 2;
+                x = -rulerWidth * 0.75;
 
             if (!(index % rulerStepCount)) {
                 context.save();
                 context.translate(0, y);
                 context.rotate(-Math.PI / 2);
-                context.fillText(Math.round(y / scale), 2, -rulerWidth / 2);
+                context.fillText(Math.round(y / scale), 2, -rulerWidth + 10);
                 context.restore();
                 x = -rulerWidth;
             }
@@ -402,6 +430,17 @@ WebInspector.ResponsiveDesignView.prototype = {
         }
     },
 
+    /**
+     * @return {number}
+     */
+    _rulerTotalHeightDIP: function()
+    {
+        var mediaInspectorHeight = this._mediaInspector.isShowing() ? this._mediaInspector.element.offsetHeight : 0;
+        if (!mediaInspectorHeight)
+            return WebInspector.ResponsiveDesignView.RulerHeight;
+        return WebInspector.ResponsiveDesignView.RulerTopHeight + WebInspector.ResponsiveDesignView.RulerBottomHeight + mediaInspectorHeight * WebInspector.zoomManager.zoomFactor();
+    },
+
     _updateUI: function()
     {
         if (!this._enabled || !this.isShowing())
@@ -412,38 +451,55 @@ WebInspector.ResponsiveDesignView.prototype = {
         var availableDip = this._availableDipSize();
         var cssCanvasWidth = rect.width;
         var cssCanvasHeight = rect.height;
+        var mediaInspectorHeight = this._mediaInspector.isShowing() ? this._mediaInspector.element.offsetHeight : 0;
+        var rulerTotalHeight = this._rulerTotalHeightDIP();
 
-        this._mediaInspector.setAxisTransform(WebInspector.ResponsiveDesignView.RulerWidth / zoomFactor, this._viewport.scrollX, this._scale * this._viewport.pageScaleFactor);
+        this._mediaInspector.setAxisTransform(this._viewport.scrollX, this._scale * this._viewport.pageScaleFactor);
 
-        if (this._cachedZoomFactor !== zoomFactor) {
+        if (this._cachedZoomFactor !== zoomFactor || this._cachedMediaInspectorHeight !== mediaInspectorHeight) {
             var cssRulerWidth = WebInspector.ResponsiveDesignView.RulerWidth / zoomFactor + "px";
-            this._rulerGlasspane.style.height = cssRulerWidth;
-            this._rulerGlasspane.style.left = cssRulerWidth;
+            var cssRulerHeight = (mediaInspectorHeight ? WebInspector.ResponsiveDesignView.RulerTopHeight : WebInspector.ResponsiveDesignView.RulerHeight) / zoomFactor + "px";
+            var cssCanvasOffset = rulerTotalHeight / zoomFactor + "px";
             this._slidersContainer.style.left = cssRulerWidth;
-            this._slidersContainer.style.top = cssRulerWidth;
-            this._warningMessage.style.height = cssRulerWidth;
-
-            var cssSliderWidth = WebInspector.ResponsiveDesignView.SliderWidth / zoomFactor + "px";
-            this._heightSliderContainer.style.flexBasis = cssSliderWidth;
-            this._heightSliderContainer.style.marginBottom = "-" + cssSliderWidth;
-            this._widthSliderContainer.style.flexBasis = cssSliderWidth;
-            this._widthSliderContainer.style.marginRight = "-" + cssSliderWidth;
+            this._slidersContainer.style.top = cssCanvasOffset;
+            this._warningMessage.style.height = cssCanvasOffset;
+            this._pageScaleContainer.style.top = cssCanvasOffset;
+            this._mediaInspectorContainer.style.left = cssRulerWidth;
+            this._mediaInspectorContainer.style.marginTop = cssRulerHeight;
         }
 
-        var cssWidth = this._dipWidth ? (this._dipWidth / zoomFactor + "px") : (availableDip.width / zoomFactor + "px");
-        var cssHeight = this._dipHeight ? (this._dipHeight / zoomFactor + "px") : (availableDip.height / zoomFactor + "px");
+        var cssWidth = (this._dipWidth ? this._dipWidth : availableDip.width) / zoomFactor;
+        var cssHeight = (this._dipHeight ? this._dipHeight : availableDip.height) / zoomFactor;
         if (this._cachedCssWidth !== cssWidth || this._cachedCssHeight !== cssHeight) {
-            this._slidersContainer.style.width = cssWidth;
-            this._slidersContainer.style.height = cssHeight;
+            this._slidersContainer.style.width = cssWidth + "px";
+            this._slidersContainer.style.height = cssHeight + "px";
             this._inspectedPagePlaceholder.onResize();
         }
 
+        var pageScaleVisible = cssWidth + this._pageScaleContainerWidth + WebInspector.ResponsiveDesignView.RulerWidth / zoomFactor <= rect.width;
+        this._pageScaleContainer.classList.toggle("hidden", !pageScaleVisible);
+
         var viewportChanged = !this._cachedViewport
             || this._cachedViewport.scrollX !== this._viewport.scrollX || this._cachedViewport.scrollY !== this._viewport.scrollY
             || this._cachedViewport.contentsWidth !== this._viewport.contentsWidth || this._cachedViewport.contentsHeight !== this._viewport.contentsHeight
-            || this._cachedViewport.pageScaleFactor !== this._viewport.pageScaleFactor;
-        if (viewportChanged || this._drawContentsSize !== this._cachedDrawContentsSize || this._cachedScale !== this._scale || this._cachedCssCanvasWidth !== cssCanvasWidth || this._cachedCssCanvasHeight !== cssCanvasHeight || this._cachedZoomFactor !== zoomFactor)
-            this._drawCanvas(cssCanvasWidth, cssCanvasHeight);
+            || this._cachedViewport.pageScaleFactor !== this._viewport.pageScaleFactor
+            || this._cachedViewport.minimumPageScaleFactor !== this._viewport.minimumPageScaleFactor
+            || this._cachedViewport.maximumPageScaleFactor !== this._viewport.maximumPageScaleFactor;
+
+        var canvasInvalidated = viewportChanged || this._drawContentsSize !== this._cachedDrawContentsSize || this._cachedScale !== this._scale ||
+            this._cachedCssCanvasWidth !== cssCanvasWidth || this._cachedCssCanvasHeight !== cssCanvasHeight || this._cachedZoomFactor !== zoomFactor ||
+            this._cachedMediaInspectorHeight !== mediaInspectorHeight;
+
+        if (canvasInvalidated)
+            this._drawCanvas(cssCanvasWidth, cssCanvasHeight, rulerTotalHeight);
+
+        if (viewportChanged) {
+            this._pageScaleLabel.textContent = WebInspector.UIString("%.1f", this._viewport.pageScaleFactor);
+            this._decreasePageScaleButton.title = WebInspector.UIString("Scale down (minimum %.1f)", this._viewport.minimumPageScaleFactor);
+            this._decreasePageScaleButton.setEnabled(this._viewport.pageScaleFactor > this._viewport.minimumPageScaleFactor);
+            this._increasePageScaleButton.title = WebInspector.UIString("Scale up (maximum %.1f)", this._viewport.maximumPageScaleFactor);
+            this._increasePageScaleButton.setEnabled(this._viewport.pageScaleFactor < this._viewport.maximumPageScaleFactor);
+        }
 
         this._cachedScale = this._scale;
         this._cachedCssCanvasWidth = cssCanvasWidth;
@@ -453,6 +509,7 @@ WebInspector.ResponsiveDesignView.prototype = {
         this._cachedZoomFactor = zoomFactor;
         this._cachedViewport = this._viewport;
         this._cachedDrawContentsSize = this._drawContentsSize;
+        this._cachedMediaInspectorHeight = mediaInspectorHeight;
     },
 
     onResize: function()
@@ -460,6 +517,10 @@ WebInspector.ResponsiveDesignView.prototype = {
         if (!this._enabled || this._ignoreResize)
             return;
         var oldSize = this._availableSize;
+
+        this._pageScaleContainer.classList.remove("hidden");
+        this._pageScaleContainerWidth = this._pageScaleContainer.offsetWidth;
+
         delete this._availableSize;
         var newSize = this._availableDipSize();
         if (!newSize.isEqual(oldSize))
@@ -477,7 +538,6 @@ WebInspector.ResponsiveDesignView.prototype = {
     {
         this._toolbarElement = this._responsiveDesignContainer.element.createChild("div", "responsive-design-toolbar");
         this._createButtonsSection();
-        this._toolbarElement.createChild("div", "responsive-design-separator");
         this._createDeviceSection();
         this._toolbarElement.createChild("div", "responsive-design-separator");
         this._createNetworkSection();
@@ -499,8 +559,9 @@ WebInspector.ResponsiveDesignView.prototype = {
         resetButton.addEventListener("click", WebInspector.overridesSupport.reset, WebInspector.overridesSupport);
 
         // Media Query Inspector.
-        this._toggleMediaInspectorButton = new WebInspector.StatusBarButton(WebInspector.UIString("Media queries."), "responsive-design-toggle-media-inspector");
+        this._toggleMediaInspectorButton = new WebInspector.StatusBarButton(WebInspector.UIString("Media queries not found"), "responsive-design-toggle-media-inspector");
         this._toggleMediaInspectorButton.toggled = WebInspector.settings.showMediaQueryInspector.get();
+        this._toggleMediaInspectorButton.setEnabled(false);
         this._toggleMediaInspectorButton.addEventListener("click", this._onToggleMediaInspectorButtonClick, this);
         WebInspector.settings.showMediaQueryInspector.addChangeListener(this._updateMediaQueryInspector, this);
         buttonsSection.appendChild(this._toggleMediaInspectorButton.element);
@@ -510,16 +571,17 @@ WebInspector.ResponsiveDesignView.prototype = {
     {
         var deviceSection = this._toolbarElement.createChild("div", "responsive-design-section responsive-design-section-device");
 
+        var separator = deviceSection.createChild("div", "responsive-design-section-decorator");
+
         // Device.
         var deviceElement = deviceSection.createChild("div", "responsive-design-suite responsive-design-suite-top").createChild("div");
+
         var fieldsetElement = deviceElement.createChild("fieldset");
         fieldsetElement.createChild("label").textContent = WebInspector.UIString("Device");
         var deviceSelectElement = WebInspector.OverridesUI.createDeviceSelect(document);
         fieldsetElement.appendChild(deviceSelectElement);
         deviceSelectElement.classList.add("responsive-design-device-select");
 
-        var separator = deviceSection.createChild("div", "responsive-design-section-separator");
-
         var detailsElement = deviceSection.createChild("div", "responsive-design-suite");
 
         // Dimensions.
@@ -536,7 +598,7 @@ WebInspector.ResponsiveDesignView.prototype = {
         fieldsetElement.appendChild(resolutionFieldset);
 
         resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceWidth, true, 4, "3em", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013")));
-        resolutionFieldset.appendChild(document.createTextNode(" \u00D7 "));
+        resolutionFieldset.createTextChild("\u00D7");
         resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceHeight, true, 4, "3em", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013")));
 
         var swapButton = new WebInspector.StatusBarButton(WebInspector.UIString("Swap dimensions"), "responsive-design-icon responsive-design-icon-swap");
@@ -553,7 +615,7 @@ WebInspector.ResponsiveDesignView.prototype = {
         var dprButton = new WebInspector.StatusBarButton(WebInspector.UIString("Device pixel ratio"), "responsive-design-icon responsive-design-icon-dpr");
         dprButton.setEnabled(false);
         resolutionFieldset2.appendChild(dprButton.element);
-        resolutionFieldset2.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceScaleFactor, true, 4, "2.5em", WebInspector.OverridesSupport.deviceScaleFactorValidator, true, true, WebInspector.UIString("\u2013")));
+        resolutionFieldset2.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceScaleFactor, true, 4, "1.9em", WebInspector.OverridesSupport.deviceScaleFactorValidator, true, true, WebInspector.UIString("\u2013")));
 
         // Fit to window.
         detailsElement.createChild("div", "responsive-design-suite-separator");
@@ -566,6 +628,8 @@ WebInspector.ResponsiveDesignView.prototype = {
     {
         var networkSection = this._toolbarElement.createChild("div", "responsive-design-section responsive-design-section-network");
 
+        var separator = networkSection.createChild("div", "responsive-design-section-decorator");
+
         // Bandwidth.
         var bandwidthElement = networkSection.createChild("div", "responsive-design-suite responsive-design-suite-top").createChild("div");
         var fieldsetElement = bandwidthElement.createChild("fieldset");
@@ -573,8 +637,6 @@ WebInspector.ResponsiveDesignView.prototype = {
         networkCheckbox.textContent = WebInspector.UIString("Network");
         fieldsetElement.appendChild(WebInspector.OverridesUI.createNetworkConditionsSelect(document));
 
-        var separator = networkSection.createChild("div", "responsive-design-section-separator");
-
         // User agent.
         var userAgentElement = networkSection.createChild("div", "responsive-design-suite").createChild("div");
         fieldsetElement = userAgentElement.createChild("fieldset");
@@ -598,17 +660,34 @@ WebInspector.ResponsiveDesignView.prototype = {
         this.onResize();
     },
 
+    /**
+     * @param {!WebInspector.Event} event
+     */
+    _updateMediaQueryInspectorButton: function(event)
+    {
+        var count = /** @type {number} */ (event.data);
+        this._toggleMediaInspectorButton.setEnabled(!!count);
+        this._toggleMediaInspectorButton.title = !count ? WebInspector.UIString("Media queries not found") :
+            WebInspector.UIString((count === 1 ? "%d media query found" : "%d media queries found"), count);
+    },
+
     _overridesWarningUpdated: function()
     {
-        var message = WebInspector.overridesSupport.warningMessage();
-        if (this._warningMessage.querySelector("span").textContent === message)
+        var message = WebInspector.settings.disableOverridesWarning.get() ? "" : WebInspector.overridesSupport.warningMessage();
+        if (this._warning === message)
             return;
+        this._warning = message;
         this._warningMessage.classList.toggle("hidden", !message);
         this._warningMessage.querySelector("span").textContent = message;
         this._invalidateCache();
         this.onResize();
     },
 
+    _disableOverridesWarnings: function()
+    {
+        WebInspector.settings.disableOverridesWarning.set(true);
+    },
+
     _showEmulationInDrawer: function()
     {
         WebInspector.Revealer.reveal(WebInspector.overridesSupport);
@@ -622,6 +701,10 @@ WebInspector.ResponsiveDesignView.prototype = {
         var viewport = /** @type {?PageAgent.Viewport} */ (event.data);
         if (viewport) {
             this._viewport = viewport;
+            this._viewport.minimumPageScaleFactor = Math.max(0.1, this._viewport.minimumPageScaleFactor);
+            this._viewport.minimumPageScaleFactor = Math.min(this._viewport.minimumPageScaleFactor, this._viewport.pageScaleFactor);
+            this._viewport.maximumPageScaleFactor = Math.min(10, this._viewport.maximumPageScaleFactor);
+            this._viewport.maximumPageScaleFactor = Math.max(this._viewport.maximumPageScaleFactor, this._viewport.pageScaleFactor);
             this._viewportChangedThrottler.schedule(this._updateUIThrottled.bind(this));
         }
     },
@@ -635,5 +718,46 @@ WebInspector.ResponsiveDesignView.prototype = {
         finishCallback();
     },
 
+    /**
+     * @param {boolean} increase
+     * @param {!WebInspector.Event} event
+     */
+    _pageScaleButtonClicked: function(increase, event)
+    {
+        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));
+
+        /**
+         * @param {!WebInspector.Throttler.FinishCallback} finishCallback
+         * @this {WebInspector.ResponsiveDesignView}
+         */
+        function updatePageScaleFactor(finishCallback)
+        {
+            if (this._target && this._viewport) {
+                var value = this._viewport.pageScaleFactor;
+                value = increase ? value * 1.1 : value / 1.1;
+                value = Math.min(this._viewport.maximumPageScaleFactor, value);
+                value = Math.max(this._viewport.minimumPageScaleFactor, value)
+                this._target.pageAgent().setPageScaleFactor(value);
+            }
+            finishCallback();
+        }
+    },
+
+    _resetPageScale: function()
+    {
+        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));
+
+        /**
+         * @param {!WebInspector.Throttler.FinishCallback} finishCallback
+         * @this {WebInspector.ResponsiveDesignView}
+         */
+        function updatePageScaleFactor(finishCallback)
+        {
+            if (this._target && this._viewport && this._viewport.minimumPageScaleFactor <= 1 && this._viewport.maximumPageScaleFactor >= 1)
+                this._target.pageAgent().setPageScaleFactor(1);
+            finishCallback();
+        }
+    },
+
     __proto__: WebInspector.VBox.prototype
 };