Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2008 Nikolas Zimmermann <zimmermann (at) kde.org>
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Library General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Library General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Library General Public License
     15  * along with this library; see the file COPYING.LIB.  If not, write to
     16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  * Boston, MA 02110-1301, USA.
     18  *
     19  */
     20 
     21 #ifndef ScriptLoader_h
     22 #define ScriptLoader_h
     23 
     24 #include "core/fetch/FetchRequest.h"
     25 #include "core/fetch/ResourceClient.h"
     26 #include "core/fetch/ResourcePtr.h"
     27 #include "core/fetch/ScriptResource.h"
     28 #include "wtf/text/TextPosition.h"
     29 #include "wtf/text/WTFString.h"
     30 
     31 namespace blink {
     32 
     33 class Element;
     34 class ScriptLoaderClient;
     35 class ScriptSourceCode;
     36 
     37 
     38 class ScriptLoader FINAL : private ScriptResourceClient {
     39 public:
     40     static PassOwnPtr<ScriptLoader> create(Element*, bool createdByParser, bool isEvaluated);
     41     virtual ~ScriptLoader();
     42 
     43     Element* element() const { return m_element; }
     44 
     45     enum LegacyTypeSupport { DisallowLegacyTypeInTypeAttribute, AllowLegacyTypeInTypeAttribute };
     46     bool prepareScript(const TextPosition& scriptStartPosition = TextPosition::minimumPosition(), LegacyTypeSupport = DisallowLegacyTypeInTypeAttribute);
     47 
     48     String scriptCharset() const { return m_characterEncoding; }
     49     String scriptContent() const;
     50     void executeScript(const ScriptSourceCode&, double* compilationFinishTime = 0);
     51     void execute(ScriptResource*);
     52 
     53     // XML parser calls these
     54     void dispatchLoadEvent();
     55     void dispatchErrorEvent();
     56     bool isScriptTypeSupported(LegacyTypeSupport) const;
     57 
     58     bool haveFiredLoadEvent() const { return m_haveFiredLoad; }
     59     bool willBeParserExecuted() const { return m_willBeParserExecuted; }
     60     bool readyToBeParserExecuted() const { return m_readyToBeParserExecuted; }
     61     bool willExecuteWhenDocumentFinishedParsing() const { return m_willExecuteWhenDocumentFinishedParsing; }
     62     ResourcePtr<ScriptResource> resource() { return m_resource; }
     63 
     64     void setHaveFiredLoadEvent(bool haveFiredLoad) { m_haveFiredLoad = haveFiredLoad; }
     65     bool isParserInserted() const { return m_parserInserted; }
     66     bool alreadyStarted() const { return m_alreadyStarted; }
     67     bool forceAsync() const { return m_forceAsync; }
     68 
     69     // Helper functions used by our parent classes.
     70     void didNotifySubtreeInsertionsToDocument();
     71     void childrenChanged();
     72     void handleSourceAttribute(const String& sourceUrl);
     73     void handleAsyncAttribute();
     74 
     75 private:
     76     ScriptLoader(Element*, bool createdByParser, bool isEvaluated);
     77 
     78     bool ignoresLoadRequest() const;
     79     bool isScriptForEventSupported() const;
     80 
     81     bool fetchScript(const String& sourceUrl, FetchRequest::DeferOption);
     82     void stopLoadRequest();
     83 
     84     ScriptLoaderClient* client() const;
     85 
     86     // ResourceClient
     87     virtual void notifyFinished(Resource*) OVERRIDE;
     88 
     89     // FIXME: Oilpan: This should become a Member once ResourceClient is moved to the heap.
     90     Element* m_element;
     91     ResourcePtr<ScriptResource> m_resource;
     92     WTF::OrdinalNumber m_startLineNumber;
     93     bool m_parserInserted : 1;
     94     bool m_isExternalScript : 1;
     95     bool m_alreadyStarted : 1;
     96     bool m_haveFiredLoad : 1;
     97     bool m_willBeParserExecuted : 1; // Same as "The parser will handle executing the script."
     98     bool m_readyToBeParserExecuted : 1;
     99     bool m_willExecuteWhenDocumentFinishedParsing : 1;
    100     bool m_forceAsync : 1;
    101     bool m_willExecuteInOrder : 1;
    102     String m_characterEncoding;
    103     String m_fallbackCharacterEncoding;
    104 };
    105 
    106 ScriptLoader* toScriptLoaderIfPossible(Element*);
    107 
    108 inline PassOwnPtr<ScriptLoader> ScriptLoader::create(Element* element, bool createdByParser, bool isEvaluated)
    109 {
    110     return adoptPtr(new ScriptLoader(element, createdByParser, isEvaluated));
    111 }
    112 
    113 }
    114 
    115 
    116 #endif
    117