Files
polymer/lib/mixins/disable-upgrade-mixin.js

111 lines
3.4 KiB
JavaScript
Raw Normal View History

2018-04-13 16:40:26 -07: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';
2018-04-13 16:40:26 -07:00
import { dedupingMixin } from '../utils/mixin.js';
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
* 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.
*
* 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,
*
* MyClass = DisableUpgradeMixin(class extends BaseClass {...});
2018-04-13 16:40:26 -07:00
*
* @mixinFunction
* @polymer
* @appliesMixin ElementMixin
2018-04-13 16:40:26 -07:00
*/
export const DisableUpgradeMixin = dedupingMixin((base) => {
/**
* @constructor
* @extends {base}
* @implements {Polymer_ElementMixin}
*/
const superClass = ElementMixin(base);
/**
* @polymer
2018-04-13 16:40:26 -07:00
* @mixinClass
* @implements {Polymer_DisableUpgradeMixin}
*/
2018-04-13 16:40:26 -07:00
class DisableUpgradeClass extends superClass {
2018-04-13 16:40:26 -07:00
/** @override */
static get observedAttributes() {
return super.observedAttributes.concat(DISABLED_ATTR);
}
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();
}
2018-04-13 16:40:26 -07:00
} else {
super.attributeChangedCallback(name, old, value, namespace);
}
2018-04-13 16:40:26 -07: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() {}
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();
}
2018-04-13 16:40:26 -07: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();
}
2018-04-13 16:40:26 -07:00
super._enableProperties();
}
2018-04-13 16:40:26 -07:00
}
2018-04-13 16:40:26 -07:00
// only go if "enabled"
/** @override */
disconnectedCallback() {
if (this.__dataEnabled) {
super.disconnectedCallback();
}
}
2017-12-15 14:34:07 -08:00
2018-04-13 16:40:26 -07:00
}
2018-04-13 16:40:26 -07:00
return DisableUpgradeClass;
2018-04-13 16:40:26 -07:00
});