1 16 17 package org.apache.xerces.dom; 18 19 import java.io.Serializable ; 20 import java.util.Hashtable ; 21 import java.util.Vector ; 22 23 import org.apache.xerces.dom.events.EventImpl; 24 import org.apache.xerces.dom.events.MutationEventImpl; 25 import org.w3c.dom.UserDataHandler ; 26 import org.w3c.dom.Attr ; 27 import org.w3c.dom.DOMException ; 28 import org.w3c.dom.DOMImplementation ; 29 import org.w3c.dom.DocumentType ; 30 import org.w3c.dom.Element ; 31 import org.w3c.dom.NamedNodeMap ; 32 import org.w3c.dom.Node ; 33 import org.w3c.dom.events.DocumentEvent ; 34 import org.w3c.dom.events.Event ; 35 import org.w3c.dom.events.EventException ; 36 import org.w3c.dom.events.EventListener ; 37 import org.w3c.dom.events.MutationEvent ; 38 import org.w3c.dom.ranges.DocumentRange; 39 import org.w3c.dom.ranges.Range; 40 import org.w3c.dom.traversal.DocumentTraversal; 41 import org.w3c.dom.traversal.NodeFilter; 42 import org.w3c.dom.traversal.NodeIterator; 43 import org.w3c.dom.traversal.TreeWalker; 44 45 46 78 public class DocumentImpl 79 extends CoreDocumentImpl 80 implements DocumentTraversal, DocumentEvent , DocumentRange { 81 82 86 87 static final long serialVersionUID = 515687835542616694L; 88 89 93 94 protected Vector iterators; 96 97 98 protected Vector ranges; 100 101 102 protected Hashtable eventListeners; 103 104 105 protected boolean mutationEvents = false; 106 107 111 115 public DocumentImpl() { 116 super(); 117 } 118 119 120 public DocumentImpl(boolean grammarAccess) { 121 super(grammarAccess); 122 } 123 124 128 public DocumentImpl(DocumentType doctype) 129 { 130 super(doctype); 131 } 132 133 134 public DocumentImpl(DocumentType doctype, boolean grammarAccess) { 135 super(doctype, grammarAccess); 136 } 137 138 142 151 public Node cloneNode(boolean deep) { 152 153 DocumentImpl newdoc = new DocumentImpl(); 154 callUserDataHandlers(this, newdoc, UserDataHandler.NODE_CLONED); 155 cloneNode(newdoc, deep); 156 157 newdoc.mutationEvents = mutationEvents; 159 160 return newdoc; 161 162 } 164 170 public DOMImplementation getImplementation() { 171 return DOMImplementationImpl.getDOMImplementation(); 174 } 175 176 180 190 public NodeIterator createNodeIterator(Node root, 191 short whatToShow, 192 NodeFilter filter) 193 { 194 return createNodeIterator(root, whatToShow, filter, true); 195 } 196 197 209 public NodeIterator createNodeIterator(Node root, 210 int whatToShow, 211 NodeFilter filter, 212 boolean entityReferenceExpansion) 213 { 214 215 if (root == null) { 216 String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_SUPPORTED_ERR", null); 217 throw new DOMException (DOMException.NOT_SUPPORTED_ERR, msg); 218 } 219 220 NodeIterator iterator = new NodeIteratorImpl(this, 221 root, 222 whatToShow, 223 filter, 224 entityReferenceExpansion); 225 if (iterators == null) { 226 iterators = new Vector (); 227 } 228 229 iterators.addElement(iterator); 230 231 return iterator; 232 } 233 234 242 public TreeWalker createTreeWalker(Node root, 243 short whatToShow, 244 NodeFilter filter) 245 { 246 return createTreeWalker(root, whatToShow, filter, true); 247 } 248 258 public TreeWalker createTreeWalker(Node root, 259 int whatToShow, 260 NodeFilter filter, 261 boolean entityReferenceExpansion) 262 { 263 if (root == null) { 264 String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_SUPPORTED_ERR", null); 265 throw new DOMException (DOMException.NOT_SUPPORTED_ERR, msg); 266 } 267 return new TreeWalkerImpl(root, whatToShow, filter, 268 entityReferenceExpansion); 269 } 270 271 275 281 void removeNodeIterator(NodeIterator nodeIterator) { 282 283 if (nodeIterator == null) return; 284 if (iterators == null) return; 285 286 iterators.removeElement(nodeIterator); 287 } 288 289 294 public Range createRange() { 295 296 if (ranges == null) { 297 ranges = new Vector (); 298 } 299 300 Range range = new RangeImpl(this); 301 302 ranges.addElement(range); 303 304 return range; 305 306 } 307 308 312 void removeRange(Range range) { 313 314 if (range == null) return; 315 if (ranges == null) return; 316 317 ranges.removeElement(range); 318 } 319 320 324 void replacedText(NodeImpl node) { 325 if (ranges != null) { 327 int size = ranges.size(); 328 for (int i = 0; i != size; i++) { 329 ((RangeImpl)ranges.elementAt(i)).receiveReplacedText(node); 330 } 331 } 332 } 333 334 338 void deletedText(NodeImpl node, int offset, int count) { 339 if (ranges != null) { 341 int size = ranges.size(); 342 for (int i = 0; i != size; i++) { 343 ((RangeImpl)ranges.elementAt(i)).receiveDeletedText(node, 344 offset, count); 345 } 346 } 347 } 348 349 353 void insertedText(NodeImpl node, int offset, int count) { 354 if (ranges != null) { 356 int size = ranges.size(); 357 for (int i = 0; i != size; i++) { 358 ((RangeImpl)ranges.elementAt(i)).receiveInsertedText(node, 359 offset, count); 360 } 361 } 362 } 363 364 368 void splitData(Node node, Node newNode, int offset) { 369 if (ranges != null) { 371 int size = ranges.size(); 372 for (int i = 0; i != size; i++) { 373 ((RangeImpl)ranges.elementAt(i)).receiveSplitData(node, 374 newNode, offset); 375 } 376 } 377 } 378 379 383 402 public Event createEvent(String type) 403 throws DOMException { 404 if (type.equalsIgnoreCase("Events") || "Event".equals(type)) 405 return new EventImpl(); 406 if (type.equalsIgnoreCase("MutationEvents") || 407 "MutationEvent".equals(type)) 408 return new MutationEventImpl(); 409 else { 410 String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_SUPPORTED_ERR", null); 411 throw new DOMException (DOMException.NOT_SUPPORTED_ERR, msg); 412 } 413 } 414 415 419 void setMutationEvents(boolean set) { 420 mutationEvents = set; 421 } 422 423 426 boolean getMutationEvents() { 427 return mutationEvents; 428 } 429 430 436 protected void setEventListeners(NodeImpl n, Vector listeners) { 437 if (eventListeners == null) { 438 eventListeners = new Hashtable (); 439 } 440 if (listeners == null) { 441 eventListeners.remove(n); 442 if (eventListeners.isEmpty()) { 443 mutationEvents = false; 445 } 446 } else { 447 eventListeners.put(n, listeners); 448 mutationEvents = true; 450 } 451 } 452 453 456 protected Vector getEventListeners(NodeImpl n) { 457 if (eventListeners == null) { 458 return null; 459 } 460 return (Vector ) eventListeners.get(n); 461 } 462 463 467 471 481 class LEntry implements Serializable { 482 483 private static final long serialVersionUID = 3258416144514626360L; 484 String type; 485 EventListener listener; 486 boolean useCapture; 487 488 494 LEntry(String type, EventListener listener, boolean useCapture) 495 { 496 this.type = type; 497 this.listener = listener; 498 this.useCapture = useCapture; 499 } 500 501 } 503 514 protected void addEventListener(NodeImpl node, String type, 515 EventListener listener, boolean useCapture) 516 { 517 if (type == null || type.equals("") || listener == null) 520 return; 521 522 removeEventListener(node, type, listener, useCapture); 525 526 Vector nodeListeners = getEventListeners(node); 527 if(nodeListeners == null) { 528 nodeListeners = new Vector (); 529 setEventListeners(node, nodeListeners); 530 } 531 nodeListeners.addElement(new LEntry(type, listener, useCapture)); 532 533 LCount lc = LCount.lookup(type); 535 if (useCapture) { 536 ++lc.captures; 537 ++lc.total; 538 } 539 else { 540 ++lc.bubbles; 541 ++lc.total; 542 } 543 544 } 546 557 protected void removeEventListener(NodeImpl node, String type, 558 EventListener listener, 559 boolean useCapture) 560 { 561 if (type == null || type.equals("") || listener == null) 563 return; 564 Vector nodeListeners = getEventListeners(node); 565 if (nodeListeners == null) 566 return; 567 568 for (int i = nodeListeners.size() - 1; i >= 0; --i) { 572 LEntry le = (LEntry) nodeListeners.elementAt(i); 573 if (le.useCapture == useCapture && le.listener == listener && 574 le.type.equals(type)) { 575 nodeListeners.removeElementAt(i); 576 if (nodeListeners.size() == 0) 578 setEventListeners(node, null); 579 580 LCount lc = LCount.lookup(type); 582 if (useCapture) { 583 --lc.captures; 584 --lc.total; 585 } 586 else { 587 --lc.bubbles; 588 --lc.total; 589 } 590 591 break; } 593 } 594 } 596 protected void copyEventListeners(NodeImpl src, NodeImpl tgt) { 597 Vector nodeListeners = getEventListeners(src); 598 if (nodeListeners == null) { 599 return; 600 } 601 setEventListeners(tgt, (Vector ) nodeListeners.clone()); 602 } 603 604 654 protected boolean dispatchEvent(NodeImpl node, Event event) { 655 if (event == null) return false; 656 657 EventImpl evt = (EventImpl)event; 660 661 if(!evt.initialized || evt.type == null || evt.type.equals("")) { 664 String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "UNSPECIFIED_EVENT_TYPE_ERR", null); 665 throw new EventException (EventException.UNSPECIFIED_EVENT_TYPE_ERR, msg); 666 } 667 668 LCount lc = LCount.lookup(evt.getType()); 670 if (lc.total == 0) 671 return evt.preventDefault; 672 673 evt.target = node; 678 evt.stopPropagation = false; 679 evt.preventDefault = false; 680 681 Vector pv = new Vector (10,10); 691 Node p = node; 692 Node n = p.getParentNode(); 693 while (n != null) { 694 pv.addElement(n); 695 p = n; 696 n = n.getParentNode(); 697 } 698 699 if (lc.captures > 0) { 701 evt.eventPhase = Event.CAPTURING_PHASE; 702 for (int j = pv.size() - 1; j >= 0; --j) { 705 if (evt.stopPropagation) 706 break; 708 NodeImpl nn = (NodeImpl) pv.elementAt(j); 710 evt.currentTarget = nn; 711 Vector nodeListeners = getEventListeners(nn); 712 if (nodeListeners != null) { 713 Vector nl = (Vector ) nodeListeners.clone(); 714 int nlsize = nl.size(); 716 for (int i = 0; i < nlsize; i++) { 717 LEntry le = (LEntry) nl.elementAt(i); 718 if (le.useCapture && le.type.equals(evt.type) && 719 nodeListeners.contains(le)) { 720 try { 721 le.listener.handleEvent(evt); 722 } 723 catch (Exception e) { 724 } 726 } 727 } 728 } 729 } 730 } 731 732 733 if (lc.bubbles > 0) { 735 evt.eventPhase = Event.AT_TARGET; 739 evt.currentTarget = node; 740 Vector nodeListeners = getEventListeners(node); 741 if (!evt.stopPropagation && nodeListeners != null) { 742 Vector nl = (Vector ) nodeListeners.clone(); 743 int nlsize = nl.size(); 745 for (int i = 0; i < nlsize; i++) { 746 LEntry le = (LEntry) nl.elementAt(i); 747 if (!le.useCapture && le.type.equals(evt.type) && 748 nodeListeners.contains(le)) { 749 try { 750 le.listener.handleEvent(evt); 751 } 752 catch (Exception e) { 753 } 755 } 756 } 757 } 758 if (evt.bubbles) { 764 evt.eventPhase = Event.BUBBLING_PHASE; 765 int pvsize = pv.size(); 766 for (int j = 0; j < pvsize; j++) { 767 if (evt.stopPropagation) 768 break; 770 NodeImpl nn = (NodeImpl) pv.elementAt(j); 772 evt.currentTarget = nn; 773 nodeListeners = getEventListeners(nn); 774 if (nodeListeners != null) { 775 Vector nl = (Vector ) nodeListeners.clone(); 776 int nlsize = nl.size(); 779 for (int i = 0; i < nlsize; i++) { 780 LEntry le = (LEntry) nl.elementAt(i); 781 if (!le.useCapture && le.type.equals(evt.type) && 782 nodeListeners.contains(le)) { 783 try { 784 le.listener.handleEvent(evt); 785 } 786 catch (Exception e) { 787 } 789 } 790 } 791 } 792 } 793 } 794 } 795 796 if (lc.defaults > 0 && (!evt.cancelable || !evt.preventDefault)) { 802 } 806 807 return evt.preventDefault; 808 } 810 825 protected void dispatchEventToSubtree(Node n, Event e) { 826 827 ((NodeImpl) n).dispatchEvent(e); 828 if (n.getNodeType() == Node.ELEMENT_NODE) { 829 NamedNodeMap a = n.getAttributes(); 830 for (int i = a.getLength() - 1; i >= 0; --i) 831 dispatchingEventToSubtree(a.item(i), e); 832 } 833 dispatchingEventToSubtree(n.getFirstChild(), e); 834 835 } 837 838 844 protected void dispatchingEventToSubtree(Node n, Event e) { 845 if (n==null) 846 return; 847 848 ((NodeImpl) n).dispatchEvent(e); 852 if (n.getNodeType() == Node.ELEMENT_NODE) { 853 NamedNodeMap a = n.getAttributes(); 854 for (int i = a.getLength() - 1; i >= 0; --i) 855 dispatchingEventToSubtree(a.item(i), e); 856 } 857 dispatchingEventToSubtree(n.getFirstChild(), e); 858 dispatchingEventToSubtree(n.getNextSibling(), e); 859 } 860 861 866 class EnclosingAttr implements Serializable { 867 private static final long serialVersionUID = 3257001077260759859L; 868 AttrImpl node; 869 String oldvalue; 870 } 871 872 EnclosingAttr savedEnclosingAttr; 873 874 881 protected void dispatchAggregateEvents(NodeImpl node, EnclosingAttr ea) { 882 if (ea != null) 883 dispatchAggregateEvents(node, ea.node, ea.oldvalue, 884 MutationEvent.MODIFICATION); 885 else 886 dispatchAggregateEvents(node, null, null, (short) 0); 887 888 } 890 914 protected void dispatchAggregateEvents(NodeImpl node, 915 AttrImpl enclosingAttr, 916 String oldvalue, short change) { 917 NodeImpl owner = null; 919 if (enclosingAttr != null) { 920 LCount lc = LCount.lookup(MutationEventImpl.DOM_ATTR_MODIFIED); 921 owner = (NodeImpl) enclosingAttr.getOwnerElement(); 922 if (lc.total > 0) { 923 if (owner != null) { 924 MutationEventImpl me = new MutationEventImpl(); 925 me.initMutationEvent(MutationEventImpl.DOM_ATTR_MODIFIED, 926 true, false, enclosingAttr, 927 oldvalue, 928 enclosingAttr.getNodeValue(), 929 enclosingAttr.getNodeName(), 930 change); 931 owner.dispatchEvent(me); 932 } 933 } 934 } 935 LCount lc = LCount.lookup(MutationEventImpl.DOM_SUBTREE_MODIFIED); 940 if (lc.total > 0) { 941 MutationEvent me = new MutationEventImpl(); 942 me.initMutationEvent(MutationEventImpl.DOM_SUBTREE_MODIFIED, 943 true, false, null, null, 944 null, null, (short) 0); 945 946 if (enclosingAttr != null) { 950 dispatchEvent(enclosingAttr, me); 951 if (owner != null) 952 dispatchEvent(owner, me); 953 } 954 else 955 dispatchEvent(node, me); 956 } 957 } 959 966 protected void saveEnclosingAttr(NodeImpl node) { 967 savedEnclosingAttr = null; 968 LCount lc = LCount.lookup(MutationEventImpl.DOM_ATTR_MODIFIED); 973 if (lc.total > 0) { 974 NodeImpl eventAncestor = node; 975 while (true) { 976 if (eventAncestor == null) 977 return; 978 int type = eventAncestor.getNodeType(); 979 if (type == Node.ATTRIBUTE_NODE) { 980 EnclosingAttr retval = new EnclosingAttr(); 981 retval.node = (AttrImpl) eventAncestor; 982 retval.oldvalue = retval.node.getNodeValue(); 983 savedEnclosingAttr = retval; 984 return; 985 } 986 else if (type == Node.ENTITY_REFERENCE_NODE) 987 eventAncestor = eventAncestor.parentNode(); 988 else if (type == Node.TEXT_NODE) 989 eventAncestor = eventAncestor.parentNode(); 990 else 991 return; 992 } 994 } 995 } 997 1000 void modifyingCharacterData(NodeImpl node, boolean replace) { 1001 if (mutationEvents) { 1002 if (!replace) { 1003 saveEnclosingAttr(node); 1004 } 1005 } 1006 } 1007 1008 1011 void modifiedCharacterData(NodeImpl node, String oldvalue, String value, boolean replace) { 1012 if (mutationEvents) { 1013 if (!replace) { 1014 LCount lc = 1016 LCount.lookup(MutationEventImpl.DOM_CHARACTER_DATA_MODIFIED); 1017 if (lc.total > 0) { 1018 MutationEvent me = new MutationEventImpl(); 1019 me.initMutationEvent( 1020 MutationEventImpl.DOM_CHARACTER_DATA_MODIFIED, 1021 true, false, null, 1022 oldvalue, value, null, (short) 0); 1023 dispatchEvent(node, me); 1024 } 1025 1026 dispatchAggregateEvents(node, savedEnclosingAttr); 1029 } } 1031 } 1032 1033 1036 void replacedCharacterData(NodeImpl node, String oldvalue, String value) { 1037 modifiedCharacterData(node, oldvalue, value, false); 1042 } 1043 1044 1045 1046 1049 void insertingNode(NodeImpl node, boolean replace) { 1050 if (mutationEvents) { 1051 if (!replace) { 1052 saveEnclosingAttr(node); 1053 } 1054 } 1055 } 1056 1057 1060 void insertedNode(NodeImpl node, NodeImpl newInternal, boolean replace) { 1061 if (mutationEvents) { 1062 LCount lc = LCount.lookup(MutationEventImpl.DOM_NODE_INSERTED); 1066 if (lc.total > 0) { 1067 MutationEventImpl me = new MutationEventImpl(); 1068 me.initMutationEvent(MutationEventImpl.DOM_NODE_INSERTED, 1069 true, false, node, 1070 null, null, null, (short) 0); 1071 dispatchEvent(newInternal, me); 1072 } 1073 1074 lc = LCount.lookup( 1077 MutationEventImpl.DOM_NODE_INSERTED_INTO_DOCUMENT); 1078 if (lc.total > 0) { 1079 NodeImpl eventAncestor = node; 1080 if (savedEnclosingAttr != null) 1081 eventAncestor = (NodeImpl) 1082 savedEnclosingAttr.node.getOwnerElement(); 1083 if (eventAncestor != null) { NodeImpl p = eventAncestor; 1085 while (p != null) { 1086 eventAncestor = p; if (p.getNodeType() == ATTRIBUTE_NODE) { 1090 p = (NodeImpl) ((AttrImpl)p).getOwnerElement(); 1091 } 1092 else { 1093 p = p.parentNode(); 1094 } 1095 } 1096 if (eventAncestor.getNodeType() == Node.DOCUMENT_NODE){ 1097 MutationEventImpl me = new MutationEventImpl(); 1098 me.initMutationEvent(MutationEventImpl 1099 .DOM_NODE_INSERTED_INTO_DOCUMENT, 1100 false,false,null,null, 1101 null,null,(short)0); 1102 dispatchEventToSubtree(newInternal, me); 1103 } 1104 } 1105 } 1106 if (!replace) { 1107 dispatchAggregateEvents(node, savedEnclosingAttr); 1110 } 1111 } 1112 1113 if (ranges != null) { 1115 int size = ranges.size(); 1116 for (int i = 0; i != size; i++) { 1117 ((RangeImpl)ranges.elementAt(i)).insertedNodeFromDOM(newInternal); 1118 } 1119 } 1120 } 1121 1122 1125 void removingNode(NodeImpl node, NodeImpl oldChild, boolean replace) { 1126 1127 if (iterators != null) { 1129 int size = iterators.size(); 1130 for (int i = 0; i != size; i++) { 1131 ((NodeIteratorImpl)iterators.elementAt(i)).removeNode(oldChild); 1132 } 1133 } 1134 1135 if (ranges != null) { 1137 int size = ranges.size(); 1138 for (int i = 0; i != size; i++) { 1139 ((RangeImpl)ranges.elementAt(i)).removeNode(oldChild); 1140 } 1141 } 1142 1143 if (mutationEvents) { 1145 if (!replace) { 1150 saveEnclosingAttr(node); 1151 } 1152 LCount lc = LCount.lookup(MutationEventImpl.DOM_NODE_REMOVED); 1154 if (lc.total > 0) { 1155 MutationEventImpl me= new MutationEventImpl(); 1156 me.initMutationEvent(MutationEventImpl.DOM_NODE_REMOVED, 1157 true, false, node, null, 1158 null, null, (short) 0); 1159 dispatchEvent(oldChild, me); 1160 } 1161 1162 lc = LCount.lookup( 1165 MutationEventImpl.DOM_NODE_REMOVED_FROM_DOCUMENT); 1166 if (lc.total > 0) { 1167 NodeImpl eventAncestor = this; 1168 if(savedEnclosingAttr != null) 1169 eventAncestor = (NodeImpl) 1170 savedEnclosingAttr.node.getOwnerElement(); 1171 if (eventAncestor != null) { for (NodeImpl p = eventAncestor.parentNode(); 1173 p != null; p = p.parentNode()) { 1174 eventAncestor = p; } 1176 if (eventAncestor.getNodeType() == Node.DOCUMENT_NODE){ 1177 MutationEventImpl me = new MutationEventImpl(); 1178 me.initMutationEvent( 1179 MutationEventImpl.DOM_NODE_REMOVED_FROM_DOCUMENT, 1180 false, false, null, 1181 null, null, null, (short) 0); 1182 dispatchEventToSubtree(oldChild, me); 1183 } 1184 } 1185 } 1186 } } 1188 1189 1192 void removedNode(NodeImpl node, boolean replace) { 1193 if (mutationEvents) { 1194 if (!replace) { 1198 dispatchAggregateEvents(node, savedEnclosingAttr); 1199 } 1200 } } 1202 1203 1206 void replacingNode(NodeImpl node) { 1207 if (mutationEvents) { 1208 saveEnclosingAttr(node); 1209 } 1210 } 1211 1212 1215 void replacingData (NodeImpl node) { 1216 if (mutationEvents) { 1217 saveEnclosingAttr(node); 1218 } 1219 } 1220 1221 1224 void replacedNode(NodeImpl node) { 1225 if (mutationEvents) { 1226 dispatchAggregateEvents(node, savedEnclosingAttr); 1227 } 1228 } 1229 1230 1233 void modifiedAttrValue(AttrImpl attr, String oldvalue) { 1234 if (mutationEvents) { 1235 dispatchAggregateEvents(attr, attr, oldvalue, 1237 MutationEvent.MODIFICATION); 1238 } 1239 } 1240 1241 1244 void setAttrNode(AttrImpl attr, AttrImpl previous) { 1245 if (mutationEvents) { 1246 if (previous == null) { 1248 dispatchAggregateEvents(attr.ownerNode, attr, null, 1249 MutationEvent.ADDITION); 1250 } 1251 else { 1252 dispatchAggregateEvents(attr.ownerNode, attr, 1253 previous.getNodeValue(), 1254 MutationEvent.MODIFICATION); 1255 } 1256 } 1257 } 1258 1259 1262 void removedAttrNode(AttrImpl attr, NodeImpl oldOwner, String name) { 1263 if (mutationEvents) { 1267 LCount lc = LCount.lookup(MutationEventImpl.DOM_ATTR_MODIFIED); 1270 if (lc.total > 0) { 1271 MutationEventImpl me= new MutationEventImpl(); 1272 me.initMutationEvent(MutationEventImpl.DOM_ATTR_MODIFIED, 1273 true, false, attr, 1274 attr.getNodeValue(), null, name, 1275 MutationEvent.REMOVAL); 1276 dispatchEvent(oldOwner, me); 1277 } 1278 1279 dispatchAggregateEvents(oldOwner, null, null, (short) 0); 1283 } 1284 } 1285 1286 1287 1290 void renamedAttrNode(Attr oldAt, Attr newAt) { 1291 } 1293 1294 1297 void renamedElement(Element oldEl, Element newEl) { 1298 } 1300 1301} | Popular Tags |