blob: 275afa2eba4800a570d3c20ebc5581580280bbdf [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.xml.client.impl;
import com.google.gwt.core.client.JavaScriptObject;
/**
* This class is the IE6 implementation of the XMLParser interface.
*/
class XMLParserImplIE6 extends XMLParserImpl {
/**
* Called from JSNI to select a DOM document; this is necessary due to
* different versions of IE and Windows having different available DOM
* implementations.
*/
private static native JavaScriptObject selectDOMDocumentVersion() /*-{
try { return new ActiveXObject("Msxml2.DOMDocument"); } catch (e) { }
try { return new ActiveXObject("MSXML.DOMDocument"); } catch (e) { }
try { return new ActiveXObject("MSXML3.DOMDocument"); } catch (e) { }
try { return new ActiveXObject("Microsoft.XmlDom"); } catch (e) { }
try { return new ActiveXObject("Microsoft.DOMDocument"); } catch (e) { }
throw new Error("XMLParserImplIE6.createDocumentImpl: Could not find appropriate version of DOMDocument.");
}-*/;
@Override
protected native JavaScriptObject createDocumentImpl() /*-{
var doc = @com.google.gwt.xml.client.impl.XMLParserImplIE6::selectDOMDocumentVersion()();
// preserveWhiteSpace is set to true here to prevent IE from throwing away
// text nodes that consist of only whitespace characters. This makes it
// act more like other browsers.
doc.preserveWhiteSpace = true;
doc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
doc.setProperty("SelectionLanguage", "XPath");
return doc;
}-*/;
@Override
protected native JavaScriptObject getElementByIdImpl(JavaScriptObject o,
String elementId) /*-{
return o.nodeFromID(elementId);
}-*/;
@Override
protected native JavaScriptObject getElementsByTagNameImpl(JavaScriptObject o,
String tagName) /*-{
return o.selectNodes(".//*[local-name()='" + tagName + "']");
}-*/;
@Override
protected native String getPrefixImpl(JavaScriptObject jsObject) /*-{
return jsObject.prefix;
}-*/;
@Override
protected native JavaScriptObject importNodeImpl(JavaScriptObject o,
JavaScriptObject importedNode, boolean deep) /*-{
// IE6 does not seem to need or want nodes to be imported
// as appends from different docs work perfectly
// and this method is not supplied until MSXML5.0
return importedNode;
}-*/;
@Override
protected native JavaScriptObject parseImpl(String contents) /*-{
var doc = this.@com.google.gwt.xml.client.impl.XMLParserImplIE6::createDocumentImpl()();
if(!doc.loadXML(contents)) {
var err = doc.parseError;
throw new Error("line " + err.line + ", char " + err.linepos + ":" + err.reason);
} else {
return doc;
}
}-*/;
@Override
protected String toStringImpl(ProcessingInstructionImpl node) {
return toStringImpl((NodeImpl) node);
}
@Override
protected native String toStringImpl(NodeImpl node) /*-{
var jsNode = node.@com.google.gwt.xml.client.impl.DOMItem::getJsObject()();
return jsNode.xml;
}-*/;
}