From ba749de15deb9c4c248a7153281451129f4a35aa Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 11 Mar 2016 22:29:37 -0500 Subject: [PATCH] update components --- .../emby-webcomponents/.bower.json | 8 +- .../emby-webcomponents/browser.js | 1 + .../browserdeviceprofile.js | 26 +- .../emby-webcomponents/images/imagehelper.js | 11 +- .../emby-webcomponents/scrollhelper.js | 53 ++- .../emby-webcomponents/visibleinviewport.js | 19 +- .../iron-dropdown/.bower.json | 8 +- .../bower_components/iron-dropdown/bower.json | 2 +- .../iron-dropdown-scroll-manager.html | 4 +- .../iron-dropdown/iron-dropdown.html | 218 +++++------ .../iron-dropdown/test/iron-dropdown.html | 97 +++-- .../bower_components/iron-icon/.bower.json | 6 +- .../iron-overlay-behavior/.bower.json | 8 +- .../iron-overlay-behavior/bower.json | 2 +- .../iron-overlay-behavior.html | 11 +- .../iron-overlay-manager.html | 367 ++++++++++-------- .../paper-behaviors/.bower.json | 4 +- .../bower_components/paper-ripple/.bower.json | 6 +- 18 files changed, 482 insertions(+), 369 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index ac83d5ef6..308a67d6d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -16,12 +16,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.1.33", - "_release": "1.1.33", + "version": "1.1.37", + "_release": "1.1.37", "_resolution": { "type": "version", - "tag": "1.1.33", - "commit": "9933aefe464ffcf5a3a29851ec0f34ff088d0ff5" + "tag": "1.1.37", + "commit": "7235838b8cff53a9bb2aea7d6c6418160728cd3a" }, "_source": "git://github.com/MediaBrowser/emby-webcomponents.git", "_target": "~1.1.5", diff --git a/dashboard-ui/bower_components/emby-webcomponents/browser.js b/dashboard-ui/bower_components/emby-webcomponents/browser.js index d30e32e61..c973fdbb0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browser.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browser.js @@ -99,6 +99,7 @@ browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) != -1; browser.tv = isTv(); + browser.operaTv = browser.tv && userAgent.toLowerCase().indexOf('opr/') != -1; return browser; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index 77a566ed6..73a65e7b3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -88,6 +88,12 @@ define(['browser'], function (browser) { // Unfortunately there's no real way to detect mkv support if (browser.chrome) { + + // Not supported on opera tv + if (browser.operaTv) { + return false; + } + return true; } @@ -125,6 +131,15 @@ define(['browser'], function (browser) { case 'wmv': supported = browser.tizen || browser.web0s; break; + case 'ts': + supported = browser.tizen || browser.web0s; + if (supported) { + return { + Container: 'ts,mpegts', + Type: 'Video' + }; + } + break; default: break; } @@ -231,17 +246,8 @@ define(['browser'], function (browser) { }); } - if (canPlayTs) { - profile.DirectPlayProfiles.push({ - Container: 'ts,mpegts', - Type: 'Video', - VideoCodec: 'h264', - AudioCodec: videoAudioCodecs.join(',') - }); - } - // These are formats we can't test for but some devices will support - ['m2ts', 'wmv'].map(getDirectPlayProfileForVideoContainer).filter(function (i) { + ['m2ts', 'wmv', 'ts'].map(getDirectPlayProfileForVideoContainer).filter(function (i) { return i != null; }).forEach(function (i) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js b/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js index 7d80813e0..3acfa9cbd 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js @@ -5,8 +5,8 @@ define(['visibleinviewport', 'imageFetcher'], function (visibleinviewport, image var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); - function isVisible(elem) { - return visibleinviewport(elem, true, thresholdX, thresholdY); + function isVisible(elem, windowSize) { + return visibleinviewport(elem, true, thresholdX, thresholdY, windowSize); } var self = {}; @@ -56,6 +56,11 @@ define(['visibleinviewport', 'imageFetcher'], function (visibleinviewport, image var anyFound = false; var out = false; + var windowSize = { + innerHeight: window.innerHeight, + innerWidth: window.innerWidth + }; + // TODO: This out construct assumes left to right, top to bottom for (var i = 0, length = images.length; i < length; i++) { @@ -64,7 +69,7 @@ define(['visibleinviewport', 'imageFetcher'], function (visibleinviewport, image return; } var img = images[i]; - if (!out && isVisible(img)) { + if (!out && isVisible(img, windowSize)) { anyFound = true; fillImage(img); } else { diff --git a/dashboard-ui/bower_components/emby-webcomponents/scrollhelper.js b/dashboard-ui/bower_components/emby-webcomponents/scrollhelper.js index cc6919c22..52b0520f9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/scrollhelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/scrollhelper.js @@ -1,31 +1,54 @@ define(['focusManager'], function (focusManager) { - function getOffset(elem) { + function getOffsets(elems) { var doc = document; - var box = { top: 0, left: 0 }; + var results = []; if (!doc) { - return box; + return results; } var docElem = doc.documentElement; - - // Support: BlackBerry 5, iOS 3 (original iPhone) - // If we don't have gBCR, just use 0,0 rather than error - if (elem.getBoundingClientRect) { - box = elem.getBoundingClientRect(); - } - var win = doc.defaultView; - return { - top: box.top + win.pageYOffset - docElem.clientTop, - left: box.left + win.pageXOffset - docElem.clientLeft + var docElemValues = { + clientTop: docElem.clientTop, + clientLeft: docElem.clientLeft }; + + var win = doc.defaultView; + var winValues = { + pageXOffset: win.pageXOffset, + pageYOffset: win.pageYOffset + }; + + var box; + var elem; + + for (var i = 0, length = elems.length; i < length; i++) { + + elem = elems[i]; + // Support: BlackBerry 5, iOS 3 (original iPhone) + // If we don't have gBCR, just use 0,0 rather than error + if (elem.getBoundingClientRect) { + box = elem.getBoundingClientRect(); + } else { + box = { top: 0, left: 0 }; + } + + results[i] = { + top: box.top + winValues.pageYOffset - docElemValues.clientTop, + left: box.left + winValues.pageXOffset - docElemValues.clientLeft + }; + } + + return results; } function getPosition(scrollContainer, item, horizontal) { - var slideeOffset = getOffset(scrollContainer); - var itemOffset = getOffset(item); + + var offsets = getOffsets([scrollContainer, item]); + var slideeOffset = offsets[0]; + var itemOffset = offsets[1]; var offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; var size = item[horizontal ? 'offsetWidth' : 'offsetHeight']; diff --git a/dashboard-ui/bower_components/emby-webcomponents/visibleinviewport.js b/dashboard-ui/bower_components/emby-webcomponents/visibleinviewport.js index faa3b1b54..c89a6bdee 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/visibleinviewport.js +++ b/dashboard-ui/bower_components/emby-webcomponents/visibleinviewport.js @@ -10,17 +10,22 @@ * the user visible viewport of a web browser. * only accounts for vertical position, not horizontal. */ - function visibleInViewport(elem, partial, thresholdX, thresholdY) { + function visibleInViewport(elem, partial, thresholdX, thresholdY, windowSize) { thresholdX = thresholdX || 0; thresholdY = thresholdY || 0; - var vpWidth = window.innerWidth, - vpHeight = window.innerHeight; - - if (!elem.getBoundingClientRect){ - return true; - } + if (!elem.getBoundingClientRect) { + return true; + } + + windowSize = windowSize || { + innerHeight: window.innerHeight, + innerWidth: window.innerWidth + }; + + var vpWidth = windowSize.innerWidth, + vpHeight = windowSize.innerHeight; // Use this native browser method, if available. var rec = elem.getBoundingClientRect(), diff --git a/dashboard-ui/bower_components/iron-dropdown/.bower.json b/dashboard-ui/bower_components/iron-dropdown/.bower.json index b76dd1702..d2077f11c 100644 --- a/dashboard-ui/bower_components/iron-dropdown/.bower.json +++ b/dashboard-ui/bower_components/iron-dropdown/.bower.json @@ -1,6 +1,6 @@ { "name": "iron-dropdown", - "version": "1.2.0", + "version": "1.3.0", "description": "An unstyled element that works similarly to a native browser select", "authors": [ "The Polymer Authors" @@ -36,11 +36,11 @@ "iron-image": "polymerelements/iron-image#^1.0.0" }, "ignore": [], - "_release": "1.2.0", + "_release": "1.3.0", "_resolution": { "type": "version", - "tag": "v1.2.0", - "commit": "f864191c6ffbd3aaddea8102102ab40137046327" + "tag": "v1.3.0", + "commit": "9d6bb9e7a8150430e61559f5a0827526d2eefaa4" }, "_source": "git://github.com/polymerelements/iron-dropdown.git", "_target": "^1.0.0", diff --git a/dashboard-ui/bower_components/iron-dropdown/bower.json b/dashboard-ui/bower_components/iron-dropdown/bower.json index 8b9b75b4b..6cbbe388d 100644 --- a/dashboard-ui/bower_components/iron-dropdown/bower.json +++ b/dashboard-ui/bower_components/iron-dropdown/bower.json @@ -1,6 +1,6 @@ { "name": "iron-dropdown", - "version": "1.2.0", + "version": "1.3.0", "description": "An unstyled element that works similarly to a native browser select", "authors": [ "The Polymer Authors" diff --git a/dashboard-ui/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html b/dashboard-ui/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html index 14f8933d0..5e9176efa 100644 --- a/dashboard-ui/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html +++ b/dashboard-ui/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html @@ -175,9 +175,11 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN }, _scrollInteractionHandler: function(event) { + var scrolledElement = + /** @type {HTMLElement} */(Polymer.dom(event).rootTarget); if (Polymer .IronDropdownScrollManager - .elementIsScrollLocked(Polymer.dom(event).rootTarget)) { + .elementIsScrollLocked(scrolledElement)) { if (event.type === 'keydown' && !Polymer.IronDropdownScrollManager._isScrollingKeypress(event)) { return; diff --git a/dashboard-ui/bower_components/iron-dropdown/iron-dropdown.html b/dashboard-ui/bower_components/iron-dropdown/iron-dropdown.html index b4c0e6131..7c48a2d47 100644 --- a/dashboard-ui/bower_components/iron-dropdown/iron-dropdown.html +++ b/dashboard-ui/bower_components/iron-dropdown/iron-dropdown.html @@ -143,8 +143,7 @@ method is called on the element. * it is opened. */ positionTarget: { - type: Object, - observer: '_positionTargetChanged' + type: Object }, /** @@ -189,15 +188,6 @@ method is called on the element. allowOutsideScroll: { type: Boolean, value: false - }, - - /** - * We memoize the positionTarget bounding rectangle so that we can - * limit the number of times it is queried per resize / relayout. - * @type {?Object} - */ - _positionRectMemo: { - type: Object } }, @@ -206,13 +196,13 @@ method is called on the element. }, observers: [ - '_updateOverlayPosition(verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)' + '_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)' ], attached: function() { - if (this.positionTarget === undefined) { - this.positionTarget = this._defaultPositionTarget; - } + this.positionTarget = this.positionTarget || this._defaultPositionTarget; + // Memoize this to avoid expensive calculations & relayouts. + this._isRTL = window.getComputedStyle(this).direction == 'rtl'; }, /** @@ -230,13 +220,6 @@ method is called on the element. return this.focusTarget || this.containedElement; }, - /** - * Whether the text direction is RTL - */ - _isRTL: function() { - return window.getComputedStyle(this).direction == 'rtl'; - }, - /** * The element that should be used to position the dropdown when * it opens, if no position target is configured. @@ -252,31 +235,32 @@ method is called on the element. }, /** - * The bounding rect of the position target. + * The horizontal align value, accounting for the RTL/LTR text direction. */ - get _positionRect() { - if (!this._positionRectMemo && this.positionTarget) { - this._positionRectMemo = this.positionTarget.getBoundingClientRect(); + get _localeHorizontalAlign() { + // In RTL, "left" becomes "right". + if (this._isRTL) { + return this.horizontalAlign === 'right' ? 'left' : 'right'; + } else { + return this.horizontalAlign; } - - return this._positionRectMemo; }, /** * The horizontal offset value used to position the dropdown. + * @param {ClientRect} dropdownRect + * @param {ClientRect} positionRect + * @param {boolean=false} fromRight + * @return {number} pixels + * @private */ - get _horizontalAlignTargetValue() { + _horizontalAlignTargetValue: function(dropdownRect, positionRect, fromRight) { var target; - - // In RTL, the direction flips, so what is "right" in LTR becomes "left". - var isRTL = this._isRTL(); - if ((!isRTL && this.horizontalAlign === 'right') || - (isRTL && this.horizontalAlign === 'left')) { - target = document.documentElement.clientWidth - this._positionRect.right; + if (fromRight) { + target = document.documentElement.clientWidth - positionRect.right - (this._fitWidth - dropdownRect.right); } else { - target = this._positionRect.left; + target = positionRect.left - dropdownRect.left; } - target += this.horizontalOffset; return Math.max(target, 0); @@ -284,33 +268,24 @@ method is called on the element. /** * The vertical offset value used to position the dropdown. + * @param {ClientRect} dropdownRect + * @param {ClientRect} positionRect + * @param {boolean=false} fromBottom + * @return {number} pixels + * @private */ - get _verticalAlignTargetValue() { + _verticalAlignTargetValue: function(dropdownRect, positionRect, fromBottom) { var target; - - if (this.verticalAlign === 'bottom') { - target = document.documentElement.clientHeight - this._positionRect.bottom; + if (fromBottom) { + target = document.documentElement.clientHeight - positionRect.bottom - (this._fitHeight - dropdownRect.bottom); } else { - target = this._positionRect.top; + target = positionRect.top - dropdownRect.top; } - target += this.verticalOffset; return Math.max(target, 0); }, - /** - * The horizontal align value, accounting for the RTL/LTR text direction. - */ - get _localeHorizontalAlign() { - // In RTL, "left" becomes "right". - if (this._isRTL()) { - return this.horizontalAlign === 'right' ? 'left' : 'right'; - } else { - return this.horizontalAlign; - } - }, - /** * Called when the value of `opened` changes. * @@ -321,7 +296,8 @@ method is called on the element. this.cancel(); } else { this.cancelAnimation(); - this._prepareDropdown(); + this.sizingTarget = this.containedElement || this.sizingTarget; + this._updateAnimationConfig(); Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments); } }, @@ -335,6 +311,9 @@ method is called on the element. } if (!this.noAnimations && this.animationConfig && this.animationConfig.open) { + if (this.withBackdrop) { + this.backdropElement.open(); + } this.$.contentWrapper.classList.add('animating'); this.playAnimation('open'); } else { @@ -348,6 +327,9 @@ method is called on the element. _renderClosed: function() { Polymer.IronDropdownScrollManager.removeScrollLock(this); if (!this.noAnimations && this.animationConfig && this.animationConfig.close) { + if (this.withBackdrop) { + this.backdropElement.close(); + } this.$.contentWrapper.classList.add('animating'); this.playAnimation('close'); } else { @@ -364,44 +346,12 @@ method is called on the element. _onNeonAnimationFinish: function() { this.$.contentWrapper.classList.remove('animating'); if (this.opened) { - Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this); + Polymer.IronOverlayBehaviorImpl._finishRenderOpened.apply(this); } else { - Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this); + Polymer.IronOverlayBehaviorImpl._finishRenderClosed.apply(this); } }, - /** - * Called when an `iron-resize` event fires. - */ - _onIronResize: function() { - var containedElement = this.containedElement; - var scrollTop; - var scrollLeft; - - if (this.opened && containedElement) { - scrollTop = containedElement.scrollTop; - scrollLeft = containedElement.scrollLeft; - } - - if (this.opened) { - this._updateOverlayPosition(); - } - - Polymer.IronOverlayBehaviorImpl._onIronResize.apply(this, arguments); - - if (this.opened && containedElement) { - containedElement.scrollTop = scrollTop; - containedElement.scrollLeft = scrollLeft; - } - }, - - /** - * Called when the `positionTarget` property changes. - */ - _positionTargetChanged: function() { - this._updateOverlayPosition(); - }, - /** * Constructs the final animation config from different properties used * to configure specific parts of the opening and closing animations. @@ -434,43 +384,73 @@ method is called on the element. }, /** - * Prepares the dropdown for opening by updating measured layout - * values. + * Updates the overlay position based on configured horizontal + * and vertical alignment. */ - _prepareDropdown: function() { - this.sizingTarget = this.containedElement || this.sizingTarget; - this._updateAnimationConfig(); - this._updateOverlayPosition(); + _updateOverlayPosition: function() { + if (this.isAttached) { + // This triggers iron-resize, and iron-overlay-behavior will call refit if needed. + this.notifyResize(); + } }, /** - * Updates the overlay position based on configured horizontal - * and vertical alignment, and re-memoizes these values for the sake - * of behavior in `IronFitBehavior`. + * Useful to call this after the element, the window, or the `fitInfo` + * element has been resized. Will maintain the scroll position. */ - _updateOverlayPosition: function() { - this._positionRectMemo = null; - - if (!this.positionTarget) { - return; + refit: function () { + if (!this.opened) { + return } + var containedElement = this.containedElement; + var scrollTop; + var scrollLeft; - this.style[this._localeHorizontalAlign] = - this._horizontalAlignTargetValue + 'px'; - - this.style[this.verticalAlign] = - this._verticalAlignTargetValue + 'px'; - - // NOTE(cdata): We re-memoize inline styles here, otherwise - // calling `refit` from `IronFitBehavior` will reset inline styles - // to whatever they were when the dropdown first opened. - if (this._fitInfo) { - this._fitInfo.inlineStyle[this.horizontalAlign] = - this.style[this.horizontalAlign]; - - this._fitInfo.inlineStyle[this.verticalAlign] = - this.style[this.verticalAlign]; + if (containedElement) { + scrollTop = containedElement.scrollTop; + scrollLeft = containedElement.scrollLeft; } + Polymer.IronFitBehavior.refit.apply(this, arguments); + + if (containedElement) { + containedElement.scrollTop = scrollTop; + containedElement.scrollLeft = scrollLeft; + } + }, + + /** + * Resets the target element's position and size constraints, and clear + * the memoized data. + */ + resetFit: function() { + Polymer.IronFitBehavior.resetFit.apply(this, arguments); + + var hAlign = this._localeHorizontalAlign; + var vAlign = this.verticalAlign; + // Set to 0, 0 in order to discover any offset caused by parent stacking contexts. + this.style[hAlign] = this.style[vAlign] = '0px'; + + var dropdownRect = this.getBoundingClientRect(); + var positionRect = this.positionTarget.getBoundingClientRect(); + var horizontalValue = this._horizontalAlignTargetValue(dropdownRect, positionRect, hAlign === 'right'); + var verticalValue = this._verticalAlignTargetValue(dropdownRect, positionRect, vAlign === 'bottom'); + + this.style[hAlign] = horizontalValue + 'px'; + this.style[vAlign] = verticalValue + 'px'; + }, + + /** + * Overridden from `IronFitBehavior`. + * Ensure positionedBy has correct values for horizontally & vertically. + */ + _discoverInfo: function() { + Polymer.IronFitBehavior._discoverInfo.apply(this, arguments); + // Note(valdrin): in Firefox, an element with style `position: fixed; bottom: 90vh; height: 20vh` + // would have `getComputedStyle(element).top < 0` (instead of being `auto`) http://jsbin.com/cofired/3/edit?html,output + // This would cause IronFitBehavior's `constrain` to wrongly calculate sizes + // (it would use `top` instead of `bottom`), so we ensure we give the correct values. + this._fitInfo.positionedBy.horizontally = this._localeHorizontalAlign; + this._fitInfo.positionedBy.vertically = this.verticalAlign; }, /** diff --git a/dashboard-ui/bower_components/iron-dropdown/test/iron-dropdown.html b/dashboard-ui/bower_components/iron-dropdown/test/iron-dropdown.html index b355352f1..5652892d3 100644 --- a/dashboard-ui/bower_components/iron-dropdown/test/iron-dropdown.html +++ b/dashboard-ui/bower_components/iron-dropdown/test/iron-dropdown.html @@ -28,13 +28,38 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN margin: 0; padding: 0; } + + .container { + display: block; + position: relative; + width: 100px; + height: 100px; + background-color: yellow; + } + + .positioned { + position: absolute; + top: 40px; + left: 40px; + } + + .dropdown-content { + width: 50px; + height: 50px; + background-color: orange; + } + + .full-screen { + width: 100vw; + height: 100vh; + } @@ -49,9 +74,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN @@ -60,9 +85,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN @@ -70,9 +95,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN @@ -90,9 +115,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN @@ -100,9 +125,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN @@ -196,7 +221,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN .to.be.equal(1); expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(document.body)) .to.be.equal(true); - + if(openCount === 0) { // This triggers a second `pushScrollLock` with the same element, however // that should not add the element to the `_lockingElements` stack twice @@ -240,11 +265,10 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN runAfterOpen(dropdown, function () { dropdownRect = dropdown.getBoundingClientRect(); parentRect = parent.getBoundingClientRect(); - - // NOTE(cdata): IE10 / 11 have minor rounding errors in this case, - // so we assert with `closeTo` and a tight threshold: - expect(dropdownRect.top).to.be.closeTo(parentRect.top, 0.1); - expect(dropdownRect.right).to.be.closeTo(parentRect.right, 0.1); + assert.equal(dropdownRect.top, parentRect.top, 'top ok'); + assert.equal(dropdownRect.left, 0, 'left ok'); + assert.equal(dropdownRect.bottom, document.documentElement.clientHeight, 'bottom ok'); + assert.equal(dropdownRect.right, parentRect.right, 'right ok'); done(); }); }); @@ -257,11 +281,26 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN runAfterOpen(dropdown, function () { parentRect = parent.getBoundingClientRect(); dropdownRect = dropdown.getBoundingClientRect(); + assert.equal(dropdownRect.top, 0, 'top ok'); + assert.equal(dropdownRect.left, 0, 'left ok'); + assert.equal(dropdownRect.bottom, parentRect.bottom, 'bottom ok'); + assert.equal(dropdownRect.right, parentRect.right, 'right ok'); + done(); + }); + }); - // NOTE(cdata): IE10 / 11 have minor rounding errors in this case, - // so we assert with `closeTo` and a tight threshold: - expect(dropdownRect.bottom).to.be.closeTo(parentRect.bottom, 0.1); - expect(dropdownRect.right).to.be.closeTo(parentRect.right, 0.1); + test('handles parent\'s stacking context', function(done) { + var parentRect; + var dropdownRect; + // This will create a new stacking context. + parent.style.transform = 'translateZ(0)'; + runAfterOpen(dropdown, function () { + dropdownRect = dropdown.getBoundingClientRect(); + parentRect = parent.getBoundingClientRect(); + assert.equal(dropdownRect.top, parentRect.top, 'top ok'); + assert.equal(dropdownRect.left, 0, 'left ok'); + assert.equal(dropdownRect.bottom, document.documentElement.clientHeight, 'bottom ok'); + assert.equal(dropdownRect.right, parentRect.right, 'right ok'); done(); }); }); @@ -285,9 +324,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN offsetDropdownRect = dropdown.getBoundingClientRect(); // verticalAlign is top, so a positive offset moves down. - expect(dropdownRect.top + 10).to.be.closeTo(offsetDropdownRect.top, 0.1); + assert.equal(dropdownRect.top + 10, offsetDropdownRect.top, 'top ok'); // horizontalAlign is left, so a positive offset moves to the right. - expect(dropdownRect.left + 10).to.be.closeTo(offsetDropdownRect.left, 0.1); + assert.equal(dropdownRect.left + 10, offsetDropdownRect.left, 'left ok'); done(); }); }); @@ -301,9 +340,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN offsetDropdownRect = dropdown.getBoundingClientRect(); // verticalAlign is top, so a negative offset moves up. - expect(dropdownRect.top - 10).to.be.closeTo(offsetDropdownRect.top, 0.1); + assert.equal(dropdownRect.top - 10, offsetDropdownRect.top, 'top ok'); // horizontalAlign is left, so a negative offset moves to the left. - expect(dropdownRect.left - 10).to.be.closeTo(offsetDropdownRect.left, 0.1); + assert.equal(dropdownRect.left - 10, offsetDropdownRect.left, 'left ok'); done(); }); }); @@ -327,9 +366,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN offsetDropdownRect = dropdown.getBoundingClientRect(); // verticalAlign is bottom, so a positive offset moves up. - expect(dropdownRect.bottom - 10).to.be.closeTo(offsetDropdownRect.bottom, 0.1); + assert.equal(dropdownRect.bottom - 10, offsetDropdownRect.bottom, 'bottom ok'); // horizontalAlign is right, so a positive offset moves to the left. - expect(dropdownRect.right - 10).to.be.closeTo(offsetDropdownRect.right, 0.1); + assert.equal(dropdownRect.right - 10, offsetDropdownRect.right, 'right ok'); done(); }); }); @@ -343,9 +382,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN offsetDropdownRect = dropdown.getBoundingClientRect(); // verticalAlign is bottom, so a negative offset moves down. - expect(dropdownRect.bottom + 10).to.be.closeTo(offsetDropdownRect.bottom, 0.1); + assert.equal(dropdownRect.bottom + 10, offsetDropdownRect.bottom, 'bottom ok'); // horizontalAlign is right, so a positive offset moves to the right. - expect(dropdownRect.right + 10).to.be.closeTo(offsetDropdownRect.right, 0.1); + assert.equal(dropdownRect.right + 10, offsetDropdownRect.right, 'right ok'); done(); }); }); diff --git a/dashboard-ui/bower_components/iron-icon/.bower.json b/dashboard-ui/bower_components/iron-icon/.bower.json index 9784e3a3b..f0167baf1 100644 --- a/dashboard-ui/bower_components/iron-icon/.bower.json +++ b/dashboard-ui/bower_components/iron-icon/.bower.json @@ -32,14 +32,14 @@ "web-component-tester": "^4.0.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, - "homepage": "https://github.com/PolymerElements/iron-icon", + "homepage": "https://github.com/polymerelements/iron-icon", "_release": "1.0.8", "_resolution": { "type": "version", "tag": "v1.0.8", "commit": "f36b38928849ef3853db727faa8c9ef104d611eb" }, - "_source": "git://github.com/PolymerElements/iron-icon.git", + "_source": "git://github.com/polymerelements/iron-icon.git", "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-icon" + "_originalSource": "polymerelements/iron-icon" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-overlay-behavior/.bower.json b/dashboard-ui/bower_components/iron-overlay-behavior/.bower.json index c8f51831c..15d41e263 100644 --- a/dashboard-ui/bower_components/iron-overlay-behavior/.bower.json +++ b/dashboard-ui/bower_components/iron-overlay-behavior/.bower.json @@ -1,6 +1,6 @@ { "name": "iron-overlay-behavior", - "version": "1.4.2", + "version": "1.4.3", "license": "http://polymer.github.io/LICENSE.txt", "description": "Provides a behavior for making an element an overlay", "private": true, @@ -35,11 +35,11 @@ }, "ignore": [], "homepage": "https://github.com/polymerelements/iron-overlay-behavior", - "_release": "1.4.2", + "_release": "1.4.3", "_resolution": { "type": "version", - "tag": "v1.4.2", - "commit": "565869d04433fb1065210ca30d81e7b7c4af73f8" + "tag": "v1.4.3", + "commit": "6b8662619fbd4e82c2cebce6a846425ff9fc610d" }, "_source": "git://github.com/polymerelements/iron-overlay-behavior.git", "_target": "^1.0.0", diff --git a/dashboard-ui/bower_components/iron-overlay-behavior/bower.json b/dashboard-ui/bower_components/iron-overlay-behavior/bower.json index 8232d06df..4a764a7b7 100644 --- a/dashboard-ui/bower_components/iron-overlay-behavior/bower.json +++ b/dashboard-ui/bower_components/iron-overlay-behavior/bower.json @@ -1,6 +1,6 @@ { "name": "iron-overlay-behavior", - "version": "1.4.2", + "version": "1.4.3", "license": "http://polymer.github.io/LICENSE.txt", "description": "Provides a behavior for making an element an overlay", "private": true, diff --git a/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-behavior.html b/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-behavior.html index 49c5cf286..c86858d52 100644 --- a/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-behavior.html +++ b/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-behavior.html @@ -136,6 +136,11 @@ context. You should place this element as a child of `` whenever possible. value: false }, + /** + * Shortcut to access to the overlay manager. + * @private + * @type {Polymer.IronOverlayManagerClass} + */ _manager: { type: Object, value: Polymer.IronOverlayManager @@ -176,7 +181,7 @@ context. You should place this element as a child of `` whenever possible. /** * The backdrop element. - * @type {Node} + * @type {Element} */ get backdropElement() { return this._manager.backdropElement; @@ -197,7 +202,7 @@ context. You should place this element as a child of `` whenever possible. * * If you know what is your content (specifically the first and last focusable children), * you can override this method to return only `[firstFocusable, lastFocusable];` - * @type {[Node]} + * @type {Array} * @protected */ get _focusableNodes() { @@ -295,7 +300,7 @@ context. You should place this element as a child of `` whenever possible. /** * Cancels the overlay. - * @param {?Event} event The original event + * @param {Event=} event The original event */ cancel: function(event) { var cancelEvent = this.fire('iron-overlay-canceled', event, {cancelable: true}); diff --git a/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-manager.html b/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-manager.html index 3156f7b29..c11186497 100644 --- a/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-manager.html +++ b/dashboard-ui/bower_components/iron-overlay-behavior/iron-overlay-manager.html @@ -15,197 +15,244 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN /** * @struct * @constructor + * @private */ Polymer.IronOverlayManagerClass = function() { + /** + * Used to keep track of the opened overlays. + * @private {Array} + */ this._overlays = []; - // Used to keep track of the last focused node before an overlay gets opened. + + /** + * Used to keep track of the last focused node before an overlay gets opened. + * @private {Array} + */ this._lastFocusedNodes = []; /** - * iframes have a default z-index of 100, so this default should be at least - * that. + * iframes have a default z-index of 100, + * so this default should be at least that. * @private {number} */ this._minimumZ = 101; + /** + * Used to keep track of the opened overlays with backdrop. + * @private {Array} + */ this._backdrops = []; + /** + * Memoized backdrop element. + * @private {Element|null} + */ this._backdropElement = null; - Object.defineProperty(this, 'backdropElement', { - get: function() { - if (!this._backdropElement) { - this._backdropElement = document.createElement('iron-overlay-backdrop'); - } - return this._backdropElement; - }.bind(this) - }); + }; + + Polymer.IronOverlayManagerClass.prototype = { + + constructor: Polymer.IronOverlayManagerClass, + + /** + * The shared backdrop element. + * @type {Element} backdropElement + */ + get backdropElement() { + if (!this._backdropElement) { + this._backdropElement = document.createElement('iron-overlay-backdrop'); + } + return this._backdropElement; + }, /** * The deepest active element. - * returns {?Node} element the active element + * @type {Element|undefined} activeElement the active element */ - this.deepActiveElement = null; - Object.defineProperty(this, 'deepActiveElement', { - get: function() { - var active = document.activeElement; - // document.activeElement can be null - // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement - while (active && active.root && Polymer.dom(active.root).activeElement) { - active = Polymer.dom(active.root).activeElement; + get deepActiveElement() { + var active = document.activeElement; + // document.activeElement can be null + // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement + while (active && active.root && Polymer.dom(active.root).activeElement) { + active = Polymer.dom(active.root).activeElement; + } + return active; + }, + + /** + * If a node is contained in an overlay. + * @param {Element=} node + * @return {boolean} + * @private + */ + _isChildOfOverlay: function(node) { + while (node && node !== document.body) { + // Use logical parentNode, or native ShadowRoot host. + node = Polymer.dom(node).parentNode || node.host; + // Check if it is an overlay. + if (node && node.behaviors && node.behaviors.indexOf(Polymer.IronOverlayBehaviorImpl) !== -1) { + return true; } - return active; - }.bind(this) - }); - }; - - /** - * If a node is contained in an overlay. - * @private - * @param {Node} node - * @returns {Boolean} - */ - Polymer.IronOverlayManagerClass.prototype._isChildOfOverlay = function(node) { - while (node && node !== document.body) { - // Use logical parentNode, or native ShadowRoot host. - node = Polymer.dom(node).parentNode || node.host; - // Check if it is an overlay. - if (node && node.behaviors && node.behaviors.indexOf(Polymer.IronOverlayBehaviorImpl) !== -1) { - return true; } - } - return false; - }; + return false; + }, - Polymer.IronOverlayManagerClass.prototype._applyOverlayZ = function(overlay, aboveZ) { - this._setZ(overlay, aboveZ + 2); - }; + /** + * @param {Element} overlay + * @param {number} aboveZ + * @private + */ + _applyOverlayZ: function(overlay, aboveZ) { + this._setZ(overlay, aboveZ + 2); + }, - Polymer.IronOverlayManagerClass.prototype._setZ = function(element, z) { - element.style.zIndex = z; - }; + /** + * @param {Element} element + * @param {number|string} z + * @private + */ + _setZ: function(element, z) { + element.style.zIndex = z; + }, - /** - * track overlays for z-index and focus managemant - */ - Polymer.IronOverlayManagerClass.prototype.addOverlay = function(overlay) { - var minimumZ = Math.max(this.currentOverlayZ(), this._minimumZ); - this._overlays.push(overlay); - var newZ = this.currentOverlayZ(); - if (newZ <= minimumZ) { - this._applyOverlayZ(overlay, minimumZ); - } - var element = this.deepActiveElement; - // If already in other overlay, don't reset focus there. - if (this._isChildOfOverlay(element)) { - element = null; - } - this._lastFocusedNodes.push(element); - }; - - Polymer.IronOverlayManagerClass.prototype.removeOverlay = function(overlay) { - var i = this._overlays.indexOf(overlay); - if (i >= 0) { - this._overlays.splice(i, 1); - this._setZ(overlay, ''); - - var node = this._lastFocusedNodes[i]; - // Focus only if still contained in document.body - if (overlay.restoreFocusOnClose && node && Polymer.dom(document.body).deepContains(node)) { - node.focus(); + /** + * Tracks overlays for z-index and focus management. + * @param {Element} overlay + */ + addOverlay: function(overlay) { + var minimumZ = Math.max(this.currentOverlayZ(), this._minimumZ); + this._overlays.push(overlay); + var newZ = this.currentOverlayZ(); + if (newZ <= minimumZ) { + this._applyOverlayZ(overlay, minimumZ); } - this._lastFocusedNodes.splice(i, 1); - } - }; - - Polymer.IronOverlayManagerClass.prototype.currentOverlay = function() { - var i = this._overlays.length - 1; - while (this._overlays[i] && !this._overlays[i].opened) { - --i; - } - return this._overlays[i]; - }; - - Polymer.IronOverlayManagerClass.prototype.currentOverlayZ = function() { - return this._getOverlayZ(this.currentOverlay()); - }; - - /** - * Ensures that the minimum z-index of new overlays is at least `minimumZ`. - * This does not effect the z-index of any existing overlays. - * - * @param {number} minimumZ - */ - Polymer.IronOverlayManagerClass.prototype.ensureMinimumZ = function(minimumZ) { - this._minimumZ = Math.max(this._minimumZ, minimumZ); - }; - - Polymer.IronOverlayManagerClass.prototype.focusOverlay = function() { - var current = this.currentOverlay(); - // We have to be careful to focus the next overlay _after_ any current - // transitions are complete (due to the state being toggled prior to the - // transition). Otherwise, we risk infinite recursion when a transitioning - // (closed) overlay becomes the current overlay. - // - // NOTE: We make the assumption that any overlay that completes a transition - // will call into focusOverlay to kick the process back off. Currently: - // transitionend -> _applyFocus -> focusOverlay. - if (current && !current.transitioning) { - current._applyFocus(); - } - }; - - Polymer.IronOverlayManagerClass.prototype.trackBackdrop = function(element) { - // backdrops contains the overlays with a backdrop that are currently - // visible - var index = this._backdrops.indexOf(element); - if (element.opened && element.withBackdrop) { - // no duplicates - if (index === -1) { - this._backdrops.push(element); + var element = this.deepActiveElement; + // If already in other overlay, don't reset focus there. + if (this._isChildOfOverlay(element)) { + element = null; } - } else if (index >= 0) { - this._backdrops.splice(index, 1); - } - }; + this._lastFocusedNodes.push(element); + }, - Polymer.IronOverlayManagerClass.prototype.getBackdrops = function() { - return this._backdrops; - }; + /** + * @param {Element} overlay + */ + removeOverlay: function(overlay) { + var i = this._overlays.indexOf(overlay); + if (i >= 0) { + this._overlays.splice(i, 1); + this._setZ(overlay, ''); - /** - * Returns the z-index for the backdrop. - */ - Polymer.IronOverlayManagerClass.prototype.backdropZ = function() { - return this._getOverlayZ(this._overlayWithBackdrop()) - 1; - }; - - /** - * Returns the first opened overlay that has a backdrop. - */ - Polymer.IronOverlayManagerClass.prototype._overlayWithBackdrop = function() { - for (var i = 0; i < this._overlays.length; i++) { - if (this._overlays[i].opened && this._overlays[i].withBackdrop) { - return this._overlays[i]; + var node = this._lastFocusedNodes[i]; + // Focus only if still contained in document.body + if (overlay.restoreFocusOnClose && node && Polymer.dom(document.body).deepContains(node)) { + node.focus(); + } + this._lastFocusedNodes.splice(i, 1); } - } - }; + }, - /** - * Calculates the minimum z-index for the overlay. - */ - Polymer.IronOverlayManagerClass.prototype._getOverlayZ = function(overlay) { - var z = this._minimumZ; - if (overlay) { - var z1 = Number(window.getComputedStyle(overlay).zIndex); - // Check if is a number - // Number.isNaN not supported in IE 10+ - if (z1 === z1) { - z = z1; + /** + * @return {Element|undefined} overlay The current overlay. + */ + currentOverlay: function() { + var i = this._overlays.length - 1; + while (this._overlays[i] && !this._overlays[i].opened) { + --i; } + return this._overlays[i]; + }, + + /** + * @return {number} zIndex the current overlay z-index. + */ + currentOverlayZ: function() { + return this._getOverlayZ(this.currentOverlay()); + }, + + /** + * Ensures that the minimum z-index of new overlays is at least `minimumZ`. + * This does not effect the z-index of any existing overlays. + * @param {number} minimumZ + */ + ensureMinimumZ: function(minimumZ) { + this._minimumZ = Math.max(this._minimumZ, minimumZ); + }, + + focusOverlay: function() { + var current = /** @type {?} */ (this.currentOverlay()); + // We have to be careful to focus the next overlay _after_ any current + // transitions are complete (due to the state being toggled prior to the + // transition). Otherwise, we risk infinite recursion when a transitioning + // (closed) overlay becomes the current overlay. + // + // NOTE: We make the assumption that any overlay that completes a transition + // will call into focusOverlay to kick the process back off. Currently: + // transitionend -> _applyFocus -> focusOverlay. + if (current && !current.transitioning) { + current._applyFocus(); + } + }, + + /** + * @param {Element} overlay The overlay that updated its withBackdrop. + */ + trackBackdrop: function(overlay) { + var index = this._backdrops.indexOf(overlay); + if (overlay.opened && overlay.withBackdrop) { + // no duplicates + if (index === -1) { + this._backdrops.push(overlay); + } + } else if (index >= 0) { + this._backdrops.splice(index, 1); + } + }, + + /** + * @return {Array} backdrops + */ + getBackdrops: function() { + return this._backdrops; + }, + + /** + * @return {number} index The z-index for the backdrop. + */ + backdropZ: function() { + return this._getOverlayZ(this._overlayWithBackdrop()) - 1; + }, + + /** + * @return {Element|undefined} overlay The first opened overlay that has a backdrop. + * @private + */ + _overlayWithBackdrop: function() { + for (var i = 0; i < this._overlays.length; i++) { + if (this._overlays[i].opened && this._overlays[i].withBackdrop) { + return this._overlays[i]; + } + } + }, + + /** + * Calculates the minimum z-index for the overlay. + * @param {Element=} overlay + * @private + */ + _getOverlayZ: function(overlay) { + var z = this._minimumZ; + if (overlay) { + var z1 = Number(window.getComputedStyle(overlay).zIndex); + // Check if is a number + // Number.isNaN not supported in IE 10+ + if (z1 === z1) { + z = z1; + } + } + return z; } - return z; }; Polymer.IronOverlayManager = new Polymer.IronOverlayManagerClass(); - diff --git a/dashboard-ui/bower_components/paper-behaviors/.bower.json b/dashboard-ui/bower_components/paper-behaviors/.bower.json index a6b333d33..2b04bf9f8 100644 --- a/dashboard-ui/bower_components/paper-behaviors/.bower.json +++ b/dashboard-ui/bower_components/paper-behaviors/.bower.json @@ -45,7 +45,7 @@ "tag": "v1.0.11", "commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5" }, - "_source": "git://github.com/polymerelements/paper-behaviors.git", + "_source": "git://github.com/PolymerElements/paper-behaviors.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/paper-behaviors" + "_originalSource": "PolymerElements/paper-behaviors" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/paper-ripple/.bower.json b/dashboard-ui/bower_components/paper-ripple/.bower.json index 2f654d71c..157225ee7 100644 --- a/dashboard-ui/bower_components/paper-ripple/.bower.json +++ b/dashboard-ui/bower_components/paper-ripple/.bower.json @@ -32,14 +32,14 @@ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" }, "ignore": [], - "homepage": "https://github.com/polymerelements/paper-ripple", + "homepage": "https://github.com/PolymerElements/paper-ripple", "_release": "1.0.5", "_resolution": { "type": "version", "tag": "v1.0.5", "commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5" }, - "_source": "git://github.com/polymerelements/paper-ripple.git", + "_source": "git://github.com/PolymerElements/paper-ripple.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/paper-ripple" + "_originalSource": "PolymerElements/paper-ripple" } \ No newline at end of file