Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: Source/WebCore/dom/TreeScope.cpp

Issue 12518022: Merge 143840 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1410/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/WebCore/dom/TreeScope.h ('k') | Source/WebCore/dom/TreeScopeAdopter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All Rights Reserved. 2 * Copyright (C) 2011 Google Inc. All Rights Reserved.
3 * Copyright (C) 2012 Apple Inc. All rights reserved. 3 * Copyright (C) 2012 Apple Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "TreeScopeAdopter.h" 52 #include "TreeScopeAdopter.h"
53 #include <wtf/Vector.h> 53 #include <wtf/Vector.h>
54 #include <wtf/text/AtomicString.h> 54 #include <wtf/text/AtomicString.h>
55 #include <wtf/text/CString.h> 55 #include <wtf/text/CString.h>
56 56
57 namespace WebCore { 57 namespace WebCore {
58 58
59 struct SameSizeAsTreeScope { 59 struct SameSizeAsTreeScope {
60 virtual ~SameSizeAsTreeScope(); 60 virtual ~SameSizeAsTreeScope();
61 void* pointers[8]; 61 void* pointers[8];
62 int ints[1];
62 }; 63 };
63 64
64 COMPILE_ASSERT(sizeof(TreeScope) == sizeof(SameSizeAsTreeScope), treescope_shoul d_stay_small); 65 COMPILE_ASSERT(sizeof(TreeScope) == sizeof(SameSizeAsTreeScope), treescope_shoul d_stay_small);
65 66
66 using namespace HTMLNames; 67 using namespace HTMLNames;
67 68
68 TreeScope::TreeScope(ContainerNode* rootNode, Document* document) 69 TreeScope::TreeScope(ContainerNode* rootNode, Document* document)
69 : m_rootNode(rootNode) 70 : m_rootNode(rootNode)
70 , m_documentScope(document) 71 , m_documentScope(document)
71 , m_parentTreeScope(document) 72 , m_parentTreeScope(document)
73 , m_guardRefCount(0)
72 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) 74 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create())
73 { 75 {
74 ASSERT(rootNode); 76 ASSERT(rootNode);
75 ASSERT(document); 77 ASSERT(document);
76 ASSERT(rootNode != document); 78 ASSERT(rootNode != document);
79 m_parentTreeScope->guardRef();
80 m_rootNode->setTreeScope(this);
77 } 81 }
78 82
79 TreeScope::TreeScope(Document* document) 83 TreeScope::TreeScope(Document* document)
80 : m_rootNode(document) 84 : m_rootNode(document)
81 , m_documentScope(document) 85 , m_documentScope(document)
82 , m_parentTreeScope(0) 86 , m_parentTreeScope(0)
87 , m_guardRefCount(0)
83 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) 88 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create())
84 { 89 {
85 ASSERT(document); 90 ASSERT(document);
91 m_rootNode->setTreeScope(this);
86 } 92 }
87 93
88 TreeScope::TreeScope() 94 TreeScope::TreeScope()
89 : m_rootNode(0) 95 : m_rootNode(0)
90 , m_documentScope(0) 96 , m_documentScope(0)
91 , m_parentTreeScope(0) 97 , m_parentTreeScope(0)
98 , m_guardRefCount(0)
92 { 99 {
93 } 100 }
94 101
95 TreeScope::~TreeScope() 102 TreeScope::~TreeScope()
96 { 103 {
104 ASSERT(!m_guardRefCount);
105 m_rootNode->setTreeScope(noDocumentInstance());
106
97 if (m_selection) { 107 if (m_selection) {
98 m_selection->clearTreeScope(); 108 m_selection->clearTreeScope();
99 m_selection = 0; 109 m_selection = 0;
100 } 110 }
111
112 if (m_parentTreeScope)
113 m_parentTreeScope->guardDeref();
101 } 114 }
102 115
103 void TreeScope::destroyTreeScopeData() 116 void TreeScope::destroyTreeScopeData()
104 { 117 {
105 m_elementsById.clear(); 118 m_elementsById.clear();
106 m_imageMapsByName.clear(); 119 m_imageMapsByName.clear();
107 m_labelsByForAttribute.clear(); 120 m_labelsByForAttribute.clear();
108 } 121 }
109 122
110 void TreeScope::clearDocumentScope() 123 void TreeScope::clearDocumentScope()
111 { 124 {
112 ASSERT(rootNode()->isDocumentNode()); 125 ASSERT(rootNode()->isDocumentNode());
113 m_documentScope = 0; 126 m_documentScope = 0;
114 } 127 }
115 128
116 void TreeScope::setParentTreeScope(TreeScope* newParentScope) 129 void TreeScope::setParentTreeScope(TreeScope* newParentScope)
117 { 130 {
118 // A document node cannot be re-parented. 131 // A document node cannot be re-parented.
119 ASSERT(!rootNode()->isDocumentNode()); 132 ASSERT(!rootNode()->isDocumentNode());
120 // Every scope other than document needs a parent scope. 133 // Every scope other than document needs a parent scope.
121 ASSERT(newParentScope); 134 ASSERT(newParentScope);
122 135
136 newParentScope->guardRef();
137 if (m_parentTreeScope)
138 m_parentTreeScope->guardDeref();
123 m_parentTreeScope = newParentScope; 139 m_parentTreeScope = newParentScope;
124 setDocumentScope(newParentScope->documentScope()); 140 setDocumentScope(newParentScope->documentScope());
125 } 141 }
126 142
127 Element* TreeScope::getElementById(const AtomicString& elementId) const 143 Element* TreeScope::getElementById(const AtomicString& elementId) const
128 { 144 {
129 if (elementId.isEmpty()) 145 if (elementId.isEmpty())
130 return 0; 146 return 0;
131 if (!m_elementsById) 147 if (!m_elementsById)
132 return 0; 148 return 0;
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 listTreeScopes(nodeB, treeScopesB); 424 listTreeScopes(nodeB, treeScopesB);
409 425
410 size_t indexA = treeScopesA.size(); 426 size_t indexA = treeScopesA.size();
411 size_t indexB = treeScopesB.size(); 427 size_t indexB = treeScopesB.size();
412 428
413 for (; indexA > 0 && indexB > 0 && treeScopesA[indexA - 1] == treeScopesB[in dexB - 1]; --indexA, --indexB) { } 429 for (; indexA > 0 && indexB > 0 && treeScopesA[indexA - 1] == treeScopesB[in dexB - 1]; --indexA, --indexB) { }
414 430
415 return treeScopesA[indexA] == treeScopesB[indexB] ? treeScopesA[indexA] : 0; 431 return treeScopesA[indexA] == treeScopesB[indexB] ? treeScopesA[indexA] : 0;
416 } 432 }
417 433
434 #ifndef NDEBUG
435 bool TreeScope::deletionHasBegun()
436 {
437 return rootNode() && rootNode()->m_deletionHasBegun;
438 }
439
440 void TreeScope::beginDeletion()
441 {
442 ASSERT(this != noDocumentInstance());
443 rootNode()->m_deletionHasBegun = true;
444 }
445 #endif
446
447 int TreeScope::refCount() const
448 {
449 if (Node* root = rootNode())
450 return root->refCount();
451 return 0;
452 }
453
418 } // namespace WebCore 454 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/dom/TreeScope.h ('k') | Source/WebCore/dom/TreeScopeAdopter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698