/* * 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 Safari implementation of the XMLParser interface. */ public class XMLParserImplSafari extends XMLParserImplStandard { private static boolean safari2LevelWebKit = (getWebKitVersion() <= 420); public static boolean isSafari2LevelWebKit() { return safari2LevelWebKit; } private static native int getWebKitVersion() /*-{ var result = / AppleWebKit\/([\d]+)/.exec(navigator.userAgent); return ((result) ? parseInt(result[1]) : 0) || 0; }-*/; private static void throwDOMParseException(String message) { throw new DOMParseException(message); } @Override protected native JavaScriptObject getElementsByTagNameImpl(JavaScriptObject o, String tagName) /*-{ return o.getElementsByTagName(tagName); }-*/; @Override protected native JavaScriptObject importNodeImpl(JavaScriptObject jsObject, JavaScriptObject importedNode, boolean deep) /*-{ // Works around a Safari2 issue where importing a node will steal attributes // from the original. if (@com.google.gwt.xml.client.impl.XMLParserImplSafari::isSafari2LevelWebKit()()) { importedNode = importedNode.cloneNode(deep); } return jsObject.importNode(importedNode, deep); }-*/; /** * <html><body><parsererror style="white-space: pre; border: 2px solid #c77; * padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black" > * <h3>This page contains the following errors:</h3> * <div style="font-family:monospace;font-size:12px" >error on line 1 at * column 2: xmlParseStartTag: invalid element name </div> * <h3>Below is a rendering of the page up to the first error.</h3> * </parsererror></body></html> is all you get from Safari. Hope that nobody * wants to send one of those error reports over the wire to be parsed by * safari... * * @param contents contents * @return parsed JavaScript object * @see com.google.gwt.xml.client.impl.XMLParserImpl#parseImpl(java.lang.String) */ @Override protected native JavaScriptObject parseImpl(String contents) /*-{ var domParser = this.@com.google.gwt.xml.client.impl.XMLParserImplStandard::domParser; var result = domParser.parseFromString(contents,"text/xml"); var parseerrors = result.getElementsByTagName("parsererror"); if (parseerrors.length > 0) { var err = parseerrors.item(0); if (err.parentNode.tagName == 'body') { @com.google.gwt.xml.client.impl.XMLParserImplSafari::throwDOMParseException(Ljava/lang/String;)(err.childNodes[1].innerHTML); } } return result; }-*/; }