1f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// found in the LICENSE file.
4f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "config.h"
6f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/html/imports/HTMLImportTreeRoot.h"
7f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
8f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/dom/Document.h"
9f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/dom/StyleEngine.h"
10f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/frame/LocalFrame.h"
11f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/html/imports/HTMLImportChild.h"
12f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
14f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
15f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)PassOwnPtrWillBeRawPtr<HTMLImportTreeRoot> HTMLImportTreeRoot::create(Document* document)
16f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
17f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return adoptPtrWillBeNoop(new HTMLImportTreeRoot(document));
18f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
19f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
20f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)HTMLImportTreeRoot::HTMLImportTreeRoot(Document* document)
21f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    : HTMLImport(HTMLImport::Sync)
22f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    , m_document(document)
23f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    , m_recalcTimer(this, &HTMLImportTreeRoot::recalcTimerFired)
24f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    scheduleRecalcState(); // This recomputes initial state.
26f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
27f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
28f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)HTMLImportTreeRoot::~HTMLImportTreeRoot()
29f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
30f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if !ENABLE(OILPAN)
31f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    for (size_t i = 0; i < m_imports.size(); ++i)
32f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_imports[i]->importDestroyed();
33f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_imports.clear();
34f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_document = nullptr;
35f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
36f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
37f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
38f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)Document* HTMLImportTreeRoot::document() const
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
40f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return m_document;
41f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
42f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
43f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)bool HTMLImportTreeRoot::isDone() const
44f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
45f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return !m_document->parsing() && m_document->styleEngine()->haveStylesheetsLoaded();
46f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLImportTreeRoot::stateWillChange()
49f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
50f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    scheduleRecalcState();
51f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
52f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
53f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLImportTreeRoot::stateDidChange()
54f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
55f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    HTMLImport::stateDidChange();
56f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
57f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!state().isReady())
58f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return;
59f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (LocalFrame* frame = m_document->frame())
60f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        frame->loader().checkCompleted();
61f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLImportTreeRoot::scheduleRecalcState()
64f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
65f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if ENABLE(OILPAN)
66f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ASSERT(m_document);
67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (m_recalcTimer.isActive() || !m_document->isActive())
68f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return;
69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#else
70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (m_recalcTimer.isActive() || !m_document)
71f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return;
72f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
73f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_recalcTimer.startOneShot(0, FROM_HERE);
74f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
75f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
76f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)HTMLImportChild* HTMLImportTreeRoot::add(PassOwnPtrWillBeRawPtr<HTMLImportChild> child)
77f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
78f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_imports.append(child);
79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return m_imports.last().get();
80f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
81f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
82f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)HTMLImportChild* HTMLImportTreeRoot::find(const KURL& url) const
83f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
84f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    for (size_t i = 0; i < m_imports.size(); ++i) {
85f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        HTMLImportChild* candidate = m_imports[i].get();
86f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (equalIgnoringFragmentIdentifier(candidate->url(), url))
87f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            return candidate;
88f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    }
89f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
90f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return 0;
91f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
93f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLImportTreeRoot::recalcTimerFired(Timer<HTMLImportTreeRoot>*)
94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
95f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ASSERT(m_document);
96f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
97f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    do {
98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_recalcTimer.stop();
99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        HTMLImport::recalcTreeState(this);
100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    } while (m_recalcTimer.isActive());
101f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
102f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLImportTreeRoot::trace(Visitor* visitor)
104f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
105f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    visitor->trace(m_document);
106f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    visitor->trace(m_imports);
107f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    HTMLImport::trace(visitor);
108f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
109f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
110f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
111