Files
react-native-devtools-frontend/front_end/emulation/DeviceModeWrapper.js
T
Tim van der Lippe 99e59b8c29 Migrate Runtime.js to ESM
Introduce a new namespace "Root" to be able to disambiguate between
Runtime the namespace and Runtime the object.

roll CodeMirror
The above line is necessary to fix the presubmit, which complains
about CodeMirror changes. This is only updating a type reference.

Bug: 1006759
Change-Id: I04941d9f18649701060e3035f7eeb2ef3abb51e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1829708
Reviewed-by: Yang Guo <yangguo@chromium.org>
Commit-Queue: Tim Van der Lippe <tvanderlippe@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#701257}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 17cc008cf6ad28c6e8c07c638a1b380ca30e7f79
2019-09-30 20:00:59 +00:00

151 lines
5.1 KiB
JavaScript

// Copyright 2016 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.
/**
* @unrestricted
*/
Emulation.DeviceModeWrapper = class extends UI.VBox {
/**
* @param {!Emulation.InspectedPagePlaceholder} inspectedPagePlaceholder
*/
constructor(inspectedPagePlaceholder) {
super();
Emulation.DeviceModeView._wrapperInstance = this;
this._inspectedPagePlaceholder = inspectedPagePlaceholder;
/** @type {?Emulation.DeviceModeView} */
this._deviceModeView = null;
this._toggleDeviceModeAction = UI.actionRegistry.action('emulation.toggle-device-mode');
const model = self.singleton(Emulation.DeviceModeModel);
this._showDeviceModeSetting = model.enabledSetting();
this._showDeviceModeSetting.setRequiresUserAction(!!Root.Runtime.queryParam('hasOtherClients'));
this._showDeviceModeSetting.addChangeListener(this._update.bind(this, false));
SDK.targetManager.addModelListener(
SDK.OverlayModel, SDK.OverlayModel.Events.ScreenshotRequested, this._screenshotRequestedFromOverlay, this);
this._update(true);
}
_toggleDeviceMode() {
this._showDeviceModeSetting.set(!this._showDeviceModeSetting.get());
}
/**
* @param {boolean=} fullSize
* @param {!Protocol.Page.Viewport=} clip
* @return {boolean}
*/
_captureScreenshot(fullSize, clip) {
if (!this._deviceModeView) {
this._deviceModeView = new Emulation.DeviceModeView();
}
this._deviceModeView.setNonEmulatedAvailableSize(this._inspectedPagePlaceholder.element);
if (fullSize) {
this._deviceModeView.captureFullSizeScreenshot();
} else if (clip) {
this._deviceModeView.captureAreaScreenshot(clip);
} else {
this._deviceModeView.captureScreenshot();
}
return true;
}
/**
* @param {!Common.Event} event
*/
_screenshotRequestedFromOverlay(event) {
const clip = /** @type {!Protocol.Page.Viewport} */ (event.data);
this._captureScreenshot(false, clip);
}
/**
* @param {boolean} force
*/
_update(force) {
this._toggleDeviceModeAction.setToggled(this._showDeviceModeSetting.get());
if (!force) {
const showing = this._deviceModeView && this._deviceModeView.isShowing();
if (this._showDeviceModeSetting.get() === showing) {
return;
}
}
if (this._showDeviceModeSetting.get()) {
if (!this._deviceModeView) {
this._deviceModeView = new Emulation.DeviceModeView();
}
this._deviceModeView.show(this.element);
this._inspectedPagePlaceholder.clearMinimumSize();
this._inspectedPagePlaceholder.show(this._deviceModeView.element);
} else {
if (this._deviceModeView) {
this._deviceModeView.detach();
}
this._inspectedPagePlaceholder.restoreMinimumSize();
this._inspectedPagePlaceholder.show(this.element);
}
}
};
/** @type {!Emulation.DeviceModeWrapper} */
Emulation.DeviceModeView._wrapperInstance;
/**
* @implements {UI.ActionDelegate}
* @unrestricted
*/
Emulation.DeviceModeWrapper.ActionDelegate = class {
/**
* @override
* @param {!UI.Context} context
* @param {string} actionId
* @return {boolean}
*/
handleAction(context, actionId) {
if (Emulation.DeviceModeView._wrapperInstance) {
switch (actionId) {
case 'emulation.capture-screenshot':
return Emulation.DeviceModeView._wrapperInstance._captureScreenshot();
case 'emulation.capture-node-screenshot': {
const node = UI.context.flavor(SDK.DOMNode);
if (!node) {
return true;
}
async function captureClip() {
const object = await node.resolveToObject();
const result = await object.callFunction(function() {
const rect = this.getBoundingClientRect();
const docRect = this.ownerDocument.documentElement.getBoundingClientRect();
return JSON.stringify({
x: rect.left - docRect.left,
y: rect.top - docRect.top,
width: rect.width,
height: rect.height,
scale: 1
});
});
const clip =
/** @type {!Protocol.Page.Viewport} */ (JSON.parse(/** @type {string} */ (result.object.value)));
const response = await node.domModel().target().pageAgent().invoke_getLayoutMetrics({});
const page_zoom = !response[Protocol.Error] && response.visualViewport.zoom || 1;
clip.x *= page_zoom;
clip.y *= page_zoom;
clip.width *= page_zoom;
clip.height *= page_zoom;
Emulation.DeviceModeView._wrapperInstance._captureScreenshot(false, clip);
}
captureClip();
return true;
}
case 'emulation.capture-full-height-screenshot':
return Emulation.DeviceModeView._wrapperInstance._captureScreenshot(true);
case 'emulation.toggle-device-mode':
Emulation.DeviceModeView._wrapperInstance._toggleDeviceMode();
return true;
}
}
return false;
}
};