2018-04-13 16:40:26 -07:00
|
|
|
/**
|
2018-12-19 16:15:06 -08:00
|
|
|
* @suppress {checkPrototypalTypes}
|
2017-12-15 14:12:44 -08:00
|
|
|
@license
|
|
|
|
|
Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
|
|
|
|
|
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
|
|
|
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
|
|
|
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
|
|
|
Code distributed by Google as part of the polymer project is also
|
|
|
|
|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
2018-04-13 16:40:26 -07:00
|
|
|
*/
|
|
|
|
|
import { ElementMixin } from './element-mixin.js';
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
import { dedupingMixin } from '../utils/mixin.js';
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
const DISABLED_ATTR = 'disable-upgrade';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Element class mixin that allows the element to boot up in a non-enabled
|
|
|
|
|
* state when the `disable-upgrade` attribute is present. This mixin is
|
2018-04-23 17:33:52 -07:00
|
|
|
* designed to be used with element classes like PolymerElement that perform
|
2018-04-13 16:40:26 -07:00
|
|
|
* initial startup work when they are first connected. When the
|
|
|
|
|
* `disable-upgrade` attribute is removed, if the element is connected, it
|
|
|
|
|
* boots up and "enables" as it otherwise would; if it is not connected, the
|
|
|
|
|
* element boots up when it is next connected.
|
|
|
|
|
*
|
2018-04-23 17:33:52 -07:00
|
|
|
* Using `disable-upgrade` with PolymerElement prevents any data propagation
|
2018-04-13 16:40:26 -07:00
|
|
|
* to the element, any element DOM from stamping, or any work done in
|
|
|
|
|
* connected/disconnctedCallback from occuring, but it does not prevent work
|
|
|
|
|
* done in the element constructor.
|
|
|
|
|
*
|
|
|
|
|
* Note, this mixin must be applied on top of any element class that
|
|
|
|
|
* itself implements a `connectedCallback` so that it can control the work
|
|
|
|
|
* done in `connectedCallback`. For example,
|
|
|
|
|
*
|
2018-04-23 17:33:52 -07:00
|
|
|
* MyClass = DisableUpgradeMixin(class extends BaseClass {...});
|
2018-04-13 16:40:26 -07:00
|
|
|
*
|
|
|
|
|
* @mixinFunction
|
|
|
|
|
* @polymer
|
2018-04-23 17:33:52 -07:00
|
|
|
* @appliesMixin ElementMixin
|
2018-04-13 16:40:26 -07:00
|
|
|
*/
|
|
|
|
|
export const DisableUpgradeMixin = dedupingMixin((base) => {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @constructor
|
|
|
|
|
* @extends {base}
|
|
|
|
|
* @implements {Polymer_ElementMixin}
|
2018-07-20 21:40:34 -07:00
|
|
|
* @private
|
2018-04-13 16:40:26 -07:00
|
|
|
*/
|
|
|
|
|
const superClass = ElementMixin(base);
|
2018-07-20 21:40:34 -07:00
|
|
|
|
2017-12-15 14:12:44 -08:00
|
|
|
/**
|
|
|
|
|
* @polymer
|
2018-04-13 16:40:26 -07:00
|
|
|
* @mixinClass
|
|
|
|
|
* @implements {Polymer_DisableUpgradeMixin}
|
2017-12-15 14:12:44 -08:00
|
|
|
*/
|
2018-04-13 16:40:26 -07:00
|
|
|
class DisableUpgradeClass extends superClass {
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
/** @override */
|
|
|
|
|
static get observedAttributes() {
|
|
|
|
|
return super.observedAttributes.concat(DISABLED_ATTR);
|
|
|
|
|
}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
/** @override */
|
|
|
|
|
attributeChangedCallback(name, old, value, namespace) {
|
|
|
|
|
if (name == DISABLED_ATTR) {
|
|
|
|
|
if (!this.__dataEnabled && value == null && this.isConnected) {
|
|
|
|
|
super.connectedCallback();
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-04-13 16:40:26 -07:00
|
|
|
} else {
|
|
|
|
|
super.attributeChangedCallback(name, old, value, namespace);
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-04-13 16:40:26 -07:00
|
|
|
}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
/*
|
|
|
|
|
NOTE: cannot gate on attribute because this is called before
|
|
|
|
|
attributes are delivered. Therefore, we stub this out and
|
|
|
|
|
call `super._initializeProperties()` manually.
|
|
|
|
|
*/
|
|
|
|
|
/** @override */
|
|
|
|
|
_initializeProperties() {}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
// prevent user code in connected from running
|
|
|
|
|
/** @override */
|
|
|
|
|
connectedCallback() {
|
|
|
|
|
if (this.__dataEnabled || !this.hasAttribute(DISABLED_ATTR)) {
|
|
|
|
|
super.connectedCallback();
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-04-13 16:40:26 -07:00
|
|
|
}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
// prevent element from turning on properties
|
|
|
|
|
/** @override */
|
|
|
|
|
_enableProperties() {
|
|
|
|
|
if (!this.hasAttribute(DISABLED_ATTR)) {
|
|
|
|
|
if (!this.__dataEnabled) {
|
|
|
|
|
super._initializeProperties();
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-04-13 16:40:26 -07:00
|
|
|
super._enableProperties();
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-04-13 16:40:26 -07:00
|
|
|
}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
// only go if "enabled"
|
|
|
|
|
/** @override */
|
|
|
|
|
disconnectedCallback() {
|
|
|
|
|
if (this.__dataEnabled) {
|
|
|
|
|
super.disconnectedCallback();
|
2017-12-15 14:12:44 -08:00
|
|
|
}
|
2018-02-21 12:45:18 -08:00
|
|
|
}
|
2017-12-15 14:34:07 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
}
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
return DisableUpgradeClass;
|
2017-12-15 14:12:44 -08:00
|
|
|
|
2018-04-13 16:40:26 -07:00
|
|
|
});
|