| Index: third_party/polymer/v0_8/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
|
| diff --git a/third_party/polymer/v0_8/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js b/third_party/polymer/v0_8/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..171e42134c6c9e6b3d11f177e1505c9c02efbb14
|
| --- /dev/null
|
| +++ b/third_party/polymer/v0_8/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
|
| @@ -0,0 +1,415 @@
|
| +
|
| +
|
| +/*
|
| +Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays
|
| +on top of other content. It includes an optional backdrop, and can be used to implement a variety
|
| +of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
|
| +
|
| +### Closing and canceling
|
| +
|
| +A dialog may be hidden by closing or canceling. The difference between close and cancel is user
|
| +intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
|
| +it will cancel whenever the user taps outside it or presses the escape key. This behavior is
|
| +configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
|
| +`close()` should be called explicitly by the implementer when the user interacts with a control
|
| +in the overlay element.
|
| +
|
| +### Positioning
|
| +
|
| +By default the element is sized and positioned to fit and centered inside the window. You can
|
| +position and size it manually using CSS. See `Polymer.IronFitBehavior`.
|
| +
|
| +### Backdrop
|
| +
|
| +Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is
|
| +appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
|
| +options.
|
| +
|
| +### Limitations
|
| +
|
| +The element is styled to appear on top of other content by setting its `z-index` property. You
|
| +must ensure no element has a stacking context with a higher `z-index` than its parent stacking
|
| +context. You should place this element as a child of `<body>` whenever possible.
|
| +
|
| +@demo demo/index.html
|
| +@polymerBehavior Polymer.IronOverlayBehavior
|
| +*/
|
| +
|
| + Polymer.IronOverlayBehaviorImpl = {
|
| +
|
| + properties: {
|
| +
|
| + /**
|
| + * True if the overlay is currently displayed.
|
| + */
|
| + opened: {
|
| + observer: '_openedChanged',
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * True if the overlay was canceled when it was last closed.
|
| + */
|
| + canceled: {
|
| + observer: '_canceledChanged',
|
| + readOnly: true,
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * Set to true to display a backdrop behind the overlay.
|
| + */
|
| + withBackdrop: {
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * Set to true to disable auto-focusing the overlay or child nodes with
|
| + * the `autofocus` attribute` when the overlay is opened.
|
| + */
|
| + noAutoFocus: {
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * Set to true to disable canceling the overlay with the ESC key.
|
| + */
|
| + noCancelOnEscKey: {
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * Set to true to disable canceling the overlay by clicking outside it.
|
| + */
|
| + noCancelOnOutsideClick: {
|
| + type: Boolean,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * Returns the reason this dialog was last closed.
|
| + */
|
| + closingReason: {
|
| + // was a getter before, but needs to be a property so other
|
| + // behaviors can override this.
|
| + type: Object
|
| + },
|
| +
|
| + _manager: {
|
| + type: Object,
|
| + value: Polymer.IronOverlayManager
|
| + },
|
| +
|
| + _boundOnCaptureClick: {
|
| + type: Function,
|
| + value: function() {
|
| + return this._onCaptureClick.bind(this);
|
| + }
|
| + },
|
| +
|
| + _boundOnCaptureKeydown: {
|
| + type: Function,
|
| + value: function() {
|
| + return this._onCaptureKeydown.bind(this);
|
| + }
|
| + }
|
| +
|
| + },
|
| +
|
| + listeners: {
|
| + 'click': '_onClick',
|
| + 'iron-resize': '_onIronResize'
|
| + },
|
| +
|
| + /**
|
| + * The backdrop element.
|
| + * @type Node
|
| + */
|
| + get backdropElement() {
|
| + return this._backdrop;
|
| + },
|
| +
|
| + get _focusNode() {
|
| + return Polymer.dom(this).querySelector('[autofocus]') || this;
|
| + },
|
| +
|
| + registered: function() {
|
| + this._backdrop = document.createElement('iron-overlay-backdrop');
|
| + },
|
| +
|
| + ready: function() {
|
| + this._ensureSetup();
|
| + if (this._callOpenedWhenReady) {
|
| + this._openedChanged();
|
| + }
|
| + },
|
| +
|
| + detached: function() {
|
| + this.opened = false;
|
| + this._completeBackdrop();
|
| + this._manager.removeOverlay(this);
|
| + },
|
| +
|
| + /**
|
| + * Toggle the opened state of the overlay.
|
| + */
|
| + toggle: function() {
|
| + this.opened = !this.opened;
|
| + },
|
| +
|
| + /**
|
| + * Open the overlay.
|
| + */
|
| + open: function() {
|
| + this.opened = true;
|
| + this.closingReason = {canceled: false};
|
| + },
|
| +
|
| + /**
|
| + * Close the overlay.
|
| + */
|
| + close: function() {
|
| + this.opened = false;
|
| + this._setCanceled(false);
|
| + },
|
| +
|
| + /**
|
| + * Cancels the overlay.
|
| + */
|
| + cancel: function() {
|
| + this.opened = false,
|
| + this._setCanceled(true);
|
| + },
|
| +
|
| + _ensureSetup: function() {
|
| + if (this._overlaySetup) {
|
| + return;
|
| + }
|
| + this._overlaySetup = true;
|
| + this.style.outline = 'none';
|
| + this.style.display = 'none';
|
| + },
|
| +
|
| + _openedChanged: function() {
|
| + if (this.opened) {
|
| + this.removeAttribute('aria-hidden');
|
| + } else {
|
| + this.setAttribute('aria-hidden', 'true');
|
| + }
|
| +
|
| + // wait to call after ready only if we're initially open
|
| + if (!this._overlaySetup) {
|
| + this._callOpenedWhenReady = this.opened;
|
| + return;
|
| + }
|
| + if (this._openChangedAsync) {
|
| + this.cancelAsync(this._openChangedAsync);
|
| + }
|
| +
|
| + this._toggleListeners();
|
| +
|
| + if (this.opened) {
|
| + this._prepareRenderOpened();
|
| + }
|
| +
|
| + // async here to allow overlay layer to become visible.
|
| + this._openChangedAsync = this.async(function() {
|
| + // overlay becomes visible here
|
| + this.style.display = '';
|
| + // force layout to ensure transitions will go
|
| + this.offsetWidth;
|
| + if (this.opened) {
|
| + this._renderOpened();
|
| + } else {
|
| + this._renderClosed();
|
| + }
|
| + this._openChangedAsync = null;
|
| + });
|
| +
|
| + },
|
| +
|
| + _canceledChanged: function() {
|
| + this.closingReason = this.closingReason || {};
|
| + this.closingReason.canceled = this.canceled;
|
| + },
|
| +
|
| + _toggleListener: function(enable, node, event, boundListener, capture) {
|
| + if (enable) {
|
| + node.addEventListener(event, boundListener, capture);
|
| + } else {
|
| + node.removeEventListener(event, boundListener, capture);
|
| + }
|
| + },
|
| +
|
| + _toggleListeners: function() {
|
| + if (this._toggleListenersAsync) {
|
| + this.cancelAsync(this._toggleListenersAsync);
|
| + }
|
| + // async so we don't auto-close immediately via a click.
|
| + this._toggleListenersAsync = this.async(function() {
|
| + this._toggleListener(this.opened, document, 'click', this._boundOnCaptureClick, true);
|
| + this._toggleListener(this.opened, document, 'keydown', this._boundOnCaptureKeydown, true);
|
| + this._toggleListenersAsync = null;
|
| + });
|
| + },
|
| +
|
| + // tasks which must occur before opening; e.g. making the element visible
|
| + _prepareRenderOpened: function() {
|
| + this._manager.addOverlay(this);
|
| +
|
| + if (this.withBackdrop) {
|
| + this.backdropElement.prepare();
|
| + this._manager.trackBackdrop(this);
|
| + }
|
| +
|
| + this._preparePositioning();
|
| + this.fit();
|
| + this._finishPositioning();
|
| + },
|
| +
|
| + // tasks which cause the overlay to actually open; typically play an
|
| + // animation
|
| + _renderOpened: function() {
|
| + if (this.withBackdrop) {
|
| + this.backdropElement.open();
|
| + }
|
| + this._finishRenderOpened();
|
| + },
|
| +
|
| + _renderClosed: function() {
|
| + if (this.withBackdrop) {
|
| + this.backdropElement.close();
|
| + }
|
| + this._finishRenderClosed();
|
| + },
|
| +
|
| + _onTransitionend: function(event) {
|
| + // make sure this is our transition event.
|
| + if (event && event.target !== this) {
|
| + return;
|
| + }
|
| + if (this.opened) {
|
| + this._finishRenderOpened();
|
| + } else {
|
| + this._finishRenderClosed();
|
| + }
|
| + },
|
| +
|
| + _finishRenderOpened: function() {
|
| + // focus the child node with [autofocus]
|
| + if (!this.noAutoFocus) {
|
| + this._focusNode.focus();
|
| + }
|
| +
|
| + this.fire('iron-overlay-opened');
|
| +
|
| + this._squelchNextResize = true;
|
| + this.async(this.notifyResize);
|
| + },
|
| +
|
| + _finishRenderClosed: function() {
|
| + // hide the overlay and remove the backdrop
|
| + this.resetFit();
|
| + this.style.display = 'none';
|
| + this._completeBackdrop();
|
| + this._manager.removeOverlay(this);
|
| +
|
| + this._focusNode.blur();
|
| + // focus the next overlay, if there is one
|
| + this._manager.focusOverlay();
|
| +
|
| + this.fire('iron-overlay-closed', this.closingReason);
|
| +
|
| + this._squelchNextResize = true;
|
| + this.async(this.notifyResize);
|
| + },
|
| +
|
| + _completeBackdrop: function() {
|
| + if (this.withBackdrop) {
|
| + this._manager.trackBackdrop(this);
|
| + this.backdropElement.complete();
|
| + }
|
| + },
|
| +
|
| + _preparePositioning: function() {
|
| + this.style.transition = this.style.webkitTransition = 'none';
|
| + this.style.transform = this.style.webkitTransform = 'none';
|
| + this.style.display = '';
|
| + },
|
| +
|
| + _finishPositioning: function(target) {
|
| + this.style.display = 'none';
|
| + this.style.transform = this.style.webkitTransform = '';
|
| + // force layout to avoid application of transform
|
| + this.offsetWidth;
|
| + this.style.transition = this.style.webkitTransition = '';
|
| + },
|
| +
|
| + _applyFocus: function() {
|
| + if (this.opened) {
|
| + if (!this.noAutoFocus) {
|
| + this._focusNode.focus();
|
| + }
|
| + } else {
|
| + this._focusNode.blur();
|
| + this._manager.focusOverlay();
|
| + }
|
| + },
|
| +
|
| + _onCaptureClick: function(event) {
|
| + // attempt to close asynchronously and prevent the close of a tap event is immediately heard
|
| + // on target. This is because in shadow dom due to event retargetting event.target is not
|
| + // useful.
|
| + if (!this.noCancelOnOutsideClick && (this._manager.currentOverlay() == this)) {
|
| + this._cancelJob = this.async(function() {
|
| + this.cancel();
|
| + }, 10);
|
| + }
|
| + },
|
| +
|
| + _onClick: function(event) {
|
| + if (this._cancelJob) {
|
| + this.cancelAsync(this._cancelJob);
|
| + this._cancelJob = null;
|
| + }
|
| + },
|
| +
|
| + _onCaptureKeydown: function(event) {
|
| + var ESC = 27;
|
| + if (!this.noCancelOnEscKey && (event.keyCode === ESC)) {
|
| + this.cancel();
|
| + event.stopPropagation();
|
| + }
|
| + },
|
| +
|
| + _onIronResize: function() {
|
| + if (this._squelchNextResize) {
|
| + this._squelchNextResize = false;
|
| + return;
|
| + }
|
| + if (this.opened) {
|
| + this.refit();
|
| + }
|
| + }
|
| +
|
| + };
|
| +
|
| + /** @polymerBehavior */
|
| + Polymer.IronOverlayBehavior = [Polymer.IronFitBehavior, Polymer.IronResizableBehavior, Polymer.IronOverlayBehaviorImpl];
|
| +
|
| +/*
|
| + * Fired after the `iron-overlay` opens.
|
| + * @event iron-overlay-opened
|
| + */
|
| +
|
| +/*
|
| + * Fired after the `iron-overlay` closes.
|
| + * @event iron-overlay-closed {{canceled: boolean}} detail -
|
| + * canceled: True if the overlay was canceled.
|
| + */
|
| +
|
|
|