| Index: ppapi/cpp/udp_socket.cc
 | 
| diff --git a/ppapi/cpp/udp_socket.cc b/ppapi/cpp/udp_socket.cc
 | 
| index 2f8c505df5899db8a43d4d055cc1c8f791a6fa7d..19d2894775cec42fbbc1cb54e53d5358ddfd00e0 100644
 | 
| --- a/ppapi/cpp/udp_socket.cc
 | 
| +++ b/ppapi/cpp/udp_socket.cc
 | 
| @@ -22,13 +22,20 @@ template <> const char* interface_name<PPB_UDPSocket_1_1>() {
 | 
|    return PPB_UDPSOCKET_INTERFACE_1_1;
 | 
|  }
 | 
|  
 | 
| +template <> const char* interface_name<PPB_UDPSocket_1_2>() {
 | 
| +  return PPB_UDPSOCKET_INTERFACE_1_2;
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  UDPSocket::UDPSocket() {
 | 
|  }
 | 
|  
 | 
|  UDPSocket::UDPSocket(const InstanceHandle& instance) {
 | 
| -  if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    PassRefFromConstructor(get_interface<PPB_UDPSocket_1_2>()->Create(
 | 
| +        instance.pp_instance()));
 | 
| +  } else if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      PassRefFromConstructor(get_interface<PPB_UDPSocket_1_1>()->Create(
 | 
|          instance.pp_instance()));
 | 
|    } else if (has_interface<PPB_UDPSocket_1_0>()) {
 | 
| @@ -54,12 +61,17 @@ UDPSocket& UDPSocket::operator=(const UDPSocket& other) {
 | 
|  
 | 
|  // static
 | 
|  bool UDPSocket::IsAvailable() {
 | 
| -  return has_interface<PPB_UDPSocket_1_1>() ||
 | 
| +  return has_interface<PPB_UDPSocket_1_2>() ||
 | 
| +         has_interface<PPB_UDPSocket_1_1>() ||
 | 
|           has_interface<PPB_UDPSocket_1_0>();
 | 
|  }
 | 
|  
 | 
|  int32_t UDPSocket::Bind(const NetAddress& addr,
 | 
|                          const CompletionCallback& callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->Bind(
 | 
| +        pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
 | 
| +  }
 | 
|    if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      return get_interface<PPB_UDPSocket_1_1>()->Bind(
 | 
|          pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
 | 
| @@ -72,6 +84,11 @@ int32_t UDPSocket::Bind(const NetAddress& addr,
 | 
|  }
 | 
|  
 | 
|  NetAddress UDPSocket::GetBoundAddress() {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return NetAddress(
 | 
| +        PASS_REF,
 | 
| +        get_interface<PPB_UDPSocket_1_2>()->GetBoundAddress(pp_resource()));
 | 
| +  }
 | 
|    if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      return NetAddress(
 | 
|          PASS_REF,
 | 
| @@ -89,6 +106,11 @@ int32_t UDPSocket::RecvFrom(
 | 
|      char* buffer,
 | 
|      int32_t num_bytes,
 | 
|      const CompletionCallbackWithOutput<NetAddress>& callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->RecvFrom(
 | 
| +        pp_resource(), buffer, num_bytes, callback.output(),
 | 
| +        callback.pp_completion_callback());
 | 
| +  }
 | 
|    if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      return get_interface<PPB_UDPSocket_1_1>()->RecvFrom(
 | 
|          pp_resource(), buffer, num_bytes, callback.output(),
 | 
| @@ -106,6 +128,11 @@ int32_t UDPSocket::SendTo(const char* buffer,
 | 
|                            int32_t num_bytes,
 | 
|                            const NetAddress& addr,
 | 
|                            const CompletionCallback& callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->SendTo(
 | 
| +        pp_resource(), buffer, num_bytes, addr.pp_resource(),
 | 
| +        callback.pp_completion_callback());
 | 
| +  }
 | 
|    if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      return get_interface<PPB_UDPSocket_1_1>()->SendTo(
 | 
|          pp_resource(), buffer, num_bytes, addr.pp_resource(),
 | 
| @@ -120,6 +147,8 @@ int32_t UDPSocket::SendTo(const char* buffer,
 | 
|  }
 | 
|  
 | 
|  void UDPSocket::Close() {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>())
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->Close(pp_resource());
 | 
|    if (has_interface<PPB_UDPSocket_1_1>())
 | 
|      return get_interface<PPB_UDPSocket_1_1>()->Close(pp_resource());
 | 
|    if (has_interface<PPB_UDPSocket_1_0>())
 | 
| @@ -129,6 +158,10 @@ void UDPSocket::Close() {
 | 
|  int32_t UDPSocket::SetOption(PP_UDPSocket_Option name,
 | 
|                               const Var& value,
 | 
|                               const CompletionCallback& callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->SetOption(
 | 
| +        pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
 | 
| +  }
 | 
|    if (has_interface<PPB_UDPSocket_1_1>()) {
 | 
|      return get_interface<PPB_UDPSocket_1_1>()->SetOption(
 | 
|          pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
 | 
| @@ -140,4 +173,22 @@ int32_t UDPSocket::SetOption(PP_UDPSocket_Option name,
 | 
|    return callback.MayForce(PP_ERROR_NOINTERFACE);
 | 
|  }
 | 
|  
 | 
| +int32_t UDPSocket::JoinGroup(const NetAddress& group,
 | 
| +                             const CompletionCallback callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->JoinGroup(
 | 
| +        pp_resource(), group.pp_resource(), callback.pp_completion_callback());
 | 
| +  }
 | 
| +  return callback.MayForce(PP_ERROR_NOINTERFACE);
 | 
| +}
 | 
| +
 | 
| +int32_t UDPSocket::LeaveGroup(const NetAddress& group,
 | 
| +                             const CompletionCallback callback) {
 | 
| +  if (has_interface<PPB_UDPSocket_1_2>()) {
 | 
| +    return get_interface<PPB_UDPSocket_1_2>()->LeaveGroup(
 | 
| +        pp_resource(), group.pp_resource(), callback.pp_completion_callback());
 | 
| +  }
 | 
| +  return callback.MayForce(PP_ERROR_NOINTERFACE);
 | 
| +}
 | 
| +
 | 
|  }  // namespace pp
 | 
| 
 |