| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 /** | 4 /** |
| 5 * @implements {SDK.TargetManager.Observer} | 5 * @implements {SDK.SDKModelObserver<!SDK.EmulationModel>} |
| 6 * @unrestricted | 6 * @unrestricted |
| 7 */ | 7 */ |
| 8 Emulation.DeviceModeModel = class { | 8 Emulation.DeviceModeModel = class { |
| 9 /** | 9 /** |
| 10 * @param {function()} updateCallback | 10 * @param {function()} updateCallback |
| 11 */ | 11 */ |
| 12 constructor(updateCallback) { | 12 constructor(updateCallback) { |
| 13 this._updateCallback = updateCallback; | 13 this._updateCallback = updateCallback; |
| 14 this._screenRect = new UI.Rect(0, 0, 1, 1); | 14 this._screenRect = new UI.Rect(0, 0, 1, 1); |
| 15 this._visiblePageRect = new UI.Rect(0, 0, 1, 1); | 15 this._visiblePageRect = new UI.Rect(0, 0, 1, 1); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 | 51 |
| 52 /** @type {!Emulation.DeviceModeModel.Type} */ | 52 /** @type {!Emulation.DeviceModeModel.Type} */ |
| 53 this._type = Emulation.DeviceModeModel.Type.None; | 53 this._type = Emulation.DeviceModeModel.Type.None; |
| 54 /** @type {?Emulation.EmulatedDevice} */ | 54 /** @type {?Emulation.EmulatedDevice} */ |
| 55 this._device = null; | 55 this._device = null; |
| 56 /** @type {?Emulation.EmulatedDevice.Mode} */ | 56 /** @type {?Emulation.EmulatedDevice.Mode} */ |
| 57 this._mode = null; | 57 this._mode = null; |
| 58 /** @type {number} */ | 58 /** @type {number} */ |
| 59 this._fitScale = 1; | 59 this._fitScale = 1; |
| 60 | 60 |
| 61 /** @type {?SDK.Target} */ | 61 /** @type {?SDK.EmulationModel} */ |
| 62 this._target = null; | 62 this._emulationModel = null; |
| 63 /** @type {?function()} */ | 63 /** @type {?function()} */ |
| 64 this._onTargetAvailable = null; | 64 this._onModelAvailable = null; |
| 65 SDK.targetManager.observeTargets(this, SDK.Target.Capability.Browser); | 65 SDK.targetManager.observeModels(SDK.EmulationModel, this); |
| 66 } | 66 } |
| 67 | 67 |
| 68 /** | 68 /** |
| 69 * @param {string} value | 69 * @param {string} value |
| 70 * @return {boolean} | 70 * @return {boolean} |
| 71 */ | 71 */ |
| 72 static deviceSizeValidator(value) { | 72 static deviceSizeValidator(value) { |
| 73 if (/^[\d]+$/.test(value) && value >= Emulation.DeviceModeModel.MinDeviceSiz
e && | 73 if (/^[\d]+$/.test(value) && value >= Emulation.DeviceModeModel.MinDeviceSiz
e && |
| 74 value <= Emulation.DeviceModeModel.MaxDeviceSize) | 74 value <= Emulation.DeviceModeModel.MaxDeviceSize) |
| 75 return true; | 75 return true; |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 reset() { | 319 reset() { |
| 320 this._deviceScaleFactorSetting.set(0); | 320 this._deviceScaleFactorSetting.set(0); |
| 321 this._scaleSetting.set(1); | 321 this._scaleSetting.set(1); |
| 322 this.setWidth(400); | 322 this.setWidth(400); |
| 323 this.setHeight(0); | 323 this.setHeight(0); |
| 324 this._uaSetting.set(Emulation.DeviceModeModel.UA.Mobile); | 324 this._uaSetting.set(Emulation.DeviceModeModel.UA.Mobile); |
| 325 } | 325 } |
| 326 | 326 |
| 327 /** | 327 /** |
| 328 * @override | 328 * @override |
| 329 * @param {!SDK.Target} target | 329 * @param {!SDK.EmulationModel} emulationModel |
| 330 */ | 330 */ |
| 331 targetAdded(target) { | 331 modelAdded(emulationModel) { |
| 332 if (!this._target) { | 332 if (!this._emulationModel && emulationModel.supportsDeviceEmulation()) { |
| 333 this._target = target; | 333 this._emulationModel = emulationModel; |
| 334 if (this._onTargetAvailable) { | 334 if (this._onModelAvailable) { |
| 335 var callback = this._onTargetAvailable; | 335 var callback = this._onModelAvailable; |
| 336 this._onTargetAvailable = null; | 336 this._onModelAvailable = null; |
| 337 callback(); | 337 callback(); |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 } | 340 } |
| 341 | 341 |
| 342 /** | 342 /** |
| 343 * @override | 343 * @override |
| 344 * @param {!SDK.Target} target | 344 * @param {!SDK.EmulationModel} emulationModel |
| 345 */ | 345 */ |
| 346 targetRemoved(target) { | 346 modelRemoved(emulationModel) { |
| 347 if (this._target === target) | 347 if (this._emulationModel === emulationModel) |
| 348 this._target = null; | 348 this._emulationModel = null; |
| 349 } | 349 } |
| 350 | 350 |
| 351 /** | 351 /** |
| 352 * @return {?SDK.Target} | 352 * @return {?string} |
| 353 */ | 353 */ |
| 354 target() { | 354 inspectedURL() { |
| 355 return this._target; | 355 return this._emulationModel ? this._emulationModel.target().inspectedURL() :
null; |
| 356 } | 356 } |
| 357 | 357 |
| 358 _scaleSettingChanged() { | 358 _scaleSettingChanged() { |
| 359 this._calculateAndEmulate(false); | 359 this._calculateAndEmulate(false); |
| 360 } | 360 } |
| 361 | 361 |
| 362 _widthSettingChanged() { | 362 _widthSettingChanged() { |
| 363 this._calculateAndEmulate(false); | 363 this._calculateAndEmulate(false); |
| 364 } | 364 } |
| 365 | 365 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 _currentInsets() { | 412 _currentInsets() { |
| 413 if (this._type !== Emulation.DeviceModeModel.Type.Device) | 413 if (this._type !== Emulation.DeviceModeModel.Type.Device) |
| 414 return new UI.Insets(0, 0, 0, 0); | 414 return new UI.Insets(0, 0, 0, 0); |
| 415 return this._mode.insets; | 415 return this._mode.insets; |
| 416 } | 416 } |
| 417 | 417 |
| 418 /** | 418 /** |
| 419 * @param {boolean} resetPageScaleFactor | 419 * @param {boolean} resetPageScaleFactor |
| 420 */ | 420 */ |
| 421 _calculateAndEmulate(resetPageScaleFactor) { | 421 _calculateAndEmulate(resetPageScaleFactor) { |
| 422 if (!this._target) | 422 if (!this._emulationModel) |
| 423 this._onTargetAvailable = this._calculateAndEmulate.bind(this, resetPageSc
aleFactor); | 423 this._onModelAvailable = this._calculateAndEmulate.bind(this, resetPageSca
leFactor); |
| 424 var mobile = this._isMobile(); | 424 var mobile = this._isMobile(); |
| 425 if (this._type === Emulation.DeviceModeModel.Type.Device) { | 425 if (this._type === Emulation.DeviceModeModel.Type.Device) { |
| 426 var orientation = this._device.orientationByName(this._mode.orientation); | 426 var orientation = this._device.orientationByName(this._mode.orientation); |
| 427 var outline = this._currentOutline(); | 427 var outline = this._currentOutline(); |
| 428 var insets = this._currentInsets(); | 428 var insets = this._currentInsets(); |
| 429 this._fitScale = this._calculateFitScale(orientation.width, orientation.he
ight, outline, insets); | 429 this._fitScale = this._calculateFitScale(orientation.width, orientation.he
ight, outline, insets); |
| 430 if (mobile) { | 430 if (mobile) { |
| 431 this._appliedUserAgentType = | 431 this._appliedUserAgentType = |
| 432 this._device.touch() ? Emulation.DeviceModeModel.UA.Mobile : Emulati
on.DeviceModeModel.UA.MobileNoTouch; | 432 this._device.touch() ? Emulation.DeviceModeModel.UA.Mobile : Emulati
on.DeviceModeModel.UA.MobileNoTouch; |
| 433 } else { | 433 } else { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 this._scaleSetting.get(), this._deviceScaleFactorSetting.get() || defa
ultDeviceScaleFactor, mobile, | 465 this._scaleSetting.get(), this._deviceScaleFactorSetting.get() || defa
ultDeviceScaleFactor, mobile, |
| 466 screenHeight >= screenWidth ? Protocol.Emulation.ScreenOrientationType
.PortraitPrimary : | 466 screenHeight >= screenWidth ? Protocol.Emulation.ScreenOrientationType
.PortraitPrimary : |
| 467 Protocol.Emulation.ScreenOrientationType
.LandscapePrimary, | 467 Protocol.Emulation.ScreenOrientationType
.LandscapePrimary, |
| 468 resetPageScaleFactor); | 468 resetPageScaleFactor); |
| 469 this._applyUserAgent(mobile ? Emulation.DeviceModeModel._defaultMobileUser
Agent : ''); | 469 this._applyUserAgent(mobile ? Emulation.DeviceModeModel._defaultMobileUser
Agent : ''); |
| 470 this._applyTouch( | 470 this._applyTouch( |
| 471 this._uaSetting.get() === Emulation.DeviceModeModel.UA.DesktopTouch || | 471 this._uaSetting.get() === Emulation.DeviceModeModel.UA.DesktopTouch || |
| 472 this._uaSetting.get() === Emulation.DeviceModeModel.UA.Mobile, | 472 this._uaSetting.get() === Emulation.DeviceModeModel.UA.Mobile, |
| 473 this._uaSetting.get() === Emulation.DeviceModeModel.UA.Mobile); | 473 this._uaSetting.get() === Emulation.DeviceModeModel.UA.Mobile); |
| 474 } | 474 } |
| 475 var overlayModel = this._target ? this._target.model(SDK.OverlayModel) : nul
l; | 475 var overlayModel = this._emulationModel ? this._emulationModel.overlayModel(
) : null; |
| 476 if (overlayModel) | 476 if (overlayModel) |
| 477 overlayModel.setShowViewportSizeOnResize(this._type === Emulation.DeviceMo
deModel.Type.None); | 477 overlayModel.setShowViewportSizeOnResize(this._type === Emulation.DeviceMo
deModel.Type.None); |
| 478 this._updateCallback.call(null); | 478 this._updateCallback.call(null); |
| 479 } | 479 } |
| 480 | 480 |
| 481 /** | 481 /** |
| 482 * @param {number} screenWidth | 482 * @param {number} screenWidth |
| 483 * @param {number} screenHeight | 483 * @param {number} screenHeight |
| 484 * @param {!UI.Insets=} outline | 484 * @param {!UI.Insets=} outline |
| 485 * @param {!UI.Insets=} insets | 485 * @param {!UI.Insets=} insets |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 pageHeight = 0; | 583 pageHeight = 0; |
| 584 } | 584 } |
| 585 | 585 |
| 586 this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this)); | 586 this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this)); |
| 587 | 587 |
| 588 /** | 588 /** |
| 589 * @this {Emulation.DeviceModeModel} | 589 * @this {Emulation.DeviceModeModel} |
| 590 * @return {!Promise.<?>} | 590 * @return {!Promise.<?>} |
| 591 */ | 591 */ |
| 592 function setDeviceMetricsOverride() { | 592 function setDeviceMetricsOverride() { |
| 593 if (!this._target) | 593 if (!this._emulationModel) |
| 594 return Promise.resolve(); | 594 return Promise.resolve(); |
| 595 | 595 |
| 596 var clear = !pageWidth && !pageHeight && !mobile && !deviceScaleFactor &&
scale === 1 && !screenOrientation; | 596 var clear = !pageWidth && !pageHeight && !mobile && !deviceScaleFactor &&
scale === 1 && !screenOrientation; |
| 597 var allPromises = []; | 597 var allPromises = []; |
| 598 if (resetPageScaleFactor) | 598 if (resetPageScaleFactor) |
| 599 allPromises.push(this._target.emulationAgent().resetPageScaleFactor()); | 599 allPromises.push(this._emulationModel.resetPageScaleFactor()); |
| 600 var setDevicePromise; | 600 var metrics = null; |
| 601 if (clear) { | 601 if (!clear) { |
| 602 setDevicePromise = this._target.emulationAgent().clearDeviceMetricsOverr
ide(); | 602 metrics = { |
| 603 } else { | |
| 604 var params = { | |
| 605 width: pageWidth, | 603 width: pageWidth, |
| 606 height: pageHeight, | 604 height: pageHeight, |
| 607 deviceScaleFactor: deviceScaleFactor, | 605 deviceScaleFactor: deviceScaleFactor, |
| 608 mobile: mobile, | 606 mobile: mobile, |
| 609 fitWindow: false, | 607 fitWindow: false, |
| 610 scale: scale, | 608 scale: scale, |
| 611 screenWidth: screenSize.width, | 609 screenWidth: screenSize.width, |
| 612 screenHeight: screenSize.height, | 610 screenHeight: screenSize.height, |
| 613 positionX: positionX, | 611 positionX: positionX, |
| 614 positionY: positionY | 612 positionY: positionY |
| 615 }; | 613 }; |
| 616 if (screenOrientation) | 614 if (screenOrientation) |
| 617 params.screenOrientation = {type: screenOrientation, angle: screenOrie
ntationAngle}; | 615 metrics.screenOrientation = {type: screenOrientation, angle: screenOri
entationAngle}; |
| 618 setDevicePromise = this._target.emulationAgent().invoke_setDeviceMetrics
Override(params); | |
| 619 } | 616 } |
| 620 allPromises.push(setDevicePromise); | 617 allPromises.push(this._emulationModel.emulateDevice(metrics)); |
| 621 return Promise.all(allPromises); | 618 return Promise.all(allPromises); |
| 622 } | 619 } |
| 623 } | 620 } |
| 624 | 621 |
| 625 /** | 622 /** |
| 626 * @param {boolean} fullSize | 623 * @param {boolean} fullSize |
| 627 * @return {!Promise<?string>} | 624 * @return {!Promise<?string>} |
| 628 */ | 625 */ |
| 629 async captureScreenshot(fullSize) { | 626 async captureScreenshot(fullSize) { |
| 630 var screenCaptureModel = this._target ? this._target.model(SDK.ScreenCapture
Model) : null; | 627 var screenCaptureModel = this._emulationModel ? this._emulationModel.target(
).model(SDK.ScreenCaptureModel) : null; |
| 631 if (!screenCaptureModel) | 628 if (!screenCaptureModel) |
| 632 return null; | 629 return null; |
| 633 | 630 |
| 634 var metrics = await screenCaptureModel.fetchLayoutMetrics(); | 631 var metrics = await screenCaptureModel.fetchLayoutMetrics(); |
| 635 if (!metrics) | 632 if (!metrics) |
| 636 return null; | 633 return null; |
| 637 | 634 |
| 638 if (!this._emulatedPageSize) | 635 if (!this._emulatedPageSize) |
| 639 this._calculateAndEmulate(false); | 636 this._calculateAndEmulate(false); |
| 640 var overlayModel = this._target ? this._target.model(SDK.OverlayModel) : nul
l; | 637 var overlayModel = this._emulationModel ? this._emulationModel.overlayModel(
) : null; |
| 641 if (overlayModel) | 638 if (overlayModel) |
| 642 overlayModel.setShowViewportSizeOnResize(false); | 639 overlayModel.setShowViewportSizeOnResize(false); |
| 643 | 640 |
| 644 var pageSize = fullSize ? new UI.Size(metrics.contentWidth, metrics.contentH
eight) : this._emulatedPageSize; | 641 var pageSize = fullSize ? new UI.Size(metrics.contentWidth, metrics.contentH
eight) : this._emulatedPageSize; |
| 645 var promises = []; | 642 var promises = []; |
| 646 promises.push( | 643 promises.push(this._emulationModel.setVisibleSize(Math.floor(pageSize.width)
, Math.floor(pageSize.height))); |
| 647 this._target.emulationAgent().setVisibleSize(Math.floor(pageSize.width),
Math.floor(pageSize.height))); | |
| 648 if (fullSize) { | 644 if (fullSize) { |
| 649 promises.push(this._target.emulationAgent().forceViewport(0, 0, 1)); | 645 promises.push(this._emulationModel.forceViewport({x: 0, y: 0, scale: 1})); |
| 650 } else { | 646 } else { |
| 651 promises.push(this._target.emulationAgent().forceViewport( | 647 promises.push(this._emulationModel.forceViewport( |
| 652 Math.floor(metrics.viewportX), Math.floor(metrics.viewportY), metrics.
viewportScale)); | 648 {x: Math.floor(metrics.viewportX), y: Math.floor(metrics.viewportY), s
cale: metrics.viewportScale})); |
| 653 } | 649 } |
| 654 promises.push(this._target.emulationAgent().invoke_setDeviceMetricsOverride(
{ | 650 promises.push(this._emulationModel.emulateDevice({ |
| 655 width: 0, | 651 width: 0, |
| 656 height: 0, | 652 height: 0, |
| 657 deviceScaleFactor: this._appliedDeviceScaleFactor, | 653 deviceScaleFactor: this._appliedDeviceScaleFactor, |
| 658 mobile: this._isMobile(), | 654 mobile: this._isMobile(), |
| 659 fitWindow: false, | 655 fitWindow: false, |
| 660 scale: 1, | 656 scale: 1, |
| 661 })); | 657 })); |
| 662 await Promise.all(promises); | 658 await Promise.all(promises); |
| 663 | 659 |
| 664 var screenshot = await screenCaptureModel.captureScreenshot('png', 100); | 660 var screenshot = await screenCaptureModel.captureScreenshot('png', 100); |
| 665 this._target.emulationAgent().setVisibleSize( | 661 this._emulationModel.setVisibleSize( |
| 666 Math.floor(this._emulatedPageSize.width * this._scale), | 662 Math.floor(this._emulatedPageSize.width * this._scale), |
| 667 Math.floor(this._emulatedPageSize.height * this._scale)); | 663 Math.floor(this._emulatedPageSize.height * this._scale)); |
| 668 this._target.emulationAgent().resetViewport(); | 664 this._emulationModel.forceViewport(null); |
| 669 this._calculateAndEmulate(false); | 665 this._calculateAndEmulate(false); |
| 670 return screenshot; | 666 return screenshot; |
| 671 } | 667 } |
| 672 | 668 |
| 673 /** | 669 /** |
| 674 * @param {boolean} touchEnabled | 670 * @param {boolean} touchEnabled |
| 675 * @param {boolean} mobile | 671 * @param {boolean} mobile |
| 676 */ | 672 */ |
| 677 _applyTouch(touchEnabled, mobile) { | 673 _applyTouch(touchEnabled, mobile) { |
| 678 for (var emulationModel of SDK.targetManager.models(SDK.EmulationModel)) | 674 for (var emulationModel of SDK.targetManager.models(SDK.EmulationModel)) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 697 | 693 |
| 698 Emulation.DeviceModeModel.MinDeviceSize = 50; | 694 Emulation.DeviceModeModel.MinDeviceSize = 50; |
| 699 Emulation.DeviceModeModel.MaxDeviceSize = 9999; | 695 Emulation.DeviceModeModel.MaxDeviceSize = 9999; |
| 700 | 696 |
| 701 | 697 |
| 702 Emulation.DeviceModeModel._defaultMobileUserAgent = | 698 Emulation.DeviceModeModel._defaultMobileUserAgent = |
| 703 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/%s Mobile Safari/537.36'; | 699 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/%s Mobile Safari/537.36'; |
| 704 Emulation.DeviceModeModel._defaultMobileUserAgent = | 700 Emulation.DeviceModeModel._defaultMobileUserAgent = |
| 705 SDK.MultitargetNetworkManager.patchUserAgentWithChromeVersion(Emulation.Devi
ceModeModel._defaultMobileUserAgent); | 701 SDK.MultitargetNetworkManager.patchUserAgentWithChromeVersion(Emulation.Devi
ceModeModel._defaultMobileUserAgent); |
| 706 Emulation.DeviceModeModel.defaultMobileScaleFactor = 2; | 702 Emulation.DeviceModeModel.defaultMobileScaleFactor = 2; |
| OLD | NEW |