Move loading responsibility out of WebResourceLoadScheduler into a new WebResourceLoader
[WebKit-https.git] / Source / WebKit2 / Platform / CoreIPC / MessageID.h
1 /*
2  * Copyright (C) 2010, 2012 Apple 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
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef MessageID_h
27 #define MessageID_h
28
29 namespace CoreIPC {
30
31 enum MessageClass {
32     MessageClassInvalid = 0,
33
34     // Messages sent by Core IPC.
35     MessageClassCoreIPC,
36
37     // Messages sent by the UI process to the web process.
38     MessageClassAuthenticationManager,
39     MessageClassDrawingArea,
40     MessageClassLayerTreeCoordinator,
41     MessageClassWebApplicationCacheManager,
42     MessageClassWebBatteryManagerProxy,
43     MessageClassWebCookieManager,
44     MessageClassWebDatabaseManager,
45     MessageClassWebFullScreenManager,
46     MessageClassWebGeolocationManagerProxy,
47     MessageClassWebIconDatabaseProxy,
48     MessageClassWebInspector,
49     MessageClassWebKeyValueStorageManager,
50     MessageClassWebMediaCacheManager,
51     MessageClassWebNetworkInfoManagerProxy,
52     MessageClassWebNotificationManager,
53     MessageClassWebPage,
54     MessageClassWebPageGroupProxy,
55     MessageClassWebProcess,
56     MessageClassWebResourceCacheManager,
57     MessageClassEventDispatcher,
58 #if USE(SOUP)
59     MessageClassWebSoupRequestManager,
60 #endif
61
62     // Messages sent by the web process to the UI process.
63     MessageClassDownloadProxy,
64     MessageClassDrawingAreaProxy,
65     MessageClassLayerTreeCoordinatorProxy,
66     MessageClassWebApplicationCacheManagerProxy,
67     MessageClassWebBatteryManager,
68     MessageClassWebConnection,
69     MessageClassWebContext,
70     MessageClassWebContextLegacy,
71     MessageClassWebCookieManagerProxy,
72     MessageClassWebDatabaseManagerProxy,
73     MessageClassWebFullScreenManagerProxy,
74     MessageClassWebGeolocationManager,
75     MessageClassWebIconDatabase,
76     MessageClassWebInspectorProxy,
77     MessageClassWebKeyValueStorageManagerProxy,
78     MessageClassWebMediaCacheManagerProxy,
79     MessageClassWebNetworkInfoManager,
80     MessageClassWebNotificationManagerProxy,
81     MessageClassWebPageProxy,
82     MessageClassWebProcessProxy,
83     MessageClassWebResourceCacheManagerProxy,
84 #if USE(SOUP)
85     MessageClassWebSoupRequestManagerProxy,
86 #endif
87     MessageClassWebVibrationProxy,
88     MessageClassRemoteLayerTreeHost,
89
90     // Messages sent to a WebConnection
91     MessageClassWebConnectionLegacy,
92
93     // Messages sent by the UI process to the plug-in process.
94     MessageClassPluginProcess,
95
96     // Messages sent by the plug-in process to the UI process.
97     MessageClassPluginProcessProxy,
98
99     // Messages sent by the web process to the plug-in process.
100     MessageClassWebProcessConnection,
101     MessageClassPluginControllerProxy,
102
103     // Messages sent by the plug-in process to the web process.
104     MessageClassPluginProcessConnection,
105     MessageClassPluginProxy,
106
107     // NPObject messages sent by both the plug-in process and the web process.
108     MessageClassNPObjectMessageReceiver,
109
110     // Messages sent by the UI process to the network process.
111     MessageClassNetworkProcess,
112
113     // Messages sent by the network process to the UI process.
114     MessageClassNetworkProcessProxy,
115
116     // Messages sent by the web process to the network process.
117     MessageClassNetworkConnectionToWebProcess,
118
119     // Messages sent by the network process to a web process.
120     MessageClassNetworkProcessConnection,
121     MessageClassWebResourceLoader,
122     
123 #if ENABLE(SHARED_WORKER_PROCESS)
124     // Messages sent by the UI process to the shared worker process.
125     MessageClassSharedWorkerProcess,
126 #endif // ENABLE(SHARED_WORKER_PROCESS)
127
128     // Messages sent by the shared worker process to the UI process.
129     MessageClassSharedWorkerProcessProxy,
130     
131 #if ENABLE(CUSTOM_PROTOCOLS)
132     // Messages sent by the UI process to a web process (soon the network process).
133     MessageClassCustomProtocolManager,
134
135     // Messages sent by a web process (soon the network process) to the UI process.
136     MessageClassCustomProtocolManagerProxy,
137 #endif
138 };
139
140 template<typename> struct MessageKindTraits { };
141
142
143 /*
144     MessageID Layout (the most significant bit is reserved and therefore always zero)
145
146     ---------
147     | Flags | 7 bits
148     |-------|
149     | Class | 8 bits
150     |-------|
151     |  Msg  | 16 bits
152     |  Kind |
153     ---------
154 */
155
156 class MessageID {
157 public:
158     enum Flags {
159         SyncMessage = 1 << 0,
160         DispatchMessageWhenWaitingForSyncReply = 1 << 1,
161     };
162
163     MessageID()
164         : m_messageID(0)
165     {
166     }
167
168     template <typename EnumType>
169     explicit MessageID(EnumType messageKind, unsigned char flags = 0)
170         : m_messageID(stripMostSignificantBit(flags << 24 | (MessageKindTraits<EnumType>::messageClass) << 16 | messageKind))
171     {
172     }
173
174     MessageID messageIDWithAddedFlags(unsigned char flags)
175     {
176         MessageID messageID;
177
178         messageID.m_messageID = stripMostSignificantBit(m_messageID | (flags << 24));
179         return messageID;
180     }
181
182     template <typename EnumType>
183     EnumType get() const
184     {
185         ASSERT(getClass() == MessageKindTraits<EnumType>::messageClass);
186         return static_cast<EnumType>(m_messageID & 0xffff);
187     }
188
189     template <MessageClass K>
190     bool is() const
191     {
192         return getClass() == K;
193     }
194     
195     template <typename EnumType>
196     bool operator==(EnumType messageKind) const
197     {
198         return m_messageID == MessageID(messageKind).m_messageID;
199     }
200
201     static MessageID fromInt(unsigned i)
202     {
203         MessageID messageID;
204         messageID.m_messageID = stripMostSignificantBit(i);
205         
206         return messageID;
207     }
208     
209     unsigned toInt() const { return m_messageID; }
210
211     bool shouldDispatchMessageWhenWaitingForSyncReply() const { return getFlags() & DispatchMessageWhenWaitingForSyncReply; }
212     bool isSync() const { return getFlags() & SyncMessage; }
213
214     MessageClass messageClass() const
215     {
216         return static_cast<MessageClass>(getClass());
217     }
218
219 private:
220     static inline unsigned stripMostSignificantBit(unsigned value)
221     {
222         return value & 0x7fffffff;
223     }
224
225     unsigned char getFlags() const { return (m_messageID & 0xff000000) >> 24; }
226     unsigned char getClass() const { return (m_messageID & 0x00ff0000) >> 16; }
227
228     unsigned m_messageID;
229 };
230
231 } // namespace CoreIPC
232     
233 #endif // MessageID_h