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

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

Issue 2612913002: DevTools: Add feature to capture full-height screenshots (Closed)
Patch Set: Created 3 years, 11 months 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/DeviceModeView.js
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
index ce6aef2fe18dd3a2b95a5b1b6cb15d2951cdaedd..d01082661d9ac076cbdf0cc8a8f1500ea7b52090 100644
--- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
@@ -470,6 +470,71 @@ Emulation.DeviceModeView = class extends UI.VBox {
}
}
}
+
+ captureFullHeightScreenshot() {
+ var mainTarget = SDK.targetManager.mainTarget();
+ if (!mainTarget)
+ return;
+ SDK.DOMModel.muteHighlight();
+ var visiblePageRect = this._model.visiblePageRect();
+ var pageWidth = Math.floor(visiblePageRect.width);
dgozman 2017/01/11 01:19:25 visiblePageRect is cropped by available space. Thi
ahmetemirercin 2017/01/11 19:25:18 After updating 'setVisibleSize' to handle width&he
+
+ var executionContext = UI.context.flavor(SDK.ExecutionContext);
dgozman 2017/01/11 01:19:25 Should instead use mainTarget.runtimeModel.default
ahmetemirercin 2017/01/11 19:25:17 Done.
+ executionContext.evaluate(
+ 'document.scrollingElement.scrollHeight', '', false, true, true, false, false, evaluated.bind(this));
+
+ function evaluated(result) {
dgozman 2017/01/11 01:19:25 Annotate with JSDoc please.
ahmetemirercin 2017/01/11 19:25:17 Done.
+ var scrollHeight = result.value;
+ mainTarget.pageAgent().getLayoutMetrics((err, layoutViewport, visualViewport) => {
dgozman 2017/01/11 01:19:24 Actually, we can expose content size through getLa
dgozman 2017/01/11 01:19:25 Let's put this method (which calls into agent) int
ahmetemirercin 2017/01/11 19:25:18 Checked that exception about responsive mode and f
+ var promises = [];
+ var scaledScrollHeight = Math.floor(scrollHeight * visualViewport.scale * this._model.scale());
+ promises.push(mainTarget.emulationAgent().forceViewport(0, 0, visualViewport.scale));
+ promises.push(mainTarget.emulationAgent().setDeviceMetricsOverride(
+ 0, 0, 0, this._model._device.mobile(), false, this._model.scale()));
dgozman 2017/01/11 01:19:25 We should use current device scale factor applied
ahmetemirercin 2017/01/11 19:25:18 Done.
+ promises.push(mainTarget.emulationAgent().setVisibleSize(pageWidth, scaledScrollHeight));
+ Promise.all(promises).then(() => {
+ mainTarget.pageAgent().captureScreenshot(screenshotCaptured.bind(this));
+ })
+ })
+ }
+
+ /**
+ * @param {?Protocol.Error} error
+ * @param {string} content
+ * @this {Emulation.DeviceModeView}
+ */
+ function screenshotCaptured(error, content) {
+ mainTarget.emulationAgent().resetViewport();
+ mainTarget.emulationAgent().setVisibleSize(Math.floor(visiblePageRect.width), Math.floor(visiblePageRect.height));
dgozman 2017/01/11 01:19:25 We should instead pass (0, 0) and add support on b
ahmetemirercin 2017/01/11 19:25:18 I think we can reset visible size from DeviceModeM
+ SDK.DOMModel.unmuteHighlight();
+ UI.inspectorView.restore();
dgozman 2017/01/11 01:19:25 Don't need this.
ahmetemirercin 2017/01/11 19:25:18 Done.
+ if (error) {
+ console.error(error);
+ return;
+ }
+
+ var canvas = createElement('canvas');
+ var pageImage = new Image();
+ pageImage.src = 'data:image/png;base64,' + content;
+ pageImage.onload = () => {
+ var ctx = canvas.getContext('2d');
+ ctx.imageSmoothingEnabled = false;
+ canvas.width = pageImage.width;
+ canvas.height = pageImage.height;
+ ctx.drawImage(pageImage, 0, 0, pageImage.width, pageImage.height);
+ var url = mainTarget && mainTarget.inspectedURL();
+ var fileName = url ? url.trimURL().removeURLFragment() : '';
+ if (this._model.type() === Emulation.DeviceModeModel.Type.Device)
+ fileName += Common.UIString('(%s)', this._model.device().title);
+ var link = createElement('a');
+ link.download = fileName + '.png';
+ canvas.toBlob(function(blob) {
+ link.href = URL.createObjectURL(blob);
dgozman 2017/01/11 01:19:25 Instead of drawing to canvas, can we just do the f
ahmetemirercin 2017/01/11 19:25:18 I tried this and because of data url size limits (
dgozman 2017/01/12 21:49:35 Oh, I see. That's unfortunate... Thanks for explan
+ link.click();
+ });
+ }
+ }
+ }
};
/**

Powered by Google App Engine
This is Rietveld 408576698