OLD | NEW |
---|---|
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 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
472 , m_writeRecursionDepth(0) | 472 , m_writeRecursionDepth(0) |
473 , m_taskRunner(MainThreadTaskRunner::create(this)) | 473 , m_taskRunner(MainThreadTaskRunner::create(this)) |
474 , m_registrationContext(initializer.registrationContext(this)) | 474 , m_registrationContext(initializer.registrationContext(this)) |
475 , m_elementDataCacheClearTimer(this, &Document::elementDataCacheClearTimerFi red) | 475 , m_elementDataCacheClearTimer(this, &Document::elementDataCacheClearTimerFi red) |
476 #ifndef NDEBUG | 476 #ifndef NDEBUG |
477 , m_didDispatchViewportPropertiesChanged(false) | 477 , m_didDispatchViewportPropertiesChanged(false) |
478 #endif | 478 #endif |
479 , m_animationClock(AnimationClock::create()) | 479 , m_animationClock(AnimationClock::create()) |
480 , m_timeline(DocumentTimeline::create(this)) | 480 , m_timeline(DocumentTimeline::create(this)) |
481 , m_transitionTimeline(TransitionTimeline::create(this)) | 481 , m_transitionTimeline(TransitionTimeline::create(this)) |
482 , m_templateDocumentHost(0) | 482 , m_templateDocumentHost(nullptr) |
483 , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsT imerFired) | 483 , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsT imerFired) |
484 , m_hasViewportUnits(false) | 484 , m_hasViewportUnits(false) |
485 , m_styleRecalcElementCounter(0) | 485 , m_styleRecalcElementCounter(0) |
486 { | 486 { |
487 setClient(this); | 487 setClient(this); |
488 ScriptWrappable::init(this); | 488 ScriptWrappable::init(this); |
489 | 489 |
490 if (m_frame) { | 490 if (m_frame) { |
491 ASSERT(m_frame->page()); | 491 ASSERT(m_frame->page()); |
492 provideContextFeaturesToDocumentFrom(*this, *m_frame->page()); | 492 provideContextFeaturesToDocumentFrom(*this, *m_frame->page()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
527 ASSERT(!renderView()); | 527 ASSERT(!renderView()); |
528 ASSERT(m_ranges.isEmpty()); | 528 ASSERT(m_ranges.isEmpty()); |
529 ASSERT(!parentTreeScope()); | 529 ASSERT(!parentTreeScope()); |
530 #if !ENABLE(OILPAN) | 530 #if !ENABLE(OILPAN) |
531 ASSERT(!hasGuardRefCount()); | 531 ASSERT(!hasGuardRefCount()); |
532 // With Oilpan, either the document outlives the visibility observers | 532 // With Oilpan, either the document outlives the visibility observers |
533 // or the visibility observers and the document die in the same GC round. | 533 // or the visibility observers and the document die in the same GC round. |
534 // When they die in the same GC round, the list of visibility observers | 534 // When they die in the same GC round, the list of visibility observers |
535 // will not be empty on Document destruction. | 535 // will not be empty on Document destruction. |
536 ASSERT(m_visibilityObservers.isEmpty()); | 536 ASSERT(m_visibilityObservers.isEmpty()); |
537 #endif | |
538 | 537 |
539 if (m_templateDocument) | 538 if (m_templateDocument) |
540 m_templateDocument->m_templateDocumentHost = 0; // balanced in ensureTem plateDocument(). | 539 m_templateDocument->m_templateDocumentHost = nullptr; // balanced in ens ureTemplateDocument(). |
540 #endif | |
541 | 541 |
542 m_scriptRunner.clear(); | 542 m_scriptRunner.clear(); |
543 | 543 |
544 // FIXME: Oilpan: Not removing event listeners here also means that we do | |
545 // not notify the inspector instrumentation that the event listeners are | |
546 // gone. The Document and all the nodes in the document are gone, so maybe | |
547 // that is OK? | |
548 #if !ENABLE(OILPAN) | |
544 removeAllEventListenersRecursively(); | 549 removeAllEventListenersRecursively(); |
550 #endif | |
545 | 551 |
546 // Currently we believe that Document can never outlive the parser. | 552 // Currently we believe that Document can never outlive the parser. |
547 // Although the Document may be replaced synchronously, DocumentParsers | 553 // Although the Document may be replaced synchronously, DocumentParsers |
548 // generally keep at least one reference to an Element which would in turn | 554 // generally keep at least one reference to an Element which would in turn |
549 // has a reference to the Document. If you hit this ASSERT, then that | 555 // has a reference to the Document. If you hit this ASSERT, then that |
550 // assumption is wrong. DocumentParser::detach() should ensure that even | 556 // assumption is wrong. DocumentParser::detach() should ensure that even |
551 // if the DocumentParser outlives the Document it won't cause badness. | 557 // if the DocumentParser outlives the Document it won't cause badness. |
552 ASSERT(!m_parser || m_parser->refCount() == 1); | 558 ASSERT(!m_parser || m_parser->refCount() == 1); |
553 detachParser(); | 559 detachParser(); |
554 | 560 |
555 if (this == topDocument()) | 561 if (this == topDocument()) |
556 clearAXObjectCache(); | 562 clearAXObjectCache(); |
557 | 563 |
558 #if !ENABLE(OILPAN) | 564 #if !ENABLE(OILPAN) |
559 if (m_styleSheetList) | 565 if (m_styleSheetList) |
560 m_styleSheetList->detachFromDocument(); | 566 m_styleSheetList->detachFromDocument(); |
561 #endif | 567 #endif |
562 | 568 |
563 if (m_importsController) { | 569 if (m_importsController) { |
564 m_importsController->wasDetachedFrom(*this); | 570 m_importsController->wasDetachedFrom(*this); |
565 m_importsController = 0; | 571 m_importsController = 0; |
566 } | 572 } |
567 | 573 |
568 m_timeline->detachFromDocument(); | 574 m_timeline->detachFromDocument(); |
569 m_transitionTimeline->detachFromDocument(); | 575 m_transitionTimeline->detachFromDocument(); |
570 | 576 |
577 #if !ENABLE(OILPAN) | |
571 // We need to destroy CSSFontSelector before destroying m_fetcher. | 578 // We need to destroy CSSFontSelector before destroying m_fetcher. |
572 if (m_styleEngine) | 579 if (m_styleEngine) |
573 m_styleEngine->detachFromDocument(); | 580 m_styleEngine->detachFromDocument(); |
574 | 581 |
575 #if !ENABLE(OILPAN) | |
576 if (m_elemSheet) | 582 if (m_elemSheet) |
577 m_elemSheet->clearOwnerNode(); | 583 m_elemSheet->clearOwnerNode(); |
578 #endif | 584 #endif |
579 | 585 |
580 // It's possible for multiple Documents to end up referencing the same Resou rceFetcher (e.g., SVGImages | 586 // It's possible for multiple Documents to end up referencing the same Resou rceFetcher (e.g., SVGImages |
581 // load the initial empty document and the SVGDocument with the same Documen tLoader). | 587 // load the initial empty document and the SVGDocument with the same Documen tLoader). |
582 if (m_fetcher->document() == this) | 588 if (m_fetcher->document() == this) |
583 m_fetcher->setDocument(0); | 589 m_fetcher->setDocument(0); |
584 m_fetcher.clear(); | 590 m_fetcher.clear(); |
585 | 591 |
586 // We must call clearRareData() here since a Document class inherits TreeSco pe | 592 // We must call clearRareData() here since a Document class inherits TreeSco pe |
587 // as well as Node. See a comment on TreeScope.h for the reason. | 593 // as well as Node. See a comment on TreeScope.h for the reason. |
588 if (hasRareData()) | 594 if (hasRareData()) |
589 clearRareData(); | 595 clearRareData(); |
590 | 596 |
591 ASSERT(!m_listsInvalidatedAtDocument.size()); | 597 ASSERT(!m_listsInvalidatedAtDocument.size()); |
592 | 598 |
593 for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++) | 599 for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++) |
594 ASSERT(!m_nodeListCounts[i]); | 600 ASSERT(!m_nodeListCounts[i]); |
595 | 601 |
596 setClient(0); | 602 setClient(0); |
597 | 603 |
598 InspectorCounters::decrementCounter(InspectorCounters::DocumentCounter); | 604 InspectorCounters::decrementCounter(InspectorCounters::DocumentCounter); |
599 } | 605 } |
600 | 606 |
601 void Document::dispose() | 607 void Document::dispose() |
602 { | 608 { |
609 #if !ENABLE(OILPAN) | |
603 ASSERT_WITH_SECURITY_IMPLICATION(!m_deletionHasBegun); | 610 ASSERT_WITH_SECURITY_IMPLICATION(!m_deletionHasBegun); |
611 | |
604 // We must make sure not to be retaining any of our children through | 612 // We must make sure not to be retaining any of our children through |
605 // these extra pointers or we will create a reference cycle. | 613 // these extra pointers or we will create a reference cycle. |
606 m_docType = nullptr; | 614 m_docType = nullptr; |
607 m_focusedElement = nullptr; | 615 m_focusedElement = nullptr; |
608 m_hoverNode = nullptr; | 616 m_hoverNode = nullptr; |
609 m_activeHoverElement = nullptr; | 617 m_activeHoverElement = nullptr; |
610 m_titleElement = nullptr; | 618 m_titleElement = nullptr; |
611 m_documentElement = nullptr; | 619 m_documentElement = nullptr; |
612 m_contextFeatures = ContextFeatures::defaultSwitch(); | 620 m_contextFeatures = ContextFeatures::defaultSwitch(); |
613 m_userActionElements.documentDidRemoveLastRef(); | 621 m_userActionElements.documentDidRemoveLastRef(); |
614 m_associatedFormControls.clear(); | 622 m_associatedFormControls.clear(); |
623 #endif | |
615 | 624 |
616 detachParser(); | 625 detachParser(); |
617 | 626 |
618 m_registrationContext.clear(); | 627 m_registrationContext.clear(); |
619 | 628 |
620 if (m_importsController) { | 629 if (m_importsController) { |
621 m_importsController->wasDetachedFrom(*this); | 630 m_importsController->wasDetachedFrom(*this); |
622 m_importsController = 0; | 631 m_importsController = 0; |
623 } | 632 } |
624 | 633 |
634 #if !ENABLE(OILPAN) | |
625 // removeDetachedChildren() doesn't always unregister IDs, | 635 // removeDetachedChildren() doesn't always unregister IDs, |
626 // so tear down scope information upfront to avoid having stale references i n the map. | 636 // so tear down scope information upfront to avoid having stale references i n the map. |
627 destroyTreeScopeData(); | 637 destroyTreeScopeData(); |
638 | |
628 removeDetachedChildren(); | 639 removeDetachedChildren(); |
640 #endif | |
641 | |
629 // removeDetachedChildren() can access FormController. | 642 // removeDetachedChildren() can access FormController. |
630 m_formController.clear(); | 643 m_formController.clear(); |
631 | 644 |
645 #if !ENABLE(OILPAN) | |
632 m_markers->clear(); | 646 m_markers->clear(); |
633 | 647 |
634 m_cssCanvasElements.clear(); | 648 m_cssCanvasElements.clear(); |
649 #endif | |
635 | 650 |
636 // FIXME: consider using ActiveDOMObject. | 651 // FIXME: consider using ActiveDOMObject. |
637 if (m_scriptedAnimationController) | 652 if (m_scriptedAnimationController) |
638 m_scriptedAnimationController->clearDocumentPointer(); | 653 m_scriptedAnimationController->clearDocumentPointer(); |
639 m_scriptedAnimationController.clear(); | 654 m_scriptedAnimationController.clear(); |
640 | 655 |
641 if (svgExtensions()) | 656 if (svgExtensions()) |
642 accessSVGExtensions().pauseAnimations(); | 657 accessSVGExtensions().pauseAnimations(); |
643 | 658 |
644 m_lifecycle.advanceTo(DocumentLifecycle::Disposed); | 659 m_lifecycle.advanceTo(DocumentLifecycle::Disposed); |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1355 | 1370 |
1356 void Document::setTitle(const String& title) | 1371 void Document::setTitle(const String& title) |
1357 { | 1372 { |
1358 // Title set by JavaScript -- overrides any title elements. | 1373 // Title set by JavaScript -- overrides any title elements. |
1359 m_titleSetExplicitly = true; | 1374 m_titleSetExplicitly = true; |
1360 if (!isHTMLDocument() && !isXHTMLDocument()) | 1375 if (!isHTMLDocument() && !isXHTMLDocument()) |
1361 m_titleElement = nullptr; | 1376 m_titleElement = nullptr; |
1362 else if (!m_titleElement) { | 1377 else if (!m_titleElement) { |
1363 if (HTMLElement* headElement = head()) { | 1378 if (HTMLElement* headElement = head()) { |
1364 m_titleElement = HTMLTitleElement::create(*this); | 1379 m_titleElement = HTMLTitleElement::create(*this); |
1365 headElement->appendChild(m_titleElement); | 1380 headElement->appendChild(m_titleElement.get()); |
1366 } | 1381 } |
1367 } | 1382 } |
1368 | 1383 |
1369 if (isHTMLTitleElement(m_titleElement)) | 1384 if (isHTMLTitleElement(m_titleElement)) |
1370 toHTMLTitleElement(m_titleElement)->setText(title); | 1385 toHTMLTitleElement(m_titleElement)->setText(title); |
1371 else | 1386 else |
1372 updateTitle(title); | 1387 updateTitle(title); |
1373 } | 1388 } |
1374 | 1389 |
1375 void Document::setTitleElement(const String& title, Element* titleElement) | 1390 void Document::setTitleElement(const String& title, Element* titleElement) |
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2225 // possible to re-attach. Eventually Document::detach() should be renamed, | 2240 // possible to re-attach. Eventually Document::detach() should be renamed, |
2226 // or this setting of the frame to 0 could be made explicit in each of the | 2241 // or this setting of the frame to 0 could be made explicit in each of the |
2227 // callers of Document::detach(). | 2242 // callers of Document::detach(). |
2228 m_frame = 0; | 2243 m_frame = 0; |
2229 | 2244 |
2230 if (m_mediaQueryMatcher) | 2245 if (m_mediaQueryMatcher) |
2231 m_mediaQueryMatcher->documentDestroyed(); | 2246 m_mediaQueryMatcher->documentDestroyed(); |
2232 | 2247 |
2233 lifecycleNotifier().notifyDocumentWasDetached(); | 2248 lifecycleNotifier().notifyDocumentWasDetached(); |
2234 m_lifecycle.advanceTo(DocumentLifecycle::Stopped); | 2249 m_lifecycle.advanceTo(DocumentLifecycle::Stopped); |
2250 #if ENABLE(OILPAN) | |
2251 dispose(); | |
haraken
2014/05/06 15:59:42
I do agree with you that Document::dispose() shoul
Mads Ager (chromium)
2014/05/07 12:13:16
Yes, done.
| |
2252 #endif | |
2235 } | 2253 } |
2236 | 2254 |
2237 void Document::prepareForDestruction() | 2255 void Document::prepareForDestruction() |
2238 { | 2256 { |
2239 m_markers->prepareForDestruction(); | 2257 m_markers->prepareForDestruction(); |
2240 disconnectDescendantFrames(); | 2258 disconnectDescendantFrames(); |
2241 | 2259 |
2242 // The process of disconnecting descendant frames could have already detache d us. | 2260 // The process of disconnecting descendant frames could have already detache d us. |
2243 if (!isActive()) | 2261 if (!isActive()) |
2244 return; | 2262 return; |
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3527 if (newFocusedElement && (newFocusedElement->document() != this)) | 3545 if (newFocusedElement && (newFocusedElement->document() != this)) |
3528 return true; | 3546 return true; |
3529 | 3547 |
3530 if (NodeChildRemovalTracker::isBeingRemoved(newFocusedElement.get())) | 3548 if (NodeChildRemovalTracker::isBeingRemoved(newFocusedElement.get())) |
3531 return true; | 3549 return true; |
3532 | 3550 |
3533 if (m_focusedElement == newFocusedElement) | 3551 if (m_focusedElement == newFocusedElement) |
3534 return true; | 3552 return true; |
3535 | 3553 |
3536 bool focusChangeBlocked = false; | 3554 bool focusChangeBlocked = false; |
3537 RefPtr<Element> oldFocusedElement = m_focusedElement; | 3555 RefPtrWillBeRawPtr<Element> oldFocusedElement = m_focusedElement; |
3538 m_focusedElement = nullptr; | 3556 m_focusedElement = nullptr; |
3539 | 3557 |
3540 // Remove focus from the existing focus node (if any) | 3558 // Remove focus from the existing focus node (if any) |
3541 if (oldFocusedElement) { | 3559 if (oldFocusedElement) { |
3542 ASSERT(!oldFocusedElement->inDetach()); | 3560 ASSERT(!oldFocusedElement->inDetach()); |
3543 | 3561 |
3544 if (oldFocusedElement->active()) | 3562 if (oldFocusedElement->active()) |
3545 oldFocusedElement->setActive(false); | 3563 oldFocusedElement->setActive(false); |
3546 | 3564 |
3547 oldFocusedElement->setFocus(false); | 3565 oldFocusedElement->setFocus(false); |
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4868 is2d = true; | 4886 is2d = true; |
4869 context2d = toCanvasRenderingContext2D(context); | 4887 context2d = toCanvasRenderingContext2D(context); |
4870 } else if (context->is3d()) { | 4888 } else if (context->is3d()) { |
4871 is3d = true; | 4889 is3d = true; |
4872 context3d = toWebGLRenderingContext(context); | 4890 context3d = toWebGLRenderingContext(context); |
4873 } | 4891 } |
4874 } | 4892 } |
4875 | 4893 |
4876 HTMLCanvasElement& Document::getCSSCanvasElement(const String& name) | 4894 HTMLCanvasElement& Document::getCSSCanvasElement(const String& name) |
4877 { | 4895 { |
4878 RefPtr<HTMLCanvasElement>& element = m_cssCanvasElements.add(name, nullptr). storedValue->value; | 4896 RefPtrWillBeMember<HTMLCanvasElement>& element = m_cssCanvasElements.add(nam e, nullptr).storedValue->value; |
4879 if (!element) { | 4897 if (!element) { |
4880 element = HTMLCanvasElement::create(*this); | 4898 element = HTMLCanvasElement::create(*this); |
4881 element->setAccelerationDisabled(true); | 4899 element->setAccelerationDisabled(true); |
4882 } | 4900 } |
4883 return *element; | 4901 return *element; |
4884 } | 4902 } |
4885 | 4903 |
4886 void Document::initDNSPrefetch() | 4904 void Document::initDNSPrefetch() |
4887 { | 4905 { |
4888 Settings* settings = this->settings(); | 4906 Settings* settings = this->settings(); |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5653 if (!visitor->isAlive(it->key)) | 5671 if (!visitor->isAlive(it->key)) |
5654 deadNodes.append(it->key); | 5672 deadNodes.append(it->key); |
5655 } | 5673 } |
5656 for (unsigned i = 0; i < deadNodes.size(); ++i) | 5674 for (unsigned i = 0; i < deadNodes.size(); ++i) |
5657 didClearTouchEventHandlers(deadNodes[i]); | 5675 didClearTouchEventHandlers(deadNodes[i]); |
5658 } | 5676 } |
5659 } | 5677 } |
5660 | 5678 |
5661 void Document::trace(Visitor* visitor) | 5679 void Document::trace(Visitor* visitor) |
5662 { | 5680 { |
5681 visitor->trace(m_docType); | |
5682 visitor->trace(m_autofocusElement); | |
5683 visitor->trace(m_focusedElement); | |
5684 visitor->trace(m_hoverNode); | |
5685 visitor->trace(m_activeHoverElement); | |
5686 visitor->trace(m_documentElement); | |
5687 visitor->trace(m_titleElement); | |
5688 visitor->trace(m_currentScriptStack); | |
5689 visitor->trace(m_transformSourceDocument); | |
5690 visitor->trace(m_cssCanvasElements); | |
5691 visitor->trace(m_topLayerElements); | |
5692 visitor->trace(m_elemSheet); | |
5693 visitor->trace(m_styleEngine); | |
5663 visitor->trace(m_styleSheetList); | 5694 visitor->trace(m_styleSheetList); |
5664 visitor->trace(m_mediaQueryMatcher); | 5695 visitor->trace(m_mediaQueryMatcher); |
5696 visitor->trace(m_associatedFormControls); | |
5697 visitor->trace(m_templateDocument); | |
5698 visitor->trace(m_templateDocumentHost); | |
5665 visitor->trace(m_visibilityObservers); | 5699 visitor->trace(m_visibilityObservers); |
5666 visitor->trace(m_contextFeatures); | 5700 visitor->trace(m_contextFeatures); |
5701 visitor->trace(m_userActionElements); | |
5667 visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this); | 5702 visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this); |
5668 DocumentSupplementable::trace(visitor); | 5703 DocumentSupplementable::trace(visitor); |
5669 TreeScope::trace(visitor); | 5704 TreeScope::trace(visitor); |
5670 ContainerNode::trace(visitor); | 5705 ContainerNode::trace(visitor); |
5671 ExecutionContext::trace(visitor); | 5706 ExecutionContext::trace(visitor); |
5672 } | 5707 } |
5673 | 5708 |
5674 } // namespace WebCore | 5709 } // namespace WebCore |
OLD | NEW |