1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Copyright (c) 2009, Google Inc.  All rights reserved.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Redistribution and use in source and binary forms, with or without
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * modification, are permitted provided that the following conditions are
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * met:
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *     * Redistributions of source code must retain the above copyright
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * notice, this list of conditions and the following disclaimer.
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *     * Redistributions in binary form must reproduce the above
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * copyright notice, this list of conditions and the following disclaimer
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * in the documentation and/or other materials provided with the
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * distribution.
14d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com *     * Neither the name of Google Inc. nor the names of its
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * contributors may be used to endorse or promote products derived from
16b9cf393e84a5f0e6dd6f570e4027b5d0c205f982bsalomon@google.com * this software without specific prior written permission.
17b9cf393e84a5f0e6dd6f570e4027b5d0c205f982bsalomon@google.com *
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com */
30e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
31e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com#ifndef ApplicationCacheHost_h
32e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com#define ApplicationCacheHost_h
33e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "platform/heap/Handle.h"
35e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com#include "platform/weborigin/KURL.h"
367af56bee17764a0c118c8856a035bb3d27766969humper@google.com#include "public/platform/WebApplicationCacheHostClient.h"
3761a972f11f60a84ec0faadd6c33f77e690317a98humper@google.com#include "wtf/OwnPtr.h"
387af56bee17764a0c118c8856a035bb3d27766969humper@google.com#include "wtf/Vector.h"
393d5b998bd7415d23469360425b0d5ddbf3f284ccreed@google.com
407af56bee17764a0c118c8856a035bb3d27766969humper@google.comnamespace blink {
417af56bee17764a0c118c8856a035bb3d27766969humper@google.com    class ApplicationCache;
42c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com    class DocumentLoader;
43c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com    class ResourceRequest;
44c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com    class ResourceResponse;
457af56bee17764a0c118c8856a035bb3d27766969humper@google.com
46c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com    class ApplicationCacheHost FINAL : public NoBaseWillBeGarbageCollectedFinalized<ApplicationCacheHost>, public WebApplicationCacheHostClient {
47e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        WTF_MAKE_NONCOPYABLE(ApplicationCacheHost);
48e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com    public:
497af56bee17764a0c118c8856a035bb3d27766969humper@google.com        static PassOwnPtrWillBeRawPtr<ApplicationCacheHost> create(DocumentLoader* loader)
507af56bee17764a0c118c8856a035bb3d27766969humper@google.com        {
517af56bee17764a0c118c8856a035bb3d27766969humper@google.com            return adoptPtrWillBeNoop(new ApplicationCacheHost(loader));
527af56bee17764a0c118c8856a035bb3d27766969humper@google.com        }
537af56bee17764a0c118c8856a035bb3d27766969humper@google.com        virtual ~ApplicationCacheHost();
547af56bee17764a0c118c8856a035bb3d27766969humper@google.com
557af56bee17764a0c118c8856a035bb3d27766969humper@google.com        void dispose();
567af56bee17764a0c118c8856a035bb3d27766969humper@google.com
5737ebe3fbf6c4a5728bc2c322cc0f626444f987bfrobertphillips@google.com        // The Status numeric values are specified in the HTML5 spec.
587af56bee17764a0c118c8856a035bb3d27766969humper@google.com        enum Status {
59e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com            UNCACHED = 0,
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            IDLE = 1,
617af56bee17764a0c118c8856a035bb3d27766969humper@google.com            CHECKING = 2,
627af56bee17764a0c118c8856a035bb3d27766969humper@google.com            DOWNLOADING = 3,
63d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com            UPDATEREADY = 4,
6427d302581a09d55cd8b2e64e42b23fceca66e33aepoger@google.com            OBSOLETE = 5
65d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com        };
6627d302581a09d55cd8b2e64e42b23fceca66e33aepoger@google.com
67d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com        enum EventID {
68d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com            CHECKING_EVENT = 0,
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            ERROR_EVENT,
70d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com            NOUPDATE_EVENT,
71d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org            DOWNLOADING_EVENT,
728072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            PROGRESS_EVENT,
738072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            UPDATEREADY_EVENT,
748072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            CACHED_EVENT,
75e280f1d164a7a4abba525276b7970666b1a50e0dreed@google.com            OBSOLETE_EVENT  // Must remain the last value, this is used to size arrays.
76e280f1d164a7a4abba525276b7970666b1a50e0dreed@google.com        };
77e280f1d164a7a4abba525276b7970666b1a50e0dreed@google.com
78e280f1d164a7a4abba525276b7970666b1a50e0dreed@google.com        struct CacheInfo {
798072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            CacheInfo(const KURL& manifest, double creationTime, double updateTime, long long size)
80e280f1d164a7a4abba525276b7970666b1a50e0dreed@google.com                : m_manifest(manifest)
818072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com                , m_creationTime(creationTime)
828072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com                , m_updateTime(updateTime)
838072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com                , m_size(size) { }
848072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            KURL m_manifest;
858072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            double m_creationTime;
868072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            double m_updateTime;
878072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com            long long m_size;
888072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com        };
898f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com
90677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org        struct ResourceInfo {
91677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org            ResourceInfo(const KURL& resource, bool isMaster, bool isManifest, bool isFallback, bool isForeign, bool isExplicit, long long size)
92677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org                : m_resource(resource)
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_isMaster(isMaster)
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_isManifest(isManifest)
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_isFallback(isFallback)
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_isForeign(isForeign)
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_isExplicit(isExplicit)
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                , m_size(size) { }
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            KURL m_resource;
100a56fedc47af676f53e07e20b344f58e67c8d241evandebo@chromium.org            bool m_isMaster;
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            bool m_isManifest;
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            bool m_isFallback;
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            bool m_isForeign;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            bool m_isExplicit;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            long long m_size;
1068015dd83ae37147bb630d4751030868051ad0caereed@android.com        };
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        typedef Vector<ResourceInfo> ResourceInfoList;
1094bce115b316ec0ecc17e7b24ad7b1086fa3a8796reed@google.com
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void selectCacheWithoutManifest();
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void selectCacheWithManifest(const KURL& manifestURL);
1128015dd83ae37147bb630d4751030868051ad0caereed@android.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void willStartLoadingMainResource(ResourceRequest&);
1144e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        void didReceiveResponseForMainResource(const ResourceResponse&);
1154e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        void mainResourceDataReceived(const char* data, int length);
1164e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        void finishedLoadingMainResource();
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void failedLoadingMainResource();
118e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
119e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        void willStartLoadingResource(ResourceRequest&);
120e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
121e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        Status status() const;
122e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        bool update();
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bool swapCache();
124e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        void abort();
125e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
126e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        void setApplicationCache(ApplicationCache*);
127e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        void notifyApplicationCache(EventID, int progressTotal, int progressDone, WebApplicationCacheHost::ErrorReason, const String& errorURL, int errorStatus, const String& errorMessage);
128e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void stopDeferringEvents(); // Also raises the events that have been queued up.
130c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com
131c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com        void fillResourceList(ResourceInfoList*);
132c4ae974db67977e766b66fb42e58e088c6381e29epoger@google.com        CacheInfo applicationCacheInfo();
133e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
134e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com        void trace(Visitor*);
135e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
1367af56bee17764a0c118c8856a035bb3d27766969humper@google.com    private:
1377af56bee17764a0c118c8856a035bb3d27766969humper@google.com        explicit ApplicationCacheHost(DocumentLoader*);
1387af56bee17764a0c118c8856a035bb3d27766969humper@google.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // WebApplicationCacheHostClient implementation
140b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com        virtual void didChangeCacheAssociation() OVERRIDE FINAL;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void notifyEventListener(WebApplicationCacheHost::EventID) OVERRIDE FINAL;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void notifyProgressEventListener(const WebURL&, int progressTotal, int progressDone) OVERRIDE FINAL;
143b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com        virtual void notifyErrorEventListener(WebApplicationCacheHost::ErrorReason, const WebURL&, int status, const WebString& message) OVERRIDE FINAL;
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bool isApplicationCacheEnabled();
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        DocumentLoader* documentLoader() const { return m_documentLoader; }
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        struct DeferredEvent {
149b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com            EventID eventID;
150b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com            int progressTotal;
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            int progressDone;
152b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com            WebApplicationCacheHost::ErrorReason errorReason;
1538015dd83ae37147bb630d4751030868051ad0caereed@android.com            String errorURL;
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            int errorStatus;
1554e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            String errorMessage;
1564e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            DeferredEvent(EventID id, int progressTotal, int progressDone, WebApplicationCacheHost::ErrorReason errorReason, const String& errorURL, int errorStatus, const String& errorMessage)
1574e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                : eventID(id)
1584e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , progressTotal(progressTotal)
1594e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , progressDone(progressDone)
1604e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , errorReason(errorReason)
1614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , errorURL(errorURL)
1624e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , errorStatus(errorStatus)
1634e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org                , errorMessage(errorMessage)
1644e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            {
1654e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            }
1664e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        };
1674e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
1684e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        RawPtrWillBeWeakMember<ApplicationCache> m_domApplicationCache;
169d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com        DocumentLoader* m_documentLoader;
170d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com        bool m_defersEvents; // Events are deferred until after document onload.
1714e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        Vector<DeferredEvent> m_deferredEvents;
1724e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
1734e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        void dispatchDOMEvent(EventID, int progressTotal, int progressDone, WebApplicationCacheHost::ErrorReason, const String& errorURL, int errorStatus, const String& errorMessage);
1744e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
1754e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org        OwnPtr<WebApplicationCacheHost> m_host;
1764e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org    };
1774e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
1784e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org}  // namespace blink
1794e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
180d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com#endif  // ApplicationCacheHost_h
181d88a3d83364d2158a6fad9cb295012fac0e07ea3epoger@google.com