summaryrefslogtreecommitdiffstats
path: root/patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch')
-rw-r--r--patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch653
1 files changed, 653 insertions, 0 deletions
diff --git a/patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch b/patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch
new file mode 100644
index 000000000..ce3d9bb30
--- /dev/null
+++ b/patches/chromium/0003-Clang-libc-does-not-support-incomplete-types-in-temp.patch
@@ -0,0 +1,653 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zeno Albisser <zeno.albisser@digia.com>
+Date: Thu, 27 Jun 2013 15:58:32 +0200
+Subject: Clang / libc++ does not support incomplete types in templates. See:
+ http://clang.llvm.org/compatibility.html#undep_incomplete
+
+Therefore forward declarations must be removed in several places:
+- AudioBus::QueuedAudioBuffer
+- base::Callback
+- GURL
+- HttpAuthCache::Entry
+- ImageFamily::MapKey
+- MediaStreamDispatcher::Request
+- MediaStreamDispatcher::Stream
+- MediaStreamDispatcherHost::StreamRequest
+- MessagePortService::MessagePort
+- MockCertVerifier::Rule
+- PepperRendererInstanceData
+- RuleBasedHostResolverProc::Rule
+- WebURLError
+- WebURLLoaderMockFactory::ResponseInfo
+- WorkerDevToolsManager::InspectedWorker
+- WorkerDevToolsManager::TerminatedInspectedWorker
+---
+ base/callback_forward.h | 9 +-----
+ .../browser/devtools/worker_devtools_manager.cc | 24 ----------------
+ content/browser/devtools/worker_devtools_manager.h | 26 ++++++++++++++++--
+ .../media/media_stream_dispatcher_host.cc | 11 --------
+ .../media/media_stream_dispatcher_host.h | 12 +++++++-
+ .../browser/worker_host/message_port_service.cc | 22 ---------------
+ content/browser/worker_host/message_port_service.h | 23 +++++++++++++++-
+ content/common/gpu/gpu_messages.h | 4 ++-
+ content/renderer/media/media_stream_dispatcher.cc | 31 ---------------------
+ content/renderer/media/media_stream_dispatcher.h | 31 +++++++++++++++++++--
+ content/renderer/pepper/message_channel.cc | 12 --------
+ content/renderer/pepper/message_channel.h | 18 ++++++++----
+ gpu/config/dx_diag_node.cc | 4 +++
+ gpu/config/dx_diag_node.h | 4 +++
+ media/filters/ffmpeg_audio_decoder.cc | 6 ----
+ media/filters/ffmpeg_audio_decoder.h | 8 +++++-
+ net/cert/mock_cert_verifier.cc | 19 -------------
+ net/cert/mock_cert_verifier.h | 20 +++++++++++++-
+ net/dns/mock_host_resolver.cc | 31 ---------------------
+ net/dns/mock_host_resolver.h | 32 +++++++++++++++++++++-
+ 20 files changed, 168 insertions(+), 179 deletions(-)
+
+diff --git a/base/callback_forward.h b/base/callback_forward.h
+index 7983248..8538bb2 100644
+--- a/base/callback_forward.h
++++ b/base/callback_forward.h
+@@ -5,13 +5,6 @@
+ #ifndef BASE_CALLBACK_FORWARD_H_
+ #define BASE_CALLBACK_FORWARD_H_
+
+-namespace base {
+-
+-template <typename Sig>
+-class Callback;
+-
+-typedef Callback<void(void)> Closure;
+-
+-} // namespace base
++#include "base/callback.h"
+
+ #endif // BASE_CALLBACK_FORWARD_H
+diff --git a/content/browser/devtools/worker_devtools_manager.cc b/content/browser/devtools/worker_devtools_manager.cc
+index f08523b..983c55c 100644
+--- a/content/browser/devtools/worker_devtools_manager.cc
++++ b/content/browser/devtools/worker_devtools_manager.cc
+@@ -51,17 +51,6 @@ base::LazyInstance<AgentHosts>::Leaky g_orphan_map = LAZY_INSTANCE_INITIALIZER;
+
+ } // namespace
+
+-struct WorkerDevToolsManager::TerminatedInspectedWorker {
+- TerminatedInspectedWorker(WorkerId id, const GURL& url, const string16& name)
+- : old_worker_id(id),
+- worker_url(url),
+- worker_name(name) {}
+- WorkerId old_worker_id;
+- GURL worker_url;
+- string16 worker_name;
+-};
+-
+-
+ class WorkerDevToolsManager::WorkerDevToolsAgentHost
+ : public IPCDevToolsAgentHost {
+ public:
+@@ -200,19 +189,6 @@ class WorkerDevToolsManager::DetachedClientHosts {
+ }
+ };
+
+-struct WorkerDevToolsManager::InspectedWorker {
+- InspectedWorker(WorkerProcessHost* host, int route_id, const GURL& url,
+- const string16& name)
+- : host(host),
+- route_id(route_id),
+- worker_url(url),
+- worker_name(name) {}
+- WorkerProcessHost* const host;
+- int const route_id;
+- GURL worker_url;
+- string16 worker_name;
+-};
+-
+ // static
+ WorkerDevToolsManager* WorkerDevToolsManager::GetInstance() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+diff --git a/content/browser/devtools/worker_devtools_manager.h b/content/browser/devtools/worker_devtools_manager.h
+index 8a9a708..e6d090c 100644
+--- a/content/browser/devtools/worker_devtools_manager.h
++++ b/content/browser/devtools/worker_devtools_manager.h
+@@ -54,7 +54,20 @@ class WorkerDevToolsManager {
+ private:
+ friend struct DefaultSingletonTraits<WorkerDevToolsManager>;
+ class DetachedClientHosts;
+- struct InspectedWorker;
++
++ struct InspectedWorker {
++ InspectedWorker(WorkerProcessHost* host, int route_id, const GURL& url,
++ const string16& name)
++ : host(host),
++ route_id(route_id),
++ worker_url(url),
++ worker_name(name) {}
++ WorkerProcessHost* const host;
++ int const route_id;
++ GURL worker_url;
++ string16 worker_name;
++ };
++
+ typedef std::list<InspectedWorker> InspectedWorkersList;
+
+ WorkerDevToolsManager();
+@@ -84,7 +97,16 @@ class WorkerDevToolsManager {
+
+ InspectedWorkersList inspected_workers_;
+
+- struct TerminatedInspectedWorker;
++ struct TerminatedInspectedWorker {
++ TerminatedInspectedWorker(WorkerId id, const GURL& url, const string16& name)
++ : old_worker_id(id),
++ worker_url(url),
++ worker_name(name) {}
++ WorkerId old_worker_id;
++ GURL worker_url;
++ string16 worker_name;
++ };
++
+ typedef std::list<TerminatedInspectedWorker> TerminatedInspectedWorkers;
+ // List of terminated workers for which there may be a devtools client on
+ // the UI thread. Worker entry is added into this list when inspected worker
+diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+index ebc4d89..9135b71 100644
+--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
++++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+@@ -12,17 +12,6 @@
+
+ namespace content {
+
+-struct MediaStreamDispatcherHost::StreamRequest {
+- StreamRequest() : render_view_id(0), page_request_id(0) {}
+- StreamRequest(int render_view_id, int page_request_id)
+- : render_view_id(render_view_id),
+- page_request_id(page_request_id ) {
+- }
+- int render_view_id;
+- // Id of the request generated by MediaStreamDispatcher.
+- int page_request_id;
+-};
+-
+ MediaStreamDispatcherHost::MediaStreamDispatcherHost(
+ int render_process_id,
+ MediaStreamManager* media_stream_manager)
+diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.h b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
+index ec1dd15..cfc6913 100644
+--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.h
++++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
+@@ -72,7 +72,17 @@ class CONTENT_EXPORT MediaStreamDispatcherHost : public BrowserMessageFilter,
+ int render_process_id_;
+ MediaStreamManager* media_stream_manager_;
+
+- struct StreamRequest;
++ struct StreamRequest {
++ StreamRequest() : render_view_id(0), page_request_id(0) {}
++ StreamRequest(int render_view_id, int page_request_id)
++ : render_view_id(render_view_id),
++ page_request_id(page_request_id ) {
++ }
++ int render_view_id;
++ // Id of the request generated by MediaStreamDispatcher.
++ int page_request_id;
++ };
++
+ typedef std::map<std::string, StreamRequest> StreamMap;
+ // Streams generated for this host.
+ StreamMap streams_;
+diff --git a/content/browser/worker_host/message_port_service.cc b/content/browser/worker_host/message_port_service.cc
+index 3bc8f5a..b413c1f 100644
+--- a/content/browser/worker_host/message_port_service.cc
++++ b/content/browser/worker_host/message_port_service.cc
+@@ -9,28 +9,6 @@
+
+ namespace content {
+
+-struct MessagePortService::MessagePort {
+- // |filter| and |route_id| are what we need to send messages to the port.
+- // |filter| is just a weak pointer since we get notified when its process has
+- // gone away and remove it.
+- WorkerMessageFilter* filter;
+- int route_id;
+- // A globally unique id for this message port.
+- int message_port_id;
+- // The globally unique id of the entangled message port.
+- int entangled_message_port_id;
+- // If true, all messages to this message port are queued and not delivered.
+- // This is needed so that when a message port is sent between processes all
+- // pending message get transferred. There are two possibilities for pending
+- // messages: either they are already received by the child process, or they're
+- // in-flight. This flag ensures that the latter type get flushed through the
+- // system.
+- // This flag should only be set to true in response to
+- // WorkerProcessHostMsg_QueueMessages.
+- bool queue_messages;
+- QueuedMessages queued_messages;
+-};
+-
+ MessagePortService* MessagePortService::GetInstance() {
+ return Singleton<MessagePortService>::get();
+ }
+diff --git a/content/browser/worker_host/message_port_service.h b/content/browser/worker_host/message_port_service.h
+index b85e76b..30645c7 100644
+--- a/content/browser/worker_host/message_port_service.h
++++ b/content/browser/worker_host/message_port_service.h
+@@ -61,7 +61,28 @@ class MessagePortService {
+ // verify that the message port id exists.
+ void Erase(int message_port_id);
+
+- struct MessagePort;
++ struct MessagePort {
++ // |filter| and |route_id| are what we need to send messages to the port.
++ // |filter| is just a weak pointer since we get notified when its process has
++ // gone away and remove it.
++ WorkerMessageFilter* filter;
++ int route_id;
++ // A globally unique id for this message port.
++ int message_port_id;
++ // The globally unique id of the entangled message port.
++ int entangled_message_port_id;
++ // If true, all messages to this message port are queued and not delivered.
++ // This is needed so that when a message port is sent between processes all
++ // pending message get transferred. There are two possibilities for pending
++ // messages: either they are already received by the child process, or they're
++ // in-flight. This flag ensures that the latter type get flushed through the
++ // system.
++ // This flag should only be set to true in response to
++ // WorkerProcessHostMsg_QueueMessages.
++ bool queue_messages;
++ QueuedMessages queued_messages;
++ };
++
+ typedef std::map<int, MessagePort> MessagePorts;
+ MessagePorts message_ports_;
+
+diff --git a/content/common/gpu/gpu_messages.h b/content/common/gpu/gpu_messages.h
+index b4e5be5..3952d79 100644
+--- a/content/common/gpu/gpu_messages.h
++++ b/content/common/gpu/gpu_messages.h
+@@ -116,10 +116,12 @@ IPC_STRUCT_BEGIN(GpuStreamTextureMsg_MatrixChanged_Params)
+ IPC_STRUCT_END()
+ #endif
+
+- IPC_STRUCT_TRAITS_BEGIN(gpu::DxDiagNode)
++#if defined(OS_WIN)
++IPC_STRUCT_TRAITS_BEGIN(gpu::DxDiagNode)
+ IPC_STRUCT_TRAITS_MEMBER(values)
+ IPC_STRUCT_TRAITS_MEMBER(children)
+ IPC_STRUCT_TRAITS_END()
++#endif
+
+ IPC_STRUCT_TRAITS_BEGIN(gpu::GpuPerformanceStats)
+ IPC_STRUCT_TRAITS_MEMBER(graphics)
+diff --git a/content/renderer/media/media_stream_dispatcher.cc b/content/renderer/media/media_stream_dispatcher.cc
+index cc241fa..57d65b6 100644
+--- a/content/renderer/media/media_stream_dispatcher.cc
++++ b/content/renderer/media/media_stream_dispatcher.cc
+@@ -14,37 +14,6 @@
+
+ namespace content {
+
+-// A request is identified by pair (request_id, handler), or ipc_request.
+-// There could be multiple clients making requests and each has its own
+-// request_id sequence.
+-// The ipc_request is garanteed to be unique when it's created in
+-// MediaStreamDispatcher.
+-struct MediaStreamDispatcher::Request {
+- Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
+- int request_id,
+- int ipc_request)
+- : handler(handler),
+- request_id(request_id),
+- ipc_request(ipc_request) {
+- }
+- bool IsThisRequest(
+- int request_id1,
+- const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) {
+- return (request_id1 == request_id && handler1.get() == handler.get());
+- }
+- base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
+- int request_id;
+- int ipc_request;
+-};
+-
+-struct MediaStreamDispatcher::Stream {
+- Stream() {}
+- ~Stream() {}
+- base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
+- StreamDeviceInfoArray audio_array;
+- StreamDeviceInfoArray video_array;
+-};
+-
+ MediaStreamDispatcher::EnumerationRequest::EnumerationRequest(
+ const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
+ int request_id)
+diff --git a/content/renderer/media/media_stream_dispatcher.h b/content/renderer/media/media_stream_dispatcher.h
+index aa8f345..af25963 100644
+--- a/content/renderer/media/media_stream_dispatcher.h
++++ b/content/renderer/media/media_stream_dispatcher.h
+@@ -98,11 +98,38 @@ class CONTENT_EXPORT MediaStreamDispatcher
+ FRIEND_TEST_ALL_PREFIXES(MediaStreamDispatcherTest, TestFailure);
+ FRIEND_TEST_ALL_PREFIXES(MediaStreamDispatcherTest, CancelGenerateStream);
+
+- struct Request;
++ // A request is identified by pair (request_id, handler), or ipc_request.
++ // There could be multiple clients making requests and each has its own
++ // request_id sequence.
++ // The ipc_request is garanteed to be unique when it's created in
++ // MediaStreamDispatcher.
++ struct Request {
++ Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
++ int request_id,
++ int ipc_request)
++ : handler(handler),
++ request_id(request_id),
++ ipc_request(ipc_request) {
++ }
++ bool IsThisRequest(
++ int request_id1,
++ const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) {
++ return (request_id1 == request_id && handler1.get() == handler.get());
++ }
++ base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
++ int request_id;
++ int ipc_request;
++ };
+
+ // Private class for keeping track of opened devices and who have
+ // opened it.
+- struct Stream;
++ struct Stream {
++ Stream() {}
++ ~Stream() {}
++ base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
++ StreamDeviceInfoArray audio_array;
++ StreamDeviceInfoArray video_array;
++ };
+
+ // An enumeration request is identified by pair (request_id, handler).
+ // It allows multiple clients to make requests and each client could have
+diff --git a/content/renderer/pepper/message_channel.cc b/content/renderer/pepper/message_channel.cc
+index f06b787..c41be2f 100644
+--- a/content/renderer/pepper/message_channel.cc
++++ b/content/renderer/pepper/message_channel.cc
+@@ -279,18 +279,6 @@ NPClass message_channel_class = {
+ } // namespace
+
+ // MessageChannel --------------------------------------------------------------
+-struct MessageChannel::VarConversionResult {
+- VarConversionResult(const ppapi::ScopedPPVar& r, bool s)
+- : result(r),
+- success(s),
+- conversion_completed(true) {}
+- VarConversionResult()
+- : success(false),
+- conversion_completed(false) {}
+- ppapi::ScopedPPVar result;
+- bool success;
+- bool conversion_completed;
+-};
+
+ MessageChannel::MessageChannelNPObject::MessageChannelNPObject() {
+ }
+diff --git a/content/renderer/pepper/message_channel.h b/content/renderer/pepper/message_channel.h
+index 9c8c28d..e4e1423 100644
+--- a/content/renderer/pepper/message_channel.h
++++ b/content/renderer/pepper/message_channel.h
+@@ -10,15 +10,12 @@
+
+ #include "base/memory/weak_ptr.h"
+ #include "ppapi/shared_impl/resource.h"
++#include "ppapi/shared_impl/scoped_pp_var.h"
+ #include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
+ #include "third_party/npapi/bindings/npruntime.h"
+
+ struct PP_Var;
+
+-namespace ppapi {
+-class ScopedPPVar;
+-}
+-
+ namespace content {
+
+ class PepperPluginInstanceImpl;
+@@ -86,7 +83,18 @@ class MessageChannel {
+
+ private:
+ // Struct for storing the result of a NPVariant being converted to a PP_Var.
+- struct VarConversionResult;
++ struct VarConversionResult {
++ VarConversionResult(const ppapi::ScopedPPVar& r, bool s)
++ : result(r),
++ success(s),
++ conversion_completed(true) {}
++ VarConversionResult()
++ : success(false),
++ conversion_completed(false) {}
++ ppapi::ScopedPPVar result;
++ bool success;
++ bool conversion_completed;
++ };
+
+ // This is called when an NPVariant is finished being converted.
+ // |result_iteartor| is an iterator into |converted_var_queue_| where the
+diff --git a/gpu/config/dx_diag_node.cc b/gpu/config/dx_diag_node.cc
+index e0902ca..c1e84ae 100644
+--- a/gpu/config/dx_diag_node.cc
++++ b/gpu/config/dx_diag_node.cc
+@@ -4,6 +4,8 @@
+
+ #include "gpu/config/dx_diag_node.h"
+
++#if defined(OS_WIN)
++
+ namespace gpu {
+
+ DxDiagNode::DxDiagNode() {}
+@@ -11,3 +13,5 @@ DxDiagNode::DxDiagNode() {}
+ DxDiagNode::~DxDiagNode() {}
+
+ } // namespace gpu
++
++#endif // defined(OS_WIN)
+diff --git a/gpu/config/dx_diag_node.h b/gpu/config/dx_diag_node.h
+index 33d29b3..45ffa65 100644
+--- a/gpu/config/dx_diag_node.h
++++ b/gpu/config/dx_diag_node.h
+@@ -8,6 +8,8 @@
+ #ifndef GPU_CONFIG_DX_DIAG_NODE_H_
+ #define GPU_CONFIG_DX_DIAG_NODE_H_
+
++#if defined(OS_WIN)
++
+ #include <map>
+ #include <string>
+
+@@ -24,4 +26,6 @@ struct GPU_EXPORT DxDiagNode {
+
+ } // namespace gpu
+
++#endif // defined(OS_WIN)
++
+ #endif // GPU_CONFIG_DX_DIAG_NODE_H_
+diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
+index f922e98..f41c893 100644
+--- a/media/filters/ffmpeg_audio_decoder.cc
++++ b/media/filters/ffmpeg_audio_decoder.cc
+@@ -22,12 +22,6 @@
+
+ namespace media {
+
+-// Helper structure for managing multiple decoded audio frames per packet.
+-struct QueuedAudioBuffer {
+- AudioDecoder::Status status;
+- scoped_refptr<AudioBuffer> buffer;
+-};
+-
+ // Returns true if the decode result was end of stream.
+ static inline bool IsEndOfStream(int result,
+ int decoded_size,
+diff --git a/media/filters/ffmpeg_audio_decoder.h b/media/filters/ffmpeg_audio_decoder.h
+index 7ea8615..44c9830 100644
+--- a/media/filters/ffmpeg_audio_decoder.h
++++ b/media/filters/ffmpeg_audio_decoder.h
+@@ -25,7 +25,13 @@ namespace media {
+
+ class AudioTimestampHelper;
+ class DecoderBuffer;
+-struct QueuedAudioBuffer;
++
++// Helper structure for managing multiple decoded audio frames per packet.
++struct QueuedAudioBuffer {
++ AudioDecoder::Status status;
++ scoped_refptr<AudioBuffer> buffer;
++};
++
+
+ class MEDIA_EXPORT FFmpegAudioDecoder : public AudioDecoder {
+ public:
+diff --git a/net/cert/mock_cert_verifier.cc b/net/cert/mock_cert_verifier.cc
+index ea5538e..a30e3d5 100644
+--- a/net/cert/mock_cert_verifier.cc
++++ b/net/cert/mock_cert_verifier.cc
+@@ -13,25 +13,6 @@
+
+ namespace net {
+
+-struct MockCertVerifier::Rule {
+- Rule(X509Certificate* cert,
+- const std::string& hostname,
+- const CertVerifyResult& result,
+- int rv)
+- : cert(cert),
+- hostname(hostname),
+- result(result),
+- rv(rv) {
+- DCHECK(cert);
+- DCHECK(result.verified_cert.get());
+- }
+-
+- scoped_refptr<X509Certificate> cert;
+- std::string hostname;
+- CertVerifyResult result;
+- int rv;
+-};
+-
+ MockCertVerifier::MockCertVerifier() : default_result_(ERR_CERT_INVALID) {}
+
+ MockCertVerifier::~MockCertVerifier() {}
+diff --git a/net/cert/mock_cert_verifier.h b/net/cert/mock_cert_verifier.h
+index 5af7b7e..704c66b 100644
+--- a/net/cert/mock_cert_verifier.h
++++ b/net/cert/mock_cert_verifier.h
+@@ -57,7 +57,25 @@ class MockCertVerifier : public CertVerifier {
+ int rv);
+
+ private:
+- struct Rule;
++ struct Rule {
++ Rule(X509Certificate* cert,
++ const std::string& hostname,
++ const CertVerifyResult& result,
++ int rv)
++ : cert(cert),
++ hostname(hostname),
++ result(result),
++ rv(rv) {
++ DCHECK(cert);
++ DCHECK(result.verified_cert.get());
++ }
++
++ scoped_refptr<X509Certificate> cert;
++ std::string hostname;
++ CertVerifyResult result;
++ int rv;
++ };
++
+ typedef std::list<Rule> RuleList;
+
+ int default_result_;
+diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc
+index ff5ffbc..25918ba 100644
+--- a/net/dns/mock_host_resolver.cc
++++ b/net/dns/mock_host_resolver.cc
+@@ -212,37 +212,6 @@ void MockHostResolverBase::ResolveNow(size_t id) {
+
+ //-----------------------------------------------------------------------------
+
+-struct RuleBasedHostResolverProc::Rule {
+- enum ResolverType {
+- kResolverTypeFail,
+- kResolverTypeSystem,
+- kResolverTypeIPLiteral,
+- };
+-
+- ResolverType resolver_type;
+- std::string host_pattern;
+- AddressFamily address_family;
+- HostResolverFlags host_resolver_flags;
+- std::string replacement;
+- std::string canonical_name;
+- int latency_ms; // In milliseconds.
+-
+- Rule(ResolverType resolver_type,
+- const std::string& host_pattern,
+- AddressFamily address_family,
+- HostResolverFlags host_resolver_flags,
+- const std::string& replacement,
+- const std::string& canonical_name,
+- int latency_ms)
+- : resolver_type(resolver_type),
+- host_pattern(host_pattern),
+- address_family(address_family),
+- host_resolver_flags(host_resolver_flags),
+- replacement(replacement),
+- canonical_name(canonical_name),
+- latency_ms(latency_ms) {}
+-};
+-
+ RuleBasedHostResolverProc::RuleBasedHostResolverProc(HostResolverProc* previous)
+ : HostResolverProc(previous) {
+ }
+diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h
+index 3593fbd..f8a4240 100644
+--- a/net/dns/mock_host_resolver.h
++++ b/net/dns/mock_host_resolver.h
+@@ -209,7 +209,37 @@ class RuleBasedHostResolverProc : public HostResolverProc {
+ int* os_error) OVERRIDE;
+
+ private:
+- struct Rule;
++ struct Rule {
++ enum ResolverType {
++ kResolverTypeFail,
++ kResolverTypeSystem,
++ kResolverTypeIPLiteral,
++ };
++
++ ResolverType resolver_type;
++ std::string host_pattern;
++ AddressFamily address_family;
++ HostResolverFlags host_resolver_flags;
++ std::string replacement;
++ std::string canonical_name;
++ int latency_ms; // In milliseconds.
++
++ Rule(ResolverType resolver_type,
++ const std::string& host_pattern,
++ AddressFamily address_family,
++ HostResolverFlags host_resolver_flags,
++ const std::string& replacement,
++ const std::string& canonical_name,
++ int latency_ms)
++ : resolver_type(resolver_type),
++ host_pattern(host_pattern),
++ address_family(address_family),
++ host_resolver_flags(host_resolver_flags),
++ replacement(replacement),
++ canonical_name(canonical_name),
++ latency_ms(latency_ms) {}
++ };
++
+ typedef std::list<Rule> RuleList;
+
+ virtual ~RuleBasedHostResolverProc();