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

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

Issue 12703031: Revert 146726 "AXObjectCache gets recreated during document tear..." (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1453/
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/Document.h ('k') | Source/WebCore/dom/Element.cpp » ('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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 // Although the Document may be replaced synchronously, DocumentParsers 622 // Although the Document may be replaced synchronously, DocumentParsers
623 // generally keep at least one reference to an Element which would in turn 623 // generally keep at least one reference to an Element which would in turn
624 // has a reference to the Document. If you hit this ASSERT, then that 624 // has a reference to the Document. If you hit this ASSERT, then that
625 // assumption is wrong. DocumentParser::detach() should ensure that even 625 // assumption is wrong. DocumentParser::detach() should ensure that even
626 // if the DocumentParser outlives the Document it won't cause badness. 626 // if the DocumentParser outlives the Document it won't cause badness.
627 ASSERT(!m_parser || m_parser->refCount() == 1); 627 ASSERT(!m_parser || m_parser->refCount() == 1);
628 detachParser(); 628 detachParser();
629 629
630 m_renderArena.clear(); 630 m_renderArena.clear();
631 631
632 if (this == topDocument()) 632 clearAXObjectCache();
633 clearAXObjectCache();
634 633
635 m_decoder = 0; 634 m_decoder = 0;
636 635
637 if (m_styleSheetList) 636 if (m_styleSheetList)
638 m_styleSheetList->detachFromDocument(); 637 m_styleSheetList->detachFromDocument();
639 638
640 m_styleSheetCollection.clear(); 639 m_styleSheetCollection.clear();
641 640
642 if (m_elemSheet) 641 if (m_elemSheet)
643 m_elemSheet->clearOwnerNode(); 642 m_elemSheet->clearOwnerNode();
(...skipping 1561 matching lines...) Expand 10 before | Expand all | Expand 10 after
2205 ScriptExecutionContext::suspendActiveDOMObjects(why); 2204 ScriptExecutionContext::suspendActiveDOMObjects(why);
2206 } 2205 }
2207 2206
2208 void Document::resumeActiveDOMObjects() 2207 void Document::resumeActiveDOMObjects()
2209 { 2208 {
2210 ScriptExecutionContext::resumeActiveDOMObjects(); 2209 ScriptExecutionContext::resumeActiveDOMObjects();
2211 } 2210 }
2212 2211
2213 void Document::clearAXObjectCache() 2212 void Document::clearAXObjectCache()
2214 { 2213 {
2215 ASSERT(topDocument() == this);
2216 // Clear the cache member variable before calling delete because attempts 2214 // Clear the cache member variable before calling delete because attempts
2217 // are made to access it during destruction. 2215 // are made to access it during destruction.
2218 m_axObjectCache.clear(); 2216 topDocument()->m_axObjectCache.release();
2219 } 2217 }
2220 2218
2221 AXObjectCache* Document::existingAXObjectCache() const 2219 bool Document::axObjectCacheExists() const
2222 { 2220 {
2223 if (!AXObjectCache::accessibilityEnabled()) 2221 return topDocument()->m_axObjectCache;
2224 return 0;
2225
2226 // If the renderer is gone then we are in the process of destruction.
2227 // This method will be called before m_frame = 0.
2228 if (!topDocument()->renderer())
2229 return 0;
2230
2231 return topDocument()->m_axObjectCache.get();
2232 } 2222 }
2233 2223
2234 AXObjectCache* Document::axObjectCache() const 2224 AXObjectCache* Document::axObjectCache() const
2235 { 2225 {
2236 if (!AXObjectCache::accessibilityEnabled())
2237 return 0;
2238
2239 // The only document that actually has a AXObjectCache is the top-level 2226 // The only document that actually has a AXObjectCache is the top-level
2240 // document. This is because we need to be able to get from any WebCoreAXOb ject 2227 // document. This is because we need to be able to get from any WebCoreAXOb ject
2241 // to any other WebCoreAXObject on the same page. Using a single cache allo ws 2228 // to any other WebCoreAXObject on the same page. Using a single cache allo ws
2242 // lookups across nested webareas (i.e. multiple documents). 2229 // lookups across nested webareas (i.e. multiple documents).
2243 Document* topDocument = this->topDocument(); 2230 Document* topDocument = this->topDocument();
2244
2245 // If the document has already been detached, do not make a new axObjectCach e.
2246 if (!topDocument->renderer())
2247 return 0;
2248
2249 ASSERT(topDocument == this || !m_axObjectCache); 2231 ASSERT(topDocument == this || !m_axObjectCache);
2250 if (!topDocument->m_axObjectCache) 2232 if (!topDocument->m_axObjectCache)
2251 topDocument->m_axObjectCache = adoptPtr(new AXObjectCache(topDocument)); 2233 topDocument->m_axObjectCache = adoptPtr(new AXObjectCache(topDocument));
2252 return topDocument->m_axObjectCache.get(); 2234 return topDocument->m_axObjectCache.get();
2253 } 2235 }
2254 2236
2255 void Document::setVisuallyOrdered() 2237 void Document::setVisuallyOrdered()
2256 { 2238 {
2257 m_visuallyOrdered = true; 2239 m_visuallyOrdered = true;
2258 if (renderer()) 2240 if (renderer())
(...skipping 1228 matching lines...) Expand 10 before | Expand all | Expand 10 after
3487 // Re-get the widget in case updating the layout changed things. 3469 // Re-get the widget in case updating the layout changed things.
3488 focusWidget = widgetForNode(m_focusedNode.get()); 3470 focusWidget = widgetForNode(m_focusedNode.get());
3489 } 3471 }
3490 if (focusWidget) 3472 if (focusWidget)
3491 focusWidget->setFocus(true); 3473 focusWidget->setFocus(true);
3492 else 3474 else
3493 view()->setFocus(true); 3475 view()->setFocus(true);
3494 } 3476 }
3495 } 3477 }
3496 3478
3497 if (!focusChangeBlocked && m_focusedNode) { 3479 #if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK) || PLATFORM(CHROMIUM)
3498 // Create the AXObject cache in a focus change because Chromium relies o n it. 3480 if (!focusChangeBlocked && m_focusedNode && AXObjectCache::accessibilityEnab led())
3499 if (AXObjectCache* cache = axObjectCache()) 3481 axObjectCache()->handleFocusedUIElementChanged(oldFocusedNode.get(), new FocusedNode.get());
3500 cache->handleFocusedUIElementChanged(oldFocusedNode.get(), newFocuse dNode.get()); 3482 #endif
3501 }
3502
3503 if (!focusChangeBlocked) 3483 if (!focusChangeBlocked)
3504 page()->chrome()->focusedNodeChanged(m_focusedNode.get()); 3484 page()->chrome()->focusedNodeChanged(m_focusedNode.get());
3505 3485
3506 SetFocusedNodeDone: 3486 SetFocusedNodeDone:
3507 updateStyleIfNeeded(); 3487 updateStyleIfNeeded();
3508 return !focusChangeBlocked; 3488 return !focusChangeBlocked;
3509 } 3489 }
3510 3490
3511 void Document::getFocusableNodes(Vector<RefPtr<Node> >& nodes) 3491 void Document::getFocusableNodes(Vector<RefPtr<Node> >& nodes)
3512 { 3492 {
(...skipping 2683 matching lines...) Expand 10 before | Expand all | Expand 10 after
6196 return; 6176 return;
6197 6177
6198 Vector<Element*> associatedFormControls; 6178 Vector<Element*> associatedFormControls;
6199 copyToVector(m_associatedFormControls, associatedFormControls); 6179 copyToVector(m_associatedFormControls, associatedFormControls);
6200 6180
6201 frame()->page()->chrome()->client()->didAssociateFormControls(associatedForm Controls); 6181 frame()->page()->chrome()->client()->didAssociateFormControls(associatedForm Controls);
6202 m_associatedFormControls.clear(); 6182 m_associatedFormControls.clear();
6203 } 6183 }
6204 6184
6205 } // namespace WebCore 6185 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/dom/Document.h ('k') | Source/WebCore/dom/Element.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698