| Index: third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
|
| index a9d93cc93ba048425566da632470f34c57935d74..7e46d9207fc82be3c9cd0aa7ffd8c272a57dc8c0 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
|
| @@ -27,846 +27,848 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.VBox}
|
| * @implements {WebInspector.DOMNodeHighlighter}
|
| - * @param {!WebInspector.Target} target
|
| - * @param {!WebInspector.ResourceTreeModel} resourceTreeModel
|
| + * @unrestricted
|
| */
|
| -WebInspector.ScreencastView = function(target, resourceTreeModel)
|
| -{
|
| - WebInspector.VBox.call(this);
|
| +WebInspector.ScreencastView = class extends WebInspector.VBox {
|
| + /**
|
| + * @param {!WebInspector.Target} target
|
| + * @param {!WebInspector.ResourceTreeModel} resourceTreeModel
|
| + */
|
| + constructor(target, resourceTreeModel) {
|
| + super();
|
| this._target = target;
|
| this._domModel = WebInspector.DOMModel.fromTarget(target);
|
| this._resourceTreeModel = resourceTreeModel;
|
|
|
| this.setMinimumSize(150, 150);
|
| - this.registerRequiredCSS("screencast/screencastView.css");
|
| -};
|
| -
|
| -WebInspector.ScreencastView._bordersSize = 44;
|
| -
|
| -WebInspector.ScreencastView._navBarHeight = 29;
|
| -
|
| -WebInspector.ScreencastView._HttpRegex = /^http:\/\/(.+)/;
|
| -
|
| -WebInspector.ScreencastView._SchemeRegex = /^(https?|about|chrome):/;
|
| -
|
| -WebInspector.ScreencastView.prototype = {
|
| - initialize: function()
|
| - {
|
| - this.element.classList.add("screencast");
|
| -
|
| - this._createNavigationBar();
|
| -
|
| - this._viewportElement = this.element.createChild("div", "screencast-viewport hidden");
|
| - this._canvasContainerElement = this._viewportElement.createChild("div", "screencast-canvas-container");
|
| - this._glassPaneElement = this._canvasContainerElement.createChild("div", "screencast-glasspane fill hidden");
|
| -
|
| - this._canvasElement = this._canvasContainerElement.createChild("canvas");
|
| - this._canvasElement.tabIndex = 1;
|
| - this._canvasElement.addEventListener("mousedown", this._handleMouseEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("mouseup", this._handleMouseEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("mousemove", this._handleMouseEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("mousewheel", this._handleMouseEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("click", this._handleMouseEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("keydown", this._handleKeyEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("keyup", this._handleKeyEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("keypress", this._handleKeyEvent.bind(this), false);
|
| - this._canvasElement.addEventListener("blur", this._handleBlurEvent.bind(this), false);
|
| -
|
| - this._titleElement = this._canvasContainerElement.createChild("div", "screencast-element-title monospace hidden");
|
| - this._tagNameElement = this._titleElement.createChild("span", "screencast-tag-name");
|
| - this._nodeIdElement = this._titleElement.createChild("span", "screencast-node-id");
|
| - this._classNameElement = this._titleElement.createChild("span", "screencast-class-name");
|
| - this._titleElement.createTextChild(" ");
|
| - this._nodeWidthElement = this._titleElement.createChild("span");
|
| - this._titleElement.createChild("span", "screencast-px").textContent = "px";
|
| - this._titleElement.createTextChild(" \u00D7 ");
|
| - this._nodeHeightElement = this._titleElement.createChild("span");
|
| - this._titleElement.createChild("span", "screencast-px").textContent = "px";
|
| - this._titleElement.style.top = "0";
|
| - this._titleElement.style.left = "0";
|
| -
|
| - this._imageElement = new Image();
|
| - this._isCasting = false;
|
| - this._context = this._canvasElement.getContext("2d");
|
| - this._checkerboardPattern = this._createCheckerboardPattern(this._context);
|
| -
|
| - this._shortcuts = /** !Object.<number, function(Event=):boolean> */ ({});
|
| - this._shortcuts[WebInspector.KeyboardShortcut.makeKey("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl)] = this._focusNavigationBar.bind(this);
|
| -
|
| - this._resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.ScreencastFrame, this._screencastFrame, this);
|
| - this._resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.ScreencastVisibilityChanged, this._screencastVisibilityChanged, this);
|
| -
|
| - WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChange, this);
|
| - this._updateGlasspane();
|
| - },
|
| -
|
| - wasShown: function()
|
| - {
|
| - this._startCasting();
|
| - },
|
| -
|
| - willHide: function()
|
| - {
|
| - this._stopCasting();
|
| - },
|
| -
|
| - _startCasting: function()
|
| - {
|
| - if (WebInspector.targetManager.allTargetsSuspended())
|
| - return;
|
| - if (this._isCasting)
|
| - return;
|
| - this._isCasting = true;
|
| -
|
| - const maxImageDimension = 2048;
|
| - var dimensions = this._viewportDimensions();
|
| - if (dimensions.width < 0 || dimensions.height < 0) {
|
| - this._isCasting = false;
|
| - return;
|
| - }
|
| - dimensions.width *= window.devicePixelRatio;
|
| - dimensions.height *= window.devicePixelRatio;
|
| - this._target.pageAgent().startScreencast("jpeg", 80, Math.min(maxImageDimension, dimensions.width), Math.min(maxImageDimension, dimensions.height));
|
| - this._target.emulationAgent().setTouchEmulationEnabled(true);
|
| - this._domModel.setHighlighter(this);
|
| - },
|
| -
|
| - _stopCasting: function()
|
| - {
|
| - if (!this._isCasting)
|
| - return;
|
| - this._isCasting = false;
|
| - this._target.pageAgent().stopScreencast();
|
| - this._target.emulationAgent().setTouchEmulationEnabled(false);
|
| - this._domModel.setHighlighter(null);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _screencastFrame: function(event)
|
| - {
|
| - var metadata = /** type {PageAgent.ScreencastFrameMetadata} */(event.data.metadata);
|
| - var base64Data = /** type {string} */(event.data.data);
|
| - this._imageElement.src = "data:image/jpg;base64," + base64Data;
|
| - this._pageScaleFactor = metadata.pageScaleFactor;
|
| - this._screenOffsetTop = metadata.offsetTop;
|
| - this._scrollOffsetX = metadata.scrollOffsetX;
|
| - this._scrollOffsetY = metadata.scrollOffsetY;
|
| -
|
| - var deviceSizeRatio = metadata.deviceHeight / metadata.deviceWidth;
|
| - var dimensionsCSS = this._viewportDimensions();
|
| -
|
| - this._imageZoom = Math.min(dimensionsCSS.width / this._imageElement.naturalWidth, dimensionsCSS.height / (this._imageElement.naturalWidth * deviceSizeRatio));
|
| - this._viewportElement.classList.remove("hidden");
|
| - var bordersSize = WebInspector.ScreencastView._bordersSize;
|
| - if (this._imageZoom < 1.01 / window.devicePixelRatio)
|
| - this._imageZoom = 1 / window.devicePixelRatio;
|
| - this._screenZoom = this._imageElement.naturalWidth * this._imageZoom / metadata.deviceWidth;
|
| - this._viewportElement.style.width = metadata.deviceWidth * this._screenZoom + bordersSize + "px";
|
| - this._viewportElement.style.height = metadata.deviceHeight * this._screenZoom + bordersSize + "px";
|
| -
|
| - this.highlightDOMNode(this._highlightNode, this._highlightConfig);
|
| - },
|
| -
|
| - _isGlassPaneActive: function()
|
| - {
|
| - return !this._glassPaneElement.classList.contains("hidden");
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _screencastVisibilityChanged: function(event)
|
| - {
|
| - this._targetInactive = !event.data.visible;
|
| - this._updateGlasspane();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onSuspendStateChange: function(event)
|
| - {
|
| - if (WebInspector.targetManager.allTargetsSuspended())
|
| - this._stopCasting();
|
| - else
|
| - this._startCasting();
|
| - this._updateGlasspane();
|
| - },
|
| -
|
| - _updateGlasspane: function()
|
| - {
|
| - if (this._targetInactive) {
|
| - this._glassPaneElement.textContent = WebInspector.UIString("The tab is inactive");
|
| - this._glassPaneElement.classList.remove("hidden");
|
| - } else if (WebInspector.targetManager.allTargetsSuspended()) {
|
| - this._glassPaneElement.textContent = WebInspector.UIString("Profiling in progress");
|
| - this._glassPaneElement.classList.remove("hidden");
|
| - } else {
|
| - this._glassPaneElement.classList.add("hidden");
|
| - }
|
| - },
|
| + this.registerRequiredCSS('screencast/screencastView.css');
|
| + }
|
| +
|
| + initialize() {
|
| + this.element.classList.add('screencast');
|
| +
|
| + this._createNavigationBar();
|
| +
|
| + this._viewportElement = this.element.createChild('div', 'screencast-viewport hidden');
|
| + this._canvasContainerElement = this._viewportElement.createChild('div', 'screencast-canvas-container');
|
| + this._glassPaneElement = this._canvasContainerElement.createChild('div', 'screencast-glasspane fill hidden');
|
| +
|
| + this._canvasElement = this._canvasContainerElement.createChild('canvas');
|
| + this._canvasElement.tabIndex = 1;
|
| + this._canvasElement.addEventListener('mousedown', this._handleMouseEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('mouseup', this._handleMouseEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('mousemove', this._handleMouseEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('mousewheel', this._handleMouseEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('click', this._handleMouseEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('contextmenu', this._handleContextMenuEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('keydown', this._handleKeyEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('keyup', this._handleKeyEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('keypress', this._handleKeyEvent.bind(this), false);
|
| + this._canvasElement.addEventListener('blur', this._handleBlurEvent.bind(this), false);
|
| +
|
| + this._titleElement = this._canvasContainerElement.createChild('div', 'screencast-element-title monospace hidden');
|
| + this._tagNameElement = this._titleElement.createChild('span', 'screencast-tag-name');
|
| + this._nodeIdElement = this._titleElement.createChild('span', 'screencast-node-id');
|
| + this._classNameElement = this._titleElement.createChild('span', 'screencast-class-name');
|
| + this._titleElement.createTextChild(' ');
|
| + this._nodeWidthElement = this._titleElement.createChild('span');
|
| + this._titleElement.createChild('span', 'screencast-px').textContent = 'px';
|
| + this._titleElement.createTextChild(' \u00D7 ');
|
| + this._nodeHeightElement = this._titleElement.createChild('span');
|
| + this._titleElement.createChild('span', 'screencast-px').textContent = 'px';
|
| + this._titleElement.style.top = '0';
|
| + this._titleElement.style.left = '0';
|
| +
|
| + this._imageElement = new Image();
|
| + this._isCasting = false;
|
| + this._context = this._canvasElement.getContext('2d');
|
| + this._checkerboardPattern = this._createCheckerboardPattern(this._context);
|
| +
|
| + this._shortcuts = /** !Object.<number, function(Event=):boolean> */ ({});
|
| + this._shortcuts[WebInspector.KeyboardShortcut.makeKey('l', WebInspector.KeyboardShortcut.Modifiers.Ctrl)] =
|
| + this._focusNavigationBar.bind(this);
|
| +
|
| + this._resourceTreeModel.addEventListener(
|
| + WebInspector.ResourceTreeModel.Events.ScreencastFrame, this._screencastFrame, this);
|
| + this._resourceTreeModel.addEventListener(
|
| + WebInspector.ResourceTreeModel.Events.ScreencastVisibilityChanged, this._screencastVisibilityChanged, this);
|
| +
|
| + WebInspector.targetManager.addEventListener(
|
| + WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChange, this);
|
| + this._updateGlasspane();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasShown() {
|
| + this._startCasting();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + willHide() {
|
| + this._stopCasting();
|
| + }
|
| +
|
| + _startCasting() {
|
| + if (WebInspector.targetManager.allTargetsSuspended())
|
| + return;
|
| + if (this._isCasting)
|
| + return;
|
| + this._isCasting = true;
|
| +
|
| + const maxImageDimension = 2048;
|
| + var dimensions = this._viewportDimensions();
|
| + if (dimensions.width < 0 || dimensions.height < 0) {
|
| + this._isCasting = false;
|
| + return;
|
| + }
|
| + dimensions.width *= window.devicePixelRatio;
|
| + dimensions.height *= window.devicePixelRatio;
|
| + this._target.pageAgent().startScreencast(
|
| + 'jpeg', 80, Math.min(maxImageDimension, dimensions.width), Math.min(maxImageDimension, dimensions.height));
|
| + this._target.emulationAgent().setTouchEmulationEnabled(true);
|
| + this._domModel.setHighlighter(this);
|
| + }
|
| +
|
| + _stopCasting() {
|
| + if (!this._isCasting)
|
| + return;
|
| + this._isCasting = false;
|
| + this._target.pageAgent().stopScreencast();
|
| + this._target.emulationAgent().setTouchEmulationEnabled(false);
|
| + this._domModel.setHighlighter(null);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _screencastFrame(event) {
|
| + var metadata = /** type {PageAgent.ScreencastFrameMetadata} */ (event.data.metadata);
|
| + var base64Data = /** type {string} */ (event.data.data);
|
| + this._imageElement.src = 'data:image/jpg;base64,' + base64Data;
|
| + this._pageScaleFactor = metadata.pageScaleFactor;
|
| + this._screenOffsetTop = metadata.offsetTop;
|
| + this._scrollOffsetX = metadata.scrollOffsetX;
|
| + this._scrollOffsetY = metadata.scrollOffsetY;
|
| +
|
| + var deviceSizeRatio = metadata.deviceHeight / metadata.deviceWidth;
|
| + var dimensionsCSS = this._viewportDimensions();
|
| +
|
| + this._imageZoom = Math.min(
|
| + dimensionsCSS.width / this._imageElement.naturalWidth,
|
| + dimensionsCSS.height / (this._imageElement.naturalWidth * deviceSizeRatio));
|
| + this._viewportElement.classList.remove('hidden');
|
| + var bordersSize = WebInspector.ScreencastView._bordersSize;
|
| + if (this._imageZoom < 1.01 / window.devicePixelRatio)
|
| + this._imageZoom = 1 / window.devicePixelRatio;
|
| + this._screenZoom = this._imageElement.naturalWidth * this._imageZoom / metadata.deviceWidth;
|
| + this._viewportElement.style.width = metadata.deviceWidth * this._screenZoom + bordersSize + 'px';
|
| + this._viewportElement.style.height = metadata.deviceHeight * this._screenZoom + bordersSize + 'px';
|
| +
|
| + this.highlightDOMNode(this._highlightNode, this._highlightConfig);
|
| + }
|
| +
|
| + _isGlassPaneActive() {
|
| + return !this._glassPaneElement.classList.contains('hidden');
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _screencastVisibilityChanged(event) {
|
| + this._targetInactive = !event.data.visible;
|
| + this._updateGlasspane();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onSuspendStateChange(event) {
|
| + if (WebInspector.targetManager.allTargetsSuspended())
|
| + this._stopCasting();
|
| + else
|
| + this._startCasting();
|
| + this._updateGlasspane();
|
| + }
|
| +
|
| + _updateGlasspane() {
|
| + if (this._targetInactive) {
|
| + this._glassPaneElement.textContent = WebInspector.UIString('The tab is inactive');
|
| + this._glassPaneElement.classList.remove('hidden');
|
| + } else if (WebInspector.targetManager.allTargetsSuspended()) {
|
| + this._glassPaneElement.textContent = WebInspector.UIString('Profiling in progress');
|
| + this._glassPaneElement.classList.remove('hidden');
|
| + } else {
|
| + this._glassPaneElement.classList.add('hidden');
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _handleMouseEvent(event) {
|
| + if (this._isGlassPaneActive()) {
|
| + event.consume();
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _handleMouseEvent: function(event)
|
| - {
|
| - if (this._isGlassPaneActive()) {
|
| - event.consume();
|
| - return;
|
| - }
|
| -
|
| - if (!this._pageScaleFactor)
|
| - return;
|
| -
|
| - if (!this._inspectModeConfig || event.type === "mousewheel") {
|
| - this._simulateTouchForMouseEvent(event);
|
| - event.preventDefault();
|
| - if (event.type === "mousedown")
|
| - this._canvasElement.focus();
|
| - return;
|
| - }
|
| -
|
| - var position = this._convertIntoScreenSpace(event);
|
| - this._domModel.nodeForLocation(position.x / this._pageScaleFactor + this._scrollOffsetX, position.y / this._pageScaleFactor + this._scrollOffsetY, callback.bind(this));
|
| -
|
| - /**
|
| - * @param {?WebInspector.DOMNode} node
|
| - * @this {WebInspector.ScreencastView}
|
| - */
|
| - function callback(node)
|
| - {
|
| - if (!node)
|
| - return;
|
| - if (event.type === "mousemove") {
|
| - this.highlightDOMNode(node, this._inspectModeConfig);
|
| - this._domModel.nodeHighlightRequested(node.id);
|
| - } else if (event.type === "click") {
|
| - WebInspector.Revealer.reveal(node);
|
| - }
|
| - }
|
| - },
|
| + if (!this._pageScaleFactor)
|
| + return;
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _handleKeyEvent: function(event)
|
| - {
|
| - if (this._isGlassPaneActive()) {
|
| - event.consume();
|
| - return;
|
| - }
|
| -
|
| - var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(/** @type {!KeyboardEvent} */ (event));
|
| - var handler = this._shortcuts[shortcutKey];
|
| - if (handler && handler(event)) {
|
| - event.consume();
|
| - return;
|
| - }
|
| -
|
| - var type;
|
| - switch (event.type) {
|
| - case "keydown": type = "keyDown"; break;
|
| - case "keyup": type = "keyUp"; break;
|
| - case "keypress": type = "char"; break;
|
| - default: return;
|
| - }
|
| -
|
| - var text = event.type === "keypress" ? String.fromCharCode(event.charCode) : undefined;
|
| - this._target.inputAgent().invoke_dispatchKeyEvent({
|
| - type: type,
|
| - modifiers: this._modifiersForEvent(event),
|
| - timestamp: event.timeStamp / 1000,
|
| - text: text,
|
| - unmodifiedText: text ? text.toLowerCase() : undefined,
|
| - keyIdentifier: event.keyIdentifier,
|
| - code: event.code,
|
| - key: event.key,
|
| - windowsVirtualKeyCode: event.keyCode,
|
| - nativeVirtualKeyCode: event.keyCode,
|
| - autoRepeat: false,
|
| - isKeypad: false,
|
| - isSystemKey: false});
|
| - event.consume();
|
| + if (!this._inspectModeConfig || event.type === 'mousewheel') {
|
| + this._simulateTouchForMouseEvent(event);
|
| + event.preventDefault();
|
| + if (event.type === 'mousedown')
|
| this._canvasElement.focus();
|
| - },
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _handleContextMenuEvent: function(event)
|
| - {
|
| - event.consume(true);
|
| - },
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _simulateTouchForMouseEvent: function(event)
|
| - {
|
| - const buttons = {0: "none", 1: "left", 2: "middle", 3: "right"};
|
| - const types = {"mousedown" : "mousePressed", "mouseup": "mouseReleased", "mousemove": "mouseMoved", "mousewheel": "mouseWheel"};
|
| - if (!(event.type in types) || !(event.which in buttons))
|
| - return;
|
| - if (event.type !== "mousewheel" && buttons[event.which] === "none")
|
| - return;
|
| -
|
| - if (event.type === "mousedown" || typeof this._eventScreenOffsetTop === "undefined")
|
| - this._eventScreenOffsetTop = this._screenOffsetTop;
|
| -
|
| - var modifiers = (event.altKey ? 1 : 0) | (event.ctrlKey ? 2 : 0) | (event.metaKey ? 4 : 0) | (event.shiftKey ? 8 : 0);
|
| -
|
| - var convertedPosition = this._zoomIntoScreenSpace(event);
|
| - convertedPosition.y = Math.round(convertedPosition.y - this._eventScreenOffsetTop);
|
| - var params = {type: types[event.type], x: convertedPosition.x, y: convertedPosition.y, modifiers: modifiers, timestamp: event.timeStamp / 1000, button: buttons[event.which], clickCount: 0};
|
| - if (event.type === "mousewheel") {
|
| - params.deltaX = event.wheelDeltaX / this._screenZoom;
|
| - params.deltaY = event.wheelDeltaY / this._screenZoom;
|
| - } else {
|
| - this._eventParams = params;
|
| - }
|
| - if (event.type === "mouseup")
|
| - delete this._eventScreenOffsetTop;
|
| - this._target.inputAgent().invoke_emulateTouchFromMouseEvent(params);
|
| - },
|
| + var position = this._convertIntoScreenSpace(event);
|
| + this._domModel.nodeForLocation(
|
| + position.x / this._pageScaleFactor + this._scrollOffsetX,
|
| + position.y / this._pageScaleFactor + this._scrollOffsetY, callback.bind(this));
|
|
|
| /**
|
| - * @param {!Event} event
|
| + * @param {?WebInspector.DOMNode} node
|
| + * @this {WebInspector.ScreencastView}
|
| */
|
| - _handleBlurEvent: function(event)
|
| - {
|
| - if (typeof this._eventScreenOffsetTop !== "undefined") {
|
| - var params = this._eventParams;
|
| - delete this._eventParams;
|
| - params.type = "mouseReleased";
|
| - this._target.inputAgent().invoke_emulateTouchFromMouseEvent(params);
|
| - }
|
| - },
|
| + function callback(node) {
|
| + if (!node)
|
| + return;
|
| + if (event.type === 'mousemove') {
|
| + this.highlightDOMNode(node, this._inspectModeConfig);
|
| + this._domModel.nodeHighlightRequested(node.id);
|
| + } else if (event.type === 'click') {
|
| + WebInspector.Revealer.reveal(node);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _handleKeyEvent(event) {
|
| + if (this._isGlassPaneActive()) {
|
| + event.consume();
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - * @return {!{x: number, y: number}}
|
| - */
|
| - _zoomIntoScreenSpace: function(event)
|
| - {
|
| - var position = {};
|
| - position.x = Math.round(event.offsetX / this._screenZoom);
|
| - position.y = Math.round(event.offsetY / this._screenZoom);
|
| - return position;
|
| - },
|
| + var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(/** @type {!KeyboardEvent} */ (event));
|
| + var handler = this._shortcuts[shortcutKey];
|
| + if (handler && handler(event)) {
|
| + event.consume();
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - * @return {!{x: number, y: number}}
|
| - */
|
| - _convertIntoScreenSpace: function(event)
|
| - {
|
| - var position = this._zoomIntoScreenSpace(event);
|
| - position.y = Math.round(position.y - this._screenOffsetTop);
|
| - return position;
|
| - },
|
| + var type;
|
| + switch (event.type) {
|
| + case 'keydown':
|
| + type = 'keyDown';
|
| + break;
|
| + case 'keyup':
|
| + type = 'keyUp';
|
| + break;
|
| + case 'keypress':
|
| + type = 'char';
|
| + break;
|
| + default:
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - * @return {number}
|
| - */
|
| - _modifiersForEvent: function(event)
|
| - {
|
| - var modifiers = 0;
|
| - if (event.altKey)
|
| - modifiers = 1;
|
| - if (event.ctrlKey)
|
| - modifiers += 2;
|
| - if (event.metaKey)
|
| - modifiers += 4;
|
| - if (event.shiftKey)
|
| - modifiers += 8;
|
| - return modifiers;
|
| - },
|
| -
|
| - onResize: function()
|
| - {
|
| - if (this._deferredCasting) {
|
| - clearTimeout(this._deferredCasting);
|
| - delete this._deferredCasting;
|
| - }
|
| -
|
| - this._stopCasting();
|
| - this._deferredCasting = setTimeout(this._startCasting.bind(this), 100);
|
| - },
|
| + var text = event.type === 'keypress' ? String.fromCharCode(event.charCode) : undefined;
|
| + this._target.inputAgent().invoke_dispatchKeyEvent({
|
| + type: type,
|
| + modifiers: this._modifiersForEvent(event),
|
| + timestamp: event.timeStamp / 1000,
|
| + text: text,
|
| + unmodifiedText: text ? text.toLowerCase() : undefined,
|
| + keyIdentifier: event.keyIdentifier,
|
| + code: event.code,
|
| + key: event.key,
|
| + windowsVirtualKeyCode: event.keyCode,
|
| + nativeVirtualKeyCode: event.keyCode,
|
| + autoRepeat: false,
|
| + isKeypad: false,
|
| + isSystemKey: false
|
| + });
|
| + event.consume();
|
| + this._canvasElement.focus();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _handleContextMenuEvent(event) {
|
| + event.consume(true);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _simulateTouchForMouseEvent(event) {
|
| + const buttons = {0: 'none', 1: 'left', 2: 'middle', 3: 'right'};
|
| + const types = {
|
| + 'mousedown': 'mousePressed',
|
| + 'mouseup': 'mouseReleased',
|
| + 'mousemove': 'mouseMoved',
|
| + 'mousewheel': 'mouseWheel'
|
| + };
|
| + if (!(event.type in types) || !(event.which in buttons))
|
| + return;
|
| + if (event.type !== 'mousewheel' && buttons[event.which] === 'none')
|
| + return;
|
| +
|
| + if (event.type === 'mousedown' || typeof this._eventScreenOffsetTop === 'undefined')
|
| + this._eventScreenOffsetTop = this._screenOffsetTop;
|
| +
|
| + var modifiers =
|
| + (event.altKey ? 1 : 0) | (event.ctrlKey ? 2 : 0) | (event.metaKey ? 4 : 0) | (event.shiftKey ? 8 : 0);
|
| +
|
| + var convertedPosition = this._zoomIntoScreenSpace(event);
|
| + convertedPosition.y = Math.round(convertedPosition.y - this._eventScreenOffsetTop);
|
| + var params = {
|
| + type: types[event.type],
|
| + x: convertedPosition.x,
|
| + y: convertedPosition.y,
|
| + modifiers: modifiers,
|
| + timestamp: event.timeStamp / 1000,
|
| + button: buttons[event.which],
|
| + clickCount: 0
|
| + };
|
| + if (event.type === 'mousewheel') {
|
| + params.deltaX = event.wheelDeltaX / this._screenZoom;
|
| + params.deltaY = event.wheelDeltaY / this._screenZoom;
|
| + } else {
|
| + this._eventParams = params;
|
| + }
|
| + if (event.type === 'mouseup')
|
| + delete this._eventScreenOffsetTop;
|
| + this._target.inputAgent().invoke_emulateTouchFromMouseEvent(params);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _handleBlurEvent(event) {
|
| + if (typeof this._eventScreenOffsetTop !== 'undefined') {
|
| + var params = this._eventParams;
|
| + delete this._eventParams;
|
| + params.type = 'mouseReleased';
|
| + this._target.inputAgent().invoke_emulateTouchFromMouseEvent(params);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @return {!{x: number, y: number}}
|
| + */
|
| + _zoomIntoScreenSpace(event) {
|
| + var position = {};
|
| + position.x = Math.round(event.offsetX / this._screenZoom);
|
| + position.y = Math.round(event.offsetY / this._screenZoom);
|
| + return position;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @return {!{x: number, y: number}}
|
| + */
|
| + _convertIntoScreenSpace(event) {
|
| + var position = this._zoomIntoScreenSpace(event);
|
| + position.y = Math.round(position.y - this._screenOffsetTop);
|
| + return position;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @return {number}
|
| + */
|
| + _modifiersForEvent(event) {
|
| + var modifiers = 0;
|
| + if (event.altKey)
|
| + modifiers = 1;
|
| + if (event.ctrlKey)
|
| + modifiers += 2;
|
| + if (event.metaKey)
|
| + modifiers += 4;
|
| + if (event.shiftKey)
|
| + modifiers += 8;
|
| + return modifiers;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onResize() {
|
| + if (this._deferredCasting) {
|
| + clearTimeout(this._deferredCasting);
|
| + delete this._deferredCasting;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {?WebInspector.DOMNode} node
|
| - * @param {?DOMAgent.HighlightConfig} config
|
| - * @param {!DOMAgent.BackendNodeId=} backendNodeId
|
| - * @param {!RuntimeAgent.RemoteObjectId=} objectId
|
| - */
|
| - highlightDOMNode: function(node, config, backendNodeId, objectId)
|
| - {
|
| - this._highlightNode = node;
|
| - this._highlightConfig = config;
|
| - if (!node) {
|
| - this._model = null;
|
| - this._config = null;
|
| - this._node = null;
|
| - this._titleElement.classList.add("hidden");
|
| - this._repaint();
|
| - return;
|
| - }
|
| -
|
| - this._node = node;
|
| - node.boxModel(callback.bind(this));
|
| -
|
| - /**
|
| - * @param {?DOMAgent.BoxModel} model
|
| - * @this {WebInspector.ScreencastView}
|
| - */
|
| - function callback(model)
|
| - {
|
| - if (!model || !this._pageScaleFactor) {
|
| - this._repaint();
|
| - return;
|
| - }
|
| - this._model = this._scaleModel(model);
|
| - this._config = config;
|
| - this._repaint();
|
| - }
|
| - },
|
| + this._stopCasting();
|
| + this._deferredCasting = setTimeout(this._startCasting.bind(this), 100);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {?WebInspector.DOMNode} node
|
| + * @param {?DOMAgent.HighlightConfig} config
|
| + * @param {!DOMAgent.BackendNodeId=} backendNodeId
|
| + * @param {!RuntimeAgent.RemoteObjectId=} objectId
|
| + */
|
| + highlightDOMNode(node, config, backendNodeId, objectId) {
|
| + this._highlightNode = node;
|
| + this._highlightConfig = config;
|
| + if (!node) {
|
| + this._model = null;
|
| + this._config = null;
|
| + this._node = null;
|
| + this._titleElement.classList.add('hidden');
|
| + this._repaint();
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!DOMAgent.BoxModel} model
|
| - * @return {!DOMAgent.BoxModel}
|
| - */
|
| - _scaleModel: function(model)
|
| - {
|
| - /**
|
| - * @param {!DOMAgent.Quad} quad
|
| - * @this {WebInspector.ScreencastView}
|
| - */
|
| - function scaleQuad(quad)
|
| - {
|
| - for (var i = 0; i < quad.length; i += 2) {
|
| - quad[i] = quad[i] * this._screenZoom;
|
| - quad[i + 1] = (quad[i + 1] + this._screenOffsetTop) * this._screenZoom;
|
| - }
|
| - }
|
| -
|
| - scaleQuad.call(this, model.content);
|
| - scaleQuad.call(this, model.padding);
|
| - scaleQuad.call(this, model.border);
|
| - scaleQuad.call(this, model.margin);
|
| - return model;
|
| - },
|
| -
|
| - _repaint: function()
|
| - {
|
| - var model = this._model;
|
| - var config = this._config;
|
| -
|
| - var canvasWidth = this._canvasElement.getBoundingClientRect().width;
|
| - var canvasHeight = this._canvasElement.getBoundingClientRect().height;
|
| - this._canvasElement.width = window.devicePixelRatio * canvasWidth;
|
| - this._canvasElement.height = window.devicePixelRatio * canvasHeight;
|
| -
|
| - this._context.save();
|
| - this._context.scale(window.devicePixelRatio, window.devicePixelRatio);
|
| -
|
| - // Paint top and bottom gutter.
|
| - this._context.save();
|
| - this._context.fillStyle = this._checkerboardPattern;
|
| - this._context.fillRect(0, 0, canvasWidth, this._screenOffsetTop * this._screenZoom);
|
| - this._context.fillRect(0, this._screenOffsetTop * this._screenZoom + this._imageElement.naturalHeight * this._imageZoom, canvasWidth, canvasHeight);
|
| - this._context.restore();
|
| -
|
| - if (model && config) {
|
| - this._context.save();
|
| - const transparentColor = "rgba(0, 0, 0, 0)";
|
| - var quads = [];
|
| - if (model.content && config.contentColor !== transparentColor)
|
| - quads.push({quad: model.content, color: config.contentColor});
|
| - if (model.padding && config.paddingColor !== transparentColor)
|
| - quads.push({quad: model.padding, color: config.paddingColor});
|
| - if (model.border && config.borderColor !== transparentColor)
|
| - quads.push({quad: model.border, color: config.borderColor});
|
| - if (model.margin && config.marginColor !== transparentColor)
|
| - quads.push({quad: model.margin, color: config.marginColor});
|
| -
|
| - for (var i = quads.length - 1; i > 0; --i)
|
| - this._drawOutlinedQuadWithClip(quads[i].quad, quads[i - 1].quad, quads[i].color);
|
| - if (quads.length > 0)
|
| - this._drawOutlinedQuad(quads[0].quad, quads[0].color);
|
| - this._context.restore();
|
| -
|
| - this._drawElementTitle();
|
| -
|
| - this._context.globalCompositeOperation = "destination-over";
|
| - }
|
| -
|
| - this._context.drawImage(this._imageElement, 0, this._screenOffsetTop * this._screenZoom, this._imageElement.naturalWidth * this._imageZoom, this._imageElement.naturalHeight * this._imageZoom);
|
| - this._context.restore();
|
| -
|
| - },
|
| + this._node = node;
|
| + node.boxModel(callback.bind(this));
|
|
|
| /**
|
| - * @param {!DOMAgent.RGBA} color
|
| - * @return {string}
|
| + * @param {?DOMAgent.BoxModel} model
|
| + * @this {WebInspector.ScreencastView}
|
| */
|
| - _cssColor: function(color)
|
| - {
|
| - if (!color)
|
| - return "transparent";
|
| - return WebInspector.Color.fromRGBA([color.r, color.g, color.b, color.a]).asString(WebInspector.Color.Format.RGBA) || "";
|
| - },
|
| + function callback(model) {
|
| + if (!model || !this._pageScaleFactor) {
|
| + this._repaint();
|
| + return;
|
| + }
|
| + this._model = this._scaleModel(model);
|
| + this._config = config;
|
| + this._repaint();
|
| + }
|
| + }
|
|
|
| + /**
|
| + * @param {!DOMAgent.BoxModel} model
|
| + * @return {!DOMAgent.BoxModel}
|
| + */
|
| + _scaleModel(model) {
|
| /**
|
| * @param {!DOMAgent.Quad} quad
|
| - * @return {!CanvasRenderingContext2D}
|
| + * @this {WebInspector.ScreencastView}
|
| */
|
| - _quadToPath: function(quad)
|
| - {
|
| - this._context.beginPath();
|
| - this._context.moveTo(quad[0], quad[1]);
|
| - this._context.lineTo(quad[2], quad[3]);
|
| - this._context.lineTo(quad[4], quad[5]);
|
| - this._context.lineTo(quad[6], quad[7]);
|
| - this._context.closePath();
|
| - return this._context;
|
| - },
|
| + function scaleQuad(quad) {
|
| + for (var i = 0; i < quad.length; i += 2) {
|
| + quad[i] = quad[i] * this._screenZoom;
|
| + quad[i + 1] = (quad[i + 1] + this._screenOffsetTop) * this._screenZoom;
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {!DOMAgent.Quad} quad
|
| - * @param {!DOMAgent.RGBA} fillColor
|
| - */
|
| - _drawOutlinedQuad: function(quad, fillColor)
|
| - {
|
| - this._context.save();
|
| - this._context.lineWidth = 2;
|
| - this._quadToPath(quad).clip();
|
| - this._context.fillStyle = this._cssColor(fillColor);
|
| - this._context.fill();
|
| - this._context.restore();
|
| - },
|
| + scaleQuad.call(this, model.content);
|
| + scaleQuad.call(this, model.padding);
|
| + scaleQuad.call(this, model.border);
|
| + scaleQuad.call(this, model.margin);
|
| + return model;
|
| + }
|
| +
|
| + _repaint() {
|
| + var model = this._model;
|
| + var config = this._config;
|
| +
|
| + var canvasWidth = this._canvasElement.getBoundingClientRect().width;
|
| + var canvasHeight = this._canvasElement.getBoundingClientRect().height;
|
| + this._canvasElement.width = window.devicePixelRatio * canvasWidth;
|
| + this._canvasElement.height = window.devicePixelRatio * canvasHeight;
|
| +
|
| + this._context.save();
|
| + this._context.scale(window.devicePixelRatio, window.devicePixelRatio);
|
| +
|
| + // Paint top and bottom gutter.
|
| + this._context.save();
|
| + this._context.fillStyle = this._checkerboardPattern;
|
| + this._context.fillRect(0, 0, canvasWidth, this._screenOffsetTop * this._screenZoom);
|
| + this._context.fillRect(
|
| + 0, this._screenOffsetTop * this._screenZoom + this._imageElement.naturalHeight * this._imageZoom, canvasWidth,
|
| + canvasHeight);
|
| + this._context.restore();
|
| +
|
| + if (model && config) {
|
| + this._context.save();
|
| + const transparentColor = 'rgba(0, 0, 0, 0)';
|
| + var quads = [];
|
| + if (model.content && config.contentColor !== transparentColor)
|
| + quads.push({quad: model.content, color: config.contentColor});
|
| + if (model.padding && config.paddingColor !== transparentColor)
|
| + quads.push({quad: model.padding, color: config.paddingColor});
|
| + if (model.border && config.borderColor !== transparentColor)
|
| + quads.push({quad: model.border, color: config.borderColor});
|
| + if (model.margin && config.marginColor !== transparentColor)
|
| + quads.push({quad: model.margin, color: config.marginColor});
|
| +
|
| + for (var i = quads.length - 1; i > 0; --i)
|
| + this._drawOutlinedQuadWithClip(quads[i].quad, quads[i - 1].quad, quads[i].color);
|
| + if (quads.length > 0)
|
| + this._drawOutlinedQuad(quads[0].quad, quads[0].color);
|
| + this._context.restore();
|
| +
|
| + this._drawElementTitle();
|
| +
|
| + this._context.globalCompositeOperation = 'destination-over';
|
| + }
|
|
|
| - /**
|
| - * @param {!DOMAgent.Quad} quad
|
| - * @param {!DOMAgent.Quad} clipQuad
|
| - * @param {!DOMAgent.RGBA} fillColor
|
| - */
|
| - _drawOutlinedQuadWithClip: function(quad, clipQuad, fillColor)
|
| - {
|
| - this._context.fillStyle = this._cssColor(fillColor);
|
| - this._context.save();
|
| - this._context.lineWidth = 0;
|
| - this._quadToPath(quad).fill();
|
| - this._context.globalCompositeOperation = "destination-out";
|
| - this._context.fillStyle = "red";
|
| - this._quadToPath(clipQuad).fill();
|
| - this._context.restore();
|
| - },
|
| -
|
| - _drawElementTitle: function()
|
| - {
|
| - if (!this._node)
|
| - return;
|
| -
|
| - var canvasWidth = this._canvasElement.getBoundingClientRect().width;
|
| - var canvasHeight = this._canvasElement.getBoundingClientRect().height;
|
| -
|
| - var lowerCaseName = this._node.localName() || this._node.nodeName().toLowerCase();
|
| - this._tagNameElement.textContent = lowerCaseName;
|
| - this._nodeIdElement.textContent = this._node.getAttribute("id") ? "#" + this._node.getAttribute("id") : "";
|
| - this._nodeIdElement.textContent = this._node.getAttribute("id") ? "#" + this._node.getAttribute("id") : "";
|
| - var className = this._node.getAttribute("class");
|
| - if (className && className.length > 50)
|
| - className = className.substring(0, 50) + "\u2026";
|
| - this._classNameElement.textContent = className || "";
|
| - this._nodeWidthElement.textContent = this._model.width;
|
| - this._nodeHeightElement.textContent = this._model.height;
|
| -
|
| - this._titleElement.classList.remove("hidden");
|
| - var titleWidth = this._titleElement.offsetWidth + 6;
|
| - var titleHeight = this._titleElement.offsetHeight + 4;
|
| -
|
| - var anchorTop = this._model.margin[1];
|
| - var anchorBottom = this._model.margin[7];
|
| -
|
| - const arrowHeight = 7;
|
| - var renderArrowUp = false;
|
| - var renderArrowDown = false;
|
| -
|
| - var boxX = Math.max(2, this._model.margin[0]);
|
| - if (boxX + titleWidth > canvasWidth)
|
| - boxX = canvasWidth - titleWidth - 2;
|
| -
|
| - var boxY;
|
| - if (anchorTop > canvasHeight) {
|
| - boxY = canvasHeight - titleHeight - arrowHeight;
|
| - renderArrowDown = true;
|
| - } else if (anchorBottom < 0) {
|
| - boxY = arrowHeight;
|
| - renderArrowUp = true;
|
| - } else if (anchorBottom + titleHeight + arrowHeight < canvasHeight) {
|
| - boxY = anchorBottom + arrowHeight - 4;
|
| - renderArrowUp = true;
|
| - } else if (anchorTop - titleHeight - arrowHeight > 0) {
|
| - boxY = anchorTop - titleHeight - arrowHeight + 3;
|
| - renderArrowDown = true;
|
| - } else
|
| - boxY = arrowHeight;
|
| -
|
| - this._context.save();
|
| - this._context.translate(0.5, 0.5);
|
| - this._context.beginPath();
|
| - this._context.moveTo(boxX, boxY);
|
| - if (renderArrowUp) {
|
| - this._context.lineTo(boxX + 2 * arrowHeight, boxY);
|
| - this._context.lineTo(boxX + 3 * arrowHeight, boxY - arrowHeight);
|
| - this._context.lineTo(boxX + 4 * arrowHeight, boxY);
|
| - }
|
| - this._context.lineTo(boxX + titleWidth, boxY);
|
| - this._context.lineTo(boxX + titleWidth, boxY + titleHeight);
|
| - if (renderArrowDown) {
|
| - this._context.lineTo(boxX + 4 * arrowHeight, boxY + titleHeight);
|
| - this._context.lineTo(boxX + 3 * arrowHeight, boxY + titleHeight + arrowHeight);
|
| - this._context.lineTo(boxX + 2 * arrowHeight, boxY + titleHeight);
|
| - }
|
| - this._context.lineTo(boxX, boxY + titleHeight);
|
| - this._context.closePath();
|
| - this._context.fillStyle = "rgb(255, 255, 194)";
|
| - this._context.fill();
|
| - this._context.strokeStyle = "rgb(128, 128, 128)";
|
| - this._context.stroke();
|
| -
|
| - this._context.restore();
|
| -
|
| - this._titleElement.style.top = (boxY + 3) + "px";
|
| - this._titleElement.style.left = (boxX + 3) + "px";
|
| - },
|
| + this._context.drawImage(
|
| + this._imageElement, 0, this._screenOffsetTop * this._screenZoom,
|
| + this._imageElement.naturalWidth * this._imageZoom, this._imageElement.naturalHeight * this._imageZoom);
|
| + this._context.restore();
|
| + }
|
| +
|
| + /**
|
| + * @param {!DOMAgent.RGBA} color
|
| + * @return {string}
|
| + */
|
| + _cssColor(color) {
|
| + if (!color)
|
| + return 'transparent';
|
| + return WebInspector.Color.fromRGBA([color.r, color.g, color.b, color.a]).asString(WebInspector.Color.Format.RGBA) ||
|
| + '';
|
| + }
|
| +
|
| + /**
|
| + * @param {!DOMAgent.Quad} quad
|
| + * @return {!CanvasRenderingContext2D}
|
| + */
|
| + _quadToPath(quad) {
|
| + this._context.beginPath();
|
| + this._context.moveTo(quad[0], quad[1]);
|
| + this._context.lineTo(quad[2], quad[3]);
|
| + this._context.lineTo(quad[4], quad[5]);
|
| + this._context.lineTo(quad[6], quad[7]);
|
| + this._context.closePath();
|
| + return this._context;
|
| + }
|
| +
|
| + /**
|
| + * @param {!DOMAgent.Quad} quad
|
| + * @param {!DOMAgent.RGBA} fillColor
|
| + */
|
| + _drawOutlinedQuad(quad, fillColor) {
|
| + this._context.save();
|
| + this._context.lineWidth = 2;
|
| + this._quadToPath(quad).clip();
|
| + this._context.fillStyle = this._cssColor(fillColor);
|
| + this._context.fill();
|
| + this._context.restore();
|
| + }
|
| +
|
| + /**
|
| + * @param {!DOMAgent.Quad} quad
|
| + * @param {!DOMAgent.Quad} clipQuad
|
| + * @param {!DOMAgent.RGBA} fillColor
|
| + */
|
| + _drawOutlinedQuadWithClip(quad, clipQuad, fillColor) {
|
| + this._context.fillStyle = this._cssColor(fillColor);
|
| + this._context.save();
|
| + this._context.lineWidth = 0;
|
| + this._quadToPath(quad).fill();
|
| + this._context.globalCompositeOperation = 'destination-out';
|
| + this._context.fillStyle = 'red';
|
| + this._quadToPath(clipQuad).fill();
|
| + this._context.restore();
|
| + }
|
| +
|
| + _drawElementTitle() {
|
| + if (!this._node)
|
| + return;
|
| +
|
| + var canvasWidth = this._canvasElement.getBoundingClientRect().width;
|
| + var canvasHeight = this._canvasElement.getBoundingClientRect().height;
|
| +
|
| + var lowerCaseName = this._node.localName() || this._node.nodeName().toLowerCase();
|
| + this._tagNameElement.textContent = lowerCaseName;
|
| + this._nodeIdElement.textContent = this._node.getAttribute('id') ? '#' + this._node.getAttribute('id') : '';
|
| + this._nodeIdElement.textContent = this._node.getAttribute('id') ? '#' + this._node.getAttribute('id') : '';
|
| + var className = this._node.getAttribute('class');
|
| + if (className && className.length > 50)
|
| + className = className.substring(0, 50) + '\u2026';
|
| + this._classNameElement.textContent = className || '';
|
| + this._nodeWidthElement.textContent = this._model.width;
|
| + this._nodeHeightElement.textContent = this._model.height;
|
| +
|
| + this._titleElement.classList.remove('hidden');
|
| + var titleWidth = this._titleElement.offsetWidth + 6;
|
| + var titleHeight = this._titleElement.offsetHeight + 4;
|
| +
|
| + var anchorTop = this._model.margin[1];
|
| + var anchorBottom = this._model.margin[7];
|
| +
|
| + const arrowHeight = 7;
|
| + var renderArrowUp = false;
|
| + var renderArrowDown = false;
|
| +
|
| + var boxX = Math.max(2, this._model.margin[0]);
|
| + if (boxX + titleWidth > canvasWidth)
|
| + boxX = canvasWidth - titleWidth - 2;
|
| +
|
| + var boxY;
|
| + if (anchorTop > canvasHeight) {
|
| + boxY = canvasHeight - titleHeight - arrowHeight;
|
| + renderArrowDown = true;
|
| + } else if (anchorBottom < 0) {
|
| + boxY = arrowHeight;
|
| + renderArrowUp = true;
|
| + } else if (anchorBottom + titleHeight + arrowHeight < canvasHeight) {
|
| + boxY = anchorBottom + arrowHeight - 4;
|
| + renderArrowUp = true;
|
| + } else if (anchorTop - titleHeight - arrowHeight > 0) {
|
| + boxY = anchorTop - titleHeight - arrowHeight + 3;
|
| + renderArrowDown = true;
|
| + } else
|
| + boxY = arrowHeight;
|
| +
|
| + this._context.save();
|
| + this._context.translate(0.5, 0.5);
|
| + this._context.beginPath();
|
| + this._context.moveTo(boxX, boxY);
|
| + if (renderArrowUp) {
|
| + this._context.lineTo(boxX + 2 * arrowHeight, boxY);
|
| + this._context.lineTo(boxX + 3 * arrowHeight, boxY - arrowHeight);
|
| + this._context.lineTo(boxX + 4 * arrowHeight, boxY);
|
| + }
|
| + this._context.lineTo(boxX + titleWidth, boxY);
|
| + this._context.lineTo(boxX + titleWidth, boxY + titleHeight);
|
| + if (renderArrowDown) {
|
| + this._context.lineTo(boxX + 4 * arrowHeight, boxY + titleHeight);
|
| + this._context.lineTo(boxX + 3 * arrowHeight, boxY + titleHeight + arrowHeight);
|
| + this._context.lineTo(boxX + 2 * arrowHeight, boxY + titleHeight);
|
| + }
|
| + this._context.lineTo(boxX, boxY + titleHeight);
|
| + this._context.closePath();
|
| + this._context.fillStyle = 'rgb(255, 255, 194)';
|
| + this._context.fill();
|
| + this._context.strokeStyle = 'rgb(128, 128, 128)';
|
| + this._context.stroke();
|
| +
|
| + this._context.restore();
|
| +
|
| + this._titleElement.style.top = (boxY + 3) + 'px';
|
| + this._titleElement.style.left = (boxX + 3) + 'px';
|
| + }
|
| +
|
| + /**
|
| + * @return {!{width: number, height: number}}
|
| + */
|
| + _viewportDimensions() {
|
| + const gutterSize = 30;
|
| + const bordersSize = WebInspector.ScreencastView._bordersSize;
|
| + var width = this.element.offsetWidth - bordersSize - gutterSize;
|
| + var height = this.element.offsetHeight - bordersSize - gutterSize - WebInspector.ScreencastView._navBarHeight;
|
| + return {width: width, height: height};
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!DOMAgent.InspectMode} mode
|
| + * @param {!DOMAgent.HighlightConfig} config
|
| + * @param {function(?Protocol.Error)=} callback
|
| + */
|
| + setInspectMode(mode, config, callback) {
|
| + this._inspectModeConfig = mode !== DOMAgent.InspectMode.None ? config : null;
|
| + if (callback)
|
| + callback(null);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!PageAgent.FrameId} frameId
|
| + */
|
| + highlightFrame(frameId) {
|
| + }
|
| +
|
| + /**
|
| + * @param {!CanvasRenderingContext2D} context
|
| + */
|
| + _createCheckerboardPattern(context) {
|
| + var pattern = /** @type {!HTMLCanvasElement} */ (createElement('canvas'));
|
| + const size = 32;
|
| + pattern.width = size * 2;
|
| + pattern.height = size * 2;
|
| + var pctx = pattern.getContext('2d');
|
| +
|
| + pctx.fillStyle = 'rgb(195, 195, 195)';
|
| + pctx.fillRect(0, 0, size * 2, size * 2);
|
| +
|
| + pctx.fillStyle = 'rgb(225, 225, 225)';
|
| + pctx.fillRect(0, 0, size, size);
|
| + pctx.fillRect(size, size, size, size);
|
| + return context.createPattern(pattern, 'repeat');
|
| + }
|
| +
|
| + _createNavigationBar() {
|
| + this._navigationBar = this.element.createChild('div', 'screencast-navigation');
|
| +
|
| + this._navigationBack = this._navigationBar.createChild('button', 'back');
|
| + this._navigationBack.disabled = true;
|
| + this._navigationBack.addEventListener('click', this._navigateToHistoryEntry.bind(this, -1), false);
|
| +
|
| + this._navigationForward = this._navigationBar.createChild('button', 'forward');
|
| + this._navigationForward.disabled = true;
|
| + this._navigationForward.addEventListener('click', this._navigateToHistoryEntry.bind(this, 1), false);
|
| +
|
| + this._navigationReload = this._navigationBar.createChild('button', 'reload');
|
| + this._navigationReload.addEventListener('click', this._navigateReload.bind(this), false);
|
| +
|
| + this._navigationUrl = this._navigationBar.createChild('input');
|
| + this._navigationUrl.type = 'text';
|
| + this._navigationUrl.addEventListener('keyup', this._navigationUrlKeyUp.bind(this), true);
|
| +
|
| + this._navigationProgressBar =
|
| + new WebInspector.ScreencastView.ProgressTracker(this._navigationBar.createChild('div', 'progress'));
|
| +
|
| + this._requestNavigationHistory();
|
| + WebInspector.targetManager.addEventListener(
|
| + WebInspector.TargetManager.Events.InspectedURLChanged, this._requestNavigationHistory, this);
|
| + }
|
| +
|
| + _navigateToHistoryEntry(offset) {
|
| + var newIndex = this._historyIndex + offset;
|
| + if (newIndex < 0 || newIndex >= this._historyEntries.length)
|
| + return;
|
| + this._target.pageAgent().navigateToHistoryEntry(this._historyEntries[newIndex].id);
|
| + this._requestNavigationHistory();
|
| + }
|
| +
|
| + _navigateReload() {
|
| + this._resourceTreeModel.reloadPage();
|
| + }
|
| +
|
| + _navigationUrlKeyUp(event) {
|
| + if (event.key !== 'Enter')
|
| + return;
|
| + var url = this._navigationUrl.value;
|
| + if (!url)
|
| + return;
|
| + if (!url.match(WebInspector.ScreencastView._SchemeRegex))
|
| + url = 'http://' + url;
|
| + this._target.pageAgent().navigate(url);
|
| + this._canvasElement.focus();
|
| + }
|
| +
|
| + _requestNavigationHistory() {
|
| + this._target.pageAgent().getNavigationHistory(this._onNavigationHistory.bind(this));
|
| + }
|
| +
|
| + _onNavigationHistory(error, currentIndex, entries) {
|
| + if (error)
|
| + return;
|
| +
|
| + this._historyIndex = currentIndex;
|
| + this._historyEntries = entries;
|
| +
|
| + this._navigationBack.disabled = currentIndex === 0;
|
| + this._navigationForward.disabled = currentIndex === (entries.length - 1);
|
| +
|
| + var url = entries[currentIndex].url;
|
| + var match = url.match(WebInspector.ScreencastView._HttpRegex);
|
| + if (match)
|
| + url = match[1];
|
| + InspectorFrontendHost.inspectedURLChanged(url);
|
| + this._navigationUrl.value = url;
|
| + }
|
| +
|
| + _focusNavigationBar() {
|
| + this._navigationUrl.focus();
|
| + this._navigationUrl.select();
|
| + return true;
|
| + }
|
| +};
|
|
|
| - /**
|
| - * @return {!{width: number, height: number}}
|
| - */
|
| - _viewportDimensions: function()
|
| - {
|
| - const gutterSize = 30;
|
| - const bordersSize = WebInspector.ScreencastView._bordersSize;
|
| - var width = this.element.offsetWidth - bordersSize - gutterSize;
|
| - var height = this.element.offsetHeight - bordersSize - gutterSize - WebInspector.ScreencastView._navBarHeight;
|
| - return { width: width, height: height };
|
| - },
|
| +WebInspector.ScreencastView._bordersSize = 44;
|
|
|
| - /**
|
| - * @override
|
| - * @param {!DOMAgent.InspectMode} mode
|
| - * @param {!DOMAgent.HighlightConfig} config
|
| - * @param {function(?Protocol.Error)=} callback
|
| - */
|
| - setInspectMode: function(mode, config, callback)
|
| - {
|
| - this._inspectModeConfig = mode !== DOMAgent.InspectMode.None ? config : null;
|
| - if (callback)
|
| - callback(null);
|
| - },
|
| +WebInspector.ScreencastView._navBarHeight = 29;
|
|
|
| - /**
|
| - * @override
|
| - * @param {!PageAgent.FrameId} frameId
|
| - */
|
| - highlightFrame: function(frameId)
|
| - {
|
| - },
|
| +WebInspector.ScreencastView._HttpRegex = /^http:\/\/(.+)/;
|
|
|
| - /**
|
| - * @param {!CanvasRenderingContext2D} context
|
| - */
|
| - _createCheckerboardPattern: function(context)
|
| - {
|
| - var pattern = /** @type {!HTMLCanvasElement} */(createElement("canvas"));
|
| - const size = 32;
|
| - pattern.width = size * 2;
|
| - pattern.height = size * 2;
|
| - var pctx = pattern.getContext("2d");
|
| -
|
| - pctx.fillStyle = "rgb(195, 195, 195)";
|
| - pctx.fillRect(0, 0, size * 2, size * 2);
|
| -
|
| - pctx.fillStyle = "rgb(225, 225, 225)";
|
| - pctx.fillRect(0, 0, size, size);
|
| - pctx.fillRect(size, size, size, size);
|
| - return context.createPattern(pattern, "repeat");
|
| - },
|
| -
|
| - _createNavigationBar: function()
|
| - {
|
| - this._navigationBar = this.element.createChild("div", "screencast-navigation");
|
| -
|
| - this._navigationBack = this._navigationBar.createChild("button", "back");
|
| - this._navigationBack.disabled = true;
|
| - this._navigationBack.addEventListener("click", this._navigateToHistoryEntry.bind(this, -1), false);
|
| -
|
| - this._navigationForward = this._navigationBar.createChild("button", "forward");
|
| - this._navigationForward.disabled = true;
|
| - this._navigationForward.addEventListener("click", this._navigateToHistoryEntry.bind(this, 1), false);
|
| -
|
| - this._navigationReload = this._navigationBar.createChild("button", "reload");
|
| - this._navigationReload.addEventListener("click", this._navigateReload.bind(this), false);
|
| -
|
| - this._navigationUrl = this._navigationBar.createChild("input");
|
| - this._navigationUrl.type = "text";
|
| - this._navigationUrl.addEventListener("keyup", this._navigationUrlKeyUp.bind(this), true);
|
| -
|
| - this._navigationProgressBar = new WebInspector.ScreencastView.ProgressTracker(this._navigationBar.createChild("div", "progress"));
|
| -
|
| - this._requestNavigationHistory();
|
| - WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.InspectedURLChanged, this._requestNavigationHistory, this);
|
| - },
|
| -
|
| - _navigateToHistoryEntry: function(offset)
|
| - {
|
| - var newIndex = this._historyIndex + offset;
|
| - if (newIndex < 0 || newIndex >= this._historyEntries.length)
|
| - return;
|
| - this._target.pageAgent().navigateToHistoryEntry(this._historyEntries[newIndex].id);
|
| - this._requestNavigationHistory();
|
| - },
|
| -
|
| - _navigateReload: function()
|
| - {
|
| - this._resourceTreeModel.reloadPage();
|
| - },
|
| -
|
| - _navigationUrlKeyUp: function(event)
|
| - {
|
| - if (event.key !== "Enter")
|
| - return;
|
| - var url = this._navigationUrl.value;
|
| - if (!url)
|
| - return;
|
| - if (!url.match(WebInspector.ScreencastView._SchemeRegex))
|
| - url = "http://" + url;
|
| - this._target.pageAgent().navigate(url);
|
| - this._canvasElement.focus();
|
| - },
|
| -
|
| - _requestNavigationHistory: function()
|
| - {
|
| - this._target.pageAgent().getNavigationHistory(this._onNavigationHistory.bind(this));
|
| - },
|
| -
|
| - _onNavigationHistory: function(error, currentIndex, entries)
|
| - {
|
| - if (error)
|
| - return;
|
| -
|
| - this._historyIndex = currentIndex;
|
| - this._historyEntries = entries;
|
| -
|
| - this._navigationBack.disabled = currentIndex === 0;
|
| - this._navigationForward.disabled = currentIndex === (entries.length - 1);
|
| -
|
| - var url = entries[currentIndex].url;
|
| - var match = url.match(WebInspector.ScreencastView._HttpRegex);
|
| - if (match)
|
| - url = match[1];
|
| - InspectorFrontendHost.inspectedURLChanged(url);
|
| - this._navigationUrl.value = url;
|
| - },
|
| -
|
| - _focusNavigationBar: function()
|
| - {
|
| - this._navigationUrl.focus();
|
| - this._navigationUrl.select();
|
| - return true;
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| -};
|
| +WebInspector.ScreencastView._SchemeRegex = /^(https?|about|chrome):/;
|
|
|
| /**
|
| - * @param {!Element} element
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.ScreencastView.ProgressTracker = function(element)
|
| -{
|
| +WebInspector.ScreencastView.ProgressTracker = class {
|
| + /**
|
| + * @param {!Element} element
|
| + */
|
| + constructor(element) {
|
| this._element = element;
|
|
|
| - WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.Load, this._onLoad, this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestStarted, this._onRequestStarted, this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestFinished, this._onRequestFinished, this);
|
| -};
|
| -
|
| -WebInspector.ScreencastView.ProgressTracker.prototype = {
|
| - _onMainFrameNavigated: function()
|
| - {
|
| - this._requestIds = {};
|
| - this._startedRequests = 0;
|
| - this._finishedRequests = 0;
|
| - this._maxDisplayedProgress = 0;
|
| - this._updateProgress(0.1); // Display first 10% on navigation start.
|
| - },
|
| -
|
| - _onLoad: function()
|
| - {
|
| - delete this._requestIds;
|
| - this._updateProgress(1); // Display 100% progress on load, hide it in 0.5s.
|
| - setTimeout(function() {
|
| - if (!this._navigationProgressVisible())
|
| - this._displayProgress(0);
|
| - }.bind(this), 500);
|
| - },
|
| -
|
| - _navigationProgressVisible: function()
|
| - {
|
| - return !!this._requestIds;
|
| - },
|
| -
|
| - _onRequestStarted: function(event)
|
| - {
|
| - if (!this._navigationProgressVisible())
|
| - return;
|
| - var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| - // Ignore long-living WebSockets for the sake of progress indicator, as we won't be waiting them anyway.
|
| - if (request.type === WebInspector.resourceTypes.WebSocket)
|
| - return;
|
| - this._requestIds[request.requestId] = request;
|
| - ++this._startedRequests;
|
| - },
|
| -
|
| - _onRequestFinished: function(event)
|
| - {
|
| - if (!this._navigationProgressVisible())
|
| - return;
|
| - var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| - if (!(request.requestId in this._requestIds))
|
| - return;
|
| - ++this._finishedRequests;
|
| - setTimeout(function() {
|
| - this._updateProgress(this._finishedRequests / this._startedRequests * 0.9); // Finished requests drive the progress up to 90%.
|
| - }.bind(this), 500); // Delay to give the new requests time to start. This makes the progress smoother.
|
| - },
|
| -
|
| - _updateProgress: function(progress)
|
| - {
|
| - if (!this._navigationProgressVisible())
|
| - return;
|
| - if (this._maxDisplayedProgress >= progress)
|
| - return;
|
| - this._maxDisplayedProgress = progress;
|
| - this._displayProgress(progress);
|
| - },
|
| -
|
| - _displayProgress: function(progress)
|
| - {
|
| - this._element.style.width = (100 * progress) + "%";
|
| - }
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.MainFrameNavigated,
|
| + this._onMainFrameNavigated, this);
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.Load, this._onLoad, this);
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestStarted, this._onRequestStarted, this);
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestFinished, this._onRequestFinished, this);
|
| + }
|
| +
|
| + _onMainFrameNavigated() {
|
| + this._requestIds = {};
|
| + this._startedRequests = 0;
|
| + this._finishedRequests = 0;
|
| + this._maxDisplayedProgress = 0;
|
| + this._updateProgress(0.1); // Display first 10% on navigation start.
|
| + }
|
| +
|
| + _onLoad() {
|
| + delete this._requestIds;
|
| + this._updateProgress(1); // Display 100% progress on load, hide it in 0.5s.
|
| + setTimeout(function() {
|
| + if (!this._navigationProgressVisible())
|
| + this._displayProgress(0);
|
| + }.bind(this), 500);
|
| + }
|
| +
|
| + _navigationProgressVisible() {
|
| + return !!this._requestIds;
|
| + }
|
| +
|
| + _onRequestStarted(event) {
|
| + if (!this._navigationProgressVisible())
|
| + return;
|
| + var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| + // Ignore long-living WebSockets for the sake of progress indicator, as we won't be waiting them anyway.
|
| + if (request.type === WebInspector.resourceTypes.WebSocket)
|
| + return;
|
| + this._requestIds[request.requestId] = request;
|
| + ++this._startedRequests;
|
| + }
|
| +
|
| + _onRequestFinished(event) {
|
| + if (!this._navigationProgressVisible())
|
| + return;
|
| + var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| + if (!(request.requestId in this._requestIds))
|
| + return;
|
| + ++this._finishedRequests;
|
| + setTimeout(function() {
|
| + this._updateProgress(
|
| + this._finishedRequests / this._startedRequests * 0.9); // Finished requests drive the progress up to 90%.
|
| + }.bind(this), 500); // Delay to give the new requests time to start. This makes the progress smoother.
|
| + }
|
| +
|
| + _updateProgress(progress) {
|
| + if (!this._navigationProgressVisible())
|
| + return;
|
| + if (this._maxDisplayedProgress >= progress)
|
| + return;
|
| + this._maxDisplayedProgress = progress;
|
| + this._displayProgress(progress);
|
| + }
|
| +
|
| + _displayProgress(progress) {
|
| + this._element.style.width = (100 * progress) + '%';
|
| + }
|
| };
|
|
|