Skip to content

Commit

Permalink
Merge branch 'master' into 5422-ldm-templatizer-fix
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinpschaaf committed Nov 20, 2018
2 parents 6dd3456 + 655a646 commit 1092719
Show file tree
Hide file tree
Showing 7 changed files with 237 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ The Polymer team heavily uses (and loves!) GitHub for all of our software manage

If you find an issue, please do file it on the repository. The [Polymer/polymer issues](https://github.com/polymer/polymer/issues) should be used only for issues on the Polymer library itself - bugs somewhere in the core codebase.

For issues with elements the team maintains, please file directly on the element's repository. If you're not sure if a bug stems from the element or the library, air toward filing it on the element and we'll move the issue if necessary.
For issues with elements the team maintains, please file directly on the element's repository. If you're not sure if a bug stems from the element or the library, err toward filing it on the element and we'll move the issue if necessary.

Please file issues using the issue template provided, filling out as many fields as possible. We love examples for addressing issues - issues with a jsBin, Plunkr, jsFiddle, or glitch.me repro will be much easier for us to work on quickly. You can start with [this jsbin](http://jsbin.com/luhaxab/edit) which sets up the basics to demonstrate a Polymer element. If you need your repro to run in IE11, you can start from [this glitch](https://glitch.com/edit/#!/polymer-repro?path=my-element.html:2:0), which serves the source via polyserve for automatic transpilation, although you must sign up for a glitch.me account to ensure your code persists for more than 5 days (note the glitch.me _editing environment_ is not compatible with IE11, however the "live" view link of the running code should work).

Expand Down
179 changes: 179 additions & 0 deletions externs/polymer-dom-api-externs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/**
* @externs
* @fileoverview Externs for PolymerDomApi for backwards compatibility with
* the Polymer 1 externs.
*/

/**
* A Polymer DOM API for manipulating DOM such that local DOM and light DOM
* trees are properly maintained.
*
* This type exists only to provide compatibility between compiled hybrid
* Polymer V1 and V2 code. Polymer V2 only code should simply use the DomApi
* class type.
*
* @interface
*/
var PolymerDomApi = function() {};

/**
* @param {?Node} node
* @return {boolean}
*/
PolymerDomApi.prototype.deepContains = function(node) {};

/** @param {!Node} node */
PolymerDomApi.prototype.appendChild = function(node) {};

/**
* @param {!Node} oldNode
* @param {!Node} newNode
*/
PolymerDomApi.prototype.replaceChild = function(oldNode, newNode) {};

/**
* @param {!Node} node
* @param {?Node} beforeNode
*/
PolymerDomApi.prototype.insertBefore = function(node, beforeNode) {};

/** @param {!Node} node */
PolymerDomApi.prototype.removeChild = function(node) {};

/** @type {!Array<!HTMLElement>|!NodeList<!HTMLElement>} */
PolymerDomApi.prototype.children;

/** @type {!Array<!Node>|!NodeList<!Node>} */
PolymerDomApi.prototype.childNodes;

/** @type {?Node} */
PolymerDomApi.prototype.parentNode;

/** @type {?Node} */
PolymerDomApi.prototype.firstChild;

/** @type {?Node} */
PolymerDomApi.prototype.lastChild;

/** @type {?HTMLElement} */
PolymerDomApi.prototype.firstElementChild;

/** @type {?HTMLElement} */
PolymerDomApi.prototype.lastElementChild;

/** @type {?Node} */
PolymerDomApi.prototype.previousSibling;

/** @type {?Node} */
PolymerDomApi.prototype.nextSibling;

/** @type {?HTMLElement} */
PolymerDomApi.prototype.previousElementSibling;

/** @type {?HTMLElement} */
PolymerDomApi.prototype.nextElementSibling;

/** @type {string} */
PolymerDomApi.prototype.textContent;

/** @type {string} */
PolymerDomApi.prototype.innerHTML;

/** @type {?HTMLElement} */
PolymerDomApi.prototype.activeElement;

/**
* @param {string} selector
* @return {?Element}
*/
PolymerDomApi.prototype.querySelector = function(selector) {};

/**
* @param {string} selector
* @return {!Array<!Element>|!NodeList<!Element>}
*/
PolymerDomApi.prototype.querySelectorAll = function(selector) {};

/** @return {!Array<!Node>} */
PolymerDomApi.prototype.getDistributedNodes = function() {};

/** @return {!Array<!Node>} */
PolymerDomApi.prototype.getDestinationInsertionPoints = function() {};

/** @return {?Node} */
PolymerDomApi.prototype.getOwnerRoot = function() {};

/**
* @param {string} attribute
* @param {string} value
*/
PolymerDomApi.prototype.setAttribute = function(attribute, value) {};

/** @param {string} attribute */
PolymerDomApi.prototype.removeAttribute = function(attribute) {};

/**
* @typedef {function(!PolymerDomApi.ObserveInfo)}
*/
PolymerDomApi.ObserveCallback;

/**
* @typedef {{
* target: !Node,
* addedNodes: !Array<!Node>,
* removedNodes: !Array<!Node>
* }}
*/
PolymerDomApi.ObserveInfo;

/**
* A virtual type for observer callback handles.
*
* @interface
*/
PolymerDomApi.ObserveHandle = function() {};

/**
* @return {void}
*/
PolymerDomApi.ObserveHandle.prototype.disconnect = function() {};

/**
* Notifies callers about changes to the element's effective child nodes,
* the same list as returned by `getEffectiveChildNodes`.
*
* @param {!PolymerDomApi.ObserveCallback} callback The supplied callback
* is called with an `info` argument which is an object that provides
* the `target` on which the changes occurred, a list of any nodes
* added in the `addedNodes` array, and nodes removed in the
* `removedNodes` array.
*
* @return {!PolymerDomApi.ObserveHandle} Handle which is the argument to
* `unobserveNodes`.
*/
PolymerDomApi.prototype.observeNodes = function(callback) {};

/**
* Stops observing changes to the element's effective child nodes.
*
* @param {!PolymerDomApi.ObserveHandle} handle The handle for the
* callback that should no longer receive notifications. This
* handle is returned from `observeNodes`.
*/
PolymerDomApi.prototype.unobserveNodes = function(handle) {};

/** @type {?DOMTokenList} */
PolymerDomApi.prototype.classList;

/**
* @param {string} selector
* @return {!Array<!HTMLElement>}
*/
PolymerDomApi.prototype.queryDistributedElements = function(selector) {};

/**
* Returns a list of effective child nodes for this element.
*
* @return {!Array<!HTMLElement>}
*/
PolymerDomApi.prototype.getEffectiveChildNodes = function() {};
36 changes: 36 additions & 0 deletions externs/polymer-iconset-externs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* @externs
* @fileoverview Externs for Polymer.Iconset.
*/

/**
* The interface that iconsets should obey. Iconsets are registered by setting
* their name in the IronMeta 'iconset' db, and a value of type Polymer.Iconset.
*
* Used by iron-icon but needs to live here since iron-icon, iron-iconset, etc don't
* depend on each other at all and talk only through iron-meta.
*
* @interface
*/
Polymer.Iconset = function() {};

/**
* Applies an icon to the given element as a css background image. This
* method does not size the element, and it's usually necessary to set
* the element's height and width so that the background image is visible.
*
* @param {Element} element The element to which the icon is applied.
* @param {string} icon The name of the icon to apply.
* @param {string=} theme (optional) The name or index of the icon to apply.
* @param {number=} scale (optional, defaults to 1) Icon scaling factor.
*/
Polymer.Iconset.prototype.applyIcon = function(
element, icon, theme, scale) {};

/**
* Remove an icon from the given element by undoing the changes effected
* by `applyIcon`.
*
* @param {Element} element The element from which the icon is removed.
*/
Polymer.Iconset.prototype.removeIcon = function(element) {};
4 changes: 3 additions & 1 deletion gen-tsd.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
"../shadycss/custom-style-interface.d.ts"
],
"renameTypes": {
"Polymer_PropertyEffects": "PropertyEffects"
"Polymer_PropertyEffects": "PropertyEffects",
"PolymerDomApi": "DomApi",
"PolymerDomApi.ObserveHandle": "FlattenedNodesObserver"
},
"autoImport": {
"./interfaces": [
Expand Down
1 change: 1 addition & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ const runClosureOnly = ({lintOnly}) => () => {
'externs/webcomponents-externs.js',
'externs/closure-types.js',
'externs/polymer-externs.js',
'externs/polymer-dom-api-externs.js',
],
extra_annotation_name: [
'appliesMixin',
Expand Down
21 changes: 15 additions & 6 deletions lib/legacy/polymer.dom.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const matchesSelector = function(node, selector) {
/**
* Node API wrapper class returned from `Polymer.dom.(target)` when
* `target` is a `Node`.
*
* @implements {PolymerDomApi}
*/
export class DomApi {

Expand All @@ -56,7 +56,8 @@ export class DomApi {
*
* @param {function(this:HTMLElement, { target: !HTMLElement, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Called when direct or distributed children
* of this element changes
* @return {!FlattenedNodesObserver} Observer instance
* @return {!PolymerDomApi.ObserveHandle} Observer instance
* @override
*/
observeNodes(callback) {
return new FlattenedNodesObserver(
Expand All @@ -66,9 +67,10 @@ export class DomApi {
/**
* Disconnects an observer previously created via `observeNodes`
*
* @param {!FlattenedNodesObserver} observerHandle Observer instance
* @param {!PolymerDomApi.ObserveHandle} observerHandle Observer instance
* to disconnect.
* @return {void}
* @override
*/
unobserveNodes(observerHandle) {
observerHandle.disconnect();
Expand All @@ -88,6 +90,7 @@ export class DomApi {
* @param {Node} node Node to test
* @return {boolean} Returns true if the given `node` is contained within
* this element's light or shadow DOM.
* @override
*/
deepContains(node) {
if (this.node.contains(node)) {
Expand All @@ -110,6 +113,7 @@ export class DomApi {
* exists. If the node is connected to a document this is either a
* shadowRoot or the document; otherwise, it may be the node
* itself or a node or document fragment containing it.
* @override
*/
getOwnerRoot() {
return this.node.getRootNode();
Expand All @@ -120,6 +124,7 @@ export class DomApi {
* an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.
*
* @return {!Array<!Node>} Array of assigned nodes
* @override
*/
getDistributedNodes() {
return (this.node.localName === 'slot') ?
Expand All @@ -131,6 +136,7 @@ export class DomApi {
* Returns an array of all slots this element was distributed to.
*
* @return {!Array<!HTMLSlotElement>} Description
* @override
*/
getDestinationInsertionPoints() {
let ip$ = [];
Expand Down Expand Up @@ -159,6 +165,7 @@ export class DomApi {
/**
* @return {!Array<!Node>} Returns a flattened list of all child nodes and
* nodes assigned to child slots.
* @override
*/
getEffectiveChildNodes() {
return FlattenedNodesObserver.getFlattenedNodes(
Expand All @@ -171,6 +178,7 @@ export class DomApi {
*
* @param {string} selector Selector to filter nodes against
* @return {!Array<!HTMLElement>} List of flattened child elements
* @override
*/
queryDistributedElements(selector) {
let c$ = this.getEffectiveChildNodes();
Expand All @@ -189,6 +197,7 @@ export class DomApi {
* shadow root.
*
* @return {Node|undefined} Currently focused element
* @override
*/
get activeElement() {
let node = this.node;
Expand Down Expand Up @@ -401,14 +410,14 @@ forwardProperties(DomApi.prototype, [
*/
export const dom = function(obj) {
obj = obj || document;
if (!obj.__domApi) {
if (!obj['__domApi']) {
let helper;
if (obj instanceof Event) {
helper = new EventApi(obj);
} else {
helper = new DomApi(obj);
}
obj.__domApi = helper;
obj['__domApi'] = helper;
}
return obj.__domApi;
return obj['__domApi'];
};
2 changes: 2 additions & 0 deletions lib/utils/flattened-nodes-observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ function isSlot(node) {
*
* @summary Class that listens for changes (additions or removals) to
* "flattened nodes" on a given `node`.
* @implements {PolymerDomApi.ObserveHandle}
*/
export class FlattenedNodesObserver {

Expand Down Expand Up @@ -168,6 +169,7 @@ export class FlattenedNodesObserver {
* the observer.
*
* @return {void}
* @override
*/
disconnect() {
if (isSlot(this._target)) {
Expand Down

0 comments on commit 1092719

Please sign in to comment.