1/*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef InspectorResourceAgent_h
32#define InspectorResourceAgent_h
33
34#include "InspectorFrontend.h"
35#include "PlatformString.h"
36
37#include <wtf/OwnPtr.h>
38#include <wtf/PassRefPtr.h>
39#include <wtf/Vector.h>
40
41#if ENABLE(INSPECTOR)
42
43namespace WTF {
44class String;
45}
46
47namespace WebCore {
48
49class CachedResource;
50class Document;
51class DocumentLoader;
52class Frame;
53class InspectorArray;
54class InspectorFrontend;
55class InspectorFrontendProxy;
56class InspectorObject;
57class InspectorState;
58class InstrumentingAgents;
59class KURL;
60class EventsCollector;
61class Page;
62class ResourceError;
63class ResourceRequest;
64class ResourceResponse;
65class SharedBuffer;
66
67#if ENABLE(WEB_SOCKETS)
68class WebSocketHandshakeRequest;
69class WebSocketHandshakeResponse;
70#endif
71
72typedef String ErrorString;
73
74class InspectorResourceAgent : public RefCounted<InspectorResourceAgent> {
75public:
76    static PassRefPtr<InspectorResourceAgent> create(InstrumentingAgents* instrumentingAgents, Page* page, InspectorState* state)
77    {
78        return adoptRef(new InspectorResourceAgent(instrumentingAgents, page, state));
79    }
80
81    void setFrontend(InspectorFrontend*);
82    void clearFrontend();
83    void restore();
84
85    static PassRefPtr<InspectorResourceAgent> restore(Page*, InspectorState*, InspectorFrontend*);
86
87    static void resourceContent(ErrorString*, Frame*, const KURL&, String* result);
88    static void resourceContentBase64(ErrorString*, Frame*, const KURL&, String* result);
89    static PassRefPtr<SharedBuffer> resourceData(Frame*, const KURL&, String* textEncodingName);
90    static CachedResource* cachedResource(Frame*, const KURL&);
91
92    ~InspectorResourceAgent();
93
94    void willSendRequest(unsigned long identifier, DocumentLoader*, ResourceRequest&, const ResourceResponse& redirectResponse);
95    void markResourceAsCached(unsigned long identifier);
96    void didReceiveResponse(unsigned long identifier, DocumentLoader* laoder, const ResourceResponse&);
97    void didReceiveContentLength(unsigned long identifier, int dataLength, int encodedDataLength);
98    void didFinishLoading(unsigned long identifier, double finishTime);
99    void didFailLoading(unsigned long identifier, const ResourceError&);
100    void didLoadResourceFromMemoryCache(DocumentLoader*, const CachedResource*);
101    void setInitialScriptContent(unsigned long identifier, const String& sourceString);
102    void setInitialXHRContent(unsigned long identifier, const String& sourceString);
103    void domContentEventFired();
104    void loadEventFired();
105    void didCommitLoad(DocumentLoader*);
106    void frameDetachedFromParent(Frame*);
107
108#if ENABLE(WEB_SOCKETS)
109    void didCreateWebSocket(unsigned long identifier, const KURL& requestURL);
110    void willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest&);
111    void didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse&);
112    void didCloseWebSocket(unsigned long identifier);
113#endif
114
115    Frame* frameForId(const String& frameId);
116    bool backgroundEventsCollectionEnabled();
117
118    // Called from frontend
119    void enable(ErrorString*);
120    void disable(ErrorString*);
121    void getCachedResources(ErrorString*, RefPtr<InspectorObject>*);
122    void getResourceContent(ErrorString*, const String& frameId, const String& url, const bool* const base64Encode, String* content);
123    void setExtraHeaders(ErrorString*, PassRefPtr<InspectorObject>);
124
125private:
126    InspectorResourceAgent(InstrumentingAgents*, Page*, InspectorState*);
127
128    void enable();
129
130    InstrumentingAgents* m_instrumentingAgents;
131    Page* m_page;
132    InspectorState* m_state;
133    OwnPtr<EventsCollector> m_eventsCollector;
134    InspectorFrontend::Network* m_frontend;
135    OwnPtr<InspectorFrontend::Network> m_mockFrontend;
136    OwnPtr<InspectorFrontendProxy> m_inspectorFrontendProxy;
137};
138
139} // namespace WebCore
140
141#endif // ENABLE(INSPECTOR)
142
143#endif // !defined(InspectorResourceAgent_h)
144