Chromium Code Reviews| 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(); |
| + }); |
| + } |
| + } |
| + } |
| }; |
| /** |