[WebKit2] Add the ability to send messages to the WebPageGroupProxy
[WebKit-https.git] / Source / WebKit2 / Platform / CoreIPC / MessageID.h
1 /*
2  * Copyright (C) 2010 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     MessageClassInjectedBundle,
41     MessageClassLayerTreeCoordinator,
42     MessageClassWebApplicationCacheManager,
43     MessageClassWebBatteryManagerProxy,
44     MessageClassWebCookieManager,
45     MessageClassWebDatabaseManager,
46     MessageClassWebFullScreenManager,
47     MessageClassWebGeolocationManagerProxy,
48     MessageClassWebIconDatabaseProxy,
49     MessageClassWebInspector,
50     MessageClassWebKeyValueStorageManager,
51     MessageClassWebMediaCacheManager,
52     MessageClassWebNetworkInfoManagerProxy,
53     MessageClassWebNotificationManager,
54     MessageClassWebPage,
55     MessageClassWebPageGroupProxy,
56     MessageClassWebProcess,
57     MessageClassWebResourceCacheManager,
58     MessageClassEventDispatcher,
59 #if USE(SOUP)
60     MessageClassWebSoupRequestManager,
61 #endif
62
63     // Messages sent by the web process to the UI process.
64     MessageClassDownloadProxy,
65     MessageClassDrawingAreaProxy,
66     MessageClassLayerTreeCoordinatorProxy,
67     MessageClassWebApplicationCacheManagerProxy,
68     MessageClassWebBatteryManager,
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
89     // Messages sent to a WebConnection
90     MessageClassWebConnectionLegacy,
91
92     // Messages sent by the UI process to the plug-in process.
93     MessageClassPluginProcess,
94
95     // Messages sent by the plug-in process to the UI process.
96     MessageClassPluginProcessProxy,
97
98     // Messages sent by the web process to the plug-in process.
99     MessageClassWebProcessConnection,
100     MessageClassPluginControllerProxy,
101
102     // Messages sent by the plug-in process to the web process.
103     MessageClassPluginProcessConnection,
104     MessageClassPluginProxy,
105
106     // NPObject messages sent by both the plug-in process and the web process.
107     MessageClassNPObjectMessageReceiver,
108 };
109
110 template<typename> struct MessageKindTraits { };
111
112
113 /*
114     MessageID Layout (the most significant bit is reserved and therefore always zero)
115
116     ---------
117     | Flags | 7 bits
118     |-------|
119     | Class | 8 bits
120     |-------|
121     |  Msg  | 16 bits
122     |  Kind |
123     ---------
124 */
125
126 class MessageID {
127 public:
128     enum Flags {
129         SyncMessage = 1 << 0,
130         DispatchMessageWhenWaitingForSyncReply = 1 << 1,
131     };
132
133     MessageID()
134         : m_messageID(0)
135     {
136     }
137
138     template <typename EnumType>
139     explicit MessageID(EnumType messageKind, unsigned char flags = 0)
140         : m_messageID(stripMostSignificantBit(flags << 24 | (MessageKindTraits<EnumType>::messageClass) << 16 | messageKind))
141     {
142     }
143
144     MessageID messageIDWithAddedFlags(unsigned char flags)
145     {
146         MessageID messageID;
147
148         messageID.m_messageID = stripMostSignificantBit(m_messageID | (flags << 24));
149         return messageID;
150     }
151
152     template <typename EnumType>
153     EnumType get() const
154     {
155         ASSERT(getClass() == MessageKindTraits<EnumType>::messageClass);
156         return static_cast<EnumType>(m_messageID & 0xffff);
157     }
158
159     template <MessageClass K>
160     bool is() const
161     {
162         return getClass() == K;
163     }
164     
165     template <typename EnumType>
166     bool operator==(EnumType messageKind) const
167     {
168         return m_messageID == MessageID(messageKind).m_messageID;
169     }
170
171     static MessageID fromInt(unsigned i)
172     {
173         MessageID messageID;
174         messageID.m_messageID = stripMostSignificantBit(i);
175         
176         return messageID;
177     }
178     
179     unsigned toInt() const { return m_messageID; }
180
181     bool shouldDispatchMessageWhenWaitingForSyncReply() const { return getFlags() & DispatchMessageWhenWaitingForSyncReply; }
182     bool isSync() const { return getFlags() & SyncMessage; }
183
184     MessageClass messageClass() const
185     {
186         return static_cast<MessageClass>(getClass());
187     }
188
189 private:
190     static inline unsigned stripMostSignificantBit(unsigned value)
191     {
192         return value & 0x7fffffff;
193     }
194
195     unsigned char getFlags() const { return (m_messageID & 0xff000000) >> 24; }
196     unsigned char getClass() const { return (m_messageID & 0x00ff0000) >> 16; }
197
198     unsigned m_messageID;
199 };
200
201 } // namespace CoreIPC
202     
203 #endif // MessageID_h