From 616f6662f0d51802bd9a95fc271ffcee56300c6f Mon Sep 17 00:00:00 2001 From: Kevin Schaaf Date: Thu, 5 Apr 2018 14:12:54 -0700 Subject: [PATCH] Add ability to define importMeta on legacy elements. Fixes #5163 --- lib/legacy/legacy-element-mixin.html | 10 ++++++++++ lib/mixins/element-mixin.html | 24 +++++++----------------- test/unit/resolveurl.html | 4 +++- test/unit/sub/resolveurl-elements.html | 16 ++++++++++++++-- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/legacy/legacy-element-mixin.html b/lib/legacy/legacy-element-mixin.html index 6c2045f155..ab6d1e1872 100644 --- a/lib/legacy/legacy-element-mixin.html +++ b/lib/legacy/legacy-element-mixin.html @@ -86,6 +86,16 @@ this._applyListeners(); } + /** + * Forwards `importMeta` from the prototype (i.e. from the info object + * passed to `Polymer({...})`) to the static API. + * + * @return {!Object} The `import.meta` object set on the prototype + */ + static get importMeta() { + return this.prototype.importMeta; + } + /** * Legacy callback called during the `constructor`, for overriding * by the user. diff --git a/lib/mixins/element-mixin.html b/lib/mixins/element-mixin.html index 677767d71f..b58b818ded 100644 --- a/lib/mixins/element-mixin.html +++ b/lib/mixins/element-mixin.html @@ -402,11 +402,13 @@ * This path is used to resolve url's in template style cssText. * The `importPath` property is also set on element instances and can be * used to create bindings relative to the import path. - * For elements defined in ES modules, users should implement `importMeta` - * and this getter will return `import.meta.url`'s path. For elements - * defined in HTML imports, this getter will return the path to the - * document containing a `dom-module` element matching this element's - * static `is` property. + * + * For elements defined in ES modules, users should implement + * `static get importMeta() { return import.meta; }` and the default + * implementation of `importPath` will return `import.meta.url`'s path. + * For elements defined in HTML imports, this getter will return the path + * to the document containing a `dom-module` element matching this + * element's static `is` property. * * Note, this path should contain a trailing `/`. * @@ -426,18 +428,6 @@ return this._importPath; } - /** - * When an element definition is being loaded from an ES module, users - * may override this getter to return the `import.meta` object from that - * module, which will be used to derive the `importPath` for the element. - * When implementing `importMeta`, users should not implement `importPath`. - * - * @return {!Object} The `import.meta` object for the element's module - */ - static get importMeta() { - return null; - } - constructor() { super(); /** @type {HTMLTemplateElement} */ diff --git a/test/unit/resolveurl.html b/test/unit/resolveurl.html index 5cd59980ca..9da04704ad 100644 --- a/test/unit/resolveurl.html +++ b/test/unit/resolveurl.html @@ -82,7 +82,9 @@ test('Urls in styles and attributes', testStylesAndAttributes('p-r', 'sub')); - test('Urls in styles and attributes (importMeta)', testStylesAndAttributes('p-r-im', 'http://foo.com/mymodule')); + test('Urls in styles and attributes (importMeta)', testStylesAndAttributes('p-r-im', 'http://class.com/mymodule')); + + test('Urls in styles and attributes (importMeta, hybrid)', testStylesAndAttributes('p-r-hybrid', 'http://hybrid.com/mymodule')); test('url changes via setting importPath/rootPath on element instance', function() { var el = document.createElement('p-r'); diff --git a/test/unit/sub/resolveurl-elements.html b/test/unit/sub/resolveurl-elements.html index 30611b6d24..da180ee99e 100644 --- a/test/unit/sub/resolveurl-elements.html +++ b/test/unit/sub/resolveurl-elements.html @@ -39,14 +39,26 @@ } customElements.define(PR.is, PR); - class PRImportMeta extends PR { + class PRImportMeta extends Polymer.Element { + static get template() { + return Polymer.DomModule.import('p-r', 'template').cloneNode(true); + } static get importMeta() { // Idiomatically, this would be `return import.meta`, but for purposes // of stubbing the test without actual modules, it's shimmed - return { url: 'http://foo.com/mymodule/index.js' } + return { url: 'http://class.com/mymodule/index.js' }; } } customElements.define('p-r-im', PRImportMeta); + + const PRHybrid = Polymer({ + is: 'p-r-hybrid', + _template: Polymer.DomModule.import('p-r', 'template').cloneNode(true), + // Idiomatically, this would be `return import.meta`, but for purposes + // of stubbing the test without actual modules, it's shimmed + importMeta: { url: 'http://hybrid.com/mymodule/index.js' } + }); +