| Index: third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
|
| index 845ae7c8973a6e4c59b151a6bb52058008cb870e..391a4d6702b2513ed5ac61102be402f360e45e3f 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
|
| @@ -28,9 +28,8 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| -WebInspector.highlightedSearchResultClassName = "highlighted-search-result";
|
| -WebInspector.highlightedCurrentSearchResultClassName = "current-search-result";
|
| +WebInspector.highlightedSearchResultClassName = 'highlighted-search-result';
|
| +WebInspector.highlightedCurrentSearchResultClassName = 'current-search-result';
|
|
|
| /**
|
| * @param {!Element} element
|
| @@ -41,34 +40,33 @@ WebInspector.highlightedCurrentSearchResultClassName = "current-search-result";
|
| * @param {?string=} hoverCursor
|
| * @param {number=} startDelay
|
| */
|
| -WebInspector.installDragHandle = function(element, elementDragStart, elementDrag, elementDragEnd, cursor, hoverCursor, startDelay)
|
| -{
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - function onMouseDown(event)
|
| - {
|
| - var dragHandler = new WebInspector.DragHandler();
|
| - var dragStart = dragHandler.elementDragStart.bind(dragHandler, element, elementDragStart, elementDrag, elementDragEnd, cursor, event);
|
| - if (startDelay)
|
| - startTimer = setTimeout(dragStart, startDelay);
|
| - else
|
| - dragStart();
|
| - }
|
| -
|
| - function onMouseUp()
|
| - {
|
| - if (startTimer)
|
| - clearTimeout(startTimer);
|
| - startTimer = null;
|
| - }
|
| -
|
| - var startTimer;
|
| - element.addEventListener("mousedown", onMouseDown, false);
|
| +WebInspector.installDragHandle = function(
|
| + element, elementDragStart, elementDrag, elementDragEnd, cursor, hoverCursor, startDelay) {
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + function onMouseDown(event) {
|
| + var dragHandler = new WebInspector.DragHandler();
|
| + var dragStart = dragHandler.elementDragStart.bind(
|
| + dragHandler, element, elementDragStart, elementDrag, elementDragEnd, cursor, event);
|
| if (startDelay)
|
| - element.addEventListener("mouseup", onMouseUp, false);
|
| - if (hoverCursor !== null)
|
| - element.style.cursor = hoverCursor || cursor;
|
| + startTimer = setTimeout(dragStart, startDelay);
|
| + else
|
| + dragStart();
|
| + }
|
| +
|
| + function onMouseUp() {
|
| + if (startTimer)
|
| + clearTimeout(startTimer);
|
| + startTimer = null;
|
| + }
|
| +
|
| + var startTimer;
|
| + element.addEventListener('mousedown', onMouseDown, false);
|
| + if (startDelay)
|
| + element.addEventListener('mouseup', onMouseUp, false);
|
| + if (hoverCursor !== null)
|
| + element.style.cursor = hoverCursor || cursor;
|
| };
|
|
|
| /**
|
| @@ -79,165 +77,154 @@ WebInspector.installDragHandle = function(element, elementDragStart, elementDrag
|
| * @param {string} cursor
|
| * @param {!Event} event
|
| */
|
| -WebInspector.elementDragStart = function(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event)
|
| -{
|
| - var dragHandler = new WebInspector.DragHandler();
|
| - dragHandler.elementDragStart(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event);
|
| +WebInspector.elementDragStart = function(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event) {
|
| + var dragHandler = new WebInspector.DragHandler();
|
| + dragHandler.elementDragStart(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event);
|
| };
|
|
|
| /**
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.DragHandler = function()
|
| -{
|
| +WebInspector.DragHandler = class {
|
| + constructor() {
|
| this._elementDragMove = this._elementDragMove.bind(this);
|
| this._elementDragEnd = this._elementDragEnd.bind(this);
|
| this._mouseOutWhileDragging = this._mouseOutWhileDragging.bind(this);
|
| -};
|
| -
|
| -WebInspector.DragHandler._glassPaneUsageCount = 0;
|
| -
|
| -WebInspector.DragHandler.prototype = {
|
| - _createGlassPane: function()
|
| - {
|
| - this._glassPaneInUse = true;
|
| - if (!WebInspector.DragHandler._glassPaneUsageCount++)
|
| - WebInspector.DragHandler._glassPane = new WebInspector.GlassPane(WebInspector.DragHandler._documentForMouseOut);
|
| - },
|
| -
|
| - _disposeGlassPane: function()
|
| - {
|
| - if (!this._glassPaneInUse)
|
| - return;
|
| - this._glassPaneInUse = false;
|
| - if (--WebInspector.DragHandler._glassPaneUsageCount)
|
| - return;
|
| - WebInspector.DragHandler._glassPane.dispose();
|
| - delete WebInspector.DragHandler._glassPane;
|
| - delete WebInspector.DragHandler._documentForMouseOut;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * @param {!Element} targetElement
|
| - * @param {?function(!MouseEvent):boolean} elementDragStart
|
| - * @param {function(!MouseEvent)} elementDrag
|
| - * @param {?function(!MouseEvent)} elementDragEnd
|
| - * @param {string} cursor
|
| - * @param {!Event} event
|
| - */
|
| -WebInspector.DragHandler.prototype.elementDragStart = function(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event)
|
| -{
|
| + }
|
| +
|
| + _createGlassPane() {
|
| + this._glassPaneInUse = true;
|
| + if (!WebInspector.DragHandler._glassPaneUsageCount++)
|
| + WebInspector.DragHandler._glassPane = new WebInspector.GlassPane(WebInspector.DragHandler._documentForMouseOut);
|
| + }
|
| +
|
| + _disposeGlassPane() {
|
| + if (!this._glassPaneInUse)
|
| + return;
|
| + this._glassPaneInUse = false;
|
| + if (--WebInspector.DragHandler._glassPaneUsageCount)
|
| + return;
|
| + WebInspector.DragHandler._glassPane.dispose();
|
| + delete WebInspector.DragHandler._glassPane;
|
| + delete WebInspector.DragHandler._documentForMouseOut;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} targetElement
|
| + * @param {?function(!MouseEvent):boolean} elementDragStart
|
| + * @param {function(!MouseEvent)} elementDrag
|
| + * @param {?function(!MouseEvent)} elementDragEnd
|
| + * @param {string} cursor
|
| + * @param {!Event} event
|
| + */
|
| + elementDragStart(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event) {
|
| // Only drag upon left button. Right will likely cause a context menu. So will ctrl-click on mac.
|
| if (event.button || (WebInspector.isMac() && event.ctrlKey))
|
| - return;
|
| + return;
|
|
|
| if (this._elementDraggingEventListener)
|
| - return;
|
| + return;
|
|
|
| if (elementDragStart && !elementDragStart(/** @type {!MouseEvent} */ (event)))
|
| - return;
|
| + return;
|
|
|
| var targetDocument = event.target.ownerDocument;
|
| this._elementDraggingEventListener = elementDrag;
|
| this._elementEndDraggingEventListener = elementDragEnd;
|
| - console.assert((WebInspector.DragHandler._documentForMouseOut || targetDocument) === targetDocument,
|
| - "Dragging on multiple documents.");
|
| + console.assert(
|
| + (WebInspector.DragHandler._documentForMouseOut || targetDocument) === targetDocument,
|
| + 'Dragging on multiple documents.');
|
| WebInspector.DragHandler._documentForMouseOut = targetDocument;
|
| this._dragEventsTargetDocument = targetDocument;
|
| this._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document;
|
|
|
| - targetDocument.addEventListener("mousemove", this._elementDragMove, true);
|
| - targetDocument.addEventListener("mouseup", this._elementDragEnd, true);
|
| - targetDocument.addEventListener("mouseout", this._mouseOutWhileDragging, true);
|
| + targetDocument.addEventListener('mousemove', this._elementDragMove, true);
|
| + targetDocument.addEventListener('mouseup', this._elementDragEnd, true);
|
| + targetDocument.addEventListener('mouseout', this._mouseOutWhileDragging, true);
|
| if (targetDocument !== this._dragEventsTargetDocumentTop)
|
| - this._dragEventsTargetDocumentTop.addEventListener("mouseup", this._elementDragEnd, true);
|
| + this._dragEventsTargetDocumentTop.addEventListener('mouseup', this._elementDragEnd, true);
|
|
|
| - if (typeof cursor === "string") {
|
| - this._restoreCursorAfterDrag = restoreCursor.bind(this, targetElement.style.cursor);
|
| - targetElement.style.cursor = cursor;
|
| - targetDocument.body.style.cursor = cursor;
|
| + if (typeof cursor === 'string') {
|
| + this._restoreCursorAfterDrag = restoreCursor.bind(this, targetElement.style.cursor);
|
| + targetElement.style.cursor = cursor;
|
| + targetDocument.body.style.cursor = cursor;
|
| }
|
| /**
|
| * @param {string} oldCursor
|
| * @this {WebInspector.DragHandler}
|
| */
|
| - function restoreCursor(oldCursor)
|
| - {
|
| - targetDocument.body.style.removeProperty("cursor");
|
| - targetElement.style.cursor = oldCursor;
|
| - this._restoreCursorAfterDrag = null;
|
| + function restoreCursor(oldCursor) {
|
| + targetDocument.body.style.removeProperty('cursor');
|
| + targetElement.style.cursor = oldCursor;
|
| + this._restoreCursorAfterDrag = null;
|
| }
|
| event.preventDefault();
|
| -};
|
| + }
|
|
|
| -WebInspector.DragHandler.prototype._mouseOutWhileDragging = function()
|
| -{
|
| + _mouseOutWhileDragging() {
|
| this._unregisterMouseOutWhileDragging();
|
| this._createGlassPane();
|
| -};
|
| + }
|
|
|
| -WebInspector.DragHandler.prototype._unregisterMouseOutWhileDragging = function()
|
| -{
|
| + _unregisterMouseOutWhileDragging() {
|
| if (!WebInspector.DragHandler._documentForMouseOut)
|
| - return;
|
| - WebInspector.DragHandler._documentForMouseOut.removeEventListener("mouseout", this._mouseOutWhileDragging, true);
|
| -};
|
| + return;
|
| + WebInspector.DragHandler._documentForMouseOut.removeEventListener('mouseout', this._mouseOutWhileDragging, true);
|
| + }
|
|
|
| -WebInspector.DragHandler.prototype._unregisterDragEvents = function()
|
| -{
|
| + _unregisterDragEvents() {
|
| if (!this._dragEventsTargetDocument)
|
| - return;
|
| - this._dragEventsTargetDocument.removeEventListener("mousemove", this._elementDragMove, true);
|
| - this._dragEventsTargetDocument.removeEventListener("mouseup", this._elementDragEnd, true);
|
| + return;
|
| + this._dragEventsTargetDocument.removeEventListener('mousemove', this._elementDragMove, true);
|
| + this._dragEventsTargetDocument.removeEventListener('mouseup', this._elementDragEnd, true);
|
| if (this._dragEventsTargetDocument !== this._dragEventsTargetDocumentTop)
|
| - this._dragEventsTargetDocumentTop.removeEventListener("mouseup", this._elementDragEnd, true);
|
| + this._dragEventsTargetDocumentTop.removeEventListener('mouseup', this._elementDragEnd, true);
|
| delete this._dragEventsTargetDocument;
|
| delete this._dragEventsTargetDocumentTop;
|
| -};
|
| + }
|
|
|
| -/**
|
| - * @param {!Event} event
|
| - */
|
| -WebInspector.DragHandler.prototype._elementDragMove = function(event)
|
| -{
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _elementDragMove(event) {
|
| if (event.buttons !== 1) {
|
| - this._elementDragEnd(event);
|
| - return;
|
| + this._elementDragEnd(event);
|
| + return;
|
| }
|
| if (this._elementDraggingEventListener(/** @type {!MouseEvent} */ (event)))
|
| - this._cancelDragEvents(event);
|
| -};
|
| + this._cancelDragEvents(event);
|
| + }
|
|
|
| -/**
|
| - * @param {!Event} event
|
| - */
|
| -WebInspector.DragHandler.prototype._cancelDragEvents = function(event)
|
| -{
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _cancelDragEvents(event) {
|
| this._unregisterDragEvents();
|
| this._unregisterMouseOutWhileDragging();
|
|
|
| if (this._restoreCursorAfterDrag)
|
| - this._restoreCursorAfterDrag();
|
| + this._restoreCursorAfterDrag();
|
|
|
| this._disposeGlassPane();
|
|
|
| delete this._elementDraggingEventListener;
|
| delete this._elementEndDraggingEventListener;
|
| -};
|
| + }
|
|
|
| -/**
|
| - * @param {!Event} event
|
| - */
|
| -WebInspector.DragHandler.prototype._elementDragEnd = function(event)
|
| -{
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _elementDragEnd(event) {
|
| var elementDragEnd = this._elementEndDraggingEventListener;
|
| this._cancelDragEvents(/** @type {!MouseEvent} */ (event));
|
| event.preventDefault();
|
| if (elementDragEnd)
|
| - elementDragEnd(/** @type {!MouseEvent} */ (event));
|
| + elementDragEnd(/** @type {!MouseEvent} */ (event));
|
| + }
|
| };
|
|
|
| +WebInspector.DragHandler._glassPaneUsageCount = 0;
|
| +
|
| /**
|
| * @param {!Element} element
|
| * @param {function(number, number, !MouseEvent): boolean} elementDragStart
|
| @@ -248,93 +235,95 @@ WebInspector.DragHandler.prototype._elementDragEnd = function(event)
|
| * @param {number=} startDelay
|
| * @param {number=} friction
|
| */
|
| -WebInspector.installInertialDragHandle = function(element, elementDragStart, elementDrag, elementDragEnd, cursor, hoverCursor, startDelay, friction)
|
| -{
|
| - WebInspector.installDragHandle(element, drag.bind(null, elementDragStart), drag.bind(null, elementDrag), dragEnd, cursor, hoverCursor, startDelay);
|
| - if (typeof friction !== "number")
|
| - friction = 50;
|
| - var lastX;
|
| - var lastY;
|
| - var lastTime;
|
| - var velocityX;
|
| - var velocityY;
|
| - var holding = false;
|
| -
|
| - /**
|
| - * @param {function(number, number, !MouseEvent): boolean} callback
|
| - * @param {!MouseEvent} event
|
| - * @return {boolean}
|
| - */
|
| - function drag(callback, event)
|
| - {
|
| - lastTime = window.performance.now();
|
| - lastX = event.pageX;
|
| - lastY = event.pageY;
|
| - holding = true;
|
| - return callback(lastX, lastY, event);
|
| - }
|
| -
|
| - /**
|
| - * @param {!MouseEvent} event
|
| - */
|
| - function dragEnd(event)
|
| - {
|
| - var now = window.performance.now();
|
| - var duration = now - lastTime || 1;
|
| - const maxVelocity = 4; // 4px per millisecond.
|
| - velocityX = Number.constrain((event.pageX - lastX) / duration, -maxVelocity, maxVelocity);
|
| - velocityY = Number.constrain((event.pageY - lastY) / duration, -maxVelocity, maxVelocity);
|
| - lastX = event.pageX;
|
| - lastY = event.pageY;
|
| - lastTime = now;
|
| - holding = false;
|
| - animationStep();
|
| - }
|
| -
|
| - function animationStep()
|
| - {
|
| - var v2 = velocityX * velocityX + velocityY * velocityY;
|
| - if (v2 < 0.001 || holding) {
|
| - elementDragEnd(lastX, lastY);
|
| - return;
|
| - }
|
| - element.window().requestAnimationFrame(animationStep);
|
| - var now = window.performance.now();
|
| - var duration = now - lastTime;
|
| - if (!duration)
|
| - return;
|
| - lastTime = now;
|
| - lastX += velocityX * duration;
|
| - lastY += velocityY * duration;
|
| - var k = Math.pow(1 / (1 + friction), duration / 1000);
|
| - velocityX *= k;
|
| - velocityY *= k;
|
| - elementDrag(lastX, lastY);
|
| +WebInspector.installInertialDragHandle = function(
|
| + element, elementDragStart, elementDrag, elementDragEnd, cursor, hoverCursor, startDelay, friction) {
|
| + WebInspector.installDragHandle(
|
| + element, drag.bind(null, elementDragStart), drag.bind(null, elementDrag), dragEnd, cursor, hoverCursor,
|
| + startDelay);
|
| + if (typeof friction !== 'number')
|
| + friction = 50;
|
| + var lastX;
|
| + var lastY;
|
| + var lastTime;
|
| + var velocityX;
|
| + var velocityY;
|
| + var holding = false;
|
| +
|
| + /**
|
| + * @param {function(number, number, !MouseEvent): boolean} callback
|
| + * @param {!MouseEvent} event
|
| + * @return {boolean}
|
| + */
|
| + function drag(callback, event) {
|
| + lastTime = window.performance.now();
|
| + lastX = event.pageX;
|
| + lastY = event.pageY;
|
| + holding = true;
|
| + return callback(lastX, lastY, event);
|
| + }
|
| +
|
| + /**
|
| + * @param {!MouseEvent} event
|
| + */
|
| + function dragEnd(event) {
|
| + var now = window.performance.now();
|
| + var duration = now - lastTime || 1;
|
| + const maxVelocity = 4; // 4px per millisecond.
|
| + velocityX = Number.constrain((event.pageX - lastX) / duration, -maxVelocity, maxVelocity);
|
| + velocityY = Number.constrain((event.pageY - lastY) / duration, -maxVelocity, maxVelocity);
|
| + lastX = event.pageX;
|
| + lastY = event.pageY;
|
| + lastTime = now;
|
| + holding = false;
|
| + animationStep();
|
| + }
|
| +
|
| + function animationStep() {
|
| + var v2 = velocityX * velocityX + velocityY * velocityY;
|
| + if (v2 < 0.001 || holding) {
|
| + elementDragEnd(lastX, lastY);
|
| + return;
|
| }
|
| + element.window().requestAnimationFrame(animationStep);
|
| + var now = window.performance.now();
|
| + var duration = now - lastTime;
|
| + if (!duration)
|
| + return;
|
| + lastTime = now;
|
| + lastX += velocityX * duration;
|
| + lastY += velocityY * duration;
|
| + var k = Math.pow(1 / (1 + friction), duration / 1000);
|
| + velocityX *= k;
|
| + velocityY *= k;
|
| + elementDrag(lastX, lastY);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!Document} document
|
| - * @param {boolean=} dimmed
|
| + * @unrestricted
|
| */
|
| -WebInspector.GlassPane = function(document, dimmed)
|
| -{
|
| - this.element = createElement("div");
|
| - var background = dimmed ? "rgba(255, 255, 255, 0.5)" : "transparent";
|
| - this._zIndex = WebInspector._glassPane ? WebInspector._glassPane._zIndex + 1000 : 3000; // Deliberately starts with 3000 to hide other z-indexed elements below.
|
| - this.element.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;background-color:" + background + ";z-index:" + this._zIndex + ";overflow:hidden;";
|
| +WebInspector.GlassPane = class {
|
| + /**
|
| + * @param {!Document} document
|
| + * @param {boolean=} dimmed
|
| + */
|
| + constructor(document, dimmed) {
|
| + this.element = createElement('div');
|
| + var background = dimmed ? 'rgba(255, 255, 255, 0.5)' : 'transparent';
|
| + this._zIndex = WebInspector._glassPane ?
|
| + WebInspector._glassPane._zIndex + 1000 :
|
| + 3000; // Deliberately starts with 3000 to hide other z-indexed elements below.
|
| + this.element.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;background-color:' + background +
|
| + ';z-index:' + this._zIndex + ';overflow:hidden;';
|
| document.body.appendChild(this.element);
|
| WebInspector._glassPane = this;
|
| // TODO(dgozman): disallow focus outside of glass pane?
|
| -};
|
| + }
|
|
|
| -WebInspector.GlassPane.prototype = {
|
| - dispose: function()
|
| - {
|
| - delete WebInspector._glassPane;
|
| - this.element.remove();
|
| - }
|
| + dispose() {
|
| + delete WebInspector._glassPane;
|
| + this.element.remove();
|
| + }
|
| };
|
|
|
| /** @type {!WebInspector.GlassPane|undefined} */
|
| @@ -344,38 +333,36 @@ WebInspector._glassPane;
|
| * @param {?Node=} node
|
| * @return {boolean}
|
| */
|
| -WebInspector.isBeingEdited = function(node)
|
| -{
|
| - if (!node || node.nodeType !== Node.ELEMENT_NODE)
|
| - return false;
|
| - var element = /** {!Element} */ (node);
|
| - if (element.classList.contains("text-prompt") || element.nodeName === "INPUT" || element.nodeName === "TEXTAREA")
|
| - return true;
|
| -
|
| - if (!WebInspector.__editingCount)
|
| - return false;
|
| -
|
| - while (element) {
|
| - if (element.__editing)
|
| - return true;
|
| - element = element.parentElementOrShadowHost();
|
| - }
|
| +WebInspector.isBeingEdited = function(node) {
|
| + if (!node || node.nodeType !== Node.ELEMENT_NODE)
|
| + return false;
|
| + var element = /** {!Element} */ (node);
|
| + if (element.classList.contains('text-prompt') || element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA')
|
| + return true;
|
| +
|
| + if (!WebInspector.__editingCount)
|
| return false;
|
| +
|
| + while (element) {
|
| + if (element.__editing)
|
| + return true;
|
| + element = element.parentElementOrShadowHost();
|
| + }
|
| + return false;
|
| };
|
|
|
| /**
|
| * @return {boolean}
|
| * @suppressGlobalPropertiesCheck
|
| */
|
| -WebInspector.isEditing = function()
|
| -{
|
| - if (WebInspector.__editingCount)
|
| - return true;
|
| -
|
| - var focused = document.deepActiveElement();
|
| - if (!focused)
|
| - return false;
|
| - return focused.classList.contains("text-prompt") || focused.nodeName === "INPUT" || focused.nodeName === "TEXTAREA";
|
| +WebInspector.isEditing = function() {
|
| + if (WebInspector.__editingCount)
|
| + return true;
|
| +
|
| + var focused = document.deepActiveElement();
|
| + if (!focused)
|
| + return false;
|
| + return focused.classList.contains('text-prompt') || focused.nodeName === 'INPUT' || focused.nodeName === 'TEXTAREA';
|
| };
|
|
|
| /**
|
| @@ -383,49 +370,46 @@ WebInspector.isEditing = function()
|
| * @param {boolean} value
|
| * @return {boolean}
|
| */
|
| -WebInspector.markBeingEdited = function(element, value)
|
| -{
|
| - if (value) {
|
| - if (element.__editing)
|
| - return false;
|
| - element.classList.add("being-edited");
|
| - element.__editing = true;
|
| - WebInspector.__editingCount = (WebInspector.__editingCount || 0) + 1;
|
| - } else {
|
| - if (!element.__editing)
|
| - return false;
|
| - element.classList.remove("being-edited");
|
| - delete element.__editing;
|
| - --WebInspector.__editingCount;
|
| - }
|
| - return true;
|
| +WebInspector.markBeingEdited = function(element, value) {
|
| + if (value) {
|
| + if (element.__editing)
|
| + return false;
|
| + element.classList.add('being-edited');
|
| + element.__editing = true;
|
| + WebInspector.__editingCount = (WebInspector.__editingCount || 0) + 1;
|
| + } else {
|
| + if (!element.__editing)
|
| + return false;
|
| + element.classList.remove('being-edited');
|
| + delete element.__editing;
|
| + --WebInspector.__editingCount;
|
| + }
|
| + return true;
|
| };
|
|
|
| WebInspector.CSSNumberRegex = /^(-?(?:\d+(?:\.\d+)?|\.\d+))$/;
|
|
|
| -WebInspector.StyleValueDelimiters = " \xA0\t\n\"':;,/()";
|
| -
|
| +WebInspector.StyleValueDelimiters = ' \xA0\t\n"\':;,/()';
|
|
|
| /**
|
| * @param {!Event} event
|
| * @return {?string}
|
| */
|
| -WebInspector._valueModificationDirection = function(event)
|
| -{
|
| - var direction = null;
|
| - if (event.type === "mousewheel") {
|
| - // When shift is pressed while spinning mousewheel, delta comes as wheelDeltaX.
|
| - if (event.wheelDeltaY > 0 || event.wheelDeltaX > 0)
|
| - direction = "Up";
|
| - else if (event.wheelDeltaY < 0 || event.wheelDeltaX < 0)
|
| - direction = "Down";
|
| - } else {
|
| - if (event.key === "ArrowUp" || event.key === "PageUp")
|
| - direction = "Up";
|
| - else if (event.key === "ArrowDown" || event.key === "PageDown")
|
| - direction = "Down";
|
| - }
|
| - return direction;
|
| +WebInspector._valueModificationDirection = function(event) {
|
| + var direction = null;
|
| + if (event.type === 'mousewheel') {
|
| + // When shift is pressed while spinning mousewheel, delta comes as wheelDeltaX.
|
| + if (event.wheelDeltaY > 0 || event.wheelDeltaX > 0)
|
| + direction = 'Up';
|
| + else if (event.wheelDeltaY < 0 || event.wheelDeltaX < 0)
|
| + direction = 'Down';
|
| + } else {
|
| + if (event.key === 'ArrowUp' || event.key === 'PageUp')
|
| + direction = 'Up';
|
| + else if (event.key === 'ArrowDown' || event.key === 'PageDown')
|
| + direction = 'Down';
|
| + }
|
| + return direction;
|
| };
|
|
|
| /**
|
| @@ -433,51 +417,50 @@ WebInspector._valueModificationDirection = function(event)
|
| * @param {!Event} event
|
| * @return {?string}
|
| */
|
| -WebInspector._modifiedHexValue = function(hexString, event)
|
| -{
|
| - var direction = WebInspector._valueModificationDirection(event);
|
| - if (!direction)
|
| - return null;
|
| -
|
| - var mouseEvent = /** @type {!MouseEvent} */(event);
|
| - var number = parseInt(hexString, 16);
|
| - if (isNaN(number) || !isFinite(number))
|
| - return null;
|
| -
|
| - var hexStrLen = hexString.length;
|
| - var channelLen = hexStrLen / 3;
|
| -
|
| - // Colors are either rgb or rrggbb.
|
| - if (channelLen !== 1 && channelLen !== 2)
|
| - return null;
|
| -
|
| - // Precision modifier keys work with both mousewheel and up/down keys.
|
| - // When ctrl is pressed, increase R by 1.
|
| - // When shift is pressed, increase G by 1.
|
| - // When alt is pressed, increase B by 1.
|
| - // If no shortcut keys are pressed then increase hex value by 1.
|
| - // Keys can be pressed together to increase RGB channels. e.g trying different shades.
|
| - var delta = 0;
|
| - if (WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(mouseEvent))
|
| - delta += Math.pow(16, channelLen * 2);
|
| - if (mouseEvent.shiftKey)
|
| - delta += Math.pow(16, channelLen);
|
| - if (mouseEvent.altKey)
|
| - delta += 1;
|
| - if (delta === 0)
|
| - delta = 1;
|
| - if (direction === "Down")
|
| - delta *= -1;
|
| -
|
| - // Increase hex value by 1 and clamp from 0 ... maxValue.
|
| - var maxValue = Math.pow(16, hexStrLen) - 1;
|
| - var result = Number.constrain(number + delta, 0, maxValue);
|
| -
|
| - // Ensure the result length is the same as the original hex value.
|
| - var resultString = result.toString(16).toUpperCase();
|
| - for (var i = 0, lengthDelta = hexStrLen - resultString.length; i < lengthDelta; ++i)
|
| - resultString = "0" + resultString;
|
| - return resultString;
|
| +WebInspector._modifiedHexValue = function(hexString, event) {
|
| + var direction = WebInspector._valueModificationDirection(event);
|
| + if (!direction)
|
| + return null;
|
| +
|
| + var mouseEvent = /** @type {!MouseEvent} */ (event);
|
| + var number = parseInt(hexString, 16);
|
| + if (isNaN(number) || !isFinite(number))
|
| + return null;
|
| +
|
| + var hexStrLen = hexString.length;
|
| + var channelLen = hexStrLen / 3;
|
| +
|
| + // Colors are either rgb or rrggbb.
|
| + if (channelLen !== 1 && channelLen !== 2)
|
| + return null;
|
| +
|
| + // Precision modifier keys work with both mousewheel and up/down keys.
|
| + // When ctrl is pressed, increase R by 1.
|
| + // When shift is pressed, increase G by 1.
|
| + // When alt is pressed, increase B by 1.
|
| + // If no shortcut keys are pressed then increase hex value by 1.
|
| + // Keys can be pressed together to increase RGB channels. e.g trying different shades.
|
| + var delta = 0;
|
| + if (WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(mouseEvent))
|
| + delta += Math.pow(16, channelLen * 2);
|
| + if (mouseEvent.shiftKey)
|
| + delta += Math.pow(16, channelLen);
|
| + if (mouseEvent.altKey)
|
| + delta += 1;
|
| + if (delta === 0)
|
| + delta = 1;
|
| + if (direction === 'Down')
|
| + delta *= -1;
|
| +
|
| + // Increase hex value by 1 and clamp from 0 ... maxValue.
|
| + var maxValue = Math.pow(16, hexStrLen) - 1;
|
| + var result = Number.constrain(number + delta, 0, maxValue);
|
| +
|
| + // Ensure the result length is the same as the original hex value.
|
| + var resultString = result.toString(16).toUpperCase();
|
| + for (var i = 0, lengthDelta = hexStrLen - resultString.length; i < lengthDelta; ++i)
|
| + resultString = '0' + resultString;
|
| + return resultString;
|
| };
|
|
|
| /**
|
| @@ -485,37 +468,36 @@ WebInspector._modifiedHexValue = function(hexString, event)
|
| * @param {!Event} event
|
| * @return {?number}
|
| */
|
| -WebInspector._modifiedFloatNumber = function(number, event)
|
| -{
|
| - var direction = WebInspector._valueModificationDirection(event);
|
| - if (!direction)
|
| - return null;
|
| -
|
| - var mouseEvent = /** @type {!MouseEvent} */(event);
|
| -
|
| - // Precision modifier keys work with both mousewheel and up/down keys.
|
| - // When ctrl is pressed, increase by 100.
|
| - // When shift is pressed, increase by 10.
|
| - // When alt is pressed, increase by 0.1.
|
| - // Otherwise increase by 1.
|
| - var delta = 1;
|
| - if (WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(mouseEvent))
|
| - delta = 100;
|
| - else if (mouseEvent.shiftKey)
|
| - delta = 10;
|
| - else if (mouseEvent.altKey)
|
| - delta = 0.1;
|
| -
|
| - if (direction === "Down")
|
| - delta *= -1;
|
| -
|
| - // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
|
| - // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
|
| - var result = Number((number + delta).toFixed(6));
|
| - if (!String(result).match(WebInspector.CSSNumberRegex))
|
| - return null;
|
| -
|
| - return result;
|
| +WebInspector._modifiedFloatNumber = function(number, event) {
|
| + var direction = WebInspector._valueModificationDirection(event);
|
| + if (!direction)
|
| + return null;
|
| +
|
| + var mouseEvent = /** @type {!MouseEvent} */ (event);
|
| +
|
| + // Precision modifier keys work with both mousewheel and up/down keys.
|
| + // When ctrl is pressed, increase by 100.
|
| + // When shift is pressed, increase by 10.
|
| + // When alt is pressed, increase by 0.1.
|
| + // Otherwise increase by 1.
|
| + var delta = 1;
|
| + if (WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(mouseEvent))
|
| + delta = 100;
|
| + else if (mouseEvent.shiftKey)
|
| + delta = 10;
|
| + else if (mouseEvent.altKey)
|
| + delta = 0.1;
|
| +
|
| + if (direction === 'Down')
|
| + delta *= -1;
|
| +
|
| + // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
|
| + // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
|
| + var result = Number((number + delta).toFixed(6));
|
| + if (!String(result).match(WebInspector.CSSNumberRegex))
|
| + return null;
|
| +
|
| + return result;
|
| };
|
|
|
| /**
|
| @@ -524,30 +506,30 @@ WebInspector._modifiedFloatNumber = function(number, event)
|
| * @param {function(string, number, string):string=} customNumberHandler
|
| * @return {?string}
|
| */
|
| -WebInspector.createReplacementString = function(wordString, event, customNumberHandler)
|
| -{
|
| - var prefix;
|
| - var suffix;
|
| - var number;
|
| - var replacementString = null;
|
| - var matches = /(.*#)([\da-fA-F]+)(.*)/.exec(wordString);
|
| +WebInspector.createReplacementString = function(wordString, event, customNumberHandler) {
|
| + var prefix;
|
| + var suffix;
|
| + var number;
|
| + var replacementString = null;
|
| + var matches = /(.*#)([\da-fA-F]+)(.*)/.exec(wordString);
|
| + if (matches && matches.length) {
|
| + prefix = matches[1];
|
| + suffix = matches[3];
|
| + number = WebInspector._modifiedHexValue(matches[2], event);
|
| + if (number !== null)
|
| + replacementString = prefix + number + suffix;
|
| + } else {
|
| + matches = /(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/.exec(wordString);
|
| if (matches && matches.length) {
|
| - prefix = matches[1];
|
| - suffix = matches[3];
|
| - number = WebInspector._modifiedHexValue(matches[2], event);
|
| - if (number !== null)
|
| - replacementString = prefix + number + suffix;
|
| - } else {
|
| - matches = /(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/.exec(wordString);
|
| - if (matches && matches.length) {
|
| - prefix = matches[1];
|
| - suffix = matches[3];
|
| - number = WebInspector._modifiedFloatNumber(parseFloat(matches[2]), event);
|
| - if (number !== null)
|
| - replacementString = customNumberHandler ? customNumberHandler(prefix, number, suffix) : prefix + number + suffix;
|
| - }
|
| + prefix = matches[1];
|
| + suffix = matches[3];
|
| + number = WebInspector._modifiedFloatNumber(parseFloat(matches[2]), event);
|
| + if (number !== null)
|
| + replacementString =
|
| + customNumberHandler ? customNumberHandler(prefix, number, suffix) : prefix + number + suffix;
|
| }
|
| - return replacementString;
|
| + }
|
| + return replacementString;
|
| };
|
|
|
| /**
|
| @@ -558,61 +540,61 @@ WebInspector.createReplacementString = function(wordString, event, customNumberH
|
| * @param {function(string, number, string):string=} customNumberHandler
|
| * @return {boolean}
|
| */
|
| -WebInspector.handleElementValueModifications = function(event, element, finishHandler, suggestionHandler, customNumberHandler)
|
| -{
|
| - /**
|
| - * @return {?Range}
|
| - * @suppressGlobalPropertiesCheck
|
| - */
|
| - function createRange()
|
| - {
|
| - return document.createRange();
|
| - }
|
| -
|
| - var arrowKeyOrMouseWheelEvent = (event.key === "ArrowUp" || event.key === "ArrowDown" || event.type === "mousewheel");
|
| - var pageKeyPressed = (event.key === "PageUp" || event.key === "PageDown");
|
| - if (!arrowKeyOrMouseWheelEvent && !pageKeyPressed)
|
| - return false;
|
| +WebInspector.handleElementValueModifications = function(
|
| + event, element, finishHandler, suggestionHandler, customNumberHandler) {
|
| + /**
|
| + * @return {?Range}
|
| + * @suppressGlobalPropertiesCheck
|
| + */
|
| + function createRange() {
|
| + return document.createRange();
|
| + }
|
| +
|
| + var arrowKeyOrMouseWheelEvent = (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.type === 'mousewheel');
|
| + var pageKeyPressed = (event.key === 'PageUp' || event.key === 'PageDown');
|
| + if (!arrowKeyOrMouseWheelEvent && !pageKeyPressed)
|
| + return false;
|
|
|
| - var selection = element.getComponentSelection();
|
| - if (!selection.rangeCount)
|
| - return false;
|
| + var selection = element.getComponentSelection();
|
| + if (!selection.rangeCount)
|
| + return false;
|
|
|
| - var selectionRange = selection.getRangeAt(0);
|
| - if (!selectionRange.commonAncestorContainer.isSelfOrDescendant(element))
|
| - return false;
|
| + var selectionRange = selection.getRangeAt(0);
|
| + if (!selectionRange.commonAncestorContainer.isSelfOrDescendant(element))
|
| + return false;
|
|
|
| - var originalValue = element.textContent;
|
| - var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, WebInspector.StyleValueDelimiters, element);
|
| - var wordString = wordRange.toString();
|
| + var originalValue = element.textContent;
|
| + var wordRange =
|
| + selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, WebInspector.StyleValueDelimiters, element);
|
| + var wordString = wordRange.toString();
|
|
|
| - if (suggestionHandler && suggestionHandler(wordString))
|
| - return false;
|
| + if (suggestionHandler && suggestionHandler(wordString))
|
| + return false;
|
|
|
| - var replacementString = WebInspector.createReplacementString(wordString, event, customNumberHandler);
|
| + var replacementString = WebInspector.createReplacementString(wordString, event, customNumberHandler);
|
|
|
| - if (replacementString) {
|
| - var replacementTextNode = createTextNode(replacementString);
|
| + if (replacementString) {
|
| + var replacementTextNode = createTextNode(replacementString);
|
|
|
| - wordRange.deleteContents();
|
| - wordRange.insertNode(replacementTextNode);
|
| + wordRange.deleteContents();
|
| + wordRange.insertNode(replacementTextNode);
|
|
|
| - var finalSelectionRange = createRange();
|
| - finalSelectionRange.setStart(replacementTextNode, 0);
|
| - finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
|
| + var finalSelectionRange = createRange();
|
| + finalSelectionRange.setStart(replacementTextNode, 0);
|
| + finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
|
|
|
| - selection.removeAllRanges();
|
| - selection.addRange(finalSelectionRange);
|
| + selection.removeAllRanges();
|
| + selection.addRange(finalSelectionRange);
|
|
|
| - event.handled = true;
|
| - event.preventDefault();
|
| + event.handled = true;
|
| + event.preventDefault();
|
|
|
| - if (finishHandler)
|
| - finishHandler(originalValue, replacementString);
|
| + if (finishHandler)
|
| + finishHandler(originalValue, replacementString);
|
|
|
| - return true;
|
| - }
|
| - return false;
|
| + return true;
|
| + }
|
| + return false;
|
| };
|
|
|
| /**
|
| @@ -620,68 +602,66 @@ WebInspector.handleElementValueModifications = function(event, element, finishHa
|
| * @param {number=} precision
|
| * @return {string}
|
| */
|
| -Number.preciseMillisToString = function(ms, precision)
|
| -{
|
| - precision = precision || 0;
|
| - var format = "%." + precision + "f\u2009ms";
|
| - return WebInspector.UIString(format, ms);
|
| +Number.preciseMillisToString = function(ms, precision) {
|
| + precision = precision || 0;
|
| + var format = '%.' + precision + 'f\u2009ms';
|
| + return WebInspector.UIString(format, ms);
|
| };
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._microsFormat = new WebInspector.UIStringFormat("%.0f\u2009\u03bcs");
|
| +WebInspector._microsFormat = new WebInspector.UIStringFormat('%.0f\u2009\u03bcs');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._subMillisFormat = new WebInspector.UIStringFormat("%.2f\u2009ms");
|
| +WebInspector._subMillisFormat = new WebInspector.UIStringFormat('%.2f\u2009ms');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._millisFormat = new WebInspector.UIStringFormat("%.0f\u2009ms");
|
| +WebInspector._millisFormat = new WebInspector.UIStringFormat('%.0f\u2009ms');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._secondsFormat = new WebInspector.UIStringFormat("%.2f\u2009s");
|
| +WebInspector._secondsFormat = new WebInspector.UIStringFormat('%.2f\u2009s');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._minutesFormat = new WebInspector.UIStringFormat("%.1f\u2009min");
|
| +WebInspector._minutesFormat = new WebInspector.UIStringFormat('%.1f\u2009min');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._hoursFormat = new WebInspector.UIStringFormat("%.1f\u2009hrs");
|
| +WebInspector._hoursFormat = new WebInspector.UIStringFormat('%.1f\u2009hrs');
|
|
|
| /** @type {!WebInspector.UIStringFormat} */
|
| -WebInspector._daysFormat = new WebInspector.UIStringFormat("%.1f\u2009days");
|
| +WebInspector._daysFormat = new WebInspector.UIStringFormat('%.1f\u2009days');
|
|
|
| /**
|
| * @param {number} ms
|
| * @param {boolean=} higherResolution
|
| * @return {string}
|
| */
|
| -Number.millisToString = function(ms, higherResolution)
|
| -{
|
| - if (!isFinite(ms))
|
| - return "-";
|
| -
|
| - if (ms === 0)
|
| - return "0";
|
| -
|
| - if (higherResolution && ms < 0.1)
|
| - return WebInspector._microsFormat.format(ms * 1000);
|
| - if (higherResolution && ms < 1000)
|
| - return WebInspector._subMillisFormat.format(ms);
|
| - if (ms < 1000)
|
| - return WebInspector._millisFormat.format(ms);
|
| -
|
| - var seconds = ms / 1000;
|
| - if (seconds < 60)
|
| - return WebInspector._secondsFormat.format(seconds);
|
| -
|
| - var minutes = seconds / 60;
|
| - if (minutes < 60)
|
| - return WebInspector._minutesFormat.format(minutes);
|
| -
|
| - var hours = minutes / 60;
|
| - if (hours < 24)
|
| - return WebInspector._hoursFormat.format(hours);
|
| -
|
| - var days = hours / 24;
|
| - return WebInspector._daysFormat.format(days);
|
| +Number.millisToString = function(ms, higherResolution) {
|
| + if (!isFinite(ms))
|
| + return '-';
|
| +
|
| + if (ms === 0)
|
| + return '0';
|
| +
|
| + if (higherResolution && ms < 0.1)
|
| + return WebInspector._microsFormat.format(ms * 1000);
|
| + if (higherResolution && ms < 1000)
|
| + return WebInspector._subMillisFormat.format(ms);
|
| + if (ms < 1000)
|
| + return WebInspector._millisFormat.format(ms);
|
| +
|
| + var seconds = ms / 1000;
|
| + if (seconds < 60)
|
| + return WebInspector._secondsFormat.format(seconds);
|
| +
|
| + var minutes = seconds / 60;
|
| + if (minutes < 60)
|
| + return WebInspector._minutesFormat.format(minutes);
|
| +
|
| + var hours = minutes / 60;
|
| + if (hours < 24)
|
| + return WebInspector._hoursFormat.format(hours);
|
| +
|
| + var days = hours / 24;
|
| + return WebInspector._daysFormat.format(days);
|
| };
|
|
|
| /**
|
| @@ -689,46 +669,43 @@ Number.millisToString = function(ms, higherResolution)
|
| * @param {boolean=} higherResolution
|
| * @return {string}
|
| */
|
| -Number.secondsToString = function(seconds, higherResolution)
|
| -{
|
| - if (!isFinite(seconds))
|
| - return "-";
|
| - return Number.millisToString(seconds * 1000, higherResolution);
|
| +Number.secondsToString = function(seconds, higherResolution) {
|
| + if (!isFinite(seconds))
|
| + return '-';
|
| + return Number.millisToString(seconds * 1000, higherResolution);
|
| };
|
|
|
| /**
|
| * @param {number} bytes
|
| * @return {string}
|
| */
|
| -Number.bytesToString = function(bytes)
|
| -{
|
| - if (bytes < 1024)
|
| - return WebInspector.UIString("%.0f\u2009B", bytes);
|
| -
|
| - var kilobytes = bytes / 1024;
|
| - if (kilobytes < 100)
|
| - return WebInspector.UIString("%.1f\u2009KB", kilobytes);
|
| - if (kilobytes < 1024)
|
| - return WebInspector.UIString("%.0f\u2009KB", kilobytes);
|
| -
|
| - var megabytes = kilobytes / 1024;
|
| - if (megabytes < 100)
|
| - return WebInspector.UIString("%.1f\u2009MB", megabytes);
|
| - else
|
| - return WebInspector.UIString("%.0f\u2009MB", megabytes);
|
| +Number.bytesToString = function(bytes) {
|
| + if (bytes < 1024)
|
| + return WebInspector.UIString('%.0f\u2009B', bytes);
|
| +
|
| + var kilobytes = bytes / 1024;
|
| + if (kilobytes < 100)
|
| + return WebInspector.UIString('%.1f\u2009KB', kilobytes);
|
| + if (kilobytes < 1024)
|
| + return WebInspector.UIString('%.0f\u2009KB', kilobytes);
|
| +
|
| + var megabytes = kilobytes / 1024;
|
| + if (megabytes < 100)
|
| + return WebInspector.UIString('%.1f\u2009MB', megabytes);
|
| + else
|
| + return WebInspector.UIString('%.0f\u2009MB', megabytes);
|
| };
|
|
|
| /**
|
| * @param {number} num
|
| * @return {string}
|
| */
|
| -Number.withThousandsSeparator = function(num)
|
| -{
|
| - var str = num + "";
|
| - var re = /(\d+)(\d{3})/;
|
| - while (str.match(re))
|
| - str = str.replace(re, "$1\u2009$2"); // \u2009 is a thin space.
|
| - return str;
|
| +Number.withThousandsSeparator = function(num) {
|
| + var str = num + '';
|
| + var re = /(\d+)(\d{3})/;
|
| + while (str.match(re))
|
| + str = str.replace(re, '$1\u2009$2'); // \u2009 is a thin space.
|
| + return str;
|
| };
|
|
|
| /**
|
| @@ -736,67 +713,59 @@ Number.withThousandsSeparator = function(num)
|
| * @param {?ArrayLike} substitutions
|
| * @return {!Element}
|
| */
|
| -WebInspector.formatLocalized = function(format, substitutions)
|
| -{
|
| - var formatters = {
|
| - s: substitution => substitution
|
| - };
|
| - /**
|
| - * @param {!Element} a
|
| - * @param {string|!Element} b
|
| - * @return {!Element}
|
| - */
|
| - function append(a, b)
|
| - {
|
| - a.appendChild(typeof b === "string" ? createTextNode(b) : b);
|
| - return a;
|
| - }
|
| - return String.format(WebInspector.UIString(format), substitutions, formatters, createElement("span"), append).formattedResult;
|
| +WebInspector.formatLocalized = function(format, substitutions) {
|
| + var formatters = {s: substitution => substitution};
|
| + /**
|
| + * @param {!Element} a
|
| + * @param {string|!Element} b
|
| + * @return {!Element}
|
| + */
|
| + function append(a, b) {
|
| + a.appendChild(typeof b === 'string' ? createTextNode(b) : b);
|
| + return a;
|
| + }
|
| + return String.format(WebInspector.UIString(format), substitutions, formatters, createElement('span'), append)
|
| + .formattedResult;
|
| };
|
|
|
| /**
|
| * @return {string}
|
| */
|
| -WebInspector.openLinkExternallyLabel = function()
|
| -{
|
| - return WebInspector.UIString.capitalize("Open ^link in ^new ^tab");
|
| +WebInspector.openLinkExternallyLabel = function() {
|
| + return WebInspector.UIString.capitalize('Open ^link in ^new ^tab');
|
| };
|
|
|
| /**
|
| * @return {string}
|
| */
|
| -WebInspector.copyLinkAddressLabel = function()
|
| -{
|
| - return WebInspector.UIString.capitalize("Copy ^link ^address");
|
| +WebInspector.copyLinkAddressLabel = function() {
|
| + return WebInspector.UIString.capitalize('Copy ^link ^address');
|
| };
|
|
|
| /**
|
| * @return {string}
|
| */
|
| -WebInspector.anotherProfilerActiveLabel = function()
|
| -{
|
| - return WebInspector.UIString("Another profiler is already active");
|
| +WebInspector.anotherProfilerActiveLabel = function() {
|
| + return WebInspector.UIString('Another profiler is already active');
|
| };
|
|
|
| /**
|
| * @param {string|undefined} description
|
| * @return {string}
|
| */
|
| -WebInspector.asyncStackTraceLabel = function(description)
|
| -{
|
| - if (description)
|
| - return description + " " + WebInspector.UIString("(async)");
|
| - return WebInspector.UIString("Async Call");
|
| +WebInspector.asyncStackTraceLabel = function(description) {
|
| + if (description)
|
| + return description + ' ' + WebInspector.UIString('(async)');
|
| + return WebInspector.UIString('Async Call');
|
| };
|
|
|
| /**
|
| * @param {!Element} element
|
| */
|
| -WebInspector.installComponentRootStyles = function(element)
|
| -{
|
| - WebInspector.appendStyle(element, "ui/inspectorCommon.css");
|
| - WebInspector.themeSupport.injectHighlightStyleSheets(element);
|
| - element.classList.add("platform-" + WebInspector.platform());
|
| +WebInspector.installComponentRootStyles = function(element) {
|
| + WebInspector.appendStyle(element, 'ui/inspectorCommon.css');
|
| + WebInspector.themeSupport.injectHighlightStyleSheets(element);
|
| + element.classList.add('platform-' + WebInspector.platform());
|
| };
|
|
|
| /**
|
| @@ -804,68 +773,64 @@ WebInspector.installComponentRootStyles = function(element)
|
| * @param {string=} cssFile
|
| * @return {!DocumentFragment}
|
| */
|
| -WebInspector.createShadowRootWithCoreStyles = function(element, cssFile)
|
| -{
|
| - var shadowRoot = element.createShadowRoot();
|
| - WebInspector.appendStyle(shadowRoot, "ui/inspectorCommon.css");
|
| - WebInspector.themeSupport.injectHighlightStyleSheets(shadowRoot);
|
| - if (cssFile)
|
| - WebInspector.appendStyle(shadowRoot, cssFile);
|
| - shadowRoot.addEventListener("focus", WebInspector._focusChanged.bind(WebInspector), true);
|
| - return shadowRoot;
|
| +WebInspector.createShadowRootWithCoreStyles = function(element, cssFile) {
|
| + var shadowRoot = element.createShadowRoot();
|
| + WebInspector.appendStyle(shadowRoot, 'ui/inspectorCommon.css');
|
| + WebInspector.themeSupport.injectHighlightStyleSheets(shadowRoot);
|
| + if (cssFile)
|
| + WebInspector.appendStyle(shadowRoot, cssFile);
|
| + shadowRoot.addEventListener('focus', WebInspector._focusChanged.bind(WebInspector), true);
|
| + return shadowRoot;
|
| };
|
|
|
| /**
|
| * @param {!Document} document
|
| * @param {!Event} event
|
| */
|
| -WebInspector._windowFocused = function(document, event)
|
| -{
|
| - if (event.target.document.nodeType === Node.DOCUMENT_NODE)
|
| - document.body.classList.remove("inactive");
|
| +WebInspector._windowFocused = function(document, event) {
|
| + if (event.target.document.nodeType === Node.DOCUMENT_NODE)
|
| + document.body.classList.remove('inactive');
|
| };
|
|
|
| /**
|
| * @param {!Document} document
|
| * @param {!Event} event
|
| */
|
| -WebInspector._windowBlurred = function(document, event)
|
| -{
|
| - if (event.target.document.nodeType === Node.DOCUMENT_NODE)
|
| - document.body.classList.add("inactive");
|
| +WebInspector._windowBlurred = function(document, event) {
|
| + if (event.target.document.nodeType === Node.DOCUMENT_NODE)
|
| + document.body.classList.add('inactive');
|
| };
|
|
|
| /**
|
| * @param {!Event} event
|
| */
|
| -WebInspector._focusChanged = function(event)
|
| -{
|
| - var document = event.target && event.target.ownerDocument;
|
| - var element = document ? document.deepActiveElement() : null;
|
| - WebInspector.Widget.focusWidgetForNode(element);
|
| +WebInspector._focusChanged = function(event) {
|
| + var document = event.target && event.target.ownerDocument;
|
| + var element = document ? document.deepActiveElement() : null;
|
| + WebInspector.Widget.focusWidgetForNode(element);
|
| };
|
|
|
| /**
|
| - * @param {!Element} element
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.ElementFocusRestorer = function(element)
|
| -{
|
| +WebInspector.ElementFocusRestorer = class {
|
| + /**
|
| + * @param {!Element} element
|
| + */
|
| + constructor(element) {
|
| this._element = element;
|
| this._previous = element.ownerDocument.deepActiveElement();
|
| element.focus();
|
| -};
|
| -
|
| -WebInspector.ElementFocusRestorer.prototype = {
|
| - restore: function()
|
| - {
|
| - if (!this._element)
|
| - return;
|
| - if (this._element.hasFocus() && this._previous)
|
| - this._previous.focus();
|
| - this._previous = null;
|
| - this._element = null;
|
| - }
|
| + }
|
| +
|
| + restore() {
|
| + if (!this._element)
|
| + return;
|
| + if (this._element.hasFocus() && this._previous)
|
| + this._previous.focus();
|
| + this._previous = null;
|
| + this._element = null;
|
| + }
|
| };
|
|
|
| /**
|
| @@ -875,10 +840,9 @@ WebInspector.ElementFocusRestorer.prototype = {
|
| * @param {!Array.<!Object>=} domChanges
|
| * @return {?Element}
|
| */
|
| -WebInspector.highlightSearchResult = function(element, offset, length, domChanges)
|
| -{
|
| - var result = WebInspector.highlightSearchResults(element, [new WebInspector.SourceRange(offset, length)], domChanges);
|
| - return result.length ? result[0] : null;
|
| +WebInspector.highlightSearchResult = function(element, offset, length, domChanges) {
|
| + var result = WebInspector.highlightSearchResults(element, [new WebInspector.SourceRange(offset, length)], domChanges);
|
| + return result.length ? result[0] : null;
|
| };
|
|
|
| /**
|
| @@ -887,28 +851,26 @@ WebInspector.highlightSearchResult = function(element, offset, length, domChange
|
| * @param {!Array.<!Object>=} changes
|
| * @return {!Array.<!Element>}
|
| */
|
| -WebInspector.highlightSearchResults = function(element, resultRanges, changes)
|
| -{
|
| - return WebInspector.highlightRangesWithStyleClass(element, resultRanges, WebInspector.highlightedSearchResultClassName, changes);
|
| +WebInspector.highlightSearchResults = function(element, resultRanges, changes) {
|
| + return WebInspector.highlightRangesWithStyleClass(
|
| + element, resultRanges, WebInspector.highlightedSearchResultClassName, changes);
|
| };
|
|
|
| /**
|
| * @param {!Element} element
|
| * @param {string} className
|
| */
|
| -WebInspector.runCSSAnimationOnce = function(element, className)
|
| -{
|
| - function animationEndCallback()
|
| - {
|
| - element.classList.remove(className);
|
| - element.removeEventListener("webkitAnimationEnd", animationEndCallback, false);
|
| - }
|
| +WebInspector.runCSSAnimationOnce = function(element, className) {
|
| + function animationEndCallback() {
|
| + element.classList.remove(className);
|
| + element.removeEventListener('webkitAnimationEnd', animationEndCallback, false);
|
| + }
|
|
|
| - if (element.classList.contains(className))
|
| - element.classList.remove(className);
|
| + if (element.classList.contains(className))
|
| + element.classList.remove(className);
|
|
|
| - element.addEventListener("webkitAnimationEnd", animationEndCallback, false);
|
| - element.classList.add(className);
|
| + element.addEventListener('webkitAnimationEnd', animationEndCallback, false);
|
| + element.classList.add(className);
|
| };
|
|
|
| /**
|
| @@ -918,112 +880,114 @@ WebInspector.runCSSAnimationOnce = function(element, className)
|
| * @param {!Array.<!Object>=} changes
|
| * @return {!Array.<!Element>}
|
| */
|
| -WebInspector.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes)
|
| -{
|
| - changes = changes || [];
|
| - var highlightNodes = [];
|
| - var textNodes = element.childTextNodes();
|
| - var lineText = textNodes.map(function(node) { return node.textContent; }).join("");
|
| - var ownerDocument = element.ownerDocument;
|
| -
|
| - if (textNodes.length === 0)
|
| - return highlightNodes;
|
| -
|
| - var nodeRanges = [];
|
| - var rangeEndOffset = 0;
|
| - for (var i = 0; i < textNodes.length; ++i) {
|
| - var range = {};
|
| - range.offset = rangeEndOffset;
|
| - range.length = textNodes[i].textContent.length;
|
| - rangeEndOffset = range.offset + range.length;
|
| - nodeRanges.push(range);
|
| - }
|
| -
|
| - var startIndex = 0;
|
| - for (var i = 0; i < resultRanges.length; ++i) {
|
| - var startOffset = resultRanges[i].offset;
|
| - var endOffset = startOffset + resultRanges[i].length;
|
| -
|
| - while (startIndex < textNodes.length && nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= startOffset)
|
| - startIndex++;
|
| - var endIndex = startIndex;
|
| - while (endIndex < textNodes.length && nodeRanges[endIndex].offset + nodeRanges[endIndex].length < endOffset)
|
| - endIndex++;
|
| - if (endIndex === textNodes.length)
|
| - break;
|
| -
|
| - var highlightNode = ownerDocument.createElement("span");
|
| - highlightNode.className = styleClass;
|
| - highlightNode.textContent = lineText.substring(startOffset, endOffset);
|
| -
|
| - var lastTextNode = textNodes[endIndex];
|
| - var lastText = lastTextNode.textContent;
|
| - lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endIndex].offset);
|
| - changes.push({ node: lastTextNode, type: "changed", oldText: lastText, newText: lastTextNode.textContent });
|
| -
|
| - if (startIndex === endIndex) {
|
| - lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode);
|
| - changes.push({ node: highlightNode, type: "added", nextSibling: lastTextNode, parent: lastTextNode.parentElement });
|
| - highlightNodes.push(highlightNode);
|
| -
|
| - var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startOffset - nodeRanges[startIndex].offset));
|
| - lastTextNode.parentElement.insertBefore(prefixNode, highlightNode);
|
| - changes.push({ node: prefixNode, type: "added", nextSibling: highlightNode, parent: lastTextNode.parentElement });
|
| - } else {
|
| - var firstTextNode = textNodes[startIndex];
|
| - var firstText = firstTextNode.textContent;
|
| - var anchorElement = firstTextNode.nextSibling;
|
| -
|
| - firstTextNode.parentElement.insertBefore(highlightNode, anchorElement);
|
| - changes.push({ node: highlightNode, type: "added", nextSibling: anchorElement, parent: firstTextNode.parentElement });
|
| - highlightNodes.push(highlightNode);
|
| -
|
| - firstTextNode.textContent = firstText.substring(0, startOffset - nodeRanges[startIndex].offset);
|
| - changes.push({ node: firstTextNode, type: "changed", oldText: firstText, newText: firstTextNode.textContent });
|
| -
|
| - for (var j = startIndex + 1; j < endIndex; j++) {
|
| - var textNode = textNodes[j];
|
| - var text = textNode.textContent;
|
| - textNode.textContent = "";
|
| - changes.push({ node: textNode, type: "changed", oldText: text, newText: textNode.textContent });
|
| - }
|
| - }
|
| - startIndex = endIndex;
|
| - nodeRanges[startIndex].offset = endOffset;
|
| - nodeRanges[startIndex].length = lastTextNode.textContent.length;
|
| +WebInspector.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes) {
|
| + changes = changes || [];
|
| + var highlightNodes = [];
|
| + var textNodes = element.childTextNodes();
|
| + var lineText = textNodes
|
| + .map(function(node) {
|
| + return node.textContent;
|
| + })
|
| + .join('');
|
| + var ownerDocument = element.ownerDocument;
|
| +
|
| + if (textNodes.length === 0)
|
| + return highlightNodes;
|
|
|
| + var nodeRanges = [];
|
| + var rangeEndOffset = 0;
|
| + for (var i = 0; i < textNodes.length; ++i) {
|
| + var range = {};
|
| + range.offset = rangeEndOffset;
|
| + range.length = textNodes[i].textContent.length;
|
| + rangeEndOffset = range.offset + range.length;
|
| + nodeRanges.push(range);
|
| + }
|
| +
|
| + var startIndex = 0;
|
| + for (var i = 0; i < resultRanges.length; ++i) {
|
| + var startOffset = resultRanges[i].offset;
|
| + var endOffset = startOffset + resultRanges[i].length;
|
| +
|
| + while (startIndex < textNodes.length &&
|
| + nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= startOffset)
|
| + startIndex++;
|
| + var endIndex = startIndex;
|
| + while (endIndex < textNodes.length && nodeRanges[endIndex].offset + nodeRanges[endIndex].length < endOffset)
|
| + endIndex++;
|
| + if (endIndex === textNodes.length)
|
| + break;
|
| +
|
| + var highlightNode = ownerDocument.createElement('span');
|
| + highlightNode.className = styleClass;
|
| + highlightNode.textContent = lineText.substring(startOffset, endOffset);
|
| +
|
| + var lastTextNode = textNodes[endIndex];
|
| + var lastText = lastTextNode.textContent;
|
| + lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endIndex].offset);
|
| + changes.push({node: lastTextNode, type: 'changed', oldText: lastText, newText: lastTextNode.textContent});
|
| +
|
| + if (startIndex === endIndex) {
|
| + lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode);
|
| + changes.push({node: highlightNode, type: 'added', nextSibling: lastTextNode, parent: lastTextNode.parentElement});
|
| + highlightNodes.push(highlightNode);
|
| +
|
| + var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startOffset - nodeRanges[startIndex].offset));
|
| + lastTextNode.parentElement.insertBefore(prefixNode, highlightNode);
|
| + changes.push({node: prefixNode, type: 'added', nextSibling: highlightNode, parent: lastTextNode.parentElement});
|
| + } else {
|
| + var firstTextNode = textNodes[startIndex];
|
| + var firstText = firstTextNode.textContent;
|
| + var anchorElement = firstTextNode.nextSibling;
|
| +
|
| + firstTextNode.parentElement.insertBefore(highlightNode, anchorElement);
|
| + changes.push(
|
| + {node: highlightNode, type: 'added', nextSibling: anchorElement, parent: firstTextNode.parentElement});
|
| + highlightNodes.push(highlightNode);
|
| +
|
| + firstTextNode.textContent = firstText.substring(0, startOffset - nodeRanges[startIndex].offset);
|
| + changes.push({node: firstTextNode, type: 'changed', oldText: firstText, newText: firstTextNode.textContent});
|
| +
|
| + for (var j = startIndex + 1; j < endIndex; j++) {
|
| + var textNode = textNodes[j];
|
| + var text = textNode.textContent;
|
| + textNode.textContent = '';
|
| + changes.push({node: textNode, type: 'changed', oldText: text, newText: textNode.textContent});
|
| + }
|
| }
|
| - return highlightNodes;
|
| + startIndex = endIndex;
|
| + nodeRanges[startIndex].offset = endOffset;
|
| + nodeRanges[startIndex].length = lastTextNode.textContent.length;
|
| + }
|
| + return highlightNodes;
|
| };
|
|
|
| -WebInspector.applyDomChanges = function(domChanges)
|
| -{
|
| - for (var i = 0, size = domChanges.length; i < size; ++i) {
|
| - var entry = domChanges[i];
|
| - switch (entry.type) {
|
| - case "added":
|
| - entry.parent.insertBefore(entry.node, entry.nextSibling);
|
| - break;
|
| - case "changed":
|
| - entry.node.textContent = entry.newText;
|
| - break;
|
| - }
|
| +WebInspector.applyDomChanges = function(domChanges) {
|
| + for (var i = 0, size = domChanges.length; i < size; ++i) {
|
| + var entry = domChanges[i];
|
| + switch (entry.type) {
|
| + case 'added':
|
| + entry.parent.insertBefore(entry.node, entry.nextSibling);
|
| + break;
|
| + case 'changed':
|
| + entry.node.textContent = entry.newText;
|
| + break;
|
| }
|
| + }
|
| };
|
|
|
| -WebInspector.revertDomChanges = function(domChanges)
|
| -{
|
| - for (var i = domChanges.length - 1; i >= 0; --i) {
|
| - var entry = domChanges[i];
|
| - switch (entry.type) {
|
| - case "added":
|
| - entry.node.remove();
|
| - break;
|
| - case "changed":
|
| - entry.node.textContent = entry.oldText;
|
| - break;
|
| - }
|
| +WebInspector.revertDomChanges = function(domChanges) {
|
| + for (var i = domChanges.length - 1; i >= 0; --i) {
|
| + var entry = domChanges[i];
|
| + switch (entry.type) {
|
| + case 'added':
|
| + entry.node.remove();
|
| + break;
|
| + case 'changed':
|
| + entry.node.textContent = entry.oldText;
|
| + break;
|
| }
|
| + }
|
| };
|
|
|
| /**
|
| @@ -1031,102 +995,96 @@ WebInspector.revertDomChanges = function(domChanges)
|
| * @param {?Element=} containerElement
|
| * @return {!Size}
|
| */
|
| -WebInspector.measurePreferredSize = function(element, containerElement)
|
| -{
|
| - var oldParent = element.parentElement;
|
| - var oldNextSibling = element.nextSibling;
|
| - containerElement = containerElement || element.ownerDocument.body;
|
| - containerElement.appendChild(element);
|
| - element.positionAt(0, 0);
|
| - var result = new Size(element.offsetWidth, element.offsetHeight);
|
| -
|
| - element.positionAt(undefined, undefined);
|
| - if (oldParent)
|
| - oldParent.insertBefore(element, oldNextSibling);
|
| - else
|
| - element.remove();
|
| - return result;
|
| +WebInspector.measurePreferredSize = function(element, containerElement) {
|
| + var oldParent = element.parentElement;
|
| + var oldNextSibling = element.nextSibling;
|
| + containerElement = containerElement || element.ownerDocument.body;
|
| + containerElement.appendChild(element);
|
| + element.positionAt(0, 0);
|
| + var result = new Size(element.offsetWidth, element.offsetHeight);
|
| +
|
| + element.positionAt(undefined, undefined);
|
| + if (oldParent)
|
| + oldParent.insertBefore(element, oldNextSibling);
|
| + else
|
| + element.remove();
|
| + return result;
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {boolean} autoInvoke
|
| + * @unrestricted
|
| */
|
| -WebInspector.InvokeOnceHandlers = function(autoInvoke)
|
| -{
|
| +WebInspector.InvokeOnceHandlers = class {
|
| + /**
|
| + * @param {boolean} autoInvoke
|
| + */
|
| + constructor(autoInvoke) {
|
| this._handlers = null;
|
| this._autoInvoke = autoInvoke;
|
| -};
|
| -
|
| -WebInspector.InvokeOnceHandlers.prototype = {
|
| - /**
|
| - * @param {!Object} object
|
| - * @param {function()} method
|
| - */
|
| - add: function(object, method)
|
| - {
|
| - if (!this._handlers) {
|
| - this._handlers = new Map();
|
| - if (this._autoInvoke)
|
| - this.scheduleInvoke();
|
| - }
|
| - var methods = this._handlers.get(object);
|
| - if (!methods) {
|
| - methods = new Set();
|
| - this._handlers.set(object, methods);
|
| - }
|
| - methods.add(method);
|
| - },
|
| -
|
| - /**
|
| - * @suppressGlobalPropertiesCheck
|
| - */
|
| - scheduleInvoke: function()
|
| - {
|
| - if (this._handlers)
|
| - requestAnimationFrame(this._invoke.bind(this));
|
| - },
|
| -
|
| - _invoke: function()
|
| - {
|
| - var handlers = this._handlers;
|
| - this._handlers = null;
|
| - var keys = handlers.keysArray();
|
| - for (var i = 0; i < keys.length; ++i) {
|
| - var object = keys[i];
|
| - var methods = handlers.get(object).valuesArray();
|
| - for (var j = 0; j < methods.length; ++j)
|
| - methods[j].call(object);
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Object} object
|
| + * @param {function()} method
|
| + */
|
| + add(object, method) {
|
| + if (!this._handlers) {
|
| + this._handlers = new Map();
|
| + if (this._autoInvoke)
|
| + this.scheduleInvoke();
|
| + }
|
| + var methods = this._handlers.get(object);
|
| + if (!methods) {
|
| + methods = new Set();
|
| + this._handlers.set(object, methods);
|
| + }
|
| + methods.add(method);
|
| + }
|
| +
|
| + /**
|
| + * @suppressGlobalPropertiesCheck
|
| + */
|
| + scheduleInvoke() {
|
| + if (this._handlers)
|
| + requestAnimationFrame(this._invoke.bind(this));
|
| + }
|
| +
|
| + _invoke() {
|
| + var handlers = this._handlers;
|
| + this._handlers = null;
|
| + var keys = handlers.keysArray();
|
| + for (var i = 0; i < keys.length; ++i) {
|
| + var object = keys[i];
|
| + var methods = handlers.get(object).valuesArray();
|
| + for (var j = 0; j < methods.length; ++j)
|
| + methods[j].call(object);
|
| }
|
| + }
|
| };
|
|
|
| WebInspector._coalescingLevel = 0;
|
| WebInspector._postUpdateHandlers = null;
|
|
|
| -WebInspector.startBatchUpdate = function()
|
| -{
|
| - if (!WebInspector._coalescingLevel++)
|
| - WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(false);
|
| +WebInspector.startBatchUpdate = function() {
|
| + if (!WebInspector._coalescingLevel++)
|
| + WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(false);
|
| };
|
|
|
| -WebInspector.endBatchUpdate = function()
|
| -{
|
| - if (--WebInspector._coalescingLevel)
|
| - return;
|
| - WebInspector._postUpdateHandlers.scheduleInvoke();
|
| - WebInspector._postUpdateHandlers = null;
|
| +WebInspector.endBatchUpdate = function() {
|
| + if (--WebInspector._coalescingLevel)
|
| + return;
|
| + WebInspector._postUpdateHandlers.scheduleInvoke();
|
| + WebInspector._postUpdateHandlers = null;
|
| };
|
|
|
| /**
|
| * @param {!Object} object
|
| * @param {function()} method
|
| */
|
| -WebInspector.invokeOnceAfterBatchUpdate = function(object, method)
|
| -{
|
| - if (!WebInspector._postUpdateHandlers)
|
| - WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(true);
|
| - WebInspector._postUpdateHandlers.add(object, method);
|
| +WebInspector.invokeOnceAfterBatchUpdate = function(object, method) {
|
| + if (!WebInspector._postUpdateHandlers)
|
| + WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(true);
|
| + WebInspector._postUpdateHandlers.add(object, method);
|
| };
|
|
|
| /**
|
| @@ -1137,145 +1095,134 @@ WebInspector.invokeOnceAfterBatchUpdate = function(object, method)
|
| * @param {function()=} animationComplete
|
| * @return {function()}
|
| */
|
| -WebInspector.animateFunction = function(window, func, params, frames, animationComplete)
|
| -{
|
| - var values = new Array(params.length);
|
| - var deltas = new Array(params.length);
|
| - for (var i = 0; i < params.length; ++i) {
|
| - values[i] = params[i].from;
|
| - deltas[i] = (params[i].to - params[i].from) / frames;
|
| +WebInspector.animateFunction = function(window, func, params, frames, animationComplete) {
|
| + var values = new Array(params.length);
|
| + var deltas = new Array(params.length);
|
| + for (var i = 0; i < params.length; ++i) {
|
| + values[i] = params[i].from;
|
| + deltas[i] = (params[i].to - params[i].from) / frames;
|
| + }
|
| +
|
| + var raf = window.requestAnimationFrame(animationStep);
|
| +
|
| + var framesLeft = frames;
|
| +
|
| + function animationStep() {
|
| + if (--framesLeft < 0) {
|
| + if (animationComplete)
|
| + animationComplete();
|
| + return;
|
| }
|
| -
|
| - var raf = window.requestAnimationFrame(animationStep);
|
| -
|
| - var framesLeft = frames;
|
| -
|
| - function animationStep()
|
| - {
|
| - if (--framesLeft < 0) {
|
| - if (animationComplete)
|
| - animationComplete();
|
| - return;
|
| - }
|
| - for (var i = 0; i < params.length; ++i) {
|
| - if (params[i].to > params[i].from)
|
| - values[i] = Number.constrain(values[i] + deltas[i], params[i].from, params[i].to);
|
| - else
|
| - values[i] = Number.constrain(values[i] + deltas[i], params[i].to, params[i].from);
|
| - }
|
| - func.apply(null, values);
|
| - raf = window.requestAnimationFrame(animationStep);
|
| + for (var i = 0; i < params.length; ++i) {
|
| + if (params[i].to > params[i].from)
|
| + values[i] = Number.constrain(values[i] + deltas[i], params[i].from, params[i].to);
|
| + else
|
| + values[i] = Number.constrain(values[i] + deltas[i], params[i].to, params[i].from);
|
| }
|
| + func.apply(null, values);
|
| + raf = window.requestAnimationFrame(animationStep);
|
| + }
|
|
|
| - function cancelAnimation()
|
| - {
|
| - window.cancelAnimationFrame(raf);
|
| - }
|
| + function cancelAnimation() {
|
| + window.cancelAnimationFrame(raf);
|
| + }
|
|
|
| - return cancelAnimation;
|
| + return cancelAnimation;
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.Object}
|
| - * @param {!Element} element
|
| - * @param {function(!Event)} callback
|
| + * @unrestricted
|
| */
|
| -WebInspector.LongClickController = function(element, callback)
|
| -{
|
| +WebInspector.LongClickController = class extends WebInspector.Object {
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {function(!Event)} callback
|
| + */
|
| + constructor(element, callback) {
|
| + super();
|
| this._element = element;
|
| this._callback = callback;
|
| this._enable();
|
| -};
|
| + }
|
|
|
| -WebInspector.LongClickController.prototype = {
|
| - reset: function()
|
| - {
|
| - if (this._longClickInterval) {
|
| - clearInterval(this._longClickInterval);
|
| - delete this._longClickInterval;
|
| - }
|
| - },
|
| + reset() {
|
| + if (this._longClickInterval) {
|
| + clearInterval(this._longClickInterval);
|
| + delete this._longClickInterval;
|
| + }
|
| + }
|
|
|
| - _enable: function()
|
| - {
|
| - if (this._longClickData)
|
| - return;
|
| - var boundMouseDown = mouseDown.bind(this);
|
| - var boundMouseUp = mouseUp.bind(this);
|
| - var boundReset = this.reset.bind(this);
|
| -
|
| - this._element.addEventListener("mousedown", boundMouseDown, false);
|
| - this._element.addEventListener("mouseout", boundReset, false);
|
| - this._element.addEventListener("mouseup", boundMouseUp, false);
|
| - this._element.addEventListener("click", boundReset, true);
|
| -
|
| - this._longClickData = { mouseUp: boundMouseUp, mouseDown: boundMouseDown, reset: boundReset };
|
| -
|
| - /**
|
| - * @param {!Event} e
|
| - * @this {WebInspector.LongClickController}
|
| - */
|
| - function mouseDown(e)
|
| - {
|
| - if (e.which !== 1)
|
| - return;
|
| - var callback = this._callback;
|
| - this._longClickInterval = setTimeout(callback.bind(null, e), 200);
|
| - }
|
| + _enable() {
|
| + if (this._longClickData)
|
| + return;
|
| + var boundMouseDown = mouseDown.bind(this);
|
| + var boundMouseUp = mouseUp.bind(this);
|
| + var boundReset = this.reset.bind(this);
|
|
|
| - /**
|
| - * @param {!Event} e
|
| - * @this {WebInspector.LongClickController}
|
| - */
|
| - function mouseUp(e)
|
| - {
|
| - if (e.which !== 1)
|
| - return;
|
| - this.reset();
|
| - }
|
| - },
|
| + this._element.addEventListener('mousedown', boundMouseDown, false);
|
| + this._element.addEventListener('mouseout', boundReset, false);
|
| + this._element.addEventListener('mouseup', boundMouseUp, false);
|
| + this._element.addEventListener('click', boundReset, true);
|
|
|
| - dispose: function()
|
| - {
|
| - if (!this._longClickData)
|
| - return;
|
| - this._element.removeEventListener("mousedown", this._longClickData.mouseDown, false);
|
| - this._element.removeEventListener("mouseout", this._longClickData.reset, false);
|
| - this._element.removeEventListener("mouseup", this._longClickData.mouseUp, false);
|
| - this._element.addEventListener("click", this._longClickData.reset, true);
|
| - delete this._longClickData;
|
| - },
|
| + this._longClickData = {mouseUp: boundMouseUp, mouseDown: boundMouseDown, reset: boundReset};
|
| +
|
| + /**
|
| + * @param {!Event} e
|
| + * @this {WebInspector.LongClickController}
|
| + */
|
| + function mouseDown(e) {
|
| + if (e.which !== 1)
|
| + return;
|
| + var callback = this._callback;
|
| + this._longClickInterval = setTimeout(callback.bind(null, e), 200);
|
| + }
|
|
|
| - __proto__: WebInspector.Object.prototype
|
| + /**
|
| + * @param {!Event} e
|
| + * @this {WebInspector.LongClickController}
|
| + */
|
| + function mouseUp(e) {
|
| + if (e.which !== 1)
|
| + return;
|
| + this.reset();
|
| + }
|
| + }
|
| +
|
| + dispose() {
|
| + if (!this._longClickData)
|
| + return;
|
| + this._element.removeEventListener('mousedown', this._longClickData.mouseDown, false);
|
| + this._element.removeEventListener('mouseout', this._longClickData.reset, false);
|
| + this._element.removeEventListener('mouseup', this._longClickData.mouseUp, false);
|
| + this._element.addEventListener('click', this._longClickData.reset, true);
|
| + delete this._longClickData;
|
| + }
|
| };
|
|
|
| /**
|
| * @param {!Document} document
|
| * @param {!WebInspector.Setting} themeSetting
|
| */
|
| -WebInspector.initializeUIUtils = function(document, themeSetting)
|
| -{
|
| - document.defaultView.addEventListener("focus", WebInspector._windowFocused.bind(WebInspector, document), false);
|
| - document.defaultView.addEventListener("blur", WebInspector._windowBlurred.bind(WebInspector, document), false);
|
| - document.addEventListener("focus", WebInspector._focusChanged.bind(WebInspector), true);
|
| -
|
| - if (!WebInspector.themeSupport)
|
| - WebInspector.themeSupport = new WebInspector.ThemeSupport(themeSetting);
|
| - WebInspector.themeSupport.applyTheme(document);
|
| -
|
| - var body = /** @type {!Element} */ (document.body);
|
| - WebInspector.appendStyle(body, "ui/inspectorStyle.css");
|
| - WebInspector.appendStyle(body, "ui/popover.css");
|
| +WebInspector.initializeUIUtils = function(document, themeSetting) {
|
| + document.defaultView.addEventListener('focus', WebInspector._windowFocused.bind(WebInspector, document), false);
|
| + document.defaultView.addEventListener('blur', WebInspector._windowBlurred.bind(WebInspector, document), false);
|
| + document.addEventListener('focus', WebInspector._focusChanged.bind(WebInspector), true);
|
| +
|
| + if (!WebInspector.themeSupport)
|
| + WebInspector.themeSupport = new WebInspector.ThemeSupport(themeSetting);
|
| + WebInspector.themeSupport.applyTheme(document);
|
| +
|
| + var body = /** @type {!Element} */ (document.body);
|
| + WebInspector.appendStyle(body, 'ui/inspectorStyle.css');
|
| + WebInspector.appendStyle(body, 'ui/popover.css');
|
| };
|
|
|
| /**
|
| * @param {string} name
|
| * @return {string}
|
| */
|
| -WebInspector.beautifyFunctionName = function(name)
|
| -{
|
| - return name || WebInspector.UIString("(anonymous)");
|
| +WebInspector.beautifyFunctionName = function(name) {
|
| + return name || WebInspector.UIString('(anonymous)');
|
| };
|
|
|
| /**
|
| @@ -1286,12 +1233,8 @@ WebInspector.beautifyFunctionName = function(name)
|
| * @suppressGlobalPropertiesCheck
|
| * @template T
|
| */
|
| -function registerCustomElement(localName, typeExtension, prototype)
|
| -{
|
| - return document.registerElement(typeExtension, {
|
| - prototype: Object.create(prototype),
|
| - extends: localName
|
| - });
|
| +function registerCustomElement(localName, typeExtension, prototype) {
|
| + return document.registerElement(typeExtension, {prototype: Object.create(prototype), extends: localName});
|
| }
|
|
|
| /**
|
| @@ -1301,15 +1244,14 @@ function registerCustomElement(localName, typeExtension, prototype)
|
| * @param {string=} title
|
| * @return {!Element}
|
| */
|
| -function createTextButton(text, clickHandler, className, title)
|
| -{
|
| - var element = createElementWithClass("button", className || "", "text-button");
|
| - element.textContent = text;
|
| - if (clickHandler)
|
| - element.addEventListener("click", clickHandler, false);
|
| - if (title)
|
| - element.title = title;
|
| - return element;
|
| +function createTextButton(text, clickHandler, className, title) {
|
| + var element = createElementWithClass('button', className || '', 'text-button');
|
| + element.textContent = text;
|
| + if (clickHandler)
|
| + element.addEventListener('click', clickHandler, false);
|
| + if (title)
|
| + element.title = title;
|
| + return element;
|
| }
|
|
|
| /**
|
| @@ -1318,13 +1260,12 @@ function createTextButton(text, clickHandler, className, title)
|
| * @param {boolean=} checked
|
| * @return {!Element}
|
| */
|
| -function createRadioLabel(name, title, checked)
|
| -{
|
| - var element = createElement("label", "dt-radio");
|
| - element.radioElement.name = name;
|
| - element.radioElement.checked = !!checked;
|
| - element.createTextChild(title);
|
| - return element;
|
| +function createRadioLabel(name, title, checked) {
|
| + var element = createElement('label', 'dt-radio');
|
| + element.radioElement.name = name;
|
| + element.radioElement.checked = !!checked;
|
| + element.createTextChild(title);
|
| + return element;
|
| }
|
|
|
| /**
|
| @@ -1332,12 +1273,11 @@ function createRadioLabel(name, title, checked)
|
| * @param {string} iconClass
|
| * @return {!Element}
|
| */
|
| -function createLabel(title, iconClass)
|
| -{
|
| - var element = createElement("label", "dt-icon-label");
|
| - element.createChild("span").textContent = title;
|
| - element.type = iconClass;
|
| - return element;
|
| +function createLabel(title, iconClass) {
|
| + var element = createElement('label', 'dt-icon-label');
|
| + element.createChild('span').textContent = title;
|
| + element.type = iconClass;
|
| + return element;
|
| }
|
|
|
| /**
|
| @@ -1346,19 +1286,18 @@ function createLabel(title, iconClass)
|
| * @param {string=} subtitle
|
| * @return {!Element}
|
| */
|
| -function createCheckboxLabel(title, checked, subtitle)
|
| -{
|
| - var element = createElement("label", "dt-checkbox");
|
| - element.checkboxElement.checked = !!checked;
|
| - if (title !== undefined) {
|
| - element.textElement = element.createChild("div", "dt-checkbox-text");
|
| - element.textElement.textContent = title;
|
| - if (subtitle !== undefined) {
|
| - element.subtitleElement = element.textElement.createChild("div", "dt-checkbox-subtitle");
|
| - element.subtitleElement.textContent = subtitle;
|
| - }
|
| +function createCheckboxLabel(title, checked, subtitle) {
|
| + var element = createElement('label', 'dt-checkbox');
|
| + element.checkboxElement.checked = !!checked;
|
| + if (title !== undefined) {
|
| + element.textElement = element.createChild('div', 'dt-checkbox-text');
|
| + element.textElement.textContent = title;
|
| + if (subtitle !== undefined) {
|
| + element.subtitleElement = element.textElement.createChild('div', 'dt-checkbox-subtitle');
|
| + element.subtitleElement.textContent = subtitle;
|
| }
|
| - return element;
|
| + }
|
| + return element;
|
| }
|
|
|
| /**
|
| @@ -1367,14 +1306,13 @@ function createCheckboxLabel(title, checked, subtitle)
|
| * @param {number} max
|
| * @param {number} tabIndex
|
| */
|
| -function createSliderLabel(min, max, tabIndex)
|
| -{
|
| - var element = createElement("label", "dt-slider");
|
| - element.sliderElement.min = min;
|
| - element.sliderElement.max = max;
|
| - element.sliderElement.step = 1;
|
| - element.sliderElement.tabIndex = tabIndex;
|
| - return element;
|
| +function createSliderLabel(min, max, tabIndex) {
|
| + var element = createElement('label', 'dt-slider');
|
| + element.sliderElement.min = min;
|
| + element.sliderElement.max = max;
|
| + element.sliderElement.step = 1;
|
| + element.sliderElement.tabIndex = tabIndex;
|
| + return element;
|
| }
|
|
|
| /**
|
| @@ -1382,562 +1320,531 @@ function createSliderLabel(min, max, tabIndex)
|
| * @param {string} cssFile
|
| * @suppressGlobalPropertiesCheck
|
| */
|
| -WebInspector.appendStyle = function(node, cssFile)
|
| -{
|
| - var content = Runtime.cachedResources[cssFile] || "";
|
| - if (!content)
|
| - console.error(cssFile + " not preloaded. Check module.json");
|
| - var styleElement = createElement("style");
|
| - styleElement.type = "text/css";
|
| - styleElement.textContent = content;
|
| +WebInspector.appendStyle =
|
| + function(node, cssFile) {
|
| + var content = Runtime.cachedResources[cssFile] || '';
|
| + if (!content)
|
| + console.error(cssFile + ' not preloaded. Check module.json');
|
| + var styleElement = createElement('style');
|
| + styleElement.type = 'text/css';
|
| + styleElement.textContent = content;
|
| + node.appendChild(styleElement);
|
| +
|
| + var themeStyleSheet = WebInspector.themeSupport.themeStyleSheet(cssFile, content);
|
| + if (themeStyleSheet) {
|
| + styleElement = createElement('style');
|
| + styleElement.type = 'text/css';
|
| + styleElement.textContent = themeStyleSheet + '\n' + Runtime.resolveSourceURL(cssFile + '.theme');
|
| node.appendChild(styleElement);
|
| -
|
| - var themeStyleSheet = WebInspector.themeSupport.themeStyleSheet(cssFile, content);
|
| - if (themeStyleSheet) {
|
| - styleElement = createElement("style");
|
| - styleElement.type = "text/css";
|
| - styleElement.textContent = themeStyleSheet + "\n" + Runtime.resolveSourceURL(cssFile + ".theme");
|
| - node.appendChild(styleElement);
|
| - }
|
| + }
|
| }
|
|
|
| -;(function() {
|
| - registerCustomElement("button", "text-button", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - this.type = "button";
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/textButton.css");
|
| - root.createChild("content");
|
| - },
|
| -
|
| - __proto__: HTMLButtonElement.prototype
|
| - });
|
| -
|
| - registerCustomElement("label", "dt-radio", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - this.radioElement = this.createChild("input", "dt-radio-button");
|
| - this.radioElement.type = "radio";
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/radioButton.css");
|
| - root.createChild("content").select = ".dt-radio-button";
|
| - root.createChild("content");
|
| - this.addEventListener("click", radioClickHandler, false);
|
| - },
|
| -
|
| - __proto__: HTMLLabelElement.prototype
|
| - });
|
| -
|
| +;
|
| +(function() {
|
| + registerCustomElement('button', 'text-button', {
|
| /**
|
| - * @param {!Event} event
|
| - * @suppressReceiverCheck
|
| * @this {Element}
|
| */
|
| - function radioClickHandler(event)
|
| - {
|
| - if (this.radioElement.checked || this.radioElement.disabled)
|
| - return;
|
| - this.radioElement.checked = true;
|
| - this.radioElement.dispatchEvent(new Event("change"));
|
| - }
|
| -
|
| - registerCustomElement("label", "dt-checkbox", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - this._root = WebInspector.createShadowRootWithCoreStyles(this, "ui/checkboxTextLabel.css");
|
| - var checkboxElement = createElementWithClass("input", "dt-checkbox-button");
|
| - checkboxElement.type = "checkbox";
|
| - this._root.appendChild(checkboxElement);
|
| - this.checkboxElement = checkboxElement;
|
| -
|
| - this.addEventListener("click", toggleCheckbox.bind(this));
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - * @this {Node}
|
| - */
|
| - function toggleCheckbox(event)
|
| - {
|
| - if (event.target !== checkboxElement && event.target !== this) {
|
| - event.consume();
|
| - checkboxElement.click();
|
| - }
|
| - }
|
| -
|
| - this._root.createChild("content");
|
| - },
|
| -
|
| - /**
|
| - * @param {string} color
|
| - * @this {Element}
|
| - */
|
| - set backgroundColor(color)
|
| - {
|
| - this.checkboxElement.classList.add("dt-checkbox-themed");
|
| - this.checkboxElement.style.backgroundColor = color;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} color
|
| - * @this {Element}
|
| - */
|
| - set checkColor(color)
|
| - {
|
| - this.checkboxElement.classList.add("dt-checkbox-themed");
|
| - var stylesheet = createElement("style");
|
| - stylesheet.textContent = "input.dt-checkbox-themed:checked:after { background-color: " + color + "}";
|
| - this._root.appendChild(stylesheet);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} color
|
| - * @this {Element}
|
| - */
|
| - set borderColor(color)
|
| - {
|
| - this.checkboxElement.classList.add("dt-checkbox-themed");
|
| - this.checkboxElement.style.borderColor = color;
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} focus
|
| - * @this {Element}
|
| - */
|
| - set visualizeFocus(focus)
|
| - {
|
| - this.checkboxElement.classList.toggle("dt-checkbox-visualize-focus", focus);
|
| - },
|
| -
|
| - __proto__: HTMLLabelElement.prototype
|
| - });
|
| -
|
| - registerCustomElement("label", "dt-icon-label", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/smallIcon.css");
|
| - this._iconElement = root.createChild("div");
|
| - root.createChild("content");
|
| - },
|
| -
|
| - /**
|
| - * @param {string} type
|
| - * @this {Element}
|
| - */
|
| - set type(type)
|
| - {
|
| - this._iconElement.className = type;
|
| - },
|
| -
|
| - __proto__: HTMLLabelElement.prototype
|
| - });
|
| -
|
| - registerCustomElement("label", "dt-slider", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/slider.css");
|
| - this.sliderElement = createElementWithClass("input", "dt-range-input");
|
| - this.sliderElement.type = "range";
|
| - root.appendChild(this.sliderElement);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} amount
|
| - * @this {Element}
|
| - */
|
| - set value(amount)
|
| - {
|
| - this.sliderElement.value = amount;
|
| - },
|
| -
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - get value()
|
| - {
|
| - return this.sliderElement.value;
|
| - },
|
| -
|
| - __proto__: HTMLLabelElement.prototype
|
| - });
|
| -
|
| - registerCustomElement("label", "dt-small-bubble", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/smallBubble.css");
|
| - this._textElement = root.createChild("div");
|
| - this._textElement.className = "info";
|
| - this._textElement.createChild("content");
|
| - },
|
| -
|
| - /**
|
| - * @param {string} type
|
| - * @this {Element}
|
| - */
|
| - set type(type)
|
| - {
|
| - this._textElement.className = type;
|
| - },
|
| -
|
| - __proto__: HTMLLabelElement.prototype
|
| - });
|
| -
|
| - registerCustomElement("div", "dt-close-button", {
|
| - /**
|
| - * @this {Element}
|
| - */
|
| - createdCallback: function()
|
| - {
|
| - var root = WebInspector.createShadowRootWithCoreStyles(this, "ui/closeButton.css");
|
| - this._buttonElement = root.createChild("div", "close-button");
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} gray
|
| - * @this {Element}
|
| - */
|
| - set gray(gray)
|
| - {
|
| - this._buttonElement.className = gray ? "close-button-gray" : "close-button";
|
| - },
|
| -
|
| - __proto__: HTMLDivElement.prototype
|
| - });
|
| -})();
|
| + createdCallback: function() {
|
| + this.type = 'button';
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/textButton.css');
|
| + root.createChild('content');
|
| + },
|
|
|
| -/**
|
| - * @param {!Element} input
|
| - * @param {function(string)} apply
|
| - * @param {function(string):boolean} validate
|
| - * @param {boolean} numeric
|
| - * @return {function(string)}
|
| - */
|
| -WebInspector.bindInput = function(input, apply, validate, numeric)
|
| -{
|
| - input.addEventListener("change", onChange, false);
|
| - input.addEventListener("input", onInput, false);
|
| - input.addEventListener("keydown", onKeyDown, false);
|
| - input.addEventListener("focus", input.select.bind(input), false);
|
| -
|
| - function onInput()
|
| - {
|
| - input.classList.toggle("error-input", !validate(input.value));
|
| - }
|
| + __proto__: HTMLButtonElement.prototype
|
| + });
|
|
|
| - function onChange()
|
| - {
|
| - var valid = validate(input.value);
|
| - input.classList.toggle("error-input", !valid);
|
| - if (valid)
|
| - apply(input.value);
|
| - }
|
| + registerCustomElement('label', 'dt-radio', {
|
| + /**
|
| + * @this {Element}
|
| + */
|
| + createdCallback: function() {
|
| + this.radioElement = this.createChild('input', 'dt-radio-button');
|
| + this.radioElement.type = 'radio';
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/radioButton.css');
|
| + root.createChild('content').select = '.dt-radio-button';
|
| + root.createChild('content');
|
| + this.addEventListener('click', radioClickHandler, false);
|
| + },
|
|
|
| + __proto__: HTMLLabelElement.prototype
|
| + });
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @suppressReceiverCheck
|
| + * @this {Element}
|
| + */
|
| + function radioClickHandler(event) {
|
| + if (this.radioElement.checked || this.radioElement.disabled)
|
| + return;
|
| + this.radioElement.checked = true;
|
| + this.radioElement.dispatchEvent(new Event('change'));
|
| + }
|
| +
|
| + registerCustomElement('label', 'dt-checkbox', {
|
| /**
|
| - * @param {!Event} event
|
| + * @this {Element}
|
| */
|
| - function onKeyDown(event)
|
| - {
|
| - if (isEnterKey(event)) {
|
| - if (validate(input.value))
|
| - apply(input.value);
|
| - return;
|
| + createdCallback: function() {
|
| + this._root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/checkboxTextLabel.css');
|
| + var checkboxElement = createElementWithClass('input', 'dt-checkbox-button');
|
| + checkboxElement.type = 'checkbox';
|
| + this._root.appendChild(checkboxElement);
|
| + this.checkboxElement = checkboxElement;
|
| +
|
| + this.addEventListener('click', toggleCheckbox.bind(this));
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @this {Node}
|
| + */
|
| + function toggleCheckbox(event) {
|
| + if (event.target !== checkboxElement && event.target !== this) {
|
| + event.consume();
|
| + checkboxElement.click();
|
| }
|
| + }
|
|
|
| - if (!numeric)
|
| - return;
|
| -
|
| - var increment = event.key === "ArrowUp" ? 1 : event.key === "ArrowDown" ? -1 : 0;
|
| - if (!increment)
|
| - return;
|
| - if (event.shiftKey)
|
| - increment *= 10;
|
| -
|
| - var value = input.value;
|
| - if (!validate(value) || !value)
|
| - return;
|
| -
|
| - value = (value ? Number(value) : 0) + increment;
|
| - var stringValue = value ? String(value) : "";
|
| - if (!validate(stringValue) || !value)
|
| - return;
|
| + this._root.createChild('content');
|
| + },
|
|
|
| - input.value = stringValue;
|
| - apply(input.value);
|
| - event.preventDefault();
|
| - }
|
| + /**
|
| + * @param {string} color
|
| + * @this {Element}
|
| + */
|
| + set backgroundColor(color) {
|
| + this.checkboxElement.classList.add('dt-checkbox-themed');
|
| + this.checkboxElement.style.backgroundColor = color;
|
| + },
|
|
|
| /**
|
| - * @param {string} value
|
| + * @param {string} color
|
| + * @this {Element}
|
| */
|
| - function setValue(value)
|
| - {
|
| - if (value === input.value)
|
| - return;
|
| - var valid = validate(value);
|
| - input.classList.toggle("error-input", !valid);
|
| - input.value = value;
|
| - }
|
| + set checkColor(color) {
|
| + this.checkboxElement.classList.add('dt-checkbox-themed');
|
| + var stylesheet = createElement('style');
|
| + stylesheet.textContent = 'input.dt-checkbox-themed:checked:after { background-color: ' + color + '}';
|
| + this._root.appendChild(stylesheet);
|
| + },
|
|
|
| - return setValue;
|
| -};
|
| + /**
|
| + * @param {string} color
|
| + * @this {Element}
|
| + */
|
| + set borderColor(color) {
|
| + this.checkboxElement.classList.add('dt-checkbox-themed');
|
| + this.checkboxElement.style.borderColor = color;
|
| + },
|
|
|
| -/**
|
| - * @constructor
|
| - * @param {!WebInspector.Setting} setting
|
| - */
|
| -WebInspector.ThemeSupport = function(setting)
|
| -{
|
| - this._themeName = setting.get() || "default";
|
| - this._themableProperties = new Set([
|
| - "color", "box-shadow", "text-shadow", "outline-color",
|
| - "background-image", "background-color",
|
| - "border-left-color", "border-right-color", "border-top-color", "border-bottom-color",
|
| - "-webkit-border-image"]);
|
| - /** @type {!Map<string, string>} */
|
| - this._cachedThemePatches = new Map();
|
| - this._setting = setting;
|
| -};
|
| + /**
|
| + * @param {boolean} focus
|
| + * @this {Element}
|
| + */
|
| + set visualizeFocus(focus) {
|
| + this.checkboxElement.classList.toggle('dt-checkbox-visualize-focus', focus);
|
| + },
|
|
|
| -/**
|
| - * @enum {number}
|
| - */
|
| -WebInspector.ThemeSupport.ColorUsage = {
|
| - Unknown: 0,
|
| - Foreground: 1 << 0,
|
| - Background: 1 << 1,
|
| - Selection: 1 << 2,
|
| -};
|
| + __proto__: HTMLLabelElement.prototype
|
| + });
|
|
|
| -WebInspector.ThemeSupport.prototype = {
|
| + registerCustomElement('label', 'dt-icon-label', {
|
| /**
|
| - * @return {boolean}
|
| + * @this {Element}
|
| */
|
| - hasTheme: function()
|
| - {
|
| - return this._themeName !== "default";
|
| + createdCallback: function() {
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/smallIcon.css');
|
| + this._iconElement = root.createChild('div');
|
| + root.createChild('content');
|
| },
|
|
|
| /**
|
| - * @return {string}
|
| + * @param {string} type
|
| + * @this {Element}
|
| */
|
| - themeName: function()
|
| - {
|
| - return this._themeName;
|
| + set type(type) {
|
| + this._iconElement.className = type;
|
| },
|
|
|
| + __proto__: HTMLLabelElement.prototype
|
| + });
|
| +
|
| + registerCustomElement('label', 'dt-slider', {
|
| /**
|
| - * @param {!Element} element
|
| + * @this {Element}
|
| */
|
| - injectHighlightStyleSheets: function(element)
|
| - {
|
| - this._injectingStyleSheet = true;
|
| - WebInspector.appendStyle(element, "ui/inspectorSyntaxHighlight.css");
|
| - if (this._themeName === "dark")
|
| - WebInspector.appendStyle(element, "ui/inspectorSyntaxHighlightDark.css");
|
| - this._injectingStyleSheet = false;
|
| + createdCallback: function() {
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/slider.css');
|
| + this.sliderElement = createElementWithClass('input', 'dt-range-input');
|
| + this.sliderElement.type = 'range';
|
| + root.appendChild(this.sliderElement);
|
| },
|
|
|
| /**
|
| - * @param {!Document} document
|
| + * @param {number} amount
|
| + * @this {Element}
|
| */
|
| - applyTheme: function(document)
|
| - {
|
| - if (!this.hasTheme())
|
| - return;
|
| -
|
| - if (this._themeName === "dark")
|
| - document.body.classList.add("-theme-with-dark-background");
|
| -
|
| - var styleSheets = document.styleSheets;
|
| - var result = [];
|
| - for (var i = 0; i < styleSheets.length; ++i)
|
| - result.push(this._patchForTheme(styleSheets[i].href, styleSheets[i]));
|
| - result.push("/*# sourceURL=inspector.css.theme */");
|
| -
|
| - var styleElement = createElement("style");
|
| - styleElement.type = "text/css";
|
| - styleElement.textContent = result.join("\n");
|
| - document.head.appendChild(styleElement);
|
| + set value(amount) {
|
| + this.sliderElement.value = amount;
|
| },
|
|
|
| /**
|
| - * @param {string} id
|
| - * @param {string} text
|
| - * @return {string}
|
| - * @suppressGlobalPropertiesCheck
|
| + * @this {Element}
|
| */
|
| - themeStyleSheet: function(id, text)
|
| - {
|
| - if (!this.hasTheme() || this._injectingStyleSheet)
|
| - return "";
|
| -
|
| - var patch = this._cachedThemePatches.get(id);
|
| - if (!patch) {
|
| - var styleElement = createElement("style");
|
| - styleElement.type = "text/css";
|
| - styleElement.textContent = text;
|
| - document.body.appendChild(styleElement);
|
| - patch = this._patchForTheme(id, styleElement.sheet);
|
| - document.body.removeChild(styleElement);
|
| - }
|
| - return patch;
|
| + get value() {
|
| + return this.sliderElement.value;
|
| },
|
|
|
| + __proto__: HTMLLabelElement.prototype
|
| + });
|
| +
|
| + registerCustomElement('label', 'dt-small-bubble', {
|
| /**
|
| - * @param {string} id
|
| - * @param {!StyleSheet} styleSheet
|
| - * @return {string}
|
| + * @this {Element}
|
| */
|
| - _patchForTheme: function(id, styleSheet)
|
| - {
|
| - var cached = this._cachedThemePatches.get(id);
|
| - if (cached)
|
| - return cached;
|
| -
|
| - try {
|
| - var rules = styleSheet.cssRules;
|
| - var result = [];
|
| - for (var j = 0; j < rules.length; ++j) {
|
| - if (rules[j] instanceof CSSImportRule) {
|
| - result.push(this._patchForTheme(rules[j].styleSheet.href, rules[j].styleSheet));
|
| - continue;
|
| - }
|
| - var output = [];
|
| - var style = rules[j].style;
|
| - var selectorText = rules[j].selectorText;
|
| - for (var i = 0; style && i < style.length; ++i)
|
| - this._patchProperty(selectorText, style, style[i], output);
|
| - if (output.length)
|
| - result.push(rules[j].selectorText + "{" + output.join("") + "}");
|
| - }
|
| -
|
| - var fullText = result.join("\n");
|
| - this._cachedThemePatches.set(id, fullText);
|
| - return fullText;
|
| - } catch (e) {
|
| - this._setting.set("default");
|
| - return "";
|
| - }
|
| + createdCallback: function() {
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/smallBubble.css');
|
| + this._textElement = root.createChild('div');
|
| + this._textElement.className = 'info';
|
| + this._textElement.createChild('content');
|
| },
|
|
|
| /**
|
| - * @param {string} selectorText
|
| - * @param {!CSSStyleDeclaration} style
|
| - * @param {string} name
|
| - * @param {!Array<string>} output
|
| - *
|
| - * Theming API is primarily targeted at making dark theme look good.
|
| - * - If rule has ".-theme-preserve" in selector, it won't be affected.
|
| - * - If rule has ".selection" or "selected" or "-theme-selection-color" in selector, its hue is rotated 180deg in dark themes.
|
| - * - One can create specializations for dark themes via body.-theme-with-dark-background selector in host context.
|
| + * @param {string} type
|
| + * @this {Element}
|
| */
|
| - _patchProperty: function(selectorText, style, name, output)
|
| - {
|
| - if (!this._themableProperties.has(name))
|
| - return;
|
| -
|
| - var value = style.getPropertyValue(name);
|
| - if (!value || value === "none" || value === "inherit" || value === "initial" || value === "transparent")
|
| - return;
|
| - if (name === "background-image" && value.indexOf("gradient") === -1)
|
| - return;
|
| -
|
| - var isSelection = selectorText.indexOf(".-theme-selection-color") !== -1;
|
| - if (selectorText.indexOf("-theme-") !== -1 && !isSelection)
|
| - return;
|
| -
|
| - if (name === "-webkit-border-image") {
|
| - output.push("-webkit-filter: invert(100%)");
|
| - return;
|
| - }
|
| -
|
| - isSelection = isSelection || selectorText.indexOf("selected") !== -1 || selectorText.indexOf(".selection") !== -1;
|
| - var colorUsage = WebInspector.ThemeSupport.ColorUsage.Unknown;
|
| - if (isSelection)
|
| - colorUsage |= WebInspector.ThemeSupport.ColorUsage.Selection;
|
| - if (name.indexOf("background") === 0 || name.indexOf("border") === 0)
|
| - colorUsage |= WebInspector.ThemeSupport.ColorUsage.Background;
|
| - if (name.indexOf("background") === -1)
|
| - colorUsage |= WebInspector.ThemeSupport.ColorUsage.Foreground;
|
| -
|
| - output.push(name);
|
| - output.push(":");
|
| - var items = value.replace(WebInspector.Color.Regex, "\0$1\0").split("\0");
|
| - for (var i = 0; i < items.length; ++i)
|
| - output.push(this.patchColor(items[i], colorUsage));
|
| - if (style.getPropertyPriority(name))
|
| - output.push(" !important");
|
| - output.push(";");
|
| + set type(type) {
|
| + this._textElement.className = type;
|
| },
|
|
|
| + __proto__: HTMLLabelElement.prototype
|
| + });
|
| +
|
| + registerCustomElement('div', 'dt-close-button', {
|
| /**
|
| - * @param {string} text
|
| - * @param {!WebInspector.ThemeSupport.ColorUsage} colorUsage
|
| - * @return {string}
|
| + * @this {Element}
|
| */
|
| - patchColor: function(text, colorUsage)
|
| - {
|
| - var color = WebInspector.Color.parse(text);
|
| - if (!color)
|
| - return text;
|
| -
|
| - var hsla = color.hsla();
|
| - this._patchHSLA(hsla, colorUsage);
|
| - var rgba = [];
|
| - WebInspector.Color.hsl2rgb(hsla, rgba);
|
| - var outColor = new WebInspector.Color(rgba, color.format());
|
| - var outText = outColor.asString(null);
|
| - if (!outText)
|
| - outText = outColor.asString(outColor.hasAlpha() ? WebInspector.Color.Format.RGBA : WebInspector.Color.Format.RGB);
|
| - return outText || text;
|
| + createdCallback: function() {
|
| + var root = WebInspector.createShadowRootWithCoreStyles(this, 'ui/closeButton.css');
|
| + this._buttonElement = root.createChild('div', 'close-button');
|
| },
|
|
|
| /**
|
| - * @param {!Array<number>} hsla
|
| - * @param {!WebInspector.ThemeSupport.ColorUsage} colorUsage
|
| + * @param {boolean} gray
|
| + * @this {Element}
|
| */
|
| - _patchHSLA: function(hsla, colorUsage)
|
| - {
|
| - var hue = hsla[0];
|
| - var sat = hsla[1];
|
| - var lit = hsla[2];
|
| - var alpha = hsla[3];
|
| -
|
| - switch (this._themeName) {
|
| - case "dark":
|
| - if (colorUsage & WebInspector.ThemeSupport.ColorUsage.Selection)
|
| - hue = (hue + 0.5) % 1;
|
| - var minCap = colorUsage & WebInspector.ThemeSupport.ColorUsage.Background ? 0.14 : 0;
|
| - var maxCap = colorUsage & WebInspector.ThemeSupport.ColorUsage.Foreground ? 0.9 : 1;
|
| - lit = 1 - lit;
|
| - if (lit < minCap * 2)
|
| - lit = minCap + lit / 2;
|
| - else if (lit > 2 * maxCap - 1)
|
| - lit = maxCap - 1 / 2 + lit / 2;
|
| -
|
| - break;
|
| + set gray(gray) {
|
| + this._buttonElement.className = gray ? 'close-button-gray' : 'close-button';
|
| + },
|
| +
|
| + __proto__: HTMLDivElement.prototype
|
| + });
|
| +})();
|
| +
|
| +/**
|
| + * @param {!Element} input
|
| + * @param {function(string)} apply
|
| + * @param {function(string):boolean} validate
|
| + * @param {boolean} numeric
|
| + * @return {function(string)}
|
| + */
|
| +WebInspector.bindInput = function(input, apply, validate, numeric) {
|
| + input.addEventListener('change', onChange, false);
|
| + input.addEventListener('input', onInput, false);
|
| + input.addEventListener('keydown', onKeyDown, false);
|
| + input.addEventListener('focus', input.select.bind(input), false);
|
| +
|
| + function onInput() {
|
| + input.classList.toggle('error-input', !validate(input.value));
|
| + }
|
| +
|
| + function onChange() {
|
| + var valid = validate(input.value);
|
| + input.classList.toggle('error-input', !valid);
|
| + if (valid)
|
| + apply(input.value);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + function onKeyDown(event) {
|
| + if (isEnterKey(event)) {
|
| + if (validate(input.value))
|
| + apply(input.value);
|
| + return;
|
| + }
|
| +
|
| + if (!numeric)
|
| + return;
|
| +
|
| + var increment = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0;
|
| + if (!increment)
|
| + return;
|
| + if (event.shiftKey)
|
| + increment *= 10;
|
| +
|
| + var value = input.value;
|
| + if (!validate(value) || !value)
|
| + return;
|
| +
|
| + value = (value ? Number(value) : 0) + increment;
|
| + var stringValue = value ? String(value) : '';
|
| + if (!validate(stringValue) || !value)
|
| + return;
|
| +
|
| + input.value = stringValue;
|
| + apply(input.value);
|
| + event.preventDefault();
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + */
|
| + function setValue(value) {
|
| + if (value === input.value)
|
| + return;
|
| + var valid = validate(value);
|
| + input.classList.toggle('error-input', !valid);
|
| + input.value = value;
|
| + }
|
| +
|
| + return setValue;
|
| +};
|
| +
|
| +/**
|
| + * @unrestricted
|
| + */
|
| +WebInspector.ThemeSupport = class {
|
| + /**
|
| + * @param {!WebInspector.Setting} setting
|
| + */
|
| + constructor(setting) {
|
| + this._themeName = setting.get() || 'default';
|
| + this._themableProperties = new Set([
|
| + 'color', 'box-shadow', 'text-shadow', 'outline-color', 'background-image', 'background-color',
|
| + 'border-left-color', 'border-right-color', 'border-top-color', 'border-bottom-color', '-webkit-border-image'
|
| + ]);
|
| + /** @type {!Map<string, string>} */
|
| + this._cachedThemePatches = new Map();
|
| + this._setting = setting;
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + hasTheme() {
|
| + return this._themeName !== 'default';
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + themeName() {
|
| + return this._themeName;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + */
|
| + injectHighlightStyleSheets(element) {
|
| + this._injectingStyleSheet = true;
|
| + WebInspector.appendStyle(element, 'ui/inspectorSyntaxHighlight.css');
|
| + if (this._themeName === 'dark')
|
| + WebInspector.appendStyle(element, 'ui/inspectorSyntaxHighlightDark.css');
|
| + this._injectingStyleSheet = false;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Document} document
|
| + */
|
| + applyTheme(document) {
|
| + if (!this.hasTheme())
|
| + return;
|
| +
|
| + if (this._themeName === 'dark')
|
| + document.body.classList.add('-theme-with-dark-background');
|
| +
|
| + var styleSheets = document.styleSheets;
|
| + var result = [];
|
| + for (var i = 0; i < styleSheets.length; ++i)
|
| + result.push(this._patchForTheme(styleSheets[i].href, styleSheets[i]));
|
| + result.push('/*# sourceURL=inspector.css.theme */');
|
| +
|
| + var styleElement = createElement('style');
|
| + styleElement.type = 'text/css';
|
| + styleElement.textContent = result.join('\n');
|
| + document.head.appendChild(styleElement);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} id
|
| + * @param {string} text
|
| + * @return {string}
|
| + * @suppressGlobalPropertiesCheck
|
| + */
|
| + themeStyleSheet(id, text) {
|
| + if (!this.hasTheme() || this._injectingStyleSheet)
|
| + return '';
|
| +
|
| + var patch = this._cachedThemePatches.get(id);
|
| + if (!patch) {
|
| + var styleElement = createElement('style');
|
| + styleElement.type = 'text/css';
|
| + styleElement.textContent = text;
|
| + document.body.appendChild(styleElement);
|
| + patch = this._patchForTheme(id, styleElement.sheet);
|
| + document.body.removeChild(styleElement);
|
| + }
|
| + return patch;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} id
|
| + * @param {!StyleSheet} styleSheet
|
| + * @return {string}
|
| + */
|
| + _patchForTheme(id, styleSheet) {
|
| + var cached = this._cachedThemePatches.get(id);
|
| + if (cached)
|
| + return cached;
|
| +
|
| + try {
|
| + var rules = styleSheet.cssRules;
|
| + var result = [];
|
| + for (var j = 0; j < rules.length; ++j) {
|
| + if (rules[j] instanceof CSSImportRule) {
|
| + result.push(this._patchForTheme(rules[j].styleSheet.href, rules[j].styleSheet));
|
| + continue;
|
| }
|
| - hsla[0] = Number.constrain(hue, 0, 1);
|
| - hsla[1] = Number.constrain(sat, 0, 1);
|
| - hsla[2] = Number.constrain(lit, 0, 1);
|
| - hsla[3] = Number.constrain(alpha, 0, 1);
|
| + var output = [];
|
| + var style = rules[j].style;
|
| + var selectorText = rules[j].selectorText;
|
| + for (var i = 0; style && i < style.length; ++i)
|
| + this._patchProperty(selectorText, style, style[i], output);
|
| + if (output.length)
|
| + result.push(rules[j].selectorText + '{' + output.join('') + '}');
|
| + }
|
| +
|
| + var fullText = result.join('\n');
|
| + this._cachedThemePatches.set(id, fullText);
|
| + return fullText;
|
| + } catch (e) {
|
| + this._setting.set('default');
|
| + return '';
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} selectorText
|
| + * @param {!CSSStyleDeclaration} style
|
| + * @param {string} name
|
| + * @param {!Array<string>} output
|
| + *
|
| + * Theming API is primarily targeted at making dark theme look good.
|
| + * - If rule has ".-theme-preserve" in selector, it won't be affected.
|
| + * - If rule has ".selection" or "selected" or "-theme-selection-color" in selector, its hue is rotated 180deg in dark themes.
|
| + * - One can create specializations for dark themes via body.-theme-with-dark-background selector in host context.
|
| + */
|
| + _patchProperty(selectorText, style, name, output) {
|
| + if (!this._themableProperties.has(name))
|
| + return;
|
| +
|
| + var value = style.getPropertyValue(name);
|
| + if (!value || value === 'none' || value === 'inherit' || value === 'initial' || value === 'transparent')
|
| + return;
|
| + if (name === 'background-image' && value.indexOf('gradient') === -1)
|
| + return;
|
| +
|
| + var isSelection = selectorText.indexOf('.-theme-selection-color') !== -1;
|
| + if (selectorText.indexOf('-theme-') !== -1 && !isSelection)
|
| + return;
|
| +
|
| + if (name === '-webkit-border-image') {
|
| + output.push('-webkit-filter: invert(100%)');
|
| + return;
|
| + }
|
| +
|
| + isSelection = isSelection || selectorText.indexOf('selected') !== -1 || selectorText.indexOf('.selection') !== -1;
|
| + var colorUsage = WebInspector.ThemeSupport.ColorUsage.Unknown;
|
| + if (isSelection)
|
| + colorUsage |= WebInspector.ThemeSupport.ColorUsage.Selection;
|
| + if (name.indexOf('background') === 0 || name.indexOf('border') === 0)
|
| + colorUsage |= WebInspector.ThemeSupport.ColorUsage.Background;
|
| + if (name.indexOf('background') === -1)
|
| + colorUsage |= WebInspector.ThemeSupport.ColorUsage.Foreground;
|
| +
|
| + output.push(name);
|
| + output.push(':');
|
| + var items = value.replace(WebInspector.Color.Regex, '\0$1\0').split('\0');
|
| + for (var i = 0; i < items.length; ++i)
|
| + output.push(this.patchColor(items[i], colorUsage));
|
| + if (style.getPropertyPriority(name))
|
| + output.push(' !important');
|
| + output.push(';');
|
| + }
|
| +
|
| + /**
|
| + * @param {string} text
|
| + * @param {!WebInspector.ThemeSupport.ColorUsage} colorUsage
|
| + * @return {string}
|
| + */
|
| + patchColor(text, colorUsage) {
|
| + var color = WebInspector.Color.parse(text);
|
| + if (!color)
|
| + return text;
|
| +
|
| + var hsla = color.hsla();
|
| + this._patchHSLA(hsla, colorUsage);
|
| + var rgba = [];
|
| + WebInspector.Color.hsl2rgb(hsla, rgba);
|
| + var outColor = new WebInspector.Color(rgba, color.format());
|
| + var outText = outColor.asString(null);
|
| + if (!outText)
|
| + outText = outColor.asString(outColor.hasAlpha() ? WebInspector.Color.Format.RGBA : WebInspector.Color.Format.RGB);
|
| + return outText || text;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<number>} hsla
|
| + * @param {!WebInspector.ThemeSupport.ColorUsage} colorUsage
|
| + */
|
| + _patchHSLA(hsla, colorUsage) {
|
| + var hue = hsla[0];
|
| + var sat = hsla[1];
|
| + var lit = hsla[2];
|
| + var alpha = hsla[3];
|
| +
|
| + switch (this._themeName) {
|
| + case 'dark':
|
| + if (colorUsage & WebInspector.ThemeSupport.ColorUsage.Selection)
|
| + hue = (hue + 0.5) % 1;
|
| + var minCap = colorUsage & WebInspector.ThemeSupport.ColorUsage.Background ? 0.14 : 0;
|
| + var maxCap = colorUsage & WebInspector.ThemeSupport.ColorUsage.Foreground ? 0.9 : 1;
|
| + lit = 1 - lit;
|
| + if (lit < minCap * 2)
|
| + lit = minCap + lit / 2;
|
| + else if (lit > 2 * maxCap - 1)
|
| + lit = maxCap - 1 / 2 + lit / 2;
|
| +
|
| + break;
|
| + }
|
| + hsla[0] = Number.constrain(hue, 0, 1);
|
| + hsla[1] = Number.constrain(sat, 0, 1);
|
| + hsla[2] = Number.constrain(lit, 0, 1);
|
| + hsla[3] = Number.constrain(alpha, 0, 1);
|
| + }
|
| +};
|
| +
|
| +/**
|
| + * @enum {number}
|
| + */
|
| +WebInspector.ThemeSupport.ColorUsage = {
|
| + Unknown: 0,
|
| + Foreground: 1 << 0,
|
| + Background: 1 << 1,
|
| + Selection: 1 << 2,
|
| };
|
|
|
| /**
|
| @@ -1948,30 +1855,29 @@ WebInspector.ThemeSupport.prototype = {
|
| * @param {string=} tooltipText
|
| * @return {!Element}
|
| */
|
| -WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
|
| -{
|
| - if (!linkText)
|
| - linkText = url;
|
| -
|
| - var a = createElementWithClass("a", classes);
|
| - var href = url;
|
| - if (url.trim().toLowerCase().startsWith("javascript:"))
|
| - href = null;
|
| - if (isExternal && WebInspector.ParsedURL.isRelativeURL(url))
|
| - href = null;
|
| - if (href !== null) {
|
| - a.href = href;
|
| - a.classList.add(isExternal ? "webkit-html-external-link" : "webkit-html-resource-link");
|
| - }
|
| - if (!tooltipText && linkText !== url)
|
| - a.title = url;
|
| - else if (tooltipText)
|
| - a.title = tooltipText;
|
| - a.textContent = linkText.trimMiddle(150);
|
| - if (isExternal)
|
| - a.setAttribute("target", "_blank");
|
| -
|
| - return a;
|
| +WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText) {
|
| + if (!linkText)
|
| + linkText = url;
|
| +
|
| + var a = createElementWithClass('a', classes);
|
| + var href = url;
|
| + if (url.trim().toLowerCase().startsWith('javascript:'))
|
| + href = null;
|
| + if (isExternal && WebInspector.ParsedURL.isRelativeURL(url))
|
| + href = null;
|
| + if (href !== null) {
|
| + a.href = href;
|
| + a.classList.add(isExternal ? 'webkit-html-external-link' : 'webkit-html-resource-link');
|
| + }
|
| + if (!tooltipText && linkText !== url)
|
| + a.title = url;
|
| + else if (tooltipText)
|
| + a.title = tooltipText;
|
| + a.textContent = linkText.trimMiddle(150);
|
| + if (isExternal)
|
| + a.setAttribute('target', '_blank');
|
| +
|
| + return a;
|
| };
|
|
|
| /**
|
| @@ -1979,23 +1885,22 @@ WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, too
|
| * @param {string} title
|
| * @return {!Element}
|
| */
|
| -WebInspector.linkifyDocumentationURLAsNode = function(article, title)
|
| -{
|
| - return WebInspector.linkifyURLAsNode("https://developers.google.com/web/tools/chrome-devtools/" + article, title, undefined, true);
|
| +WebInspector.linkifyDocumentationURLAsNode = function(article, title) {
|
| + return WebInspector.linkifyURLAsNode(
|
| + 'https://developers.google.com/web/tools/chrome-devtools/' + article, title, undefined, true);
|
| };
|
|
|
| /**
|
| * @param {string} url
|
| * @return {!Promise<?Image>}
|
| */
|
| -WebInspector.loadImage = function(url)
|
| -{
|
| - return new Promise(fulfill => {
|
| - var image = new Image();
|
| - image.addEventListener("load", () => fulfill(image));
|
| - image.addEventListener("error", () => fulfill(null));
|
| - image.src = url;
|
| - });
|
| +WebInspector.loadImage = function(url) {
|
| + return new Promise(fulfill => {
|
| + var image = new Image();
|
| + image.addEventListener('load', () => fulfill(image));
|
| + image.addEventListener('error', () => fulfill(null));
|
| + image.src = url;
|
| + });
|
| };
|
|
|
| /** @type {!WebInspector.ThemeSupport} */
|
|
|