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