Crash under IPC::isValidMessageName()
https://bugs.webkit.org/show_bug.cgi?id=213751
<rdar://problem/64773416>

Reviewed by Geoffrey Garen.

This is a speculative fix for the crashes tracked by <rdar://problem/64773416>.
The suspicion is that the compiler optimizes the code for IPC::isValidMessageName()
because its parameter is of type MessageName. It may therefore assume the parameter
is a valid MessageName enum value, which is ironic because the purpose of this
function is to check whether or not the enum value is valid.

To address the issue, I got rid of the #ifdefs in MessageName enum so that the
enum values have an underlying value in the range [0, MessageName::Last]. I then
updated the isValidEnum template specialization to verify that the input integer
is indeed in the range [0, MessageName::Last] before casting it to a MessageName
and calling IPC::isValidMessageName().

* Scripts/webkit/messages.py:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@263807 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 34bcf1c..e35f0e3 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,25 @@
+2020-07-01  Chris Dumez  <cdumez@apple.com>
+
+        Crash under IPC::isValidMessageName()
+        https://bugs.webkit.org/show_bug.cgi?id=213751
+        <rdar://problem/64773416>
+
+        Reviewed by Geoffrey Garen.
+
+        This is a speculative fix for the crashes tracked by <rdar://problem/64773416>.
+        The suspicion is that the compiler optimizes the code for IPC::isValidMessageName()
+        because its parameter is of type MessageName. It may therefore assume the parameter
+        is a valid MessageName enum value, which is ironic because the purpose of this
+        function is to check whether or not the enum value is valid.
+
+        To address the issue, I got rid of the #ifdefs in MessageName enum so that the
+        enum values have an underlying value in the range [0, MessageName::Last]. I then
+        updated the isValidEnum template specialization to verify that the input integer
+        is indeed in the range [0, MessageName::Last] before casting it to a MessageName
+        and calling IPC::isValidMessageName().
+
+        * Scripts/webkit/messages.py:
+
 2020-07-01  Kate Cheney  <katherine_cheney@apple.com>
 
         WKUserScripts injecting into all frames seem to violate app-bound domains
diff --git a/Source/WebKit/Scripts/MessageNames.cpp b/Source/WebKit/Scripts/MessageNames.cpp
index b82bf04..e76fa2a 100644
--- a/Source/WebKit/Scripts/MessageNames.cpp
+++ b/Source/WebKit/Scripts/MessageNames.cpp
@@ -30,156 +30,70 @@
 const char* description(MessageName name)
 {
     switch (name) {
+    case MessageName::WebPage_AddEvent:
+        return "WebPage_AddEvent";
+    case MessageName::WebPage_Close:
+        return "WebPage_Close";
+    case MessageName::WebPage_CreatePlugin:
+        return "WebPage_CreatePlugin";
+    case MessageName::WebPage_DeprecatedOperation:
+        return "WebPage_DeprecatedOperation";
+    case MessageName::WebPage_DidCreateWebProcessConnection:
+        return "WebPage_DidCreateWebProcessConnection";
+    case MessageName::WebPage_DidReceivePolicyDecision:
+        return "WebPage_DidReceivePolicyDecision";
+    case MessageName::WebPage_ExperimentalOperation:
+        return "WebPage_ExperimentalOperation";
+    case MessageName::WebPage_GetPluginProcessConnection:
+        return "WebPage_GetPluginProcessConnection";
+    case MessageName::WebPage_GetPlugins:
+        return "WebPage_GetPlugins";
+    case MessageName::WebPage_InterpretKeyEvent:
+        return "WebPage_InterpretKeyEvent";
+    case MessageName::WebPage_LoadSomething:
+        return "WebPage_LoadSomething";
+    case MessageName::WebPage_LoadSomethingElse:
+        return "WebPage_LoadSomethingElse";
     case MessageName::WebPage_LoadURL:
-        return "WebPage::LoadURL";
-#if ENABLE(TEST_FEATURE)
+        return "WebPage_LoadURL";
+    case MessageName::WebPage_PreferencesDidChange:
+        return "WebPage_PreferencesDidChange";
+    case MessageName::WebPage_RunJavaScriptAlert:
+        return "WebPage_RunJavaScriptAlert";
+    case MessageName::WebPage_SendDoubleAndFloat:
+        return "WebPage_SendDoubleAndFloat";
+    case MessageName::WebPage_SendInts:
+        return "WebPage_SendInts";
+    case MessageName::WebPage_SetVideoLayerID:
+        return "WebPage_SetVideoLayerID";
+    case MessageName::WebPage_TemplateTest:
+        return "WebPage_TemplateTest";
     case MessageName::WebPage_TestAsyncMessage:
-        return "WebPage::TestAsyncMessage";
+        return "WebPage_TestAsyncMessage";
     case MessageName::WebPage_TestAsyncMessageReply:
-        return "WebPage::TestAsyncMessageReply";
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithNoArguments:
-        return "WebPage::TestAsyncMessageWithNoArguments";
-    case MessageName::WebPage_TestAsyncMessageWithNoArgumentsReply:
-        return "WebPage::TestAsyncMessageWithNoArgumentsReply";
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithMultipleArguments:
-        return "WebPage::TestAsyncMessageWithMultipleArguments";
-    case MessageName::WebPage_TestAsyncMessageWithMultipleArgumentsReply:
-        return "WebPage::TestAsyncMessageWithMultipleArgumentsReply";
-#endif
-#if ENABLE(TEST_FEATURE)
+        return "WebPage_TestAsyncMessageReply";
     case MessageName::WebPage_TestAsyncMessageWithConnection:
-        return "WebPage::TestAsyncMessageWithConnection";
+        return "WebPage_TestAsyncMessageWithConnection";
     case MessageName::WebPage_TestAsyncMessageWithConnectionReply:
-        return "WebPage::TestAsyncMessageWithConnectionReply";
-#endif
+        return "WebPage_TestAsyncMessageWithConnectionReply";
+    case MessageName::WebPage_TestAsyncMessageWithMultipleArguments:
+        return "WebPage_TestAsyncMessageWithMultipleArguments";
+    case MessageName::WebPage_TestAsyncMessageWithMultipleArgumentsReply:
+        return "WebPage_TestAsyncMessageWithMultipleArgumentsReply";
+    case MessageName::WebPage_TestAsyncMessageWithNoArguments:
+        return "WebPage_TestAsyncMessageWithNoArguments";
+    case MessageName::WebPage_TestAsyncMessageWithNoArgumentsReply:
+        return "WebPage_TestAsyncMessageWithNoArgumentsReply";
+    case MessageName::WebPage_TestMultipleAttributes:
+        return "WebPage_TestMultipleAttributes";
+    case MessageName::WebPage_TestParameterAttributes:
+        return "WebPage_TestParameterAttributes";
     case MessageName::WebPage_TestSyncMessage:
-        return "WebPage::TestSyncMessage";
+        return "WebPage_TestSyncMessage";
     case MessageName::WebPage_TestSynchronousMessage:
-        return "WebPage::TestSynchronousMessage";
-    case MessageName::WebPage_LoadURL:
-        return "WebPage::LoadURL";
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomething:
-        return "WebPage::LoadSomething";
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
+        return "WebPage_TestSynchronousMessage";
     case MessageName::WebPage_TouchEvent:
-        return "WebPage::TouchEvent";
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
-    case MessageName::WebPage_AddEvent:
-        return "WebPage::AddEvent";
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomethingElse:
-        return "WebPage::LoadSomethingElse";
-#endif
-    case MessageName::WebPage_DidReceivePolicyDecision:
-        return "WebPage::DidReceivePolicyDecision";
-    case MessageName::WebPage_Close:
-        return "WebPage::Close";
-    case MessageName::WebPage_PreferencesDidChange:
-        return "WebPage::PreferencesDidChange";
-    case MessageName::WebPage_SendDoubleAndFloat:
-        return "WebPage::SendDoubleAndFloat";
-    case MessageName::WebPage_SendInts:
-        return "WebPage::SendInts";
-    case MessageName::WebPage_CreatePlugin:
-        return "WebPage::CreatePlugin";
-    case MessageName::WebPage_RunJavaScriptAlert:
-        return "WebPage::RunJavaScriptAlert";
-    case MessageName::WebPage_GetPlugins:
-        return "WebPage::GetPlugins";
-    case MessageName::WebPage_GetPluginProcessConnection:
-        return "WebPage::GetPluginProcessConnection";
-    case MessageName::WebPage_TestMultipleAttributes:
-        return "WebPage::TestMultipleAttributes";
-    case MessageName::WebPage_TestParameterAttributes:
-        return "WebPage::TestParameterAttributes";
-    case MessageName::WebPage_TemplateTest:
-        return "WebPage::TemplateTest";
-    case MessageName::WebPage_SetVideoLayerID:
-        return "WebPage::SetVideoLayerID";
-#if PLATFORM(MAC)
-    case MessageName::WebPage_DidCreateWebProcessConnection:
-        return "WebPage::DidCreateWebProcessConnection";
-#endif
-#if PLATFORM(MAC)
-    case MessageName::WebPage_InterpretKeyEvent:
-        return "WebPage::InterpretKeyEvent";
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    case MessageName::WebPage_DeprecatedOperation:
-        return "WebPage::DeprecatedOperation";
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    case MessageName::WebPage_ExperimentalOperation:
-        return "WebPage::ExperimentalOperation";
-#endif
-    case MessageName::WebPage_LoadURL:
-        return "WebPage::LoadURL";
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomething:
-        return "WebPage::LoadSomething";
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
-    case MessageName::WebPage_TouchEvent:
-        return "WebPage::TouchEvent";
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
-    case MessageName::WebPage_AddEvent:
-        return "WebPage::AddEvent";
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomethingElse:
-        return "WebPage::LoadSomethingElse";
-#endif
-    case MessageName::WebPage_DidReceivePolicyDecision:
-        return "WebPage::DidReceivePolicyDecision";
-    case MessageName::WebPage_Close:
-        return "WebPage::Close";
-    case MessageName::WebPage_PreferencesDidChange:
-        return "WebPage::PreferencesDidChange";
-    case MessageName::WebPage_SendDoubleAndFloat:
-        return "WebPage::SendDoubleAndFloat";
-    case MessageName::WebPage_SendInts:
-        return "WebPage::SendInts";
-    case MessageName::WebPage_CreatePlugin:
-        return "WebPage::CreatePlugin";
-    case MessageName::WebPage_RunJavaScriptAlert:
-        return "WebPage::RunJavaScriptAlert";
-    case MessageName::WebPage_GetPlugins:
-        return "WebPage::GetPlugins";
-    case MessageName::WebPage_GetPluginProcessConnection:
-        return "WebPage::GetPluginProcessConnection";
-    case MessageName::WebPage_TestMultipleAttributes:
-        return "WebPage::TestMultipleAttributes";
-    case MessageName::WebPage_TestParameterAttributes:
-        return "WebPage::TestParameterAttributes";
-    case MessageName::WebPage_TemplateTest:
-        return "WebPage::TemplateTest";
-    case MessageName::WebPage_SetVideoLayerID:
-        return "WebPage::SetVideoLayerID";
-#if PLATFORM(MAC)
-    case MessageName::WebPage_DidCreateWebProcessConnection:
-        return "WebPage::DidCreateWebProcessConnection";
-#endif
-#if PLATFORM(MAC)
-    case MessageName::WebPage_InterpretKeyEvent:
-        return "WebPage::InterpretKeyEvent";
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    case MessageName::WebPage_DeprecatedOperation:
-        return "WebPage::DeprecatedOperation";
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    case MessageName::WebPage_ExperimentalOperation:
-        return "WebPage::ExperimentalOperation";
-#endif
+        return "WebPage_TouchEvent";
     case MessageName::WrappedAsyncMessageForTesting:
         return "IPC::WrappedAsyncMessageForTesting";
     case MessageName::SyncMessageReply:
@@ -196,112 +110,33 @@
 ReceiverName receiverName(MessageName messageName)
 {
     switch (messageName) {
-    case MessageName::WebPage_LoadURL:
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessage:
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithNoArguments:
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithMultipleArguments:
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithConnection:
-#endif
-    case MessageName::WebPage_TestSyncMessage:
-    case MessageName::WebPage_TestSynchronousMessage:
-        return ReceiverName::WebPage;
-    case MessageName::WebPage_LoadURL:
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomething:
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
-    case MessageName::WebPage_TouchEvent:
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
     case MessageName::WebPage_AddEvent:
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomethingElse:
-#endif
-    case MessageName::WebPage_DidReceivePolicyDecision:
     case MessageName::WebPage_Close:
+    case MessageName::WebPage_CreatePlugin:
+    case MessageName::WebPage_DeprecatedOperation:
+    case MessageName::WebPage_DidCreateWebProcessConnection:
+    case MessageName::WebPage_DidReceivePolicyDecision:
+    case MessageName::WebPage_ExperimentalOperation:
+    case MessageName::WebPage_GetPluginProcessConnection:
+    case MessageName::WebPage_GetPlugins:
+    case MessageName::WebPage_InterpretKeyEvent:
+    case MessageName::WebPage_LoadSomething:
+    case MessageName::WebPage_LoadSomethingElse:
+    case MessageName::WebPage_LoadURL:
     case MessageName::WebPage_PreferencesDidChange:
+    case MessageName::WebPage_RunJavaScriptAlert:
     case MessageName::WebPage_SendDoubleAndFloat:
     case MessageName::WebPage_SendInts:
-    case MessageName::WebPage_CreatePlugin:
-    case MessageName::WebPage_RunJavaScriptAlert:
-    case MessageName::WebPage_GetPlugins:
-    case MessageName::WebPage_GetPluginProcessConnection:
+    case MessageName::WebPage_SetVideoLayerID:
+    case MessageName::WebPage_TemplateTest:
     case MessageName::WebPage_TestMultipleAttributes:
     case MessageName::WebPage_TestParameterAttributes:
-    case MessageName::WebPage_TemplateTest:
-    case MessageName::WebPage_SetVideoLayerID:
-#if PLATFORM(MAC)
-    case MessageName::WebPage_DidCreateWebProcessConnection:
-#endif
-#if PLATFORM(MAC)
-    case MessageName::WebPage_InterpretKeyEvent:
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    case MessageName::WebPage_DeprecatedOperation:
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    case MessageName::WebPage_ExperimentalOperation:
-#endif
-        return ReceiverName::WebPage;
-    case MessageName::WebPage_LoadURL:
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomething:
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
     case MessageName::WebPage_TouchEvent:
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
-    case MessageName::WebPage_AddEvent:
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    case MessageName::WebPage_LoadSomethingElse:
-#endif
-    case MessageName::WebPage_DidReceivePolicyDecision:
-    case MessageName::WebPage_Close:
-    case MessageName::WebPage_PreferencesDidChange:
-    case MessageName::WebPage_SendDoubleAndFloat:
-    case MessageName::WebPage_SendInts:
-    case MessageName::WebPage_CreatePlugin:
-    case MessageName::WebPage_RunJavaScriptAlert:
-    case MessageName::WebPage_GetPlugins:
-    case MessageName::WebPage_GetPluginProcessConnection:
-    case MessageName::WebPage_TestMultipleAttributes:
-    case MessageName::WebPage_TestParameterAttributes:
-    case MessageName::WebPage_TemplateTest:
-    case MessageName::WebPage_SetVideoLayerID:
-#if PLATFORM(MAC)
-    case MessageName::WebPage_DidCreateWebProcessConnection:
-#endif
-#if PLATFORM(MAC)
-    case MessageName::WebPage_InterpretKeyEvent:
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    case MessageName::WebPage_DeprecatedOperation:
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    case MessageName::WebPage_ExperimentalOperation:
-#endif
         return ReceiverName::WebPage;
-#if ENABLE(TEST_FEATURE)
     case MessageName::WebPage_TestAsyncMessageReply:
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithNoArgumentsReply:
-#endif
-#if ENABLE(TEST_FEATURE)
-    case MessageName::WebPage_TestAsyncMessageWithMultipleArgumentsReply:
-#endif
-#if ENABLE(TEST_FEATURE)
     case MessageName::WebPage_TestAsyncMessageWithConnectionReply:
-#endif
+    case MessageName::WebPage_TestAsyncMessageWithMultipleArgumentsReply:
+    case MessageName::WebPage_TestAsyncMessageWithNoArgumentsReply:
         return ReceiverName::AsyncReply;
     case MessageName::WrappedAsyncMessageForTesting:
     case MessageName::SyncMessageReply:
diff --git a/Source/WebKit/Scripts/MessageNames.h b/Source/WebKit/Scripts/MessageNames.h
index f5768c0..5e71814 100644
--- a/Source/WebKit/Scripts/MessageNames.h
+++ b/Source/WebKit/Scripts/MessageNames.h
@@ -38,105 +38,43 @@
 };
 
 enum class MessageName : uint16_t {
-    WebPage_LoadURL = 1
-#if ENABLE(TEST_FEATURE)
-    , WebPage_TestAsyncMessage = 2
-    , WebPage_TestAsyncMessageReply = 3
-#endif
-#if ENABLE(TEST_FEATURE)
-    , WebPage_TestAsyncMessageWithNoArguments = 4
-    , WebPage_TestAsyncMessageWithNoArgumentsReply = 5
-#endif
-#if ENABLE(TEST_FEATURE)
-    , WebPage_TestAsyncMessageWithMultipleArguments = 6
-    , WebPage_TestAsyncMessageWithMultipleArgumentsReply = 7
-#endif
-#if ENABLE(TEST_FEATURE)
-    , WebPage_TestAsyncMessageWithConnection = 8
-    , WebPage_TestAsyncMessageWithConnectionReply = 9
-#endif
-    , WebPage_TestSyncMessage = 10
-    , WebPage_TestSynchronousMessage = 11
-    , WebPage_LoadURL = 12
-#if ENABLE(TOUCH_EVENTS)
-    , WebPage_LoadSomething = 13
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
-    , WebPage_TouchEvent = 14
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
-    , WebPage_AddEvent = 15
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    , WebPage_LoadSomethingElse = 16
-#endif
-    , WebPage_DidReceivePolicyDecision = 17
-    , WebPage_Close = 18
-    , WebPage_PreferencesDidChange = 19
-    , WebPage_SendDoubleAndFloat = 20
-    , WebPage_SendInts = 21
-    , WebPage_CreatePlugin = 22
-    , WebPage_RunJavaScriptAlert = 23
-    , WebPage_GetPlugins = 24
-    , WebPage_GetPluginProcessConnection = 25
-    , WebPage_TestMultipleAttributes = 26
-    , WebPage_TestParameterAttributes = 27
-    , WebPage_TemplateTest = 28
-    , WebPage_SetVideoLayerID = 29
-#if PLATFORM(MAC)
-    , WebPage_DidCreateWebProcessConnection = 30
-#endif
-#if PLATFORM(MAC)
-    , WebPage_InterpretKeyEvent = 31
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    , WebPage_DeprecatedOperation = 32
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    , WebPage_ExperimentalOperation = 33
-#endif
-    , WebPage_LoadURL = 34
-#if ENABLE(TOUCH_EVENTS)
-    , WebPage_LoadSomething = 35
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION || SOME_OTHER_MESSAGE_CONDITION))
-    , WebPage_TouchEvent = 36
-#endif
-#if (ENABLE(TOUCH_EVENTS) && (NESTED_MESSAGE_CONDITION && SOME_OTHER_MESSAGE_CONDITION))
-    , WebPage_AddEvent = 37
-#endif
-#if ENABLE(TOUCH_EVENTS)
-    , WebPage_LoadSomethingElse = 38
-#endif
-    , WebPage_DidReceivePolicyDecision = 39
-    , WebPage_Close = 40
-    , WebPage_PreferencesDidChange = 41
-    , WebPage_SendDoubleAndFloat = 42
-    , WebPage_SendInts = 43
-    , WebPage_CreatePlugin = 44
-    , WebPage_RunJavaScriptAlert = 45
-    , WebPage_GetPlugins = 46
-    , WebPage_GetPluginProcessConnection = 47
-    , WebPage_TestMultipleAttributes = 48
-    , WebPage_TestParameterAttributes = 49
-    , WebPage_TemplateTest = 50
-    , WebPage_SetVideoLayerID = 51
-#if PLATFORM(MAC)
-    , WebPage_DidCreateWebProcessConnection = 52
-#endif
-#if PLATFORM(MAC)
-    , WebPage_InterpretKeyEvent = 53
-#endif
-#if ENABLE(DEPRECATED_FEATURE)
-    , WebPage_DeprecatedOperation = 54
-#endif
-#if ENABLE(EXPERIMENTAL_FEATURE)
-    , WebPage_ExperimentalOperation = 55
-#endif
-    , WrappedAsyncMessageForTesting = 56
-    , SyncMessageReply = 57
-    , InitializeConnection = 58
-    , LegacySessionState = 59
+    WebPage_AddEvent
+    , WebPage_Close
+    , WebPage_CreatePlugin
+    , WebPage_DeprecatedOperation
+    , WebPage_DidCreateWebProcessConnection
+    , WebPage_DidReceivePolicyDecision
+    , WebPage_ExperimentalOperation
+    , WebPage_GetPluginProcessConnection
+    , WebPage_GetPlugins
+    , WebPage_InterpretKeyEvent
+    , WebPage_LoadSomething
+    , WebPage_LoadSomethingElse
+    , WebPage_LoadURL
+    , WebPage_PreferencesDidChange
+    , WebPage_RunJavaScriptAlert
+    , WebPage_SendDoubleAndFloat
+    , WebPage_SendInts
+    , WebPage_SetVideoLayerID
+    , WebPage_TemplateTest
+    , WebPage_TestAsyncMessage
+    , WebPage_TestAsyncMessageReply
+    , WebPage_TestAsyncMessageWithConnection
+    , WebPage_TestAsyncMessageWithConnectionReply
+    , WebPage_TestAsyncMessageWithMultipleArguments
+    , WebPage_TestAsyncMessageWithMultipleArgumentsReply
+    , WebPage_TestAsyncMessageWithNoArguments
+    , WebPage_TestAsyncMessageWithNoArgumentsReply
+    , WebPage_TestMultipleAttributes
+    , WebPage_TestParameterAttributes
+    , WebPage_TestSyncMessage
+    , WebPage_TestSynchronousMessage
+    , WebPage_TouchEvent
+    , WrappedAsyncMessageForTesting
+    , SyncMessageReply
+    , InitializeConnection
+    , LegacySessionState
+    , Last = LegacySessionState
 };
 
 ReceiverName receiverName(MessageName);
@@ -153,6 +91,9 @@
 bool isValidEnum(T messageName)
 {
     static_assert(sizeof(T) == sizeof(E), "isValidEnum<IPC::MessageName> should only be called with 16-bit types");
+    static_assert(std::is_unsigned<T>::value, "isValidEnum<IPC::MessageName> should only be called with unsigned types");
+    if (messageName > static_cast<std::underlying_type<IPC::MessageName>::type>(IPC::MessageName::Last))
+        return false;
     return IPC::isValidMessageName(static_cast<E>(messageName));
 };
 
diff --git a/Source/WebKit/Scripts/webkit/messages.py b/Source/WebKit/Scripts/webkit/messages.py
index d0f8595..6258a7f 100644
--- a/Source/WebKit/Scripts/webkit/messages.py
+++ b/Source/WebKit/Scripts/webkit/messages.py
@@ -904,31 +904,25 @@
     result.append('\n')
     result.append('enum class MessageName : uint16_t {')
 
-    enum_value = 1
-    first_message = True
+    enum_values = set()
     for receiver in receivers:
         for message in receiver.messages:
-            result.append('\n')
-            if message.condition:
-                result.append('#if %s\n' % message.condition)
-            result.append('    ')
-            if not first_message:
-                result.append(', ')
-            first_message = False
-            result.append('%s_%s = %d' % (receiver.name, message.name, enum_value))
-            enum_value = enum_value + 1
+            enum_values.add('%s_%s' % (receiver.name, message.name))
             if message.has_attribute(ASYNC_ATTRIBUTE):
-                result.append('\n    , %s_%sReply = %d' % (receiver.name, message.name, enum_value))
-                enum_value = enum_value + 1
-            if message.condition:
-                result.append('\n#endif')
-    result.append('\n    , WrappedAsyncMessageForTesting = %d' % enum_value)
-    enum_value = enum_value + 1
-    result.append('\n    , SyncMessageReply = %d' % enum_value)
-    enum_value = enum_value + 1
-    result.append('\n    , InitializeConnection = %d' % enum_value)
-    enum_value = enum_value + 1
-    result.append('\n    , LegacySessionState = %d' % enum_value)
+                enum_values.add('%s_%sReply' % (receiver.name, message.name))
+
+    first_message = True
+    for enum_value in sorted(enum_values):
+        result.append('\n    ')
+        if not first_message:
+            result.append(', ')
+        first_message = False
+        result.append(enum_value)
+    result.append('\n    , WrappedAsyncMessageForTesting')
+    result.append('\n    , SyncMessageReply')
+    result.append('\n    , InitializeConnection')
+    result.append('\n    , LegacySessionState')
+    result.append('\n    , Last = LegacySessionState')
     result.append('\n};\n')
     result.append('\n')
     result.append('ReceiverName receiverName(MessageName);\n')
@@ -945,6 +939,9 @@
     result.append('bool isValidEnum(T messageName)\n')
     result.append('{\n')
     result.append('    static_assert(sizeof(T) == sizeof(E), "isValidEnum<IPC::MessageName> should only be called with 16-bit types");\n')
+    result.append('    static_assert(std::is_unsigned<T>::value, "isValidEnum<IPC::MessageName> should only be called with unsigned types");\n')
+    result.append('    if (messageName > static_cast<std::underlying_type<IPC::MessageName>::type>(IPC::MessageName::Last))\n')
+    result.append('        return false;\n')
     result.append('    return IPC::isValidMessageName(static_cast<E>(messageName));\n')
     result.append('};\n')
     result.append('\n')
@@ -963,17 +960,16 @@
     result.append('const char* description(MessageName name)\n')
     result.append('{\n')
     result.append('    switch (name) {\n')
+    enum_values = set()
     for receiver in receivers:
         for message in receiver.messages:
-            if message.condition:
-                result.append('#if %s\n' % message.condition)
-            result.append('    case MessageName::%s_%s:\n' % (receiver.name, message.name))
-            result.append('        return "%s::%s";\n' % (receiver.name, message.name))
+            enum_values.add('%s_%s' % (receiver.name, message.name))
             if message.has_attribute(ASYNC_ATTRIBUTE):
-                result.append('    case MessageName::%s_%sReply:\n' % (receiver.name, message.name))
-                result.append('        return "%s::%sReply";\n' % (receiver.name, message.name))
-            if message.condition:
-                result.append('#endif\n')
+                enum_values.add('%s_%sReply' % (receiver.name, message.name))
+
+    for enum_value in sorted(enum_values):
+        result.append('    case MessageName::%s:\n' % enum_value)
+        result.append('        return "%s";\n' % enum_value)
     result.append('    case MessageName::WrappedAsyncMessageForTesting:\n')
     result.append('        return "IPC::WrappedAsyncMessageForTesting";\n')
     result.append('    case MessageName::SyncMessageReply:\n')
@@ -990,22 +986,24 @@
     result.append('ReceiverName receiverName(MessageName messageName)\n')
     result.append('{\n')
     result.append('    switch (messageName) {\n')
+    message_receiver_map = dict()
+    async_reply_messages = set()
     for receiver in receivers:
+        messages = set()
         for message in receiver.messages:
-            if message.condition:
-                result.append('#if %s\n' % message.condition)
-            result.append('    case MessageName::%s_%s:\n' % (receiver.name, message.name))
-            if message.condition:
-                result.append('#endif\n')
-        result.append('        return ReceiverName::%s;\n' % receiver.name)
-    for receiver in receivers:
-        for message in receiver.messages:
+            messages.add('%s_%s' % (receiver.name, message.name))
             if message.has_attribute(ASYNC_ATTRIBUTE):
-                if message.condition:
-                    result.append('#if %s\n' % message.condition)
-                result.append('    case MessageName::%s_%sReply:\n' % (receiver.name, message.name))
-                if message.condition:
-                    result.append('#endif\n')
+                async_reply_messages.add('%s_%sReply' % (receiver.name, message.name))
+        if len(messages):
+            message_receiver_map[receiver.name] = messages
+
+    for receiver_name, message_names in message_receiver_map.items():
+        for message_name in sorted(message_names):
+            result.append('    case MessageName::%s:\n' % message_name)
+        result.append('        return ReceiverName::%s;\n' % receiver_name)
+
+    for async_reply_message in sorted(async_reply_messages):
+        result.append('    case MessageName::%s:\n' % async_reply_message)
     result.append('        return ReceiverName::AsyncReply;\n')
     result.append('    case MessageName::WrappedAsyncMessageForTesting:\n')
     result.append('    case MessageName::SyncMessageReply:\n')