/*
 * Copyright (C) 2014 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef ServiceWorkerGlobalScopeClient_h
#define ServiceWorkerGlobalScopeClient_h

#include "core/dom/MessagePort.h"
#include "core/workers/WorkerClients.h"
#include "public/platform/WebCallbacks.h"
#include "public/platform/WebMessagePortChannel.h"
#include "public/platform/WebServiceWorkerClientsInfo.h"
#include "public/platform/WebServiceWorkerEventResult.h"
#include "wtf/Forward.h"
#include "wtf/Noncopyable.h"

namespace blink {

class ExecutionContext;
class WebServiceWorkerCacheStorage;
class WebServiceWorkerResponse;
class WebURL;
class WorkerClients;

class ServiceWorkerGlobalScopeClient : public WillBeHeapSupplement<WorkerClients> {
    WTF_MAKE_NONCOPYABLE(ServiceWorkerGlobalScopeClient);
public:
    virtual ~ServiceWorkerGlobalScopeClient() { }

    virtual void getClients(WebServiceWorkerClientsCallbacks*) = 0;
    virtual WebURL scope() const = 0;
    virtual WebServiceWorkerCacheStorage* cacheStorage() const = 0;

    virtual void didHandleActivateEvent(int eventID, WebServiceWorkerEventResult) = 0;
    virtual void didHandleInstallEvent(int installEventID, WebServiceWorkerEventResult) = 0;
    // Calling didHandleFetchEvent without response means no response was
    // provided by the service worker in the fetch events, so fallback to native.
    virtual void didHandleFetchEvent(int fetchEventID) = 0;
    virtual void didHandleFetchEvent(int fetchEventID, const WebServiceWorkerResponse&) = 0;
    virtual void didHandleSyncEvent(int syncEventID) = 0;
    virtual void postMessageToClient(int clientID, const WebString& message, PassOwnPtr<WebMessagePortChannelArray>) = 0;

    static const char* supplementName();
    static ServiceWorkerGlobalScopeClient* from(ExecutionContext*);

protected:
    ServiceWorkerGlobalScopeClient() { }
};

void provideServiceWorkerGlobalScopeClientToWorker(WorkerClients*, PassOwnPtrWillBeRawPtr<ServiceWorkerGlobalScopeClient>);

} // namespace blink

#endif // ServiceWorkerGlobalScopeClient_h
