Update Polymer and pull in iron-list
[chromium-blink-merge.git] / third_party / polymer / v1_0 / components-chromium / iron-overlay-behavior / iron-overlay-manager-extracted.js
blob0d97ded635222112a6e4a9445631f9f4c82556b5
3   Polymer.IronOverlayManager = (function() {
5     var overlays = [];
6     var DEFAULT_Z = 10;
7     var backdrops = [];
9     // track overlays for z-index and focus managemant
10     function addOverlay(overlay) {
11       var z0 = currentOverlayZ();
12       overlays.push(overlay);
13       var z1 = currentOverlayZ();
14       if (z1 <= z0) {
15         applyOverlayZ(overlay, z0);
16       }
17     }
19     function removeOverlay(overlay) {
20       var i = overlays.indexOf(overlay);
21       if (i >= 0) {
22         overlays.splice(i, 1);
23         setZ(overlay, '');
24       }
25     }
27     function applyOverlayZ(overlay, aboveZ) {
28       setZ(overlay, aboveZ + 2);
29     }
31     function setZ(element, z) {
32       element.style.zIndex = z;
33     }
35     function currentOverlay() {
36       var i = overlays.length - 1;
37       while (overlays[i] && !overlays[i].opened) {
38         --i;
39       }
40       return overlays[i];
41     }
43     function currentOverlayZ() {
44       var z;
45       var current = currentOverlay();
46       if (current) {
47         var z1 = window.getComputedStyle(current).zIndex;
48         if (!isNaN(z1)) {
49           z = Number(z1);
50         }
51       }
52       return z || DEFAULT_Z;
53     }
55     function focusOverlay() {
56       var current = currentOverlay();
57       // We have to be careful to focus the next overlay _after_ any current
58       // transitions are complete (due to the state being toggled prior to the
59       // transition). Otherwise, we risk infinite recursion when a transitioning
60       // (closed) overlay becomes the current overlay.
61       //
62       // NOTE: We make the assumption that any overlay that completes a transition
63       // will call into focusOverlay to kick the process back off. Currently:
64       // transitionend -> _applyFocus -> focusOverlay.
65       if (current && !current.transitioning) {
66         current._applyFocus();
67       }
68     }
70     function trackBackdrop(element) {
71       // backdrops contains the overlays with a backdrop that are currently
72       // visible
73       if (element.opened) {
74         backdrops.push(element);
75       } else {
76         var index = backdrops.indexOf(element);
77         if (index >= 0) {
78           backdrops.splice(index, 1);
79         }
80       }
81     }
83     function getBackdrops() {
84       return backdrops;
85     }
87     return {
88       addOverlay: addOverlay,
89       removeOverlay: removeOverlay,
90       currentOverlay: currentOverlay,
91       currentOverlayZ: currentOverlayZ,
92       focusOverlay: focusOverlay,
93       trackBackdrop: trackBackdrop,
94       getBackdrops: getBackdrops
95     };
97   })();