1/*
2 * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2009, 2011 Google Inc. All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 */
27
28#ifndef WorkerScriptLoader_h
29#define WorkerScriptLoader_h
30
31#if ENABLE(WORKERS)
32
33#include "KURL.h"
34#include "ResourceRequest.h"
35#include "ThreadableLoader.h"
36#include "ThreadableLoaderClient.h"
37
38#include <wtf/FastAllocBase.h>
39#include <wtf/PassRefPtr.h>
40#include <wtf/RefCounted.h>
41#include <wtf/text/StringBuilder.h>
42
43namespace WebCore {
44
45    class ResourceRequest;
46    class ResourceResponse;
47    class ScriptExecutionContext;
48    class TextResourceDecoder;
49    class WorkerScriptLoaderClient;
50
51    class WorkerScriptLoader : public RefCounted<WorkerScriptLoader>, public ThreadableLoaderClient {
52        WTF_MAKE_FAST_ALLOCATED;
53    public:
54        static PassRefPtr<WorkerScriptLoader> create()
55        {
56            return adoptRef(new WorkerScriptLoader());
57        }
58
59        void loadSynchronously(ScriptExecutionContext*, const KURL&, CrossOriginRequestPolicy);
60        void loadAsynchronously(ScriptExecutionContext*, const KURL&, CrossOriginRequestPolicy, WorkerScriptLoaderClient*);
61
62        void notifyError();
63
64        String script();
65        const KURL& url() const { return m_url; }
66        const KURL& responseURL() const;
67        bool failed() const { return m_failed; }
68        unsigned long identifier() const { return m_identifier; }
69
70        virtual void didReceiveResponse(unsigned long /*identifier*/, const ResourceResponse&) OVERRIDE;
71        virtual void didReceiveData(const char* data, int dataLength) OVERRIDE;
72        virtual void didFinishLoading(unsigned long identifier, double) OVERRIDE;
73        virtual void didFail(const ResourceError&) OVERRIDE;
74        virtual void didFailRedirectCheck() OVERRIDE;
75
76#if PLATFORM(BLACKBERRY)
77        void setTargetType(ResourceRequest::TargetType targetType) { m_targetType = targetType; }
78#endif
79
80    private:
81        friend class WTF::RefCounted<WorkerScriptLoader>;
82
83        WorkerScriptLoader();
84        ~WorkerScriptLoader();
85
86        PassOwnPtr<ResourceRequest> createResourceRequest();
87        void notifyFinished();
88
89        WorkerScriptLoaderClient* m_client;
90        RefPtr<ThreadableLoader> m_threadableLoader;
91        String m_responseEncoding;
92        RefPtr<TextResourceDecoder> m_decoder;
93        StringBuilder m_script;
94        KURL m_url;
95        KURL m_responseURL;
96        bool m_failed;
97        unsigned long m_identifier;
98        bool m_finishing;
99#if PLATFORM(BLACKBERRY)
100        ResourceRequest::TargetType m_targetType;
101#endif
102    };
103
104} // namespace WebCore
105
106#endif // ENABLE(WORKERS)
107
108#endif // WorkerScriptLoader_h
109