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

Side by Side Diff: Source/devtools/front_end/ScreencastView.js

Issue 347143002: DevTools: Screencast view scaling (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Cleanup Created 6 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 }, 116 },
117 117
118 _startCasting: function() 118 _startCasting: function()
119 { 119 {
120 if (this._timelineActive || this._profilerActive) 120 if (this._timelineActive || this._profilerActive)
121 return; 121 return;
122 if (this._isCasting) 122 if (this._isCasting)
123 return; 123 return;
124 this._isCasting = true; 124 this._isCasting = true;
125 125
126 const maxImageDimension = 1024; 126 const maxImageDimension = 2048;
127 var dimensions = this._viewportDimensions(); 127 var dimensions = this._viewportDimensions();
128 if (dimensions.width < 0 || dimensions.height < 0) { 128 if (dimensions.width < 0 || dimensions.height < 0) {
129 this._isCasting = false; 129 this._isCasting = false;
130 return; 130 return;
131 } 131 }
132 dimensions.width *= WebInspector.zoomManager.zoomFactor(); 132 dimensions.width *= WebInspector.zoomManager.zoomFactor() * window.devic ePixelRatio;
dgozman 2014/06/25 13:31:35 window.devicePixelRatio already includes zoom fact
vkuzkokov 2014/06/25 17:56:58 Done.
133 dimensions.height *= WebInspector.zoomManager.zoomFactor(); 133 dimensions.height *= WebInspector.zoomManager.zoomFactor() * window.devi cePixelRatio;
134 this._target.pageAgent().startScreencast("jpeg", 80, Math.min(maxImageDi mension, dimensions.width), Math.min(maxImageDimension, dimensions.height)); 134 this._target.pageAgent().startScreencast("jpeg", 80, Math.min(maxImageDi mension, dimensions.width), Math.min(maxImageDimension, dimensions.height));
135 this._target.domModel.setHighlighter(this); 135 this._target.domModel.setHighlighter(this);
136 }, 136 },
137 137
138 _stopCasting: function() 138 _stopCasting: function()
139 { 139 {
140 if (!this._isCasting) 140 if (!this._isCasting)
141 return; 141 return;
142 this._isCasting = false; 142 this._isCasting = false;
143 this._target.pageAgent().stopScreencast(); 143 this._target.pageAgent().stopScreencast();
144 this._target.domModel.setHighlighter(null); 144 this._target.domModel.setHighlighter(null);
145 }, 145 },
146 146
147 /** 147 /**
148 * @param {!WebInspector.Event} event 148 * @param {!WebInspector.Event} event
149 */ 149 */
150 _screencastFrame: function(event) 150 _screencastFrame: function(event)
151 { 151 {
152 var metadata = /** type {PageAgent.ScreencastFrameMetadata} */(event.dat a.metadata); 152 var metadata = /** type {PageAgent.ScreencastFrameMetadata} */(event.dat a.metadata);
153
154 if (!metadata.deviceScaleFactor) {
155 console.log(event.data.data);
156 return;
157 }
158
159 var base64Data = /** type {string} */(event.data.data); 153 var base64Data = /** type {string} */(event.data.data);
160 this._imageElement.src = "data:image/jpg;base64," + base64Data; 154 this._imageElement.src = "data:image/jpg;base64," + base64Data;
161 this._deviceScaleFactor = metadata.deviceScaleFactor; 155 this._deviceScaleFactor = metadata.deviceScaleFactor;
162 this._pageScaleFactor = metadata.pageScaleFactor; 156 this._pageScaleFactor = metadata.pageScaleFactor;
163 this._viewport = metadata.viewport; 157 this._viewport = metadata.viewport
164 if (!this._viewport) 158 if (!this._viewport)
165 return; 159 return;
166 var offsetTop = metadata.offsetTop || 0; 160 var offsetTopDIP = metadata.offsetTop || 0;
167 var offsetBottom = metadata.offsetBottom || 0; 161 var offsetBottomDIP = metadata.offsetBottom || 0;
162 this._screenOffsetTop = offsetTopDIP;
168 163
169 var screenWidthDIP = this._viewport.width * this._pageScaleFactor; 164 var totalBarHeightDIP = offsetTopDIP + offsetBottomDIP;
170 var screenHeightDIP = this._viewport.height * this._pageScaleFactor + of fsetTop + offsetBottom; 165 var deviceWidthDIP = metadata.device.width
dgozman 2014/06/25 13:31:34 not: semicolon
171 this._screenOffsetTop = offsetTop; 166 var deviceHeightDIP = metadata.device.height
dgozman 2014/06/25 13:31:35 ditto
172 this._resizeViewport(screenWidthDIP, screenHeightDIP); 167 var deviceSizeRatio = deviceHeightDIP / deviceWidthDIP;
173 168
174 this._imageZoom = this._imageElement.naturalWidth ? this._canvasElement. offsetWidth / this._imageElement.naturalWidth : 1; 169 var dimensionsCSS = this._viewportDimensions();
170
171 this._imageZoom = Math.min(dimensionsCSS.width / this._imageElement.natu ralWidth, dimensionsCSS.height / (this._imageElement.naturalWidth * deviceSizeRa tio));
172 this._viewportElement.classList.remove("hidden");
173 var bordersSize = WebInspector.ScreencastView._bordersSize;
174 if (this._imageZoom < 1.01 / window.devicePixelRatio)
175 this._imageZoom = 1 / window.devicePixelRatio;
176 this._screenZoom = this._imageElement.naturalWidth * this._imageZoom / d eviceWidthDIP;
177 this._viewportElement.style.width = deviceWidthDIP * this._screenZoom + bordersSize + "px";
178 this._viewportElement.style.height = deviceHeightDIP * this._screenZoom + bordersSize + "px";
179
175 this.highlightDOMNode(this._highlightNode, this._highlightConfig); 180 this.highlightDOMNode(this._highlightNode, this._highlightConfig);
176 }, 181 },
177 182
178 _isGlassPaneActive: function() 183 _isGlassPaneActive: function()
179 { 184 {
180 return !this._glassPaneElement.classList.contains("hidden"); 185 return !this._glassPaneElement.classList.contains("hidden");
181 }, 186 },
182 187
183 /** 188 /**
184 * @param {!WebInspector.Event} event 189 * @param {!WebInspector.Event} event
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 this._glassPaneElement.classList.remove("hidden"); 232 this._glassPaneElement.classList.remove("hidden");
228 } else if (this._profilerActive) { 233 } else if (this._profilerActive) {
229 this._glassPaneElement.textContent = WebInspector.UIString("CPU prof iler is active"); 234 this._glassPaneElement.textContent = WebInspector.UIString("CPU prof iler is active");
230 this._glassPaneElement.classList.remove("hidden"); 235 this._glassPaneElement.classList.remove("hidden");
231 } else { 236 } else {
232 this._glassPaneElement.classList.add("hidden"); 237 this._glassPaneElement.classList.add("hidden");
233 } 238 }
234 }, 239 },
235 240
236 /** 241 /**
237 * @param {number} screenWidthDIP
238 * @param {number} screenHeightDIP
239 */
240 _resizeViewport: function(screenWidthDIP, screenHeightDIP)
241 {
242 var dimensions = this._viewportDimensions();
243 this._screenZoom = Math.min(dimensions.width / screenWidthDIP, dimension s.height / screenHeightDIP);
244
245 var bordersSize = WebInspector.ScreencastView._bordersSize;
246 this._viewportElement.classList.remove("hidden");
247 this._viewportElement.style.width = screenWidthDIP * this._screenZoom + bordersSize + "px";
248 this._viewportElement.style.height = screenHeightDIP * this._screenZoom + bordersSize + "px";
249 },
250
251 /**
252 * @param {?Event} event 242 * @param {?Event} event
253 */ 243 */
254 _handleMouseEvent: function(event) 244 _handleMouseEvent: function(event)
255 { 245 {
256 if (this._isGlassPaneActive()) { 246 if (this._isGlassPaneActive()) {
257 event.consume(); 247 event.consume();
258 return; 248 return;
259 } 249 }
260 250
261 if (!this._viewport) 251 if (!this._viewport)
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 default: 477 default:
488 } 478 }
489 }, 479 },
490 480
491 /** 481 /**
492 * @param {?Event} event 482 * @param {?Event} event
493 * @return {!{x: number, y: number}} 483 * @return {!{x: number, y: number}}
494 */ 484 */
495 _zoomIntoScreenSpace: function(event) 485 _zoomIntoScreenSpace: function(event)
496 { 486 {
497 var zoom = this._canvasElement.offsetWidth / this._viewport.width / this ._pageScaleFactor; 487 var zoom = this._canvasElement.offsetWidth / this._viewport.width;
498 var position = {}; 488 var position = {};
499 position.x = Math.round(event.offsetX / zoom); 489 position.x = Math.round(event.offsetX / zoom);
500 position.y = Math.round(event.offsetY / zoom); 490 position.y = Math.round(event.offsetY / zoom);
501 return position; 491 return position;
502 }, 492 },
503 493
504 /** 494 /**
505 * @param {?Event} event 495 * @param {?Event} event
506 * @return {!{x: number, y: number}} 496 * @return {!{x: number, y: number}}
507 */ 497 */
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 551
562 this._node = node; 552 this._node = node;
563 node.boxModel(callback.bind(this)); 553 node.boxModel(callback.bind(this));
564 554
565 /** 555 /**
566 * @param {?DOMAgent.BoxModel} model 556 * @param {?DOMAgent.BoxModel} model
567 * @this {WebInspector.ScreencastView} 557 * @this {WebInspector.ScreencastView}
568 */ 558 */
569 function callback(model) 559 function callback(model)
570 { 560 {
571 if (!model) { 561 if (!model || !this._viewport) {
572 this._repaint(); 562 this._repaint();
573 return; 563 return;
574 } 564 }
575 this._model = this._scaleModel(model); 565 this._model = this._scaleModel(model);
576 this._config = config; 566 this._config = config;
577 this._repaint(); 567 this._repaint();
578 } 568 }
579 }, 569 },
580 570
581 /** 571 /**
582 * @param {!DOMAgent.BoxModel} model 572 * @param {!DOMAgent.BoxModel} model
583 * @return {!DOMAgent.BoxModel} 573 * @return {!DOMAgent.BoxModel}
584 */ 574 */
585 _scaleModel: function(model) 575 _scaleModel: function(model)
586 { 576 {
587 var scale = this._canvasElement.offsetWidth / this._viewport.width; 577 var scale = this._canvasElement.offsetWidth * this._pageScaleFactor / th is._viewport.width;
588 578
589 /** 579 /**
590 * @param {!DOMAgent.Quad} quad 580 * @param {!DOMAgent.Quad} quad
591 * @this {WebInspector.ScreencastView} 581 * @this {WebInspector.ScreencastView}
592 */ 582 */
593 function scaleQuad(quad) 583 function scaleQuad(quad)
594 { 584 {
595 for (var i = 0; i < quad.length; i += 2) { 585 for (var i = 0; i < quad.length; i += 2) {
596 quad[i] = (quad[i] - this._viewport.x) * scale; 586 quad[i] = (quad[i] - this._viewport.x) * scale;
597 quad[i + 1] = (quad[i + 1] - this._viewport.y) * scale + this._s creenOffsetTop * this._screenZoom; 587 quad[i + 1] = (quad[i + 1] - this._viewport.y) * scale + this._s creenOffsetTop * this._screenZoom;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 } 636 }
647 if (hasContent) 637 if (hasContent)
648 this._drawOutlinedQuad(model.content, config.contentColor); 638 this._drawOutlinedQuad(model.content, config.contentColor);
649 this._context.restore(); 639 this._context.restore();
650 640
651 this._drawElementTitle(); 641 this._drawElementTitle();
652 642
653 this._context.globalCompositeOperation = "destination-over"; 643 this._context.globalCompositeOperation = "destination-over";
654 } 644 }
655 645
656 this._context.drawImage(this._imageElement, 0, this._screenOffsetTop * t his._screenZoom, this._imageElement.naturalWidth * this._imageZoom, this._imageE lement.naturalHeight * this._imageZoom); 646 this._context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelR atio);
dgozman 2014/06/25 13:31:35 This may be wrong with zoom != 1. Please double ch
vkuzkokov 2014/06/25 17:56:58 Done.
647 this._context.drawImage(this._imageElement, 0,
648 this._screenOffsetTop * this._screenZoom * windo w.devicePixelRatio,
649 this._imageElement.naturalWidth * this._imageZoo m * window.devicePixelRatio,
dgozman 2014/06/25 13:31:35 Again, devicePixelRatio includes zoom.
650 this._imageElement.naturalHeight * this._imageZo om * window.devicePixelRatio);
651 this._context.restore();
657 652
658 this._context.restore();
659 }, 653 },
660 654
661 655
662 /** 656 /**
663 * @param {!DOMAgent.Quad} quad1 657 * @param {!DOMAgent.Quad} quad1
664 * @param {!DOMAgent.Quad} quad2 658 * @param {!DOMAgent.Quad} quad2
665 * @return {boolean} 659 * @return {boolean}
666 */ 660 */
667 _quadsAreEqual: function(quad1, quad2) 661 _quadsAreEqual: function(quad1, quad2)
668 { 662 {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 this._titleElement.style.left = (boxX + 3) + "px"; 804 this._titleElement.style.left = (boxX + 3) + "px";
811 }, 805 },
812 806
813 /** 807 /**
814 * @return {!{width: number, height: number}} 808 * @return {!{width: number, height: number}}
815 */ 809 */
816 _viewportDimensions: function() 810 _viewportDimensions: function()
817 { 811 {
818 const gutterSize = 30; 812 const gutterSize = 30;
819 const bordersSize = WebInspector.ScreencastView._bordersSize; 813 const bordersSize = WebInspector.ScreencastView._bordersSize;
820 return { width: this.element.offsetWidth - bordersSize - gutterSize, 814 var width = Math.floor(this.element.offsetWidth - bordersSize - gutterSi ze);
821 height: this.element.offsetHeight - bordersSize - gutterSize - WebInspector.ScreencastView._navBarHeight}; 815 var height = Math.floor(this.element.offsetHeight - bordersSize - gutter Size - WebInspector.ScreencastView._navBarHeight);
816 return { width: width, height: height };
822 }, 817 },
823 818
824 /** 819 /**
825 * @param {boolean} enabled 820 * @param {boolean} enabled
826 * @param {boolean} inspectUAShadowDOM 821 * @param {boolean} inspectUAShadowDOM
827 * @param {!DOMAgent.HighlightConfig} config 822 * @param {!DOMAgent.HighlightConfig} config
828 * @param {function(?Protocol.Error)=} callback 823 * @param {function(?Protocol.Error)=} callback
829 */ 824 */
830 setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callbac k) 825 setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callbac k)
831 { 826 {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 return; 1009 return;
1015 this._maxDisplayedProgress = progress; 1010 this._maxDisplayedProgress = progress;
1016 this._displayProgress(progress); 1011 this._displayProgress(progress);
1017 }, 1012 },
1018 1013
1019 _displayProgress: function(progress) 1014 _displayProgress: function(progress)
1020 { 1015 {
1021 this._element.style.width = (100 * progress) + "%"; 1016 this._element.style.width = (100 * progress) + "%";
1022 } 1017 }
1023 }; 1018 };
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698