Generate param traits size methods for IPC files in chrome/ (and traits it depends on).

This allows us to reuse these traits in Mojo if needed.

I didn't add GetSize to every single trait in chrome/ and below; just enough to get the chrome message generator to compile with the size traits.

This is a followup to r393058.

Review-Url: https://codereview.chromium.org/1977643002
Cr-Commit-Position: refs/heads/master@{#393526}
diff --git a/android_webview/common/android_webview_message_generator.cc b/android_webview/common/android_webview_message_generator.cc
index d8b0080..cef229b 100644
--- a/android_webview/common/android_webview_message_generator.cc
+++ b/android_webview/common/android_webview_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "android_webview/common/android_webview_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "android_webview/common/android_webview_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index f4d3773..12d4a37 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -229,6 +229,7 @@
       'common/safe_browsing/protobuf_message_log_macros.h',
       'common/safe_browsing/protobuf_message_param_traits.h',
       'common/safe_browsing/protobuf_message_read_macros.h',
+      'common/safe_browsing/protobuf_message_size_macros.h',
       'common/safe_browsing/protobuf_message_write_macros.h',
       'common/safe_browsing/zip_analyzer.cc',
       'common/safe_browsing/zip_analyzer.h',
diff --git a/chrome/common/cast_messages.cc b/chrome/common/cast_messages.cc
index d1629f8..5b388624 100644
--- a/chrome/common/cast_messages.cc
+++ b/chrome/common/cast_messages.cc
@@ -6,6 +6,11 @@
 
 namespace IPC {
 
+void ParamTraits<media::cast::RtpTimeTicks>::GetSize(base::PickleSizer* s,
+                                                     const param_type& p) {
+  ParamTraits<uint64_t>::GetSize(s, p.SerializeForIPC());
+}
+
 void ParamTraits<media::cast::RtpTimeTicks>::Write(base::Pickle* m,
                                                    const param_type& p) {
   ParamTraits<uint64_t>::Write(m, p.SerializeForIPC());
@@ -29,6 +34,11 @@
   l->append(oss.str());
 }
 
+void ParamTraits<media::cast::FrameId>::GetSize(base::PickleSizer* s,
+                                                const param_type& p) {
+  ParamTraits<uint64_t>::GetSize(s, p.SerializeForIPC());
+}
+
 void ParamTraits<media::cast::FrameId>::Write(base::Pickle* m,
                                               const param_type& p) {
   ParamTraits<uint64_t>::Write(m, p.SerializeForIPC());
diff --git a/chrome/common/cast_messages.h b/chrome/common/cast_messages.h
index 83f9981..68eecd61 100644
--- a/chrome/common/cast_messages.h
+++ b/chrome/common/cast_messages.h
@@ -21,6 +21,7 @@
 template<>
 struct ParamTraits<media::cast::RtpTimeTicks> {
   using param_type = media::cast::RtpTimeTicks;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -31,6 +32,7 @@
 template<>
 struct ParamTraits<media::cast::FrameId> {
   using param_type = media::cast::FrameId;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/chrome/common/common_message_generator.cc b/chrome/common/common_message_generator.cc
index eb1dda2..1eeb253e 100644
--- a/chrome/common/common_message_generator.cc
+++ b/chrome/common/common_message_generator.cc
@@ -16,6 +16,13 @@
 #include "chrome/common/safe_browsing/ipc_protobuf_message_null_macros.h"
 #include "chrome/common/common_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+#include "chrome/common/safe_browsing/protobuf_message_size_macros.h"
+namespace IPC {
+#include "chrome/common/common_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 #include "chrome/common/safe_browsing/protobuf_message_write_macros.h"
diff --git a/chrome/common/common_param_traits.cc b/chrome/common/common_param_traits.cc
index 466cfde6..5a73c52 100644
--- a/chrome/common/common_param_traits.cc
+++ b/chrome/common/common_param_traits.cc
@@ -5,6 +5,13 @@
 // Get basic type definitions.
 #include "chrome/common/common_param_traits.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#undef CHROME_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+#include "chrome/common/common_param_traits_macros.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/content_settings_pattern_serializer.cc b/chrome/common/content_settings_pattern_serializer.cc
index 2e1ba34..1f8045a 100644
--- a/chrome/common/content_settings_pattern_serializer.cc
+++ b/chrome/common/content_settings_pattern_serializer.cc
@@ -8,6 +8,13 @@
 #include "components/content_settings/core/common/content_settings_pattern.h"
 
 // static
+void ContentSettingsPatternSerializer::GetSize(
+    const ContentSettingsPattern& pattern, base::PickleSizer* s) {
+  IPC::GetParamSize(s, pattern.is_valid_);
+  IPC::GetParamSize(s, pattern.parts_);
+}
+
+// static
 void ContentSettingsPatternSerializer::WriteToMessage(
     const ContentSettingsPattern& pattern,
     base::Pickle* m) {
diff --git a/chrome/common/content_settings_pattern_serializer.h b/chrome/common/content_settings_pattern_serializer.h
index a48591d..b123607 100644
--- a/chrome/common/content_settings_pattern_serializer.h
+++ b/chrome/common/content_settings_pattern_serializer.h
@@ -10,12 +10,17 @@
 namespace base {
 class Pickle;
 class PickleIterator;
+class PickleSizer;
 }
 
 class ContentSettingsPattern;
 
 class ContentSettingsPatternSerializer {
  public:
+  // Gets the serialized pattern's size.
+  static void GetSize(const ContentSettingsPattern& pattern,
+                      base::PickleSizer* s);
+
   // Serializes the pattern to an IPC message.
   static void WriteToMessage(const ContentSettingsPattern& pattern,
                              base::Pickle* m);
diff --git a/chrome/common/importer/profile_import_process_messages.cc b/chrome/common/importer/profile_import_process_messages.cc
index 4a0b9a4d..b585c24 100644
--- a/chrome/common/importer/profile_import_process_messages.cc
+++ b/chrome/common/importer/profile_import_process_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "chrome/common/importer/profile_import_process_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "chrome/common/importer/profile_import_process_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/render_messages.cc b/chrome/common/render_messages.cc
index d108f42e..1b419240 100644
--- a/chrome/common/render_messages.cc
+++ b/chrome/common/render_messages.cc
@@ -8,6 +8,12 @@
 
 namespace IPC {
 
+void ParamTraits<ContentSettingsPattern>::GetSize(
+    base::PickleSizer* s,
+    const ContentSettingsPattern& pattern) {
+  ContentSettingsPatternSerializer::GetSize(pattern, s);
+}
+
 void ParamTraits<ContentSettingsPattern>::Write(
     base::Pickle* m,
     const ContentSettingsPattern& pattern) {
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index 9f01811..0d23285 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -50,6 +50,7 @@
 template <>
 struct ParamTraits<ContentSettingsPattern> {
   typedef ContentSettingsPattern param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/chrome/common/safe_browsing/ipc_protobuf_message_macros.h b/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
index db17241..b40fe6e0 100644
--- a/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
+++ b/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
@@ -36,6 +36,7 @@
   template <>                                                       \
   struct IPC_MESSAGE_EXPORT ParamTraits<message_name> {             \
     typedef message_name param_type;                                \
+    static void GetSize(base::PickleSizer* s, const param_type& p); \
     static void Write(base::Pickle* m, const param_type& p);        \
     static bool Read(const base::Pickle* m,                         \
                      base::PickleIterator* iter,                    \
diff --git a/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc b/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
index d2fda1f4..4aa1ea1 100644
--- a/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
+++ b/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
@@ -9,6 +9,11 @@
 #define IPC_MESSAGE_IMPL
 #include "chrome/common/safe_browsing/ipc_protobuf_message_test_messages.h"
 
+// Generate ipc protobuf traits size methods.
+#include "chrome/common/safe_browsing/protobuf_message_size_macros.h"
+namespace IPC {
+#include "chrome/common/safe_browsing/ipc_protobuf_message_test_messages.h"
+}  // namespace IPC
 // Generate ipc protobuf traits write methods.
 #include "chrome/common/safe_browsing/protobuf_message_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/safe_browsing/protobuf_message_param_traits.h b/chrome/common/safe_browsing/protobuf_message_param_traits.h
index a935584d..76613ce 100644
--- a/chrome/common/safe_browsing/protobuf_message_param_traits.h
+++ b/chrome/common/safe_browsing/protobuf_message_param_traits.h
@@ -20,6 +20,12 @@
 struct ParamTraits<google::protobuf::RepeatedPtrField<Element>> {
   typedef google::protobuf::RepeatedPtrField<Element> param_type;
 
+  static void GetSize(base::PickleSizer* s, const param_type& p) {
+    GetParamSize(s, p.size());
+    for (const auto& element : p)
+      GetParamSize(s, element);
+  }
+
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.size());
     for (const auto& element : p)
diff --git a/chrome/common/safe_browsing/protobuf_message_size_macros.h b/chrome/common/safe_browsing/protobuf_message_size_macros.h
new file mode 100644
index 0000000..98be728
--- /dev/null
+++ b/chrome/common/safe_browsing/protobuf_message_size_macros.h
@@ -0,0 +1,31 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
+#define CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
+
+// Null out all the macros that need nulling.
+#include "chrome/common/safe_browsing/ipc_protobuf_message_null_macros.h"
+
+// Set up so next include will generate size methods.
+#undef IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN
+#undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER
+#undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER
+#undef IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER
+#undef IPC_PROTOBUF_MESSAGE_TRAITS_END
+
+#define IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN(message_name) \
+  void ParamTraits<message_name>::GetSize(base::PickleSizer* s, \
+                                          const param_type& p) {
+#define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER \
+  IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER
+#define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER(name) \
+  s->AddBool();                                                       \
+  if (p.has_##name())                                                 \
+    GetParamSize(s, p.name());
+#define IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER(name) \
+  GetParamSize(s, p.name());
+#define IPC_PROTOBUF_MESSAGE_TRAITS_END() }
+
+#endif  // CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
diff --git a/components/autofill/content/common/autofill_message_generator.cc b/components/autofill/content/common/autofill_message_generator.cc
index 0529172..4bc61d1 100644
--- a/components/autofill/content/common/autofill_message_generator.cc
+++ b/components/autofill/content/common/autofill_message_generator.cc
@@ -14,6 +14,14 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/autofill/content/common/autofill_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#undef COMPONENTS_AUTOFILL_CONTENT_COMMON_AUTOFILL_PARAM_TRAITS_MACROS_H_
+#include "components/autofill/content/common/autofill_message_generator.h"
+#include "components/autofill/content/common/autofill_param_traits_macros.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/cdm/common/cdm_message_generator.cc b/components/cdm/common/cdm_message_generator.cc
index 2aabce7..3c3e260 100644
--- a/components/cdm/common/cdm_message_generator.cc
+++ b/components/cdm/common/cdm_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/cdm/common/cdm_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/cdm/common/cdm_message_generator.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/content_settings/content/common/content_settings_message_generator.cc b/components/content_settings/content/common/content_settings_message_generator.cc
index 7e00666..0156c49 100644
--- a/components/content_settings/content/common/content_settings_message_generator.cc
+++ b/components/content_settings/content/common/content_settings_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/content_settings/content/common/content_settings_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/content_settings/content/common/content_settings_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/data_reduction_proxy/content/common/data_reduction_proxy_messages.cc b/components/data_reduction_proxy/content/common/data_reduction_proxy_messages.cc
index bfa8356a..d2a80bd 100644
--- a/components/data_reduction_proxy/content/common/data_reduction_proxy_messages.cc
+++ b/components/data_reduction_proxy/content/common/data_reduction_proxy_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/data_reduction_proxy/content/common/data_reduction_proxy_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/data_reduction_proxy/content/common/data_reduction_proxy_messages.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/guest_view/common/guest_view_message_generator.cc b/components/guest_view/common/guest_view_message_generator.cc
index 6a0bca1..a55a976a 100644
--- a/components/guest_view/common/guest_view_message_generator.cc
+++ b/components/guest_view/common/guest_view_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/guest_view/common/guest_view_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/guest_view/common/guest_view_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_host_messages.cc b/components/nacl/common/nacl_host_messages.cc
index 1b47272..37d6db6 100644
--- a/components/nacl/common/nacl_host_messages.cc
+++ b/components/nacl/common/nacl_host_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/nacl/common/nacl_host_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/nacl/common/nacl_host_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_messages.cc b/components/nacl/common/nacl_messages.cc
index 2140736..e1a5720e 100644
--- a/components/nacl/common/nacl_messages.cc
+++ b/components/nacl/common/nacl_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/nacl/common/nacl_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/nacl/common/nacl_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_renderer_messages.cc b/components/nacl/common/nacl_renderer_messages.cc
index 0950901..a703c1e 100644
--- a/components/nacl/common/nacl_renderer_messages.cc
+++ b/components/nacl/common/nacl_renderer_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/nacl/common/nacl_renderer_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/nacl/common/nacl_renderer_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_types_param_traits.cc b/components/nacl/common/nacl_types_param_traits.cc
index a295163..900975b 100644
--- a/components/nacl/common/nacl_types_param_traits.cc
+++ b/components/nacl/common/nacl_types_param_traits.cc
@@ -16,6 +16,13 @@
 #undef COMPONENTS_NACL_COMMON_NACL_TYPES_PARAM_TRAITS_H_
 #include "components/nacl/common/nacl_types_param_traits.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#undef COMPONENTS_NACL_COMMON_NACL_TYPES_PARAM_TRAITS_H_
+#include "components/nacl/common/nacl_types_param_traits.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/network_hints/common/network_hints_message_generator.cc b/components/network_hints/common/network_hints_message_generator.cc
index f315e98..594871a 100644
--- a/components/network_hints/common/network_hints_message_generator.cc
+++ b/components/network_hints/common/network_hints_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/network_hints/common/network_hints_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/network_hints/common/network_hints_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/page_load_metrics/common/page_load_metrics_messages.cc b/components/page_load_metrics/common/page_load_metrics_messages.cc
index a7990e7..07bdd98 100644
--- a/components/page_load_metrics/common/page_load_metrics_messages.cc
+++ b/components/page_load_metrics/common/page_load_metrics_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/page_load_metrics/common/page_load_metrics_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/page_load_metrics/common/page_load_metrics_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/pdf/common/pdf_message_generator.cc b/components/pdf/common/pdf_message_generator.cc
index 025d94c..3cd31df7 100644
--- a/components/pdf/common/pdf_message_generator.cc
+++ b/components/pdf/common/pdf_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/pdf/common/pdf_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/pdf/common/pdf_message_generator.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/printing/common/print_messages.cc b/components/printing/common/print_messages.cc
index e1a107a..6798e35 100644
--- a/components/printing/common/print_messages.cc
+++ b/components/printing/common/print_messages.cc
@@ -16,6 +16,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/printing/common/print_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/printing/common/print_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/startup_metric_utils/common/startup_metric_message_generator.cc b/components/startup_metric_utils/common/startup_metric_message_generator.cc
index dbd429c..5a9f19a 100644
--- a/components/startup_metric_utils/common/startup_metric_message_generator.cc
+++ b/components/startup_metric_utils/common/startup_metric_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/startup_metric_utils/common/startup_metric_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/startup_metric_utils/common/startup_metric_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/tracing/tracing_messages.cc b/components/tracing/tracing_messages.cc
index 3d7637a..7c6b789 100644
--- a/components/tracing/tracing_messages.cc
+++ b/components/tracing/tracing_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/tracing/tracing_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/tracing/tracing_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/translate/content/common/data_file_cld_data_provider_messages.cc b/components/translate/content/common/data_file_cld_data_provider_messages.cc
index bd23d23..f9b9876 100644
--- a/components/translate/content/common/data_file_cld_data_provider_messages.cc
+++ b/components/translate/content/common/data_file_cld_data_provider_messages.cc
@@ -18,6 +18,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/translate/content/common/data_file_cld_data_provider_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/translate/content/common/data_file_cld_data_provider_messages.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/translate/content/common/translate_messages.cc b/components/translate/content/common/translate_messages.cc
index 459248a..73a8661e 100644
--- a/components/translate/content/common/translate_messages.cc
+++ b/components/translate/content/common/translate_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/translate/content/common/translate_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/translate/content/common/translate_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/visitedlink/common/visitedlink_message_generator.cc b/components/visitedlink/common/visitedlink_message_generator.cc
index 29d31916..9ab374ed 100644
--- a/components/visitedlink/common/visitedlink_message_generator.cc
+++ b/components/visitedlink/common/visitedlink_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/visitedlink/common/visitedlink_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "components/visitedlink/common/visitedlink_message_generator.h"
+}  // namespace IPC
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/extensions/common/extension_message_generator.cc b/extensions/common/extension_message_generator.cc
index b066c4f..0ed6784 100644
--- a/extensions/common/extension_message_generator.cc
+++ b/extensions/common/extension_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "extensions/common/extension_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "extensions/common/extension_message_generator.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc
index 9f51c08e..243e4b95 100644
--- a/extensions/common/extension_messages.cc
+++ b/extensions/common/extension_messages.cc
@@ -121,6 +121,12 @@
   }
 };
 
+void ParamTraits<URLPattern>::GetSize(base::PickleSizer* s,
+                                      const param_type& p) {
+  GetParamSize(s, p.valid_schemes());
+  GetParamSize(s, p.GetAsString());
+}
+
 void ParamTraits<URLPattern>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.valid_schemes());
   WriteParam(m, p.GetAsString());
@@ -150,6 +156,11 @@
   LogParam(p.GetAsString(), l);
 }
 
+void ParamTraits<URLPatternSet>::GetSize(base::PickleSizer* s,
+                                         const param_type& p) {
+  GetParamSize(s, p.patterns());
+}
+
 void ParamTraits<URLPatternSet>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.patterns());
 }
@@ -171,6 +182,11 @@
   LogParam(p.patterns(), l);
 }
 
+void ParamTraits<APIPermission::ID>::GetSize(base::PickleSizer* s,
+                                             const param_type& p) {
+  GetParamSize(s, static_cast<int>(p));
+}
+
 void ParamTraits<APIPermission::ID>::Write(base::Pickle* m,
                                            const param_type& p) {
   WriteParam(m, static_cast<int>(p));
@@ -192,6 +208,17 @@
   LogParam(static_cast<int>(p), l);
 }
 
+void ParamTraits<APIPermissionSet>::GetSize(base::PickleSizer* s,
+                                            const param_type& p) {
+  APIPermissionSet::const_iterator it = p.begin();
+  const APIPermissionSet::const_iterator end = p.end();
+  GetParamSize(s, static_cast<uint32_t>(p.size()));
+  for (; it != end; ++it) {
+    GetParamSize(s, it->id());
+    it->GetSize(s);
+  }
+}
+
 void ParamTraits<APIPermissionSet>::Write(base::Pickle* m,
                                           const param_type& p) {
   APIPermissionSet::const_iterator it = p.begin();
@@ -230,6 +257,17 @@
   LogParam(p.map(), l);
 }
 
+void ParamTraits<ManifestPermissionSet>::GetSize(base::PickleSizer* s,
+                                                 const param_type& p) {
+  ManifestPermissionSet::const_iterator it = p.begin();
+  const ManifestPermissionSet::const_iterator end = p.end();
+  GetParamSize(s, static_cast<uint32_t>(p.size()));
+  for (; it != end; ++it) {
+    GetParamSize(s, it->name());
+    it->GetSize(s);
+  }
+}
+
 void ParamTraits<ManifestPermissionSet>::Write(base::Pickle* m,
                                                const param_type& p) {
   ManifestPermissionSet::const_iterator it = p.begin();
@@ -267,6 +305,11 @@
   LogParam(p.map(), l);
 }
 
+void ParamTraits<HostID>::GetSize(base::PickleSizer* s, const param_type& p) {
+  GetParamSize(s, p.type());
+  GetParamSize(s, p.id());
+}
+
 void ParamTraits<HostID>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.type());
   WriteParam(m, p.id());
@@ -291,6 +334,14 @@
   LogParam(p.id(), l);
 }
 
+void ParamTraits<ExtensionMsg_PermissionSetStruct>::GetSize(
+    base::PickleSizer* s, const param_type& p) {
+  GetParamSize(s, p.apis);
+  GetParamSize(s, p.manifest_permissions);
+  GetParamSize(s, p.explicit_hosts);
+  GetParamSize(s, p.scriptable_hosts);
+}
+
 void ParamTraits<ExtensionMsg_PermissionSetStruct>::Write(base::Pickle* m,
                                                           const param_type& p) {
   WriteParam(m, p.apis);
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h
index 8b3bce3..bd48626 100644
--- a/extensions/common/extension_messages.h
+++ b/extensions/common/extension_messages.h
@@ -306,6 +306,7 @@
 template <>
 struct ParamTraits<URLPattern> {
   typedef URLPattern param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -316,6 +317,7 @@
 template <>
 struct ParamTraits<extensions::URLPatternSet> {
   typedef extensions::URLPatternSet param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -326,6 +328,7 @@
 template <>
 struct ParamTraits<extensions::APIPermission::ID> {
   typedef extensions::APIPermission::ID param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -336,6 +339,7 @@
 template <>
 struct ParamTraits<extensions::APIPermissionSet> {
   typedef extensions::APIPermissionSet param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -346,6 +350,7 @@
 template <>
 struct ParamTraits<extensions::ManifestPermissionSet> {
   typedef extensions::ManifestPermissionSet param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -356,6 +361,7 @@
 template <>
 struct ParamTraits<HostID> {
   typedef HostID param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -366,6 +372,7 @@
 template <>
 struct ParamTraits<ExtensionMsg_PermissionSetStruct> {
   typedef ExtensionMsg_PermissionSetStruct param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/extensions/common/permissions/api_permission.cc b/extensions/common/permissions/api_permission.cc
index db84d8a..148fc8e 100644
--- a/extensions/common/permissions/api_permission.cc
+++ b/extensions/common/permissions/api_permission.cc
@@ -69,6 +69,8 @@
     return new SimpleAPIPermission(info());
   }
 
+  void GetSize(base::PickleSizer* s) const override {}
+
   void Write(base::Pickle* m) const override {}
 
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override {
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h
index a6069df..47aa5430 100644
--- a/extensions/common/permissions/api_permission.h
+++ b/extensions/common/permissions/api_permission.h
@@ -323,6 +323,9 @@
   virtual APIPermission* Intersect(const APIPermission* rhs) const = 0;
 
   // IPC functions
+  // Gets the size of the data to be written.
+  virtual void GetSize(base::PickleSizer* s) const = 0;
+
   // Writes this into the given IPC message |m|.
   virtual void Write(base::Pickle* m) const = 0;
 
diff --git a/extensions/common/permissions/manifest_permission.cc b/extensions/common/permissions/manifest_permission.cc
index c53f0f4..9315d1d 100644
--- a/extensions/common/permissions/manifest_permission.cc
+++ b/extensions/common/permissions/manifest_permission.cc
@@ -27,6 +27,13 @@
   return ToValue()->Equals(rhs->ToValue().get());
 }
 
+void ManifestPermission::GetSize(base::PickleSizer* s) const {
+  base::ListValue singleton;
+  base::Value* value = ToValue().release();
+  singleton.Append(value);
+  IPC::GetParamSize(s, singleton);
+}
+
 void ManifestPermission::Write(base::Pickle* m) const {
   base::ListValue singleton;
   base::Value* value = ToValue().release();
diff --git a/extensions/common/permissions/manifest_permission.h b/extensions/common/permissions/manifest_permission.h
index 98e4c230..aa05d5fb 100644
--- a/extensions/common/permissions/manifest_permission.h
+++ b/extensions/common/permissions/manifest_permission.h
@@ -68,6 +68,9 @@
   bool Equal(const ManifestPermission* rhs) const;
 
   // IPC functions
+  // Gets the size of the data to be written.
+  void GetSize(base::PickleSizer* s) const;
+
   // Writes this into the given IPC message |m|.
   void Write(base::Pickle* m) const;
 
diff --git a/extensions/common/permissions/set_disjunction_permission.h b/extensions/common/permissions/set_disjunction_permission.h
index d787d62..fedcf2c 100644
--- a/extensions/common/permissions/set_disjunction_permission.h
+++ b/extensions/common/permissions/set_disjunction_permission.h
@@ -152,6 +152,10 @@
     return std::unique_ptr<base::Value>(list);
   }
 
+  void GetSize(base::PickleSizer* s) const override {
+    IPC::GetParamSize(s, data_set_);
+  }
+
   void Write(base::Pickle* m) const override { IPC::WriteParam(m, data_set_); }
 
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override {
diff --git a/extensions/common/permissions/settings_override_permission.cc b/extensions/common/permissions/settings_override_permission.cc
index 4c7c4214..263f9dc 100644
--- a/extensions/common/permissions/settings_override_permission.cc
+++ b/extensions/common/permissions/settings_override_permission.cc
@@ -80,6 +80,8 @@
   return new SettingsOverrideAPIPermission(info(), setting_value_);
 }
 
+void SettingsOverrideAPIPermission::GetSize(base::PickleSizer* s) const {}
+
 void SettingsOverrideAPIPermission::Write(base::Pickle* m) const {}
 
 bool SettingsOverrideAPIPermission::Read(const base::Pickle* m,
diff --git a/extensions/common/permissions/settings_override_permission.h b/extensions/common/permissions/settings_override_permission.h
index e5bb9a0..66e92d6 100644
--- a/extensions/common/permissions/settings_override_permission.h
+++ b/extensions/common/permissions/settings_override_permission.h
@@ -33,6 +33,7 @@
   APIPermission* Diff(const APIPermission* rhs) const override;
   APIPermission* Union(const APIPermission* rhs) const override;
   APIPermission* Intersect(const APIPermission* rhs) const override;
+  void GetSize(base::PickleSizer* s) const override;
   void Write(base::Pickle* m) const override;
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override;
   void Log(std::string* log) const override;
diff --git a/gpu/ipc/common/gpu_message_generator.cc b/gpu/ipc/common/gpu_message_generator.cc
index ab8f4890..46a9d7f 100644
--- a/gpu/ipc/common/gpu_message_generator.cc
+++ b/gpu/ipc/common/gpu_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "gpu/ipc/common/gpu_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "gpu/ipc/common/gpu_message_generator.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/gpu/ipc/common/gpu_param_traits.cc b/gpu/ipc/common/gpu_param_traits.cc
index efc2987..b5f35b2 100644
--- a/gpu/ipc/common/gpu_param_traits.cc
+++ b/gpu/ipc/common/gpu_param_traits.cc
@@ -5,6 +5,13 @@
 // Get basic type definitions.
 #include "gpu/ipc/common/gpu_param_traits.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#undef GPU_IPC_COMMON_GPU_PARAM_TRAITS_MACROS_H_
+#include "gpu/ipc/common/gpu_param_traits_macros.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index 18a154f..f31add1 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -996,6 +996,14 @@
   ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
 }
 
+void ParamTraits<IPC::ChannelHandle>::GetSize(base::PickleSizer* sizer,
+                                              const param_type& p) {
+  GetParamSize(sizer, p.name);
+#if defined(OS_POSIX)
+  GetParamSize(sizer, p.socket);
+#endif
+}
+
 void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
                                             const param_type& p) {
 #if defined(OS_WIN)
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
index 0de489b..9848549 100644
--- a/ipc/ipc_message_utils.h
+++ b/ipc/ipc_message_utils.h
@@ -992,6 +992,7 @@
 template<>
 struct IPC_EXPORT ParamTraits<IPC::ChannelHandle> {
   typedef ChannelHandle param_type;
+  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/media/gpu/ipc/common/media_message_generator.cc b/media/gpu/ipc/common/media_message_generator.cc
index 9f3c3ab..6e8178ce 100644
--- a/media/gpu/ipc/common/media_message_generator.cc
+++ b/media/gpu/ipc/common/media_message_generator.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "media/gpu/ipc/common/media_message_generator.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "media/gpu/ipc/common/media_message_generator.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/media/gpu/ipc/common/media_messages.cc b/media/gpu/ipc/common/media_messages.cc
index d1916f3..0c3c6f7a 100644
--- a/media/gpu/ipc/common/media_messages.cc
+++ b/media/gpu/ipc/common/media_messages.cc
@@ -12,6 +12,20 @@
 
 namespace IPC {
 
+void ParamTraits<media::BitstreamBuffer>::GetSize(base::PickleSizer* s,
+                                                  const param_type& p) {
+  GetParamSize(s, p.id());
+  GetParamSize(s, static_cast<uint64_t>(p.size()));
+  GetParamSize(s, static_cast<uint64_t>(p.offset()));
+  GetParamSize(s, p.presentation_timestamp());
+  GetParamSize(s, p.key_id());
+  if (!p.key_id().empty()) {
+    GetParamSize(s, p.iv());
+    GetParamSize(s, p.subsamples());
+  }
+  GetParamSize(s, p.handle());
+}
+
 void ParamTraits<media::BitstreamBuffer>::Write(base::Pickle* m,
                                                 const param_type& p) {
   WriteParam(m, p.id());
diff --git a/media/gpu/ipc/common/media_messages.h b/media/gpu/ipc/common/media_messages.h
index 780e378..6c128a63 100644
--- a/media/gpu/ipc/common/media_messages.h
+++ b/media/gpu/ipc/common/media_messages.h
@@ -25,6 +25,7 @@
 template <>
 struct ParamTraits<media::BitstreamBuffer> {
   using param_type = media::BitstreamBuffer;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ppapi/proxy/ppapi_messages.cc b/ppapi/proxy/ppapi_messages.cc
index 5cee1c7..6ed361b2 100644
--- a/ppapi/proxy/ppapi_messages.cc
+++ b/ppapi/proxy/ppapi_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "ppapi/proxy/ppapi_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "ppapi/proxy/ppapi_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ppapi/proxy/ppapi_param_traits.cc b/ppapi/proxy/ppapi_param_traits.cc
index 9d21eac1..d55f5758 100644
--- a/ppapi/proxy/ppapi_param_traits.cc
+++ b/ppapi/proxy/ppapi_param_traits.cc
@@ -79,6 +79,11 @@
 // PP_Bool ---------------------------------------------------------------------
 
 // static
+void ParamTraits<PP_Bool>::GetSize(base::PickleSizer* s, const param_type& p) {
+  GetParamSize(s, PP_ToBool(p));
+}
+
+// static
 void ParamTraits<PP_Bool>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, PP_ToBool(p));
 }
@@ -151,6 +156,13 @@
 // PP_NetAddress_Private -------------------------------------------------------
 
 // static
+void ParamTraits<PP_NetAddress_Private>::GetSize(base::PickleSizer* s,
+                                                 const param_type& p) {
+  GetParamSize(s, p.size);
+  s->AddBytes(static_cast<int>(p.size));
+}
+
+// static
 void ParamTraits<PP_NetAddress_Private>::Write(base::Pickle* m,
                                                const param_type& p) {
   WriteParam(m, p.size);
@@ -186,6 +198,13 @@
 // HostResource ----------------------------------------------------------------
 
 // static
+void ParamTraits<ppapi::HostResource>::GetSize(base::PickleSizer* s,
+                                               const param_type& p) {
+  GetParamSize(s, p.instance());
+  GetParamSize(s, p.host_resource());
+}
+
+// static
 void ParamTraits<ppapi::HostResource>::Write(base::Pickle* m,
                                              const param_type& p) {
   WriteParam(m, p.instance());
@@ -253,6 +272,13 @@
 
 // ppapi::PpapiPermissions -----------------------------------------------------
 
+// static
+void ParamTraits<ppapi::PpapiPermissions>::GetSize(base::PickleSizer* s,
+                                                   const param_type& p) {
+  GetParamSize(s, p.GetBits());
+}
+
+// static
 void ParamTraits<ppapi::PpapiPermissions>::Write(base::Pickle* m,
                                                  const param_type& p) {
   WriteParam(m, p.GetBits());
@@ -675,6 +701,13 @@
 // ppapi::CompositorLayerData --------------------------------------------------
 
 // static
+void ParamTraits<ppapi::CompositorLayerData::Transform>::GetSize(
+    base::PickleSizer* s, const param_type& p) {
+  for (size_t i = 0; i < arraysize(p.matrix); i++)
+    GetParamSize(s, p.matrix[i]);
+}
+
+// static
 void ParamTraits<ppapi::CompositorLayerData::Transform>::Write(
     base::Pickle* m,
     const param_type& p) {
diff --git a/ppapi/proxy/ppapi_param_traits.h b/ppapi/proxy/ppapi_param_traits.h
index 6996547..75d4529f4 100644
--- a/ppapi/proxy/ppapi_param_traits.h
+++ b/ppapi/proxy/ppapi_param_traits.h
@@ -49,6 +49,7 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<PP_Bool> {
   typedef PP_Bool param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -59,6 +60,7 @@
 template <>
 struct PPAPI_PROXY_EXPORT ParamTraits<PP_NetAddress_Private> {
   typedef PP_NetAddress_Private param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -142,6 +144,7 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::HostResource> {
   typedef ppapi::HostResource param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -173,6 +176,7 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::PpapiPermissions> {
   typedef ppapi::PpapiPermissions param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -225,6 +229,7 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::CompositorLayerData::Transform> {
   typedef ppapi::CompositorLayerData::Transform param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/remoting/host/chromoting_messages.cc b/remoting/host/chromoting_messages.cc
index 36c3cf4..174bebe 100644
--- a/remoting/host/chromoting_messages.cc
+++ b/remoting/host/chromoting_messages.cc
@@ -14,6 +14,12 @@
 #include "ipc/struct_destructor_macros.h"
 #include "remoting/host/chromoting_messages.h"
 
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#include "remoting/host/chromoting_messages.h"
+}
+
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/remoting/host/chromoting_param_traits.cc b/remoting/host/chromoting_param_traits.cc
index a440c34..a19345a 100644
--- a/remoting/host/chromoting_param_traits.cc
+++ b/remoting/host/chromoting_param_traits.cc
@@ -13,6 +13,13 @@
 namespace IPC {
 
 // static
+void ParamTraits<webrtc::DesktopVector>::GetSize(base::PickleSizer* s,
+                                                 const param_type& p) {
+  GetParamSize(s, p.x());
+  GetParamSize(s, p.y());
+}
+
+// static
 void ParamTraits<webrtc::DesktopVector>::Write(base::Pickle* m,
                                                const webrtc::DesktopVector& p) {
   m->WriteInt(p.x());
@@ -38,6 +45,13 @@
 }
 
 // static
+void ParamTraits<webrtc::DesktopSize>::GetSize(base::PickleSizer* s,
+                                               const param_type& p) {
+  GetParamSize(s, p.width());
+  GetParamSize(s, p.height());
+}
+
+// static
 void ParamTraits<webrtc::DesktopSize>::Write(base::Pickle* m,
                                              const webrtc::DesktopSize& p) {
   m->WriteInt(p.width());
@@ -63,6 +77,15 @@
 }
 
 // static
+void ParamTraits<webrtc::DesktopRect>::GetSize(base::PickleSizer* s,
+                                               const param_type& p) {
+  GetParamSize(s, p.left());
+  GetParamSize(s, p.top());
+  GetParamSize(s, p.right());
+  GetParamSize(s, p.bottom());
+}
+
+// static
 void ParamTraits<webrtc::DesktopRect>::Write(base::Pickle* m,
                                              const webrtc::DesktopRect& p) {
   m->WriteInt(p.left());
@@ -190,6 +213,12 @@
 }
 
 // static
+void ParamTraits<net::IPAddress>::GetSize(base::PickleSizer* s,
+                                          const param_type& p) {
+  GetParamSize(s, p.bytes());
+}
+
+// static
 void ParamTraits<net::IPAddress>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.bytes());
 }
@@ -216,6 +245,13 @@
 }
 
 // static
+void ParamTraits<net::IPEndPoint>::GetSize(base::PickleSizer* s,
+                                           const param_type& p) {
+  GetParamSize(s, p.address());
+  GetParamSize(s, p.port());
+}
+
+// static
 void ParamTraits<net::IPEndPoint>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.address());
   WriteParam(m, p.port());
diff --git a/remoting/host/chromoting_param_traits.h b/remoting/host/chromoting_param_traits.h
index 2ca0baf..290a5cf 100644
--- a/remoting/host/chromoting_param_traits.h
+++ b/remoting/host/chromoting_param_traits.h
@@ -19,6 +19,7 @@
 template <>
 struct ParamTraits<webrtc::DesktopVector> {
   typedef webrtc::DesktopVector param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -29,6 +30,7 @@
 template <>
 struct ParamTraits<webrtc::DesktopSize> {
   typedef webrtc::DesktopSize param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -39,6 +41,7 @@
 template <>
 struct ParamTraits<webrtc::DesktopRect> {
   typedef webrtc::DesktopRect param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -69,6 +72,7 @@
 template <>
 struct ParamTraits<net::IPAddress> {
   typedef net::IPAddress param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -79,6 +83,7 @@
 template <>
 struct ParamTraits<net::IPEndPoint> {
   typedef net::IPEndPoint param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,