Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(758)

Unified Diff: third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
index 590d1b3a90d1753769fe8c39d37e87eb171b8a70..d3a87cb9a8b28126a924591494913589190dfd0f 100644
--- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
@@ -1,14 +1,15 @@
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-
/**
- * @constructor
- * @param {function()} updateCallback
* @implements {WebInspector.TargetManager.Observer}
+ * @unrestricted
*/
-WebInspector.DeviceModeModel = function(updateCallback)
-{
+WebInspector.DeviceModeModel = class {
+ /**
+ * @param {function()} updateCallback
+ */
+ constructor(updateCallback) {
this._updateCallback = updateCallback;
this._screenRect = new WebInspector.Rect(0, 0, 1, 1);
this._visiblePageRect = new WebInspector.Rect(0, 0, 1, 1);
@@ -20,32 +21,32 @@ WebInspector.DeviceModeModel = function(updateCallback)
this._appliedDeviceScaleFactor = window.devicePixelRatio;
this._appliedUserAgentType = WebInspector.DeviceModeModel.UA.Desktop;
- this._scaleSetting = WebInspector.settings.createSetting("emulation.deviceScale", 1);
+ this._scaleSetting = WebInspector.settings.createSetting('emulation.deviceScale', 1);
// We've used to allow zero before.
if (!this._scaleSetting.get())
- this._scaleSetting.set(1);
+ this._scaleSetting.set(1);
this._scaleSetting.addChangeListener(this._scaleSettingChanged, this);
- this._widthSetting = WebInspector.settings.createSetting("emulation.deviceWidth", 400);
+ this._widthSetting = WebInspector.settings.createSetting('emulation.deviceWidth', 400);
if (this._widthSetting.get() < WebInspector.DeviceModeModel.MinDeviceSize)
- this._widthSetting.set(WebInspector.DeviceModeModel.MinDeviceSize);
+ this._widthSetting.set(WebInspector.DeviceModeModel.MinDeviceSize);
if (this._widthSetting.get() > WebInspector.DeviceModeModel.MaxDeviceSize)
- this._widthSetting.set(WebInspector.DeviceModeModel.MaxDeviceSize);
+ this._widthSetting.set(WebInspector.DeviceModeModel.MaxDeviceSize);
this._widthSetting.addChangeListener(this._widthSettingChanged, this);
- this._heightSetting = WebInspector.settings.createSetting("emulation.deviceHeight", 0);
+ this._heightSetting = WebInspector.settings.createSetting('emulation.deviceHeight', 0);
if (this._heightSetting.get() && this._heightSetting.get() < WebInspector.DeviceModeModel.MinDeviceSize)
- this._heightSetting.set(WebInspector.DeviceModeModel.MinDeviceSize);
+ this._heightSetting.set(WebInspector.DeviceModeModel.MinDeviceSize);
if (this._heightSetting.get() > WebInspector.DeviceModeModel.MaxDeviceSize)
- this._heightSetting.set(WebInspector.DeviceModeModel.MaxDeviceSize);
+ this._heightSetting.set(WebInspector.DeviceModeModel.MaxDeviceSize);
this._heightSetting.addChangeListener(this._heightSettingChanged, this);
- this._uaSetting = WebInspector.settings.createSetting("emulation.deviceUA", WebInspector.DeviceModeModel.UA.Mobile);
+ this._uaSetting = WebInspector.settings.createSetting('emulation.deviceUA', WebInspector.DeviceModeModel.UA.Mobile);
this._uaSetting.addChangeListener(this._uaSettingChanged, this);
- this._deviceScaleFactorSetting = WebInspector.settings.createSetting("emulation.deviceScaleFactor", 0);
+ this._deviceScaleFactorSetting = WebInspector.settings.createSetting('emulation.deviceScaleFactor', 0);
this._deviceScaleFactorSetting.addChangeListener(this._deviceScaleFactorSettingChanged, this);
- this._deviceOutlineSetting = WebInspector.settings.moduleSetting("emulation.showDeviceOutline");
+ this._deviceOutlineSetting = WebInspector.settings.moduleSetting('emulation.showDeviceOutline');
this._deviceOutlineSetting.addChangeListener(this._deviceOutlineSettingChanged, this);
/** @type {!WebInspector.DeviceModeModel.Type} */
@@ -62,579 +63,573 @@ WebInspector.DeviceModeModel = function(updateCallback)
/** @type {?function()} */
this._onTargetAvailable = null;
WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capability.Browser);
+ }
+
+ /**
+ * @param {string} value
+ * @return {boolean}
+ */
+ static deviceSizeValidator(value) {
+ if (/^[\d]+$/.test(value) && value >= WebInspector.DeviceModeModel.MinDeviceSize &&
+ value <= WebInspector.DeviceModeModel.MaxDeviceSize)
+ return true;
+ return false;
+ }
+
+ /**
+ * @param {string} value
+ * @return {boolean}
+ */
+ static deviceScaleFactorValidator(value) {
+ if (!value || (/^[\d]+(\.\d+)?|\.\d+$/.test(value) && value >= 0 && value <= 10))
+ return true;
+ return false;
+ }
+
+ /**
+ * @param {!Size} availableSize
+ * @param {!Size} preferredSize
+ */
+ setAvailableSize(availableSize, preferredSize) {
+ this._availableSize = availableSize;
+ this._preferredSize = preferredSize;
+ this._initialized = true;
+ this._calculateAndEmulate(false);
+ }
+
+ /**
+ * @param {!WebInspector.DeviceModeModel.Type} type
+ * @param {?WebInspector.EmulatedDevice} device
+ * @param {?WebInspector.EmulatedDevice.Mode} mode
+ * @param {number=} scale
+ */
+ emulate(type, device, mode, scale) {
+ var resetPageScaleFactor = this._type !== type || this._device !== device || this._mode !== mode;
+ this._type = type;
+
+ if (type === WebInspector.DeviceModeModel.Type.Device) {
+ console.assert(device && mode, 'Must pass device and mode for device emulation');
+ this._mode = mode;
+ this._device = device;
+ if (this._initialized) {
+ var orientation = device.orientationByName(mode.orientation);
+ this._scaleSetting.set(
+ scale ||
+ this._calculateFitScale(
+ orientation.width, orientation.height, this._currentOutline(), this._currentInsets()));
+ }
+ } else {
+ this._device = null;
+ this._mode = null;
+ }
+
+ if (type !== WebInspector.DeviceModeModel.Type.None)
+ WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.DeviceModeEnabled);
+ this._calculateAndEmulate(resetPageScaleFactor);
+ }
+
+ /**
+ * @param {number} width
+ */
+ setWidth(width) {
+ var max = Math.min(WebInspector.DeviceModeModel.MaxDeviceSize, this._preferredScaledWidth());
+ width = Math.max(Math.min(width, max), 1);
+ this._widthSetting.set(width);
+ }
+
+ /**
+ * @param {number} width
+ */
+ setWidthAndScaleToFit(width) {
+ width = Math.max(Math.min(width, WebInspector.DeviceModeModel.MaxDeviceSize), 1);
+ this._scaleSetting.set(this._calculateFitScale(width, this._heightSetting.get()));
+ this._widthSetting.set(width);
+ }
+
+ /**
+ * @param {number} height
+ */
+ setHeight(height) {
+ var max = Math.min(WebInspector.DeviceModeModel.MaxDeviceSize, this._preferredScaledHeight());
+ height = Math.max(Math.min(height, max), 0);
+ if (height === this._preferredScaledHeight())
+ height = 0;
+ this._heightSetting.set(height);
+ }
+
+ /**
+ * @param {number} height
+ */
+ setHeightAndScaleToFit(height) {
+ height = Math.max(Math.min(height, WebInspector.DeviceModeModel.MaxDeviceSize), 0);
+ this._scaleSetting.set(this._calculateFitScale(this._widthSetting.get(), height));
+ this._heightSetting.set(height);
+ }
+
+ /**
+ * @param {number} scale
+ */
+ setScale(scale) {
+ this._scaleSetting.set(scale);
+ }
+
+ /**
+ * @return {?WebInspector.EmulatedDevice}
+ */
+ device() {
+ return this._device;
+ }
+
+ /**
+ * @return {?WebInspector.EmulatedDevice.Mode}
+ */
+ mode() {
+ return this._mode;
+ }
+
+ /**
+ * @return {!WebInspector.DeviceModeModel.Type}
+ */
+ type() {
+ return this._type;
+ }
+
+ /**
+ * @return {string}
+ */
+ screenImage() {
+ return (this._device && this._mode) ? this._device.modeImage(this._mode) : '';
+ }
+
+ /**
+ * @return {string}
+ */
+ outlineImage() {
+ return (this._device && this._mode && this._deviceOutlineSetting.get()) ? this._device.outlineImage(this._mode) :
+ '';
+ }
+
+ /**
+ * @return {!WebInspector.Rect}
+ */
+ outlineRect() {
+ return this._outlineRect;
+ }
+
+ /**
+ * @return {!WebInspector.Rect}
+ */
+ screenRect() {
+ return this._screenRect;
+ }
+
+ /**
+ * @return {!WebInspector.Rect}
+ */
+ visiblePageRect() {
+ return this._visiblePageRect;
+ }
+
+ /**
+ * @return {number}
+ */
+ scale() {
+ return this._scale;
+ }
+
+ /**
+ * @return {number}
+ */
+ fitScale() {
+ return this._fitScale;
+ }
+
+ /**
+ * @return {!Size}
+ */
+ appliedDeviceSize() {
+ return this._appliedDeviceSize;
+ }
+
+ /**
+ * @return {number}
+ */
+ appliedDeviceScaleFactor() {
+ return this._appliedDeviceScaleFactor;
+ }
+
+ /**
+ * @return {!WebInspector.DeviceModeModel.UA}
+ */
+ appliedUserAgentType() {
+ return this._appliedUserAgentType;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ isFullHeight() {
+ return !this._heightSetting.get();
+ }
+
+ /**
+ * @return {!WebInspector.Setting}
+ */
+ scaleSetting() {
+ return this._scaleSetting;
+ }
+
+ /**
+ * @return {!WebInspector.Setting}
+ */
+ uaSetting() {
+ return this._uaSetting;
+ }
+
+ /**
+ * @return {!WebInspector.Setting}
+ */
+ deviceScaleFactorSetting() {
+ return this._deviceScaleFactorSetting;
+ }
+
+ /**
+ * @return {!WebInspector.Setting}
+ */
+ deviceOutlineSetting() {
+ return this._deviceOutlineSetting;
+ }
+
+ reset() {
+ this._deviceScaleFactorSetting.set(0);
+ this._scaleSetting.set(1);
+ this.setWidth(400);
+ this.setHeight(0);
+ this._uaSetting.set(WebInspector.DeviceModeModel.UA.Mobile);
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.Target} target
+ */
+ targetAdded(target) {
+ if (!this._target) {
+ this._target = target;
+ if (this._onTargetAvailable) {
+ var callback = this._onTargetAvailable;
+ this._onTargetAvailable = null;
+ callback();
+ }
+ }
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.Target} target
+ */
+ targetRemoved(target) {
+ if (this._target === target)
+ this._target = null;
+ }
+
+ _scaleSettingChanged() {
+ this._calculateAndEmulate(false);
+ }
+
+ _widthSettingChanged() {
+ this._calculateAndEmulate(false);
+ }
+
+ _heightSettingChanged() {
+ this._calculateAndEmulate(false);
+ }
+
+ _uaSettingChanged() {
+ this._calculateAndEmulate(true);
+ }
+
+ _deviceScaleFactorSettingChanged() {
+ this._calculateAndEmulate(false);
+ }
+
+ _deviceOutlineSettingChanged() {
+ this._calculateAndEmulate(false);
+ }
+
+ /**
+ * @return {number}
+ */
+ _preferredScaledWidth() {
+ return Math.floor(this._preferredSize.width / (this._scaleSetting.get() || 1));
+ }
+
+ /**
+ * @return {number}
+ */
+ _preferredScaledHeight() {
+ return Math.floor(this._preferredSize.height / (this._scaleSetting.get() || 1));
+ }
+
+ /**
+ * @return {!Insets}
+ */
+ _currentOutline() {
+ var outline = new Insets(0, 0, 0, 0);
+ if (this._type !== WebInspector.DeviceModeModel.Type.Device)
+ return outline;
+ var orientation = this._device.orientationByName(this._mode.orientation);
+ if (this._deviceOutlineSetting.get())
+ outline = orientation.outlineInsets || outline;
+ return outline;
+ }
+
+ /**
+ * @return {!Insets}
+ */
+ _currentInsets() {
+ if (this._type !== WebInspector.DeviceModeModel.Type.Device)
+ return new Insets(0, 0, 0, 0);
+ return this._mode.insets;
+ }
+
+ /**
+ * @param {boolean} resetPageScaleFactor
+ */
+ _calculateAndEmulate(resetPageScaleFactor) {
+ if (!this._target)
+ this._onTargetAvailable = this._calculateAndEmulate.bind(this, resetPageScaleFactor);
+
+ if (this._type === WebInspector.DeviceModeModel.Type.Device) {
+ var orientation = this._device.orientationByName(this._mode.orientation);
+ var outline = this._currentOutline();
+ var insets = this._currentInsets();
+ this._fitScale = this._calculateFitScale(orientation.width, orientation.height, outline, insets);
+ if (this._device.mobile())
+ this._appliedUserAgentType = this._device.touch() ? WebInspector.DeviceModeModel.UA.Mobile :
+ WebInspector.DeviceModeModel.UA.MobileNoTouch;
+ else
+ this._appliedUserAgentType = this._device.touch() ? WebInspector.DeviceModeModel.UA.DesktopTouch :
+ WebInspector.DeviceModeModel.UA.Desktop;
+ this._applyDeviceMetrics(
+ new Size(orientation.width, orientation.height), insets, outline, this._scaleSetting.get(),
+ this._device.deviceScaleFactor, this._device.mobile(),
+ this._mode.orientation === WebInspector.EmulatedDevice.Horizontal ? 'landscapePrimary' : 'portraitPrimary',
+ resetPageScaleFactor);
+ this._applyUserAgent(this._device.userAgent);
+ this._applyTouch(this._device.touch(), this._device.mobile());
+ } else if (this._type === WebInspector.DeviceModeModel.Type.None) {
+ this._fitScale = this._calculateFitScale(this._availableSize.width, this._availableSize.height);
+ this._appliedUserAgentType = WebInspector.DeviceModeModel.UA.Desktop;
+ this._applyDeviceMetrics(
+ this._availableSize, new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), 1, 0, false, '', resetPageScaleFactor);
+ this._applyUserAgent('');
+ this._applyTouch(false, false);
+ } else if (this._type === WebInspector.DeviceModeModel.Type.Responsive) {
+ var screenWidth = this._widthSetting.get();
+ if (!screenWidth || screenWidth > this._preferredScaledWidth())
+ screenWidth = this._preferredScaledWidth();
+ var screenHeight = this._heightSetting.get();
+ if (!screenHeight || screenHeight > this._preferredScaledHeight())
+ screenHeight = this._preferredScaledHeight();
+ var mobile = this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile ||
+ this._uaSetting.get() === WebInspector.DeviceModeModel.UA.MobileNoTouch;
+ var defaultDeviceScaleFactor = mobile ? WebInspector.DeviceModeModel.defaultMobileScaleFactor : 0;
+ this._fitScale = this._calculateFitScale(this._widthSetting.get(), this._heightSetting.get());
+ this._appliedUserAgentType = this._uaSetting.get();
+ this._applyDeviceMetrics(
+ new Size(screenWidth, screenHeight), new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), this._scaleSetting.get(),
+ this._deviceScaleFactorSetting.get() || defaultDeviceScaleFactor, mobile,
+ screenHeight >= screenWidth ? 'portraitPrimary' : 'landscapePrimary', resetPageScaleFactor);
+ this._applyUserAgent(mobile ? WebInspector.DeviceModeModel._defaultMobileUserAgent : '');
+ this._applyTouch(
+ this._uaSetting.get() === WebInspector.DeviceModeModel.UA.DesktopTouch ||
+ this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile,
+ this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile);
+ }
+ if (this._target)
+ this._target.renderingAgent().setShowViewportSizeOnResize(this._type === WebInspector.DeviceModeModel.Type.None);
+ this._updateCallback.call(null);
+ }
+
+ /**
+ * @param {number} screenWidth
+ * @param {number} screenHeight
+ * @param {!Insets=} outline
+ * @param {!Insets=} insets
+ * @return {number}
+ */
+ _calculateFitScale(screenWidth, screenHeight, outline, insets) {
+ var outlineWidth = outline ? outline.left + outline.right : 0;
+ var outlineHeight = outline ? outline.top + outline.bottom : 0;
+ var insetsWidth = insets ? insets.left + insets.right : 0;
+ var insetsHeight = insets ? insets.top + insets.bottom : 0;
+ var scale = Math.min(
+ screenWidth ? this._preferredSize.width / (screenWidth + outlineWidth) : 1,
+ screenHeight ? this._preferredSize.height / (screenHeight + outlineHeight) : 1);
+ scale = Math.min(Math.floor(scale * 100), 100);
+
+ var sharpScale = scale;
+ while (sharpScale > scale * 0.7) {
+ var sharp = true;
+ if (screenWidth)
+ sharp = sharp && Number.isInteger((screenWidth - insetsWidth) * sharpScale / 100);
+ if (screenHeight)
+ sharp = sharp && Number.isInteger((screenHeight - insetsHeight) * sharpScale / 100);
+ if (sharp)
+ return sharpScale / 100;
+ sharpScale -= 1;
+ }
+ return scale / 100;
+ }
+
+ /**
+ * @param {number} width
+ * @param {number} height
+ */
+ setSizeAndScaleToFit(width, height) {
+ this._scaleSetting.set(this._calculateFitScale(width, height));
+ this.setWidth(width);
+ }
+
+ /**
+ * @param {string} userAgent
+ */
+ _applyUserAgent(userAgent) {
+ WebInspector.multitargetNetworkManager.setUserAgentOverride(userAgent);
+ }
+
+ /**
+ * @param {!Size} screenSize
+ * @param {!Insets} insets
+ * @param {!Insets} outline
+ * @param {number} scale
+ * @param {number} deviceScaleFactor
+ * @param {boolean} mobile
+ * @param {string} screenOrientation
+ * @param {boolean} resetPageScaleFactor
+ */
+ _applyDeviceMetrics(
+ screenSize,
+ insets,
+ outline,
+ scale,
+ deviceScaleFactor,
+ mobile,
+ screenOrientation,
+ resetPageScaleFactor) {
+ screenSize.width = Math.max(1, Math.floor(screenSize.width));
+ screenSize.height = Math.max(1, Math.floor(screenSize.height));
+
+ var pageWidth = screenSize.width - insets.left - insets.right;
+ var pageHeight = screenSize.height - insets.top - insets.bottom;
+
+ var positionX = insets.left;
+ var positionY = insets.top;
+ var screenOrientationAngle = screenOrientation === 'landscapePrimary' ? 90 : 0;
+
+ this._appliedDeviceSize = screenSize;
+ this._appliedDeviceScaleFactor = deviceScaleFactor || window.devicePixelRatio;
+ this._screenRect = new WebInspector.Rect(
+ Math.max(0, (this._availableSize.width - screenSize.width * scale) / 2), outline.top * scale,
+ screenSize.width * scale, screenSize.height * scale);
+ this._outlineRect = new WebInspector.Rect(
+ this._screenRect.left - outline.left * scale, 0, (outline.left + screenSize.width + outline.right) * scale,
+ (outline.top + screenSize.height + outline.bottom) * scale);
+ this._visiblePageRect = new WebInspector.Rect(
+ positionX * scale, positionY * scale,
+ Math.min(pageWidth * scale, this._availableSize.width - this._screenRect.left - positionX * scale),
+ Math.min(pageHeight * scale, this._availableSize.height - this._screenRect.top - positionY * scale));
+ this._scale = scale;
+
+ if (scale === 1 && this._availableSize.width >= screenSize.width &&
+ this._availableSize.height >= screenSize.height) {
+ // When we have enough space, no page size override is required. This will speed things up and remove lag.
+ pageWidth = 0;
+ pageHeight = 0;
+ }
+ if (this._visiblePageRect.width === pageWidth * scale && this._visiblePageRect.height === pageHeight * scale &&
+ Number.isInteger(pageWidth * scale) && Number.isInteger(pageHeight * scale)) {
+ // When we only have to apply scale, do not resize the page. This will speed things up and remove lag.
+ pageWidth = 0;
+ pageHeight = 0;
+ }
+
+ this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this));
+
+ /**
+ * @this {WebInspector.DeviceModeModel}
+ * @return {!Promise.<?>}
+ */
+ function setDeviceMetricsOverride() {
+ if (!this._target)
+ return Promise.resolve();
+
+ var clear = !pageWidth && !pageHeight && !mobile && !deviceScaleFactor && scale === 1 && !screenOrientation;
+ var allPromises = [];
+ if (resetPageScaleFactor)
+ allPromises.push(this._target.emulationAgent().resetPageScaleFactor());
+ var setDevicePromise;
+ if (clear) {
+ setDevicePromise = this._target.emulationAgent().clearDeviceMetricsOverride(
+ this._deviceMetricsOverrideAppliedForTest.bind(this));
+ } else {
+ var params = {
+ width: pageWidth,
+ height: pageHeight,
+ deviceScaleFactor: deviceScaleFactor,
+ mobile: mobile,
+ fitWindow: false,
+ scale: scale,
+ screenWidth: screenSize.width,
+ screenHeight: screenSize.height,
+ positionX: positionX,
+ positionY: positionY
+ };
+ if (screenOrientation)
+ params.screenOrientation = {type: screenOrientation, angle: screenOrientationAngle};
+ setDevicePromise = this._target.emulationAgent().invoke_setDeviceMetricsOverride(
+ params, this._deviceMetricsOverrideAppliedForTest.bind(this));
+ }
+ allPromises.push(setDevicePromise);
+ return Promise.all(allPromises);
+ }
+ }
+
+ _deviceMetricsOverrideAppliedForTest() {
+ // Used for sniffing in tests.
+ }
+
+ /**
+ * @param {boolean} touchEnabled
+ * @param {boolean} mobile
+ */
+ _applyTouch(touchEnabled, mobile) {
+ WebInspector.MultitargetTouchModel.instance().setTouchEnabled(touchEnabled, mobile);
+ }
};
/** @enum {string} */
WebInspector.DeviceModeModel.Type = {
- None: "None",
- Responsive: "Responsive",
- Device: "Device"
+ None: 'None',
+ Responsive: 'Responsive',
+ Device: 'Device'
};
/** @enum {string} */
WebInspector.DeviceModeModel.UA = {
- Mobile: WebInspector.UIString("Mobile"),
- MobileNoTouch: WebInspector.UIString("Mobile (no touch)"),
- Desktop: WebInspector.UIString("Desktop"),
- DesktopTouch: WebInspector.UIString("Desktop (touch)")
+ Mobile: WebInspector.UIString('Mobile'),
+ MobileNoTouch: WebInspector.UIString('Mobile (no touch)'),
+ Desktop: WebInspector.UIString('Desktop'),
+ DesktopTouch: WebInspector.UIString('Desktop (touch)')
};
WebInspector.DeviceModeModel.MinDeviceSize = 50;
WebInspector.DeviceModeModel.MaxDeviceSize = 9999;
-/**
- * @param {string} value
- * @return {boolean}
- */
-WebInspector.DeviceModeModel.deviceSizeValidator = function(value)
-{
- if (/^[\d]+$/.test(value) && value >= WebInspector.DeviceModeModel.MinDeviceSize && value <= WebInspector.DeviceModeModel.MaxDeviceSize)
- return true;
- return false;
-};
-/**
- * @param {string} value
- * @return {boolean}
- */
-WebInspector.DeviceModeModel.deviceScaleFactorValidator = function(value)
-{
- if (!value || (/^[\d]+(\.\d+)?|\.\d+$/.test(value) && value >= 0 && value <= 10))
- return true;
- return false;
-};
-
-WebInspector.DeviceModeModel._defaultMobileUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36";
-WebInspector.DeviceModeModel._defaultMobileUserAgent = WebInspector.MultitargetNetworkManager.patchUserAgentWithChromeVersion(WebInspector.DeviceModeModel._defaultMobileUserAgent);
+WebInspector.DeviceModeModel._defaultMobileUserAgent =
+ 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36';
+WebInspector.DeviceModeModel._defaultMobileUserAgent =
+ WebInspector.MultitargetNetworkManager.patchUserAgentWithChromeVersion(
+ WebInspector.DeviceModeModel._defaultMobileUserAgent);
WebInspector.DeviceModeModel.defaultMobileScaleFactor = 2;
-
-WebInspector.DeviceModeModel.prototype = {
- /**
- * @param {!Size} availableSize
- * @param {!Size} preferredSize
- */
- setAvailableSize: function(availableSize, preferredSize)
- {
- this._availableSize = availableSize;
- this._preferredSize = preferredSize;
- this._initialized = true;
- this._calculateAndEmulate(false);
- },
-
- /**
- * @param {!WebInspector.DeviceModeModel.Type} type
- * @param {?WebInspector.EmulatedDevice} device
- * @param {?WebInspector.EmulatedDevice.Mode} mode
- * @param {number=} scale
- */
- emulate: function(type, device, mode, scale)
- {
- var resetPageScaleFactor = this._type !== type || this._device !== device || this._mode !== mode;
- this._type = type;
-
- if (type === WebInspector.DeviceModeModel.Type.Device) {
- console.assert(device && mode, "Must pass device and mode for device emulation");
- this._mode = mode;
- this._device = device;
- if (this._initialized) {
- var orientation = device.orientationByName(mode.orientation);
- this._scaleSetting.set(scale || this._calculateFitScale(orientation.width, orientation.height, this._currentOutline(), this._currentInsets()));
- }
- } else {
- this._device = null;
- this._mode = null;
- }
-
- if (type !== WebInspector.DeviceModeModel.Type.None)
- WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.DeviceModeEnabled);
- this._calculateAndEmulate(resetPageScaleFactor);
- },
-
- /**
- * @param {number} width
- */
- setWidth: function(width)
- {
- var max = Math.min(WebInspector.DeviceModeModel.MaxDeviceSize, this._preferredScaledWidth());
- width = Math.max(Math.min(width, max), 1);
- this._widthSetting.set(width);
- },
-
- /**
- * @param {number} width
- */
- setWidthAndScaleToFit: function(width)
- {
- width = Math.max(Math.min(width, WebInspector.DeviceModeModel.MaxDeviceSize), 1);
- this._scaleSetting.set(this._calculateFitScale(width, this._heightSetting.get()));
- this._widthSetting.set(width);
- },
-
- /**
- * @param {number} height
- */
- setHeight: function(height)
- {
- var max = Math.min(WebInspector.DeviceModeModel.MaxDeviceSize, this._preferredScaledHeight());
- height = Math.max(Math.min(height, max), 0);
- if (height === this._preferredScaledHeight())
- height = 0;
- this._heightSetting.set(height);
- },
-
- /**
- * @param {number} height
- */
- setHeightAndScaleToFit: function(height)
- {
- height = Math.max(Math.min(height, WebInspector.DeviceModeModel.MaxDeviceSize), 0);
- this._scaleSetting.set(this._calculateFitScale(this._widthSetting.get(), height));
- this._heightSetting.set(height);
- },
-
- /**
- * @param {number} scale
- */
- setScale: function(scale)
- {
- this._scaleSetting.set(scale);
- },
-
- /**
- * @return {?WebInspector.EmulatedDevice}
- */
- device: function()
- {
- return this._device;
- },
-
- /**
- * @return {?WebInspector.EmulatedDevice.Mode}
- */
- mode: function()
- {
- return this._mode;
- },
-
- /**
- * @return {!WebInspector.DeviceModeModel.Type}
- */
- type: function()
- {
- return this._type;
- },
-
- /**
- * @return {string}
- */
- screenImage: function()
- {
- return (this._device && this._mode) ? this._device.modeImage(this._mode) : "";
- },
-
- /**
- * @return {string}
- */
- outlineImage: function()
- {
- return (this._device && this._mode && this._deviceOutlineSetting.get()) ? this._device.outlineImage(this._mode) : "";
- },
-
- /**
- * @return {!WebInspector.Rect}
- */
- outlineRect: function()
- {
- return this._outlineRect;
- },
-
- /**
- * @return {!WebInspector.Rect}
- */
- screenRect: function()
- {
- return this._screenRect;
- },
-
- /**
- * @return {!WebInspector.Rect}
- */
- visiblePageRect: function()
- {
- return this._visiblePageRect;
- },
-
- /**
- * @return {number}
- */
- scale: function()
- {
- return this._scale;
- },
-
- /**
- * @return {number}
- */
- fitScale: function()
- {
- return this._fitScale;
- },
-
- /**
- * @return {!Size}
- */
- appliedDeviceSize: function()
- {
- return this._appliedDeviceSize;
- },
-
- /**
- * @return {number}
- */
- appliedDeviceScaleFactor: function()
- {
- return this._appliedDeviceScaleFactor;
- },
-
- /**
- * @return {!WebInspector.DeviceModeModel.UA}
- */
- appliedUserAgentType: function()
- {
- return this._appliedUserAgentType;
- },
-
- /**
- * @return {boolean}
- */
- isFullHeight: function()
- {
- return !this._heightSetting.get();
- },
-
- /**
- * @return {!WebInspector.Setting}
- */
- scaleSetting: function()
- {
- return this._scaleSetting;
- },
-
- /**
- * @return {!WebInspector.Setting}
- */
- uaSetting: function()
- {
- return this._uaSetting;
- },
-
- /**
- * @return {!WebInspector.Setting}
- */
- deviceScaleFactorSetting: function()
- {
- return this._deviceScaleFactorSetting;
- },
-
- /**
- * @return {!WebInspector.Setting}
- */
- deviceOutlineSetting: function()
- {
- return this._deviceOutlineSetting;
- },
-
- reset: function()
- {
- this._deviceScaleFactorSetting.set(0);
- this._scaleSetting.set(1);
- this.setWidth(400);
- this.setHeight(0);
- this._uaSetting.set(WebInspector.DeviceModeModel.UA.Mobile);
- },
-
- /**
- * @override
- * @param {!WebInspector.Target} target
- */
- targetAdded: function(target)
- {
- if (!this._target) {
- this._target = target;
- if (this._onTargetAvailable) {
- var callback = this._onTargetAvailable;
- this._onTargetAvailable = null;
- callback();
- }
- }
- },
-
- /**
- * @override
- * @param {!WebInspector.Target} target
- */
- targetRemoved: function(target)
- {
- if (this._target === target)
- this._target = null;
- },
-
- _scaleSettingChanged: function()
- {
- this._calculateAndEmulate(false);
- },
-
- _widthSettingChanged: function()
- {
- this._calculateAndEmulate(false);
- },
-
- _heightSettingChanged: function()
- {
- this._calculateAndEmulate(false);
- },
-
- _uaSettingChanged: function()
- {
- this._calculateAndEmulate(true);
- },
-
- _deviceScaleFactorSettingChanged: function()
- {
- this._calculateAndEmulate(false);
- },
-
- _deviceOutlineSettingChanged: function()
- {
- this._calculateAndEmulate(false);
- },
-
- /**
- * @return {number}
- */
- _preferredScaledWidth: function()
- {
- return Math.floor(this._preferredSize.width / (this._scaleSetting.get() || 1));
- },
-
- /**
- * @return {number}
- */
- _preferredScaledHeight: function()
- {
- return Math.floor(this._preferredSize.height / (this._scaleSetting.get() || 1));
- },
-
- /**
- * @return {!Insets}
- */
- _currentOutline: function()
- {
- var outline = new Insets(0, 0, 0, 0);
- if (this._type !== WebInspector.DeviceModeModel.Type.Device)
- return outline;
- var orientation = this._device.orientationByName(this._mode.orientation);
- if (this._deviceOutlineSetting.get())
- outline = orientation.outlineInsets || outline;
- return outline;
- },
-
- /**
- * @return {!Insets}
- */
- _currentInsets: function()
- {
- if (this._type !== WebInspector.DeviceModeModel.Type.Device)
- return new Insets(0, 0, 0, 0);
- return this._mode.insets;
- },
-
- /**
- * @param {boolean} resetPageScaleFactor
- */
- _calculateAndEmulate: function(resetPageScaleFactor)
- {
- if (!this._target)
- this._onTargetAvailable = this._calculateAndEmulate.bind(this, resetPageScaleFactor);
-
- if (this._type === WebInspector.DeviceModeModel.Type.Device) {
- var orientation = this._device.orientationByName(this._mode.orientation);
- var outline = this._currentOutline();
- var insets = this._currentInsets();
- this._fitScale = this._calculateFitScale(orientation.width, orientation.height, outline, insets);
- if (this._device.mobile())
- this._appliedUserAgentType = this._device.touch() ? WebInspector.DeviceModeModel.UA.Mobile : WebInspector.DeviceModeModel.UA.MobileNoTouch;
- else
- this._appliedUserAgentType = this._device.touch() ? WebInspector.DeviceModeModel.UA.DesktopTouch : WebInspector.DeviceModeModel.UA.Desktop;
- this._applyDeviceMetrics(new Size(orientation.width, orientation.height), insets, outline, this._scaleSetting.get(), this._device.deviceScaleFactor, this._device.mobile(), this._mode.orientation === WebInspector.EmulatedDevice.Horizontal ? "landscapePrimary" : "portraitPrimary", resetPageScaleFactor);
- this._applyUserAgent(this._device.userAgent);
- this._applyTouch(this._device.touch(), this._device.mobile());
- } else if (this._type === WebInspector.DeviceModeModel.Type.None) {
- this._fitScale = this._calculateFitScale(this._availableSize.width, this._availableSize.height);
- this._appliedUserAgentType = WebInspector.DeviceModeModel.UA.Desktop;
- this._applyDeviceMetrics(this._availableSize, new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), 1, 0, false, "", resetPageScaleFactor);
- this._applyUserAgent("");
- this._applyTouch(false, false);
- } else if (this._type === WebInspector.DeviceModeModel.Type.Responsive) {
- var screenWidth = this._widthSetting.get();
- if (!screenWidth || screenWidth > this._preferredScaledWidth())
- screenWidth = this._preferredScaledWidth();
- var screenHeight = this._heightSetting.get();
- if (!screenHeight || screenHeight > this._preferredScaledHeight())
- screenHeight = this._preferredScaledHeight();
- var mobile = this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile || this._uaSetting.get() === WebInspector.DeviceModeModel.UA.MobileNoTouch;
- var defaultDeviceScaleFactor = mobile ? WebInspector.DeviceModeModel.defaultMobileScaleFactor : 0;
- this._fitScale = this._calculateFitScale(this._widthSetting.get(), this._heightSetting.get());
- this._appliedUserAgentType = this._uaSetting.get();
- this._applyDeviceMetrics(new Size(screenWidth, screenHeight), new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), this._scaleSetting.get(), this._deviceScaleFactorSetting.get() || defaultDeviceScaleFactor, mobile, screenHeight >= screenWidth ? "portraitPrimary" : "landscapePrimary", resetPageScaleFactor);
- this._applyUserAgent(mobile ? WebInspector.DeviceModeModel._defaultMobileUserAgent : "");
- this._applyTouch(this._uaSetting.get() === WebInspector.DeviceModeModel.UA.DesktopTouch || this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile, this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile);
- }
- if (this._target)
- this._target.renderingAgent().setShowViewportSizeOnResize(this._type === WebInspector.DeviceModeModel.Type.None);
- this._updateCallback.call(null);
- },
-
- /**
- * @param {number} screenWidth
- * @param {number} screenHeight
- * @param {!Insets=} outline
- * @param {!Insets=} insets
- * @return {number}
- */
- _calculateFitScale: function(screenWidth, screenHeight, outline, insets)
- {
- var outlineWidth = outline ? outline.left + outline.right : 0;
- var outlineHeight = outline ? outline.top + outline.bottom : 0;
- var insetsWidth = insets ? insets.left + insets.right : 0;
- var insetsHeight = insets ? insets.top + insets.bottom : 0;
- var scale = Math.min(screenWidth ? this._preferredSize.width / (screenWidth + outlineWidth) : 1, screenHeight ? this._preferredSize.height / (screenHeight + outlineHeight) : 1);
- scale = Math.min(Math.floor(scale * 100), 100);
-
- var sharpScale = scale;
- while (sharpScale > scale * 0.7) {
- var sharp = true;
- if (screenWidth)
- sharp = sharp && Number.isInteger((screenWidth - insetsWidth) * sharpScale / 100);
- if (screenHeight)
- sharp = sharp && Number.isInteger((screenHeight - insetsHeight) * sharpScale / 100);
- if (sharp)
- return sharpScale / 100;
- sharpScale -= 1;
- }
- return scale / 100;
- },
-
- /**
- * @param {number} width
- * @param {number} height
- */
- setSizeAndScaleToFit: function(width, height)
- {
- this._scaleSetting.set(this._calculateFitScale(width, height));
- this.setWidth(width);
- },
-
- /**
- * @param {string} userAgent
- */
- _applyUserAgent: function(userAgent)
- {
- WebInspector.multitargetNetworkManager.setUserAgentOverride(userAgent);
- },
-
- /**
- * @param {!Size} screenSize
- * @param {!Insets} insets
- * @param {!Insets} outline
- * @param {number} scale
- * @param {number} deviceScaleFactor
- * @param {boolean} mobile
- * @param {string} screenOrientation
- * @param {boolean} resetPageScaleFactor
- */
- _applyDeviceMetrics: function(screenSize, insets, outline, scale, deviceScaleFactor, mobile, screenOrientation, resetPageScaleFactor)
- {
- screenSize.width = Math.max(1, Math.floor(screenSize.width));
- screenSize.height = Math.max(1, Math.floor(screenSize.height));
-
- var pageWidth = screenSize.width - insets.left - insets.right;
- var pageHeight = screenSize.height - insets.top - insets.bottom;
-
- var positionX = insets.left;
- var positionY = insets.top;
- var screenOrientationAngle = screenOrientation === "landscapePrimary" ? 90 : 0;
-
- this._appliedDeviceSize = screenSize;
- this._appliedDeviceScaleFactor = deviceScaleFactor || window.devicePixelRatio;
- this._screenRect = new WebInspector.Rect(
- Math.max(0, (this._availableSize.width - screenSize.width * scale) / 2),
- outline.top * scale,
- screenSize.width * scale,
- screenSize.height * scale);
- this._outlineRect = new WebInspector.Rect(
- this._screenRect.left - outline.left * scale,
- 0,
- (outline.left + screenSize.width + outline.right) * scale,
- (outline.top + screenSize.height + outline.bottom) * scale);
- this._visiblePageRect = new WebInspector.Rect(
- positionX * scale,
- positionY * scale,
- Math.min(pageWidth * scale, this._availableSize.width - this._screenRect.left - positionX * scale),
- Math.min(pageHeight * scale, this._availableSize.height - this._screenRect.top - positionY * scale));
- this._scale = scale;
-
- if (scale === 1 && this._availableSize.width >= screenSize.width && this._availableSize.height >= screenSize.height) {
- // When we have enough space, no page size override is required. This will speed things up and remove lag.
- pageWidth = 0;
- pageHeight = 0;
- }
- if (this._visiblePageRect.width === pageWidth * scale && this._visiblePageRect.height === pageHeight * scale && Number.isInteger(pageWidth * scale) && Number.isInteger(pageHeight * scale)) {
- // When we only have to apply scale, do not resize the page. This will speed things up and remove lag.
- pageWidth = 0;
- pageHeight = 0;
- }
-
- this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this));
-
- /**
- * @this {WebInspector.DeviceModeModel}
- * @return {!Promise.<?>}
- */
- function setDeviceMetricsOverride()
- {
- if (!this._target)
- return Promise.resolve();
-
- var clear = !pageWidth && !pageHeight && !mobile && !deviceScaleFactor && scale === 1 && !screenOrientation;
- var allPromises = [];
- if (resetPageScaleFactor)
- allPromises.push(this._target.emulationAgent().resetPageScaleFactor());
- var setDevicePromise;
- if (clear) {
- setDevicePromise = this._target.emulationAgent().clearDeviceMetricsOverride(this._deviceMetricsOverrideAppliedForTest.bind(this));
- } else {
- var params = {width: pageWidth, height: pageHeight, deviceScaleFactor: deviceScaleFactor, mobile: mobile, fitWindow: false, scale: scale, screenWidth: screenSize.width, screenHeight: screenSize.height, positionX: positionX, positionY: positionY};
- if (screenOrientation)
- params.screenOrientation = {type: screenOrientation, angle: screenOrientationAngle};
- setDevicePromise = this._target.emulationAgent().invoke_setDeviceMetricsOverride(params, this._deviceMetricsOverrideAppliedForTest.bind(this));
- }
- allPromises.push(setDevicePromise);
- return Promise.all(allPromises);
- }
- },
-
- _deviceMetricsOverrideAppliedForTest: function()
- {
- // Used for sniffing in tests.
- },
-
- /**
- * @param {boolean} touchEnabled
- * @param {boolean} mobile
- */
- _applyTouch: function(touchEnabled, mobile)
- {
- WebInspector.MultitargetTouchModel.instance().setTouchEnabled(touchEnabled, mobile);
- }
-};

Powered by Google App Engine
This is Rietveld 408576698