| Index: chrome/common/extensions/permissions/socket_permission_data.cc
 | 
| diff --git a/chrome/common/extensions/permissions/socket_permission_data.cc b/chrome/common/extensions/permissions/socket_permission_data.cc
 | 
| index e44844c039cdf17984fd152ae97ad67bcbefcf4f..316060ace6f67e0c523c0d153671fc931e55fd90 100644
 | 
| --- a/chrome/common/extensions/permissions/socket_permission_data.cc
 | 
| +++ b/chrome/common/extensions/permissions/socket_permission_data.cc
 | 
| @@ -30,6 +30,7 @@ const char kTCPConnect[] = "tcp-connect";
 | 
|  const char kTCPListen[] = "tcp-listen";
 | 
|  const char kUDPBind[] = "udp-bind";
 | 
|  const char kUDPSendTo[] = "udp-send-to";
 | 
| +const char kUDPMulticastMembership[] = "udp-multicast-membership";
 | 
|  const int kWildcardPortNumber = 0;
 | 
|  const int kInvalidPort = -1;
 | 
|  
 | 
| @@ -42,6 +43,8 @@ SocketPermissionRequest::OperationType StringToType(const std::string& s) {
 | 
|      return SocketPermissionRequest::UDP_BIND;
 | 
|    if (s == kUDPSendTo)
 | 
|      return SocketPermissionRequest::UDP_SEND_TO;
 | 
| +  if (s == kUDPMulticastMembership)
 | 
| +    return SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP;
 | 
|    return SocketPermissionRequest::NONE;
 | 
|  }
 | 
|  
 | 
| @@ -55,6 +58,8 @@ const char* TypeToString(SocketPermissionRequest::OperationType type) {
 | 
|        return kUDPBind;
 | 
|      case SocketPermissionRequest::UDP_SEND_TO:
 | 
|        return kUDPSendTo;
 | 
| +    case SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP:
 | 
| +      return kUDPMulticastMembership;
 | 
|      default:
 | 
|        return kInvalid;
 | 
|    }
 | 
| @@ -207,6 +212,10 @@ bool SocketPermissionData::Parse(const std::string& permission) {
 | 
|      if (tokens.size() == 1)
 | 
|        return true;
 | 
|  
 | 
| +    // Multicast membership permission string does not include an address.
 | 
| +    if (pattern_.type == SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP)
 | 
| +      return false;
 | 
| +
 | 
|      pattern_.host = tokens[1];
 | 
|      if (!pattern_.host.empty()) {
 | 
|        if (StartsOrEndsWithWhitespace(pattern_.host))
 | 
| @@ -250,6 +259,9 @@ const std::string& SocketPermissionData::GetAsString() const {
 | 
|    spec_.reserve(64);
 | 
|    spec_.append(TypeToString(pattern_.type));
 | 
|  
 | 
| +  if (pattern_.type == SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP)
 | 
| +    return spec_;
 | 
| +
 | 
|    if (match_subdomains_) {
 | 
|      spec_.append(1, kColon).append(kWildcard);
 | 
|      if (!pattern_.host.empty())
 | 
| 
 |