13c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch/* 23c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved. 33c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * 43c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Redistribution and use in source and binary forms, with or without 53c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * modification, are permitted provided that the following conditions are 63c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * met: 73c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * 83c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * * Redistributions of source code must retain the above copyright 93c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * notice, this list of conditions and the following disclaimer. 103c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * * Redistributions in binary form must reproduce the above 113c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 123c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * in the documentation and/or other materials provided with the 133c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * distribution. 143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * * Neither the name of Google Inc. nor the names of its 153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * contributors may be used to endorse or promote products derived from 163c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * this software without specific prior written permission. 173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * 183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 233c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 243c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 253c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 263c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch */ 303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#ifndef HTMLImportLoader_h 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#define HTMLImportLoader_h 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/DocumentParserClient.h" 3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/fetch/RawResource.h" 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/fetch/ResourceOwner.h" 37d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/heap/Handle.h" 3810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "wtf/OwnPtr.h" 3910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "wtf/PassOwnPtr.h" 403c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/Vector.h" 413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 433c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 4476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)class CustomElementSyncMicrotaskQueue; 45a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class Document; 463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochclass DocumentWriter; 4707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass HTMLImportChild; 486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass HTMLImportsController; 49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 5010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 51a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Owning imported Document lifetime. It also implements ResourceClient through ResourceOwner 53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// to feed fetched bytes to the DocumentWriter of the imported document. 54f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// HTMLImportLoader is owned by HTMLImportsController. 55a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// 56a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass HTMLImportLoader FINAL : public NoBaseWillBeGarbageCollectedFinalized<HTMLImportLoader>, public ResourceOwner<RawResource>, public DocumentParserClient { 583c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochpublic: 593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch enum State { 603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch StateLoading, 613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch StateWritten, 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) StateParsed, 63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) StateLoaded, 64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) StateError 653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch }; 663c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) static PassOwnPtrWillBeRawPtr<HTMLImportLoader> create(HTMLImportsController* controller) 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return adoptPtrWillBeNoop(new HTMLImportLoader(controller)); 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual ~HTMLImportLoader(); 733c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 74f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Document* document() const { return m_document.get(); } 7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch void addImport(HTMLImportChild*); 76f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if !ENABLE(OILPAN) 7707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch void removeImport(HTMLImportChild*); 78f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif 79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void moveToFirst(HTMLImportChild*); 806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch HTMLImportChild* firstImport() const { return m_imports[0]; } 81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool isFirstImport(const HTMLImportChild* child) const { return m_imports.size() ? firstImport() == child : false; } 823c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool isDone() const { return m_state == StateLoaded || m_state == StateError; } 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool hasError() const { return m_state == StateError; } 8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch bool shouldBlockScriptExecution() const; 863c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 87f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if !ENABLE(OILPAN) 886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void importDestroyed(); 89f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif 90a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) void startLoading(const ResourcePtr<RawResource>&); 91f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Tells the loader that all of the import's stylesheets finished 93f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // loading. 94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Called by Document::didRemoveAllPendingStylesheet. 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void didRemoveAllPendingStylesheet(); 9610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 9776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) PassRefPtrWillBeRawPtr<CustomElementSyncMicrotaskQueue> microtaskQueue() const; 983c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) virtual void trace(Visitor*); 100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 1013c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochprivate: 1026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch HTMLImportLoader(HTMLImportsController*); 1033c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 1043c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // RawResourceClient 1053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch virtual void responseReceived(Resource*, const ResourceResponse&) OVERRIDE; 1063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch virtual void dataReceived(Resource*, const char* data, int length) OVERRIDE; 1073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch virtual void notifyFinished(Resource*) OVERRIDE; 1083c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // DocumentParserClient 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Called after document parse is complete after DOMContentLoaded was dispatched. 1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual void notifyParserStopped(); 1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch State startWritingAndParsing(const ResourceResponse&); 1153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch State finishWriting(); 1163c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch State finishParsing(); 117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) State finishLoading(); 1183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 1193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch void setState(State); 120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void didFinishLoading(); 121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool hasPendingResources() const; 122f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if !ENABLE(OILPAN) 1236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void clear(); 124f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif 1253c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RawPtrWillBeMember<HTMLImportsController> m_controller; 127f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<HTMLImportChild> > m_imports; 1283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch State m_state; 129f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeMember<Document> m_document; 130f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeMember<DocumentWriter> m_writer; 13176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) RefPtrWillBeMember<CustomElementSyncMicrotaskQueue> m_microtaskQueue; 1323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch}; 1333c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif // HTMLImportLoader_h 137