18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ScriptElement_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ScriptElement_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceHandle.h"
2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/text/TextPosition.h>
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CachedScript;
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Element;
326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass ScriptElement;
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass ScriptSourceCode;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass ScriptElement : private CachedResourceClient {
36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_FAST_ALLOCATED;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ScriptElement(Element*, bool createdByParser, bool isEvaluated);
396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual ~ScriptElement();
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Element* element() const { return m_element; }
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    enum LegacyTypeSupport { DisallowLegacyTypeInTypeAttribute, AllowLegacyTypeInTypeAttribute };
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool prepareScript(const TextPosition1& scriptStartPosition = TextPosition1::minimumPosition(), LegacyTypeSupport = DisallowLegacyTypeInTypeAttribute);
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String scriptCharset() const { return m_characterEncoding; }
476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    String scriptContent() const;
486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void executeScript(const ScriptSourceCode&);
496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void execute(CachedScript*);
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // XML parser calls these
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void dispatchLoadEvent() = 0;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void dispatchErrorEvent() = 0;
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool isScriptTypeSupported(LegacyTypeSupport) const;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool haveFiredLoadEvent() const { return m_haveFiredLoad; }
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool willBeParserExecuted() const { return m_willBeParserExecuted; }
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool readyToBeParserExecuted() const { return m_readyToBeParserExecuted; }
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool willExecuteWhenDocumentFinishedParsing() const { return m_willExecuteWhenDocumentFinishedParsing; }
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CachedResourceHandle<CachedScript> cachedScript() { return m_cachedScript; }
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setHaveFiredLoadEvent(bool haveFiredLoad) { m_haveFiredLoad = haveFiredLoad; }
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool isParserInserted() const { return m_parserInserted; }
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool alreadyStarted() const { return m_alreadyStarted; }
662bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool forceAsync() const { return m_forceAsync; }
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Helper functions used by our parent classes.
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void insertedIntoDocument();
706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void removedFromDocument();
716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void childrenChanged();
726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void handleSourceAttribute(const String& sourceUrl);
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    void handleAsyncAttribute();
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerprivate:
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ignoresLoadRequest() const;
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool isScriptForEventSupported() const;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool requestScript(const String& sourceUrl);
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void stopLoadRequest();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void notifyFinished(CachedResource*);
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual String sourceAttributeValue() const = 0;
856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual String charsetAttributeValue() const = 0;
866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual String typeAttributeValue() const = 0;
876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual String languageAttributeValue() const = 0;
886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual String forAttributeValue() const = 0;
896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual String eventAttributeValue() const = 0;
906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual bool asyncAttributeValue() const = 0;
916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual bool deferAttributeValue() const = 0;
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual bool hasSourceAttribute() const = 0;
936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* m_element;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedResourceHandle<CachedScript> m_cachedScript;
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_parserInserted : 1;
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_isExternalScript : 1;
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_alreadyStarted : 1;
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_haveFiredLoad : 1;
10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_willBeParserExecuted : 1; // Same as "The parser will handle executing the script."
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_readyToBeParserExecuted : 1;
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_willExecuteWhenDocumentFinishedParsing : 1;
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_forceAsync : 1;
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_willExecuteInOrder : 1;
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String m_characterEncoding;
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String m_fallbackCharacterEncoding;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectScriptElement* toScriptElement(Element*);
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
114