From 9538b4f8f0992a63981a0ae1e032db4b8c13f0a3 Mon Sep 17 00:00:00 2001 From: Daniel Freedman Date: Fri, 21 Feb 2014 16:43:26 -0800 Subject: [PATCH] Support createElementNS for HTML namespace Fixes #102 --- src/CustomElements.js | 13 +++++++++++++ test/js/customElements.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/CustomElements.js b/src/CustomElements.js index f15d27a..3170664 100644 --- a/src/CustomElements.js +++ b/src/CustomElements.js @@ -328,6 +328,17 @@ if (useNative) { }; } + var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; + function createElementNS(namespace, tag, typeExtension) { + // NOTE: we do not support non-HTML elements, + // just call createElementNS for non HTML Elements + if (namespace === HTML_NAMESPACE) { + return createElement(tag, typeExtension); + } else { + return domCreateElementNS(namespace, tag); + } + } + function createElement(tag, typeExtension) { // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could // error check it, or perhaps there should only ever be one argument @@ -380,6 +391,7 @@ if (useNative) { // capture native createElement before we override it var domCreateElement = document.createElement.bind(document); + var domCreateElementNS = document.createElementNS.bind(document); // capture native cloneNode before we override it @@ -389,6 +401,7 @@ if (useNative) { document.registerElement = register; document.createElement = createElement; // override + document.createElementNS = createElementNS; // override Node.prototype.cloneNode = cloneNode; // override scope.registry = registry; diff --git a/test/js/customElements.js b/test/js/customElements.js index b4bd09c..df48239 100644 --- a/test/js/customElements.js +++ b/test/js/customElements.js @@ -7,6 +7,7 @@ suite('customElements', function() { var work; var assert = chai.assert; + var HTMLNS = 'http://www.w3.org/1999/xhtml'; setup(function() { work = document.createElement('div'); @@ -74,6 +75,17 @@ assert.equal(xfoo.textContent, '[x-foo2]'); }); + test('document.registerElement create via createElementNS', function() { + // create an instance via createElementNS + var xfoo = document.createElementNS(HTMLNS, 'x-foo2'); + // test localName + assert.equal(xfoo.localName, 'x-foo2'); + // attach content + xfoo.textContent = '[x-foo2]'; + // test textContent + assert.equal(xfoo.textContent, '[x-foo2]'); + }); + test('document.registerElement treats names as case insensitive', function() { var proto = {prototype: Object.create(HTMLElement.prototype)}; proto.prototype.isXCase = true; @@ -83,6 +95,11 @@ assert.equal(x.isXCase, true); x = document.createElement('x-case'); assert.equal(x.isXCase, true); + // createElementNS + x = document.createElementNS(HTMLNS, 'X-CASE'); + assert.equal(x.isXCase, true); + x = document.createElementNS(HTMLNS, 'x-case'); + assert.equal(x.isXCase, true); // upgrade work.innerHTML = ''; CustomElements.takeRecords(); @@ -419,12 +436,17 @@ var PCtor = document.registerElement('x-instance', {prototype: p}); var x = document.createElement('x-instance'); assert.isTrue(CustomElements.instanceof(x, PCtor), 'instanceof failed for x-instance'); + x = document.createElementNS(HTMLNS, 'x-instance'); + assert.isTrue(CustomElements.instanceof(x, PCtor), 'instanceof failed for x-instance'); var p2 = Object.create(PCtor.prototype); var P2Ctor = document.registerElement('x-instance2', {prototype: p2}); var x2 = document.createElement('x-instance2'); assert.isTrue(CustomElements.instanceof(x2, P2Ctor), 'instanceof failed for x-instance2'); assert.isTrue(CustomElements.instanceof(x2, PCtor), 'instanceof failed for x-instance2'); + x2 = document.createElementNS(HTMLNS, 'x-instance2'); + assert.isTrue(CustomElements.instanceof(x2, P2Ctor), 'instanceof failed for x-instance2'); + assert.isTrue(CustomElements.instanceof(x2, PCtor), 'instanceof failed for x-instance2'); }); @@ -434,6 +456,9 @@ var x = document.createElement('button', 'x-button-instance'); assert.isTrue(CustomElements.instanceof(x, PCtor), 'instanceof failed for x-button-instance'); assert.isTrue(CustomElements.instanceof(x, HTMLButtonElement), 'instanceof failed for x-button-instance'); + x = document.createElementNS(HTMLNS, 'button', 'x-button-instance'); + assert.isTrue(CustomElements.instanceof(x, PCtor), 'instanceof failed for x-button-instance'); + assert.isTrue(CustomElements.instanceof(x, HTMLButtonElement), 'instanceof failed for x-button-instance'); var p2 = Object.create(PCtor.prototype); var P2Ctor = document.registerElement('x-button-instance2', {prototype: p2, extends: 'button'}); @@ -441,6 +466,10 @@ assert.isTrue(CustomElements.instanceof(x2, P2Ctor), 'instanceof failed for x-button-instance2'); assert.isTrue(CustomElements.instanceof(x2, PCtor), 'instanceof failed for x-button-instance2'); assert.isTrue(CustomElements.instanceof(x2, HTMLButtonElement), 'instanceof failed for x-button-instance2'); + x2 = document.createElementNS(HTMLNS, 'button','x-button-instance2'); + assert.isTrue(CustomElements.instanceof(x2, P2Ctor), 'instanceof failed for x-button-instance2'); + assert.isTrue(CustomElements.instanceof(x2, PCtor), 'instanceof failed for x-button-instance2'); + assert.isTrue(CustomElements.instanceof(x2, HTMLButtonElement), 'instanceof failed for x-button-instance2'); }); });