001: /*
002: * Copyright (c) 2002-2008 Gargoyle Software Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: * 2. Redistributions in binary form must reproduce the above copyright notice,
010: * this list of conditions and the following disclaimer in the documentation
011: * and/or other materials provided with the distribution.
012: * 3. The end-user documentation included with the redistribution, if any, must
013: * include the following acknowledgment:
014: *
015: * "This product includes software developed by Gargoyle Software Inc.
016: * (http://www.GargoyleSoftware.com/)."
017: *
018: * Alternately, this acknowledgment may appear in the software itself, if
019: * and wherever such third-party acknowledgments normally appear.
020: * 4. The name "Gargoyle Software" must not be used to endorse or promote
021: * products derived from this software without prior written permission.
022: * For written permission, please contact info@GargoyleSoftware.com.
023: * 5. Products derived from this software may not be called "HtmlUnit", nor may
024: * "HtmlUnit" appear in their name, without prior written permission of
025: * Gargoyle Software Inc.
026: *
027: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
028: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
029: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARGOYLE
030: * SOFTWARE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
031: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
032: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
033: * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
034: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
035: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
036: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
037: */
038: package com.gargoylesoftware.htmlunit.javascript.host;
039:
040: import com.gargoylesoftware.htmlunit.javascript.SimpleScriptable;
041: import com.gargoylesoftware.htmlunit.xml.XmlElement;
042:
043: /**
044: * A JavaScript object for an XML Attribute.
045: *
046: * @version $Revision: 2132 $
047: * @author Ahmed Ashour
048: */
049: public class XMLAttribute extends SimpleScriptable {
050:
051: private static final long serialVersionUID = -5235485258901782888L;
052:
053: /**
054: * The name of this attribute.
055: */
056: private String name_;
057:
058: /**
059: * The value of this attribute, used only when this attribute is detached from
060: * a parent XML element (<tt>parent_</tt> is <tt>null</tt>).
061: */
062: private String value_;
063:
064: /**
065: * The XML element to which this attribute belongs. May be <tt>null</tt> if
066: * document.createAttribute() has been called but element.setAttributeNode()
067: * has not been called yet, or if document.setAttributeNode() has been called
068: * and this is the replaced attribute returned by said method.
069: */
070: private XmlElement parent_;
071:
072: /**
073: * Create an instance. Javascript objects must have a default constructor.
074: */
075: public XMLAttribute() {
076: }
077:
078: /**
079: * Initializes this attribute.
080: * @param name the name of the attribute.
081: * @param parent the parent xml element.
082: */
083: public void init(final String name, final XmlElement parent) {
084: name_ = name;
085: parent_ = parent;
086: if (parent_ == null) {
087: value_ = "";
088: }
089: }
090:
091: /**
092: * Detaches this attribute from the parent XML element after caching the attribute value.
093: */
094: public void detachFromParent() {
095: if (parent_ != null) {
096: value_ = parent_.getAttributeValue(name_);
097: }
098: parent_ = null;
099: }
100:
101: /**
102: * Returns <tt>true</tt> if arbitrary properties can be added to this attribute.
103: * @return <tt>true</tt> if arbitrary properties can be added to this attribute.
104: */
105: public boolean jsxGet_expando() {
106: return true;
107: }
108:
109: /**
110: * Returns <code>null</code>
111: * @return <code>null</code>
112: */
113: public Object jsxGet_firstChild() {
114: return null;
115: }
116:
117: /**
118: * Returns <code>null</code>
119: * @return <code>null</code>
120: */
121: public Object jsxGet_lastChild() {
122: return null;
123: }
124:
125: /**
126: * Returns the name of the attribute.
127: * @return the name of the attribute.
128: */
129: public String jsxGet_name() {
130: return name_;
131: }
132:
133: /**
134: * Returns <code>null</code>
135: * @return <code>null</code>
136: */
137: public Object jsxGet_nextSibling() {
138: return null;
139: }
140:
141: /**
142: * Returns the name of this attribute.
143: * @return the name of this attribute.
144: */
145: public String jsxGet_nodeName() {
146: return jsxGet_name();
147: }
148:
149: /**
150: * Returns the type of DOM node this attribute represents.
151: * @return the type of DOM node this attribute represents.
152: */
153: public int jsxGet_nodeType() {
154: return org.w3c.dom.Node.ATTRIBUTE_NODE;
155: }
156:
157: /**
158: * Returns the value of this attribute.
159: * @return the value of this attribute.
160: */
161: public String jsxGet_nodeValue() {
162: return jsxGet_value();
163: }
164:
165: /**
166: * Returns the containing document.
167: * @return the containing document.
168: */
169: public Object jsxGet_ownerDocument() {
170: if (parent_ != null) {
171: final SimpleScriptable documentScriptable = getScriptableFor(parent_
172: .getPage());
173: return documentScriptable;
174: } else {
175: return null;
176: }
177: }
178:
179: /**
180: * Returns <code>null</code>
181: * @return <code>null</code>
182: */
183: public Object jsxGet_parentNode() {
184: return null;
185: }
186:
187: /**
188: * Returns <code>null</code>
189: * @return <code>null</code>
190: */
191: public Object jsxGet_previousSibling() {
192: return null;
193: }
194:
195: /**
196: * Returns <tt>true</tt> if this attribute has been specified.
197: * @return <tt>true</tt> if this attribute has been specified.
198: */
199: public boolean jsxGet_specified() {
200: return true;
201: }
202:
203: /**
204: * Returns the value of this attribute.
205: * @return the value of this attribute.
206: */
207: public String jsxGet_value() {
208: if (parent_ != null) {
209: return parent_.getAttributeValue(name_);
210: } else {
211: return value_;
212: }
213: }
214:
215: }
|