fix(DomRenderer): correctly handle namespaced attributes
This commit is contained in:
parent
ce10fe92b2
commit
c6afea61f1
|
@ -16,7 +16,7 @@ import {HtmlAst, HtmlAttrAst, HtmlTextAst, HtmlElementAst} from './html_ast';
|
||||||
import {Injectable} from 'angular2/src/core/di';
|
import {Injectable} from 'angular2/src/core/di';
|
||||||
import {HtmlToken, HtmlTokenType, tokenizeHtml} from './html_lexer';
|
import {HtmlToken, HtmlTokenType, tokenizeHtml} from './html_lexer';
|
||||||
import {ParseError, ParseLocation, ParseSourceSpan} from './parse_util';
|
import {ParseError, ParseLocation, ParseSourceSpan} from './parse_util';
|
||||||
import {HtmlTagDefinition, getHtmlTagDefinition, getNsPrefix} from './html_tags';
|
import {HtmlTagDefinition, getHtmlTagDefinition, getNsPrefix, mergeNsAndName} from './html_tags';
|
||||||
|
|
||||||
export class HtmlTreeError extends ParseError {
|
export class HtmlTreeError extends ParseError {
|
||||||
static create(elementName: string, location: ParseLocation, msg: string): HtmlTreeError {
|
static create(elementName: string, location: ParseLocation, msg: string): HtmlTreeError {
|
||||||
|
@ -238,10 +238,6 @@ class TreeBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergeNsAndName(prefix: string, localName: string): string {
|
|
||||||
return isPresent(prefix) ? `@${prefix}:${localName}` : localName;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getElementFullName(prefix: string, localName: string,
|
function getElementFullName(prefix: string, localName: string,
|
||||||
parentElement: HtmlElementAst): string {
|
parentElement: HtmlElementAst): string {
|
||||||
if (isBlank(prefix)) {
|
if (isBlank(prefix)) {
|
||||||
|
|
|
@ -420,3 +420,7 @@ export function splitNsName(elementName: string): string[] {
|
||||||
export function getNsPrefix(elementName: string): string {
|
export function getNsPrefix(elementName: string): string {
|
||||||
return splitNsName(elementName)[0];
|
return splitNsName(elementName)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function mergeNsAndName(prefix: string, localName: string): string {
|
||||||
|
return isPresent(prefix) ? `@${prefix}:${localName}` : localName;
|
||||||
|
}
|
||||||
|
|
|
@ -7,11 +7,10 @@ import {Parser, AST, ASTWithSource} from 'angular2/src/core/change_detection/cha
|
||||||
import {TemplateBinding} from 'angular2/src/core/change_detection/parser/ast';
|
import {TemplateBinding} from 'angular2/src/core/change_detection/parser/ast';
|
||||||
import {CompileDirectiveMetadata, CompilePipeMetadata} from './directive_metadata';
|
import {CompileDirectiveMetadata, CompilePipeMetadata} from './directive_metadata';
|
||||||
import {HtmlParser} from './html_parser';
|
import {HtmlParser} from './html_parser';
|
||||||
import {splitNsName} from './html_tags';
|
import {splitNsName, mergeNsAndName} from './html_tags';
|
||||||
import {ParseSourceSpan, ParseError, ParseLocation} from './parse_util';
|
import {ParseSourceSpan, ParseError, ParseLocation} from './parse_util';
|
||||||
import {RecursiveAstVisitor, BindingPipe} from 'angular2/src/core/change_detection/parser/ast';
|
import {RecursiveAstVisitor, BindingPipe} from 'angular2/src/core/change_detection/parser/ast';
|
||||||
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ElementAst,
|
ElementAst,
|
||||||
BoundElementPropertyAst,
|
BoundElementPropertyAst,
|
||||||
|
@ -584,6 +583,12 @@ class TemplateParseVisitor implements HtmlAstVisitor {
|
||||||
} else {
|
} else {
|
||||||
if (parts[0] == ATTRIBUTE_PREFIX) {
|
if (parts[0] == ATTRIBUTE_PREFIX) {
|
||||||
boundPropertyName = parts[1];
|
boundPropertyName = parts[1];
|
||||||
|
let nsSeparatorIdx = boundPropertyName.indexOf(':');
|
||||||
|
if (nsSeparatorIdx > -1) {
|
||||||
|
let ns = boundPropertyName.substring(0, nsSeparatorIdx);
|
||||||
|
let name = boundPropertyName.substring(nsSeparatorIdx + 1);
|
||||||
|
boundPropertyName = mergeNsAndName(ns, name);
|
||||||
|
}
|
||||||
bindingType = PropertyBindingType.Attribute;
|
bindingType = PropertyBindingType.Attribute;
|
||||||
} else if (parts[0] == CLASS_PREFIX) {
|
} else if (parts[0] == CLASS_PREFIX) {
|
||||||
boundPropertyName = parts[1];
|
boundPropertyName = parts[1];
|
||||||
|
|
|
@ -365,9 +365,15 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter {
|
||||||
bool hasAttribute(Element element, String attribute) =>
|
bool hasAttribute(Element element, String attribute) =>
|
||||||
element.attributes.containsKey(attribute);
|
element.attributes.containsKey(attribute);
|
||||||
|
|
||||||
|
bool hasAttributeNS(Element element, String ns, String attribute) =>
|
||||||
|
element.getAttributeNS(ns, attribute) != null;
|
||||||
|
|
||||||
String getAttribute(Element element, String attribute) =>
|
String getAttribute(Element element, String attribute) =>
|
||||||
element.getAttribute(attribute);
|
element.getAttribute(attribute);
|
||||||
|
|
||||||
|
String getAttributeNS(Element element, String ns, String attribute) =>
|
||||||
|
element.getAttributeNS(ns, attribute);
|
||||||
|
|
||||||
void setAttribute(Element element, String name, String value) {
|
void setAttribute(Element element, String name, String value) {
|
||||||
element.setAttribute(name, value);
|
element.setAttribute(name, value);
|
||||||
}
|
}
|
||||||
|
@ -382,6 +388,10 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter {
|
||||||
element.attributes.remove(name);
|
element.attributes.remove(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeAttributeNS(Element element, String ns, String name) {
|
||||||
|
element.getNamespacedAttributes(ns).remove(name);
|
||||||
|
}
|
||||||
|
|
||||||
Node templateAwareRoot(Element el) => el is TemplateElement ? el.content : el;
|
Node templateAwareRoot(Element el) => el is TemplateElement ? el.content : el;
|
||||||
|
|
||||||
HtmlDocument createHtmlDocument() =>
|
HtmlDocument createHtmlDocument() =>
|
||||||
|
|
|
@ -225,12 +225,19 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
hasAttribute(element, attribute: string): boolean { return element.hasAttribute(attribute); }
|
hasAttribute(element, attribute: string): boolean { return element.hasAttribute(attribute); }
|
||||||
|
hasAttributeNS(element, ns: string, attribute: string): boolean {
|
||||||
|
return element.hasAttributeNS(ns, attribute);
|
||||||
|
}
|
||||||
getAttribute(element, attribute: string): string { return element.getAttribute(attribute); }
|
getAttribute(element, attribute: string): string { return element.getAttribute(attribute); }
|
||||||
|
getAttributeNS(element, ns: string, name: string): string {
|
||||||
|
return element.getAttributeNS(ns, name);
|
||||||
|
}
|
||||||
setAttribute(element, name: string, value: string) { element.setAttribute(name, value); }
|
setAttribute(element, name: string, value: string) { element.setAttribute(name, value); }
|
||||||
setAttributeNS(element, ns: string, name: string, value: string) {
|
setAttributeNS(element, ns: string, name: string, value: string) {
|
||||||
element.setAttributeNS(ns, name, value);
|
element.setAttributeNS(ns, name, value);
|
||||||
}
|
}
|
||||||
removeAttribute(element, attribute: string) { element.removeAttribute(attribute); }
|
removeAttribute(element, attribute: string) { element.removeAttribute(attribute); }
|
||||||
|
removeAttributeNS(element, ns: string, name: string) { element.removeAttributeNS(ns, name); }
|
||||||
templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; }
|
templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; }
|
||||||
createHtmlDocument(): HTMLDocument {
|
createHtmlDocument(): HTMLDocument {
|
||||||
return document.implementation.createHTMLDocument('fakeTitle');
|
return document.implementation.createHTMLDocument('fakeTitle');
|
||||||
|
|
|
@ -97,10 +97,13 @@ export abstract class DomAdapter {
|
||||||
abstract tagName(element): string;
|
abstract tagName(element): string;
|
||||||
abstract attributeMap(element): Map<string, string>;
|
abstract attributeMap(element): Map<string, string>;
|
||||||
abstract hasAttribute(element, attribute: string): boolean;
|
abstract hasAttribute(element, attribute: string): boolean;
|
||||||
|
abstract hasAttributeNS(element, ns: string, attribute: string): boolean;
|
||||||
abstract getAttribute(element, attribute: string): string;
|
abstract getAttribute(element, attribute: string): string;
|
||||||
|
abstract getAttributeNS(element, ns: string, attribute: string): string;
|
||||||
abstract setAttribute(element, name: string, value: string);
|
abstract setAttribute(element, name: string, value: string);
|
||||||
abstract setAttributeNS(element, ns: string, name: string, value: string);
|
abstract setAttributeNS(element, ns: string, name: string, value: string);
|
||||||
abstract removeAttribute(element, attribute: string);
|
abstract removeAttribute(element, attribute: string);
|
||||||
|
abstract removeAttributeNS(element, ns: string, attribute: string);
|
||||||
abstract templateAwareRoot(el);
|
abstract templateAwareRoot(el);
|
||||||
abstract createHtmlDocument(): HTMLDocument;
|
abstract createHtmlDocument(): HTMLDocument;
|
||||||
abstract defaultDoc(): HTMLDocument;
|
abstract defaultDoc(): HTMLDocument;
|
||||||
|
|
|
@ -185,12 +185,16 @@ export class DomRenderer implements Renderer {
|
||||||
if (isPresent(attrNs)) {
|
if (isPresent(attrNs)) {
|
||||||
DOM.setAttributeNS(renderElement, attrNs, attributeName, attributeValue);
|
DOM.setAttributeNS(renderElement, attrNs, attributeName, attributeValue);
|
||||||
} else {
|
} else {
|
||||||
DOM.setAttribute(renderElement, nsAndName[1], attributeValue);
|
DOM.setAttribute(renderElement, attributeName, attributeValue);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (isPresent(attrNs)) {
|
||||||
|
DOM.removeAttributeNS(renderElement, attrNs, nsAndName[1]);
|
||||||
} else {
|
} else {
|
||||||
DOM.removeAttribute(renderElement, attributeName);
|
DOM.removeAttribute(renderElement, attributeName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string): void {
|
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string): void {
|
||||||
var dashCasedPropertyName = camelCaseToDashCase(propertyName);
|
var dashCasedPropertyName = camelCaseToDashCase(propertyName);
|
||||||
|
|
|
@ -295,6 +295,10 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter {
|
||||||
return element.attributes.keys.any((key) => '$key' == attribute);
|
return element.attributes.keys.any((key) => '$key' == attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasAttributeNS(element, String ns, String attribute) {
|
||||||
|
throw 'not implemented';
|
||||||
|
}
|
||||||
|
|
||||||
getAttribute(element, String attribute) {
|
getAttribute(element, String attribute) {
|
||||||
// `attributes` keys can be {@link AttributeName}s.
|
// `attributes` keys can be {@link AttributeName}s.
|
||||||
var key = element.attributes.keys.firstWhere((key) => '$key' == attribute,
|
var key = element.attributes.keys.firstWhere((key) => '$key' == attribute,
|
||||||
|
@ -302,6 +306,10 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter {
|
||||||
return element.attributes[key];
|
return element.attributes[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAttributeNS(element, String ns, String attribute) {
|
||||||
|
throw 'not implemented';
|
||||||
|
}
|
||||||
|
|
||||||
setAttribute(element, String name, String value) {
|
setAttribute(element, String name, String value) {
|
||||||
element.attributes[name] = value;
|
element.attributes[name] = value;
|
||||||
}
|
}
|
||||||
|
@ -314,6 +322,10 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter {
|
||||||
element.attributes.remove(attribute);
|
element.attributes.remove(attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeAttributeNS(element, String ns, String attribute) {
|
||||||
|
throw 'not implemented';
|
||||||
|
}
|
||||||
|
|
||||||
templateAwareRoot(el) => el;
|
templateAwareRoot(el) => el;
|
||||||
|
|
||||||
createHtmlDocument() {
|
createHtmlDocument() {
|
||||||
|
|
|
@ -429,11 +429,13 @@ export class Parse5DomAdapter extends DomAdapter {
|
||||||
hasAttribute(element, attribute: string): boolean {
|
hasAttribute(element, attribute: string): boolean {
|
||||||
return element.attribs && element.attribs.hasOwnProperty(attribute);
|
return element.attribs && element.attribs.hasOwnProperty(attribute);
|
||||||
}
|
}
|
||||||
|
hasAttributeNS(element, ns: string, attribute: string): boolean { throw 'not implemented'; }
|
||||||
getAttribute(element, attribute: string): string {
|
getAttribute(element, attribute: string): string {
|
||||||
return element.attribs && element.attribs.hasOwnProperty(attribute) ?
|
return element.attribs && element.attribs.hasOwnProperty(attribute) ?
|
||||||
element.attribs[attribute] :
|
element.attribs[attribute] :
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
getAttributeNS(element, ns: string, attribute: string): string { throw 'not implemented'; }
|
||||||
setAttribute(element, attribute: string, value: string) {
|
setAttribute(element, attribute: string, value: string) {
|
||||||
if (attribute) {
|
if (attribute) {
|
||||||
element.attribs[attribute] = value;
|
element.attribs[attribute] = value;
|
||||||
|
@ -448,6 +450,7 @@ export class Parse5DomAdapter extends DomAdapter {
|
||||||
StringMapWrapper.delete(element.attribs, attribute);
|
StringMapWrapper.delete(element.attribs, attribute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
removeAttributeNS(element, ns: string, name: string) { throw 'not implemented'; }
|
||||||
templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; }
|
templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; }
|
||||||
createHtmlDocument(): Document {
|
createHtmlDocument(): Document {
|
||||||
var newDoc = treeAdapter.createDocument();
|
var newDoc = treeAdapter.createDocument();
|
||||||
|
|
|
@ -1859,6 +1859,48 @@ function declareTests() {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('attributes', () => {
|
||||||
|
|
||||||
|
it('should support attributes with namespace',
|
||||||
|
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder,
|
||||||
|
async) => {
|
||||||
|
tcb.overrideView(SomeCmp, new ViewMetadata({template: '<svg:use xlink:href="#id" />'}))
|
||||||
|
.createAsync(SomeCmp)
|
||||||
|
.then((fixture) => {
|
||||||
|
let useEl = DOM.firstChild(fixture.debugElement.nativeElement);
|
||||||
|
expect(DOM.getAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href'))
|
||||||
|
.toEqual('#id');
|
||||||
|
async.done();
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should support binding to attributes with namespace',
|
||||||
|
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder,
|
||||||
|
async) => {
|
||||||
|
tcb.overrideView(SomeCmp,
|
||||||
|
new ViewMetadata({template: '<svg:use [attr.xlink:href]="value" />'}))
|
||||||
|
.createAsync(SomeCmp)
|
||||||
|
.then((fixture) => {
|
||||||
|
let cmp = fixture.debugElement.componentInstance;
|
||||||
|
let useEl = DOM.firstChild(fixture.debugElement.nativeElement);
|
||||||
|
|
||||||
|
cmp.value = "#id";
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
expect(DOM.getAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href'))
|
||||||
|
.toEqual('#id');
|
||||||
|
|
||||||
|
cmp.value = null;
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
expect(DOM.hasAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href'))
|
||||||
|
.toEqual(false);
|
||||||
|
|
||||||
|
async.done();
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2438,3 +2480,8 @@ class DirectiveWithPropDecorators {
|
||||||
|
|
||||||
fireEvent(msg) { ObservableWrapper.callEmit(this.event, msg); }
|
fireEvent(msg) { ObservableWrapper.callEmit(this.event, msg); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Component({selector: 'some-cmp'})
|
||||||
|
class SomeCmp {
|
||||||
|
value: any;
|
||||||
|
}
|
||||||
|
|
|
@ -1556,6 +1556,7 @@ var NG_PLATFORM_BROWSER = [
|
||||||
'BrowserDomAdapter.firstChild():js',
|
'BrowserDomAdapter.firstChild():js',
|
||||||
'BrowserDomAdapter.getAnimationPrefix():js',
|
'BrowserDomAdapter.getAnimationPrefix():js',
|
||||||
'BrowserDomAdapter.getAttribute():js',
|
'BrowserDomAdapter.getAttribute():js',
|
||||||
|
'BrowserDomAdapter.getAttributeNS():js',
|
||||||
'BrowserDomAdapter.getBaseHref():js',
|
'BrowserDomAdapter.getBaseHref():js',
|
||||||
'BrowserDomAdapter.getBoundingClientRect():js',
|
'BrowserDomAdapter.getBoundingClientRect():js',
|
||||||
'BrowserDomAdapter.getChecked():js',
|
'BrowserDomAdapter.getChecked():js',
|
||||||
|
@ -1582,6 +1583,7 @@ var NG_PLATFORM_BROWSER = [
|
||||||
'BrowserDomAdapter.getValue():js',
|
'BrowserDomAdapter.getValue():js',
|
||||||
'BrowserDomAdapter.getXHR():js',
|
'BrowserDomAdapter.getXHR():js',
|
||||||
'BrowserDomAdapter.hasAttribute():js',
|
'BrowserDomAdapter.hasAttribute():js',
|
||||||
|
'BrowserDomAdapter.hasAttributeNS():js',
|
||||||
'BrowserDomAdapter.hasClass():js',
|
'BrowserDomAdapter.hasClass():js',
|
||||||
'BrowserDomAdapter.hasProperty():js',
|
'BrowserDomAdapter.hasProperty():js',
|
||||||
'BrowserDomAdapter.hasShadowRoot():js',
|
'BrowserDomAdapter.hasShadowRoot():js',
|
||||||
|
@ -1615,6 +1617,7 @@ var NG_PLATFORM_BROWSER = [
|
||||||
'BrowserDomAdapter.querySelectorAll():js',
|
'BrowserDomAdapter.querySelectorAll():js',
|
||||||
'BrowserDomAdapter.remove():js',
|
'BrowserDomAdapter.remove():js',
|
||||||
'BrowserDomAdapter.removeAttribute():js',
|
'BrowserDomAdapter.removeAttribute():js',
|
||||||
|
'BrowserDomAdapter.removeAttributeNS():js',
|
||||||
'BrowserDomAdapter.removeChild():js',
|
'BrowserDomAdapter.removeChild():js',
|
||||||
'BrowserDomAdapter.removeClass():js',
|
'BrowserDomAdapter.removeClass():js',
|
||||||
'BrowserDomAdapter.removeStyle():js',
|
'BrowserDomAdapter.removeStyle():js',
|
||||||
|
|
|
@ -987,6 +987,7 @@ const BROWSER = [
|
||||||
'BrowserDomAdapter.elementMatches(n:any, selector:string):boolean',
|
'BrowserDomAdapter.elementMatches(n:any, selector:string):boolean',
|
||||||
'BrowserDomAdapter.firstChild(el:any):Node',
|
'BrowserDomAdapter.firstChild(el:any):Node',
|
||||||
'BrowserDomAdapter.getAttribute(element:any, attribute:string):string',
|
'BrowserDomAdapter.getAttribute(element:any, attribute:string):string',
|
||||||
|
'BrowserDomAdapter.getAttributeNS(element:any, ns:string, name:string):string',
|
||||||
'BrowserDomAdapter.getBaseHref():string',
|
'BrowserDomAdapter.getBaseHref():string',
|
||||||
'BrowserDomAdapter.getBoundingClientRect(el:any):any',
|
'BrowserDomAdapter.getBoundingClientRect(el:any):any',
|
||||||
'BrowserDomAdapter.getChecked(el:any):boolean',
|
'BrowserDomAdapter.getChecked(el:any):boolean',
|
||||||
|
@ -1010,6 +1011,7 @@ const BROWSER = [
|
||||||
'BrowserDomAdapter.getUserAgent():string',
|
'BrowserDomAdapter.getUserAgent():string',
|
||||||
'BrowserDomAdapter.getValue(el:any):string',
|
'BrowserDomAdapter.getValue(el:any):string',
|
||||||
'BrowserDomAdapter.hasAttribute(element:any, attribute:string):boolean',
|
'BrowserDomAdapter.hasAttribute(element:any, attribute:string):boolean',
|
||||||
|
'BrowserDomAdapter.hasAttributeNS(element:any, ns:string, attribute:string):boolean',
|
||||||
'BrowserDomAdapter.hasClass(element:any, className:string):boolean',
|
'BrowserDomAdapter.hasClass(element:any, className:string):boolean',
|
||||||
'BrowserDomAdapter.hasProperty(element:any, name:string):boolean',
|
'BrowserDomAdapter.hasProperty(element:any, name:string):boolean',
|
||||||
'BrowserDomAdapter.hasShadowRoot(node:any):boolean',
|
'BrowserDomAdapter.hasShadowRoot(node:any):boolean',
|
||||||
|
@ -1044,6 +1046,7 @@ const BROWSER = [
|
||||||
'BrowserDomAdapter.querySelectorAll(el:any, selector:string):any[]',
|
'BrowserDomAdapter.querySelectorAll(el:any, selector:string):any[]',
|
||||||
'BrowserDomAdapter.remove(node:any):Node',
|
'BrowserDomAdapter.remove(node:any):Node',
|
||||||
'BrowserDomAdapter.removeAttribute(element:any, attribute:string):any',
|
'BrowserDomAdapter.removeAttribute(element:any, attribute:string):any',
|
||||||
|
'BrowserDomAdapter.removeAttributeNS(element:any, ns:string, name:string):any',
|
||||||
'BrowserDomAdapter.removeChild(el:any, node:any):any',
|
'BrowserDomAdapter.removeChild(el:any, node:any):any',
|
||||||
'BrowserDomAdapter.removeClass(element:any, className:string):any',
|
'BrowserDomAdapter.removeClass(element:any, className:string):any',
|
||||||
'BrowserDomAdapter.removeStyle(element:any, stylename:string):any',
|
'BrowserDomAdapter.removeStyle(element:any, stylename:string):any',
|
||||||
|
|
Loading…
Reference in New Issue