| /* |
| * 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; |
| }-*/; |
| } |