65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright (C) 2016 The Android Open Source Project
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
// http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
(function() {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  const AWAIT_MAX_ITERS = 10;
 | 
						|
  const AWAIT_STEP = 5;
 | 
						|
 | 
						|
  Polymer({
 | 
						|
    is: 'gr-overlay',
 | 
						|
 | 
						|
    behaviors: [
 | 
						|
      Polymer.IronOverlayBehavior,
 | 
						|
    ],
 | 
						|
 | 
						|
    open(...args) {
 | 
						|
      return new Promise(resolve => {
 | 
						|
        Polymer.IronOverlayBehaviorImpl.open.apply(this, args);
 | 
						|
        this._awaitOpen(resolve);
 | 
						|
      });
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Override the focus stops that iron-overlay-behavior tries to find.
 | 
						|
     */
 | 
						|
    setFocusStops(stops) {
 | 
						|
      this.__firstFocusableNode = stops.start;
 | 
						|
      this.__lastFocusableNode = stops.end;
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * NOTE: (wyatta) Slightly hacky way to listen to the overlay actually
 | 
						|
     * opening. Eventually replace with a direct way to listen to the overlay.
 | 
						|
     */
 | 
						|
    _awaitOpen(fn) {
 | 
						|
      let iters = 0;
 | 
						|
      const step = () => {
 | 
						|
        this.async(() => {
 | 
						|
          if (this.style.display !== 'none') {
 | 
						|
            fn.call(this);
 | 
						|
          } else if (iters++ < AWAIT_MAX_ITERS) {
 | 
						|
            step.call(this);
 | 
						|
          }
 | 
						|
        }, AWAIT_STEP);
 | 
						|
      };
 | 
						|
      step.call(this);
 | 
						|
    },
 | 
						|
 | 
						|
    _id() {
 | 
						|
      return this.getAttribute('id') || 'global';
 | 
						|
    },
 | 
						|
  });
 | 
						|
})();
 |