diff --git a/DEPS b/DEPS
index 55d0b4e..3365dfd1 100644
--- a/DEPS
+++ b/DEPS
@@ -43,7 +43,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '23856ea4b7d08657788c72a46483d1ccbd7a6306',
+  'v8_revision': '75076c2a96bc67b1c44cc283f85bac40ef456de3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
index ff15998..e4e11b9 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
@@ -21,6 +21,8 @@
 #include "extensions/common/permissions/permissions_data.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/audio_output_controller.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace extensions {
 
@@ -198,7 +200,7 @@
   if (media::AudioDeviceDescription::IsDefaultDevice(raw_id))
     return media::AudioDeviceDescription::kDefaultDeviceId;
 
-  GURL security_origin(source_url().GetOrigin());
+  url::Origin security_origin(source_url().GetOrigin());
   return content::GetHMACForMediaDeviceID(device_id_salt(), security_origin,
                                           raw_id);
 }
@@ -446,7 +448,7 @@
 WebrtcAudioPrivateGetAssociatedSinkFunction::GetRawSourceIDOnIOThread() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
-  GURL security_origin(params_->security_origin);
+  url::Origin security_origin(GURL(params_->security_origin));
   std::string source_id_in_origin(params_->source_id_in_origin);
 
   // Find the raw source ID for source_id_in_origin.
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
index 2f683a7..a90c4aa 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
@@ -16,7 +16,6 @@
 #include "content/public/browser/resource_context.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
 #include "media/audio/audio_device_name.h"
-#include "url/gurl.h"
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
index 84e173d..8adf942 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -159,8 +159,7 @@
       enumeration_event_.Wait();
     } else {
       *id_in_origin = content::GetHMACForMediaDeviceID(
-          resource_context->GetMediaDeviceIDSalt(),
-          origin,
+          resource_context->GetMediaDeviceIDSalt(), url::Origin(origin),
           raw_device_id);
       enumeration_event_.Signal();
     }
diff --git a/chrome/browser/net/dns_probe_runner.cc b/chrome/browser/net/dns_probe_runner.cc
index 82b44908a..68c2b4aa 100644
--- a/chrome/browser/net/dns_probe_runner.cc
+++ b/chrome/browser/net/dns_probe_runner.cc
@@ -29,7 +29,6 @@
 using net::IPEndPoint;
 using net::NetLog;
 using net::NetworkChangeNotifier;
-using net::ParseIPLiteralToNumber;
 
 namespace chrome_browser_net {
 
diff --git a/chrome/browser/net/dns_probe_service.cc b/chrome/browser/net/dns_probe_service.cc
index 3e2a8724..bdda891 100644
--- a/chrome/browser/net/dns_probe_service.cc
+++ b/chrome/browser/net/dns_probe_service.cc
@@ -22,7 +22,6 @@
 using error_page::DnsProbeStatus;
 using net::DnsClient;
 using net::DnsConfig;
-using net::ParseIPLiteralToNumber;
 using net::NetworkChangeNotifier;
 
 namespace chrome_browser_net {
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index fe9ac06..0ee63d68 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -566,7 +566,6 @@
         'common/net/x509_certificate_model.cc',
         'common/net/x509_certificate_model.h',
         'common/net/x509_certificate_model_nss.cc',
-        'common/net/x509_certificate_model_openssl.cc',
       ],
       'dependencies': [
         '<(DEPTH)/base/base.gyp:base',
@@ -592,15 +591,6 @@
             'common/net/x509_certificate_model.cc',
           ],
         }],
-        ['use_openssl_certs == 1 and OS != "android"', {
-          'dependencies': [
-            '<(DEPTH)/third_party/boringssl/boringssl.gyp:boringssl',
-          ],
-        }, {
-          'sources!': [
-            'common/net/x509_certificate_model_openssl.cc',
-          ],
-        }],
         ['use_nss_certs == 1', {
           'sources': [
             # GN version: //chrome/third_party/mozilla_security_manager
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 4742da6..d946a69 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -2728,7 +2728,7 @@
             }],
           ],
         }],
-        ['OS != "android" and (use_nss_certs == 1 or use_openssl_certs == 1)', {
+        ['OS != "android" and use_nss_certs == 1', {
           'sources': [
             'common/net/x509_certificate_model_unittest.cc',
           ],
diff --git a/chrome/common/net/BUILD.gn b/chrome/common/net/BUILD.gn
index a6d51519..1268d6a6 100644
--- a/chrome/common/net/BUILD.gn
+++ b/chrome/common/net/BUILD.gn
@@ -12,7 +12,6 @@
     "x509_certificate_model.cc",
     "x509_certificate_model.h",
     "x509_certificate_model_nss.cc",
-    "x509_certificate_model_openssl.cc",
   ]
 
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
@@ -38,12 +37,6 @@
     sources -= [ "x509_certificate_model.cc" ]
   }
 
-  if (use_openssl_certs && !is_android) {
-    deps += [ "//third_party/boringssl" ]
-  } else {
-    sources -= [ "x509_certificate_model_openssl.cc" ]
-  }
-
   if (use_nss_certs) {
     deps += [
       "//chrome/third_party/mozilla_security_manager",
diff --git a/chrome/common/net/x509_certificate_model_openssl.cc b/chrome/common/net/x509_certificate_model_openssl.cc
deleted file mode 100644
index 7081713..0000000
--- a/chrome/common/net/x509_certificate_model_openssl.cc
+++ /dev/null
@@ -1,1219 +0,0 @@
-// Copyright (c) 2011 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.
-
-#include "chrome/common/net/x509_certificate_model.h"
-
-#include <limits.h>
-#include <openssl/mem.h>
-#include <openssl/obj_mac.h>
-#include <openssl/sha.h>
-#include <openssl/stack.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/i18n/number_formatting.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/grit/generated_resources.h"
-#include "crypto/openssl_bio_string.h"
-#include "crypto/openssl_util.h"
-#include "crypto/scoped_openssl_types.h"
-#include "net/base/address_family.h"
-#include "net/cert/x509_util_openssl.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace x509_util = net::x509_util;
-
-namespace x509_certificate_model {
-
-namespace {
-
-std::string ProcessRawAsn1String(ASN1_STRING* data) {
-  return ProcessRawBytes(ASN1_STRING_data(data), ASN1_STRING_length(data));
-}
-
-std::string ProcessRawAsn1Type(ASN1_TYPE* data) {
-  int len = i2d_ASN1_TYPE(data, NULL);
-  if (len <= 0)
-    return std::string();
-
-  std::unique_ptr<unsigned char[]> buf(new unsigned char[len]);
-  unsigned char* bufp = buf.get();
-
-  len = i2d_ASN1_TYPE(data, &bufp);
-
-  return ProcessRawBytes(buf.get(), len);
-}
-
-std::string ProcessRawBignum(BIGNUM* n) {
-  int len = BN_num_bytes(n);
-  std::unique_ptr<unsigned char[]> buf(new unsigned char[len]);
-  len = BN_bn2bin(n, buf.get());
-  return ProcessRawBytes(buf.get(), len);
-}
-
-std::string Asn1StringToUTF8(ASN1_STRING* asn1_string) {
-  std::string rv;
-  unsigned char* buf = NULL;
-  int len = ASN1_STRING_to_UTF8(&buf, asn1_string);
-  if (len < 0)
-    return rv;
-  rv = std::string(reinterpret_cast<const char*>(buf), len);
-  OPENSSL_free(buf);
-  return rv;
-}
-
-std::string AlternativeWhenEmpty(const std::string& text,
-                                 const std::string& alternative) {
-  return text.empty() ? alternative : text;
-}
-
-std::string GetKeyValuesFromNameEntry(X509_NAME_ENTRY* entry) {
-  std::string ret;
-  std::string key;
-  std::string value;
-  if (!x509_util::ParsePrincipalKeyAndValue(entry, &key, &value))
-    return ret;
-  if (OBJ_obj2nid(X509_NAME_ENTRY_get_object(entry)) == NID_commonName)
-    value = x509_certificate_model::ProcessIDN(value);
-  ret = base::StringPrintf("%s = %s", key.c_str(), value.c_str());
-  return ret;
-}
-
-std::string GetKeyValuesFromNameEntries(STACK_OF(X509_NAME_ENTRY)* entries) {
-  std::string ret;
-  size_t rdns = sk_X509_NAME_ENTRY_num(entries);
-  for (size_t i = rdns - 1; i < rdns; --i) {
-    X509_NAME_ENTRY* entry = sk_X509_NAME_ENTRY_value(entries, i);
-    if (!entry)
-      continue;
-    base::StringAppendF(&ret, "%s\n", GetKeyValuesFromNameEntry(entry).c_str());
-  }
-  return ret;
-}
-
-std::string GetKeyValuesFromName(X509_NAME* name) {
-  std::string ret;
-  size_t rdns = X509_NAME_entry_count(name);
-  for (size_t i = rdns - 1; i < rdns; --i) {
-    X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, i);
-    if (!entry)
-      continue;
-    base::StringAppendF(&ret, "%s\n", GetKeyValuesFromNameEntry(entry).c_str());
-  }
-  return ret;
-}
-
-std::string Asn1ObjectToOIDString(ASN1_OBJECT* obj) {
-  std::string s;
-  char buf[80];
-  int buflen = OBJ_obj2txt(buf, sizeof(buf), obj, 1 /* no_name */);
-  if (buflen < 0)
-    return s;
-
-  s = "OID.";
-
-  if (static_cast<size_t>(buflen) < sizeof(buf)) {
-    s.append(buf, buflen);
-    return s;
-  }
-
-  size_t prefix_len = s.size();
-  s.resize(prefix_len + buflen + 1, ' ');
-  buflen =
-      OBJ_obj2txt(&s[prefix_len], s.size() - prefix_len, obj, 1 /* no_name */);
-  if (buflen < 0) {
-    s.clear();
-    return s;
-  }
-  s.resize(prefix_len + buflen);
-  return s;
-}
-
-int ms_cert_ext_certtype = -1;
-int ms_certsrv_ca_version = -1;
-int ms_ntds_replication = -1;
-int eku_ms_time_stamping = -1;
-int eku_ms_file_recovery = -1;
-int eku_ms_windows_hardware_driver_verification = -1;
-int eku_ms_qualified_subordination = -1;
-int eku_ms_key_recovery = -1;
-int eku_ms_document_signing = -1;
-int eku_ms_lifetime_signing = -1;
-int eku_ms_key_recovery_agent = -1;
-int cert_attribute_ev_incorporation_country = -1;
-int ns_cert_ext_ca_cert_url = -1;
-int ns_cert_ext_homepage_url = -1;
-int ns_cert_ext_lost_password_url = -1;
-int ns_cert_ext_cert_renewal_time = -1;
-
-int RegisterDynamicOid(const char* oid_string, const char* short_name) {
-  int nid = OBJ_txt2nid(oid_string);
-  if (nid > 0) {
-    DVLOG(1) << "found already existing nid " << nid << " for " << oid_string;
-    return nid;
-  }
-  return OBJ_create(oid_string, short_name, short_name);
-}
-
-class DynamicOidRegisterer {
- public:
-  DynamicOidRegisterer() {
-    ms_cert_ext_certtype =
-        RegisterDynamicOid("1.3.6.1.4.1.311.20.2", "ms_cert_ext_certtype");
-    ms_certsrv_ca_version =
-        RegisterDynamicOid("1.3.6.1.4.1.311.21.1", "ms_certsrv_ca_version");
-    ms_ntds_replication =
-        RegisterDynamicOid("1.3.6.1.4.1.311.25.1", "ms_ntds_replication");
-
-    eku_ms_time_stamping =
-        RegisterDynamicOid("1.3.6.1.4.1.311.10.3.2", "eku_ms_time_stamping");
-    eku_ms_file_recovery =
-        RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4.1", "eku_ms_file_recovery");
-    eku_ms_windows_hardware_driver_verification =
-        RegisterDynamicOid("1.3.6.1.4.1.311.10.3.5",
-                           "eku_ms_windows_hardware_driver_verification");
-    eku_ms_qualified_subordination = RegisterDynamicOid(
-        "1.3.6.1.4.1.311.10.3.10", "eku_ms_qualified_subordination");
-    eku_ms_key_recovery =
-        RegisterDynamicOid("1.3.6.1.4.1.311.10.3.11", "eku_ms_key_recovery");
-    eku_ms_document_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.12",
-                                                 "eku_ms_document_signing");
-    eku_ms_lifetime_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.13",
-                                                 "eku_ms_lifetime_signing");
-    eku_ms_key_recovery_agent =
-        RegisterDynamicOid("1.3.6.1.4.1.311.21.6", "eku_ms_key_recovery_agent");
-
-    cert_attribute_ev_incorporation_country = RegisterDynamicOid(
-        "1.3.6.1.4.1.311.60.2.1.3", "cert_attribute_ev_incorporation_country");
-
-    ns_cert_ext_ca_cert_url = RegisterDynamicOid(
-        "2.16.840.1.113730.1.6", "ns_cert_ext_ca_cert_url");
-    ns_cert_ext_homepage_url = RegisterDynamicOid(
-        "2.16.840.1.113730.1.9", "ns_cert_ext_homepage_url");
-    ns_cert_ext_lost_password_url = RegisterDynamicOid(
-        "2.16.840.1.113730.1.14", "ns_cert_ext_lost_password_url");
-    ns_cert_ext_cert_renewal_time = RegisterDynamicOid(
-        "2.16.840.1.113730.1.15", "ns_cert_ext_cert_renewal_time");
-  }
-};
-
-static base::LazyInstance<DynamicOidRegisterer>::Leaky
-    g_dynamic_oid_registerer = LAZY_INSTANCE_INITIALIZER;
-
-std::string Asn1ObjectToString(ASN1_OBJECT* obj) {
-  g_dynamic_oid_registerer.Get();
-
-  int string_id;
-  int nid = OBJ_obj2nid(obj);
-  switch (nid) {
-    case NID_commonName:
-      string_id = IDS_CERT_OID_AVA_COMMON_NAME;
-      break;
-    case NID_stateOrProvinceName:
-      string_id = IDS_CERT_OID_AVA_STATE_OR_PROVINCE;
-      break;
-    case NID_organizationName:
-      string_id = IDS_CERT_OID_AVA_ORGANIZATION_NAME;
-      break;
-    case NID_organizationalUnitName:
-      string_id = IDS_CERT_OID_AVA_ORGANIZATIONAL_UNIT_NAME;
-      break;
-    case NID_dnQualifier:
-      string_id = IDS_CERT_OID_AVA_DN_QUALIFIER;
-      break;
-    case NID_countryName:
-      string_id = IDS_CERT_OID_AVA_COUNTRY_NAME;
-      break;
-    case NID_serialNumber:
-      string_id = IDS_CERT_OID_AVA_SERIAL_NUMBER;
-      break;
-    case NID_localityName:
-      string_id = IDS_CERT_OID_AVA_LOCALITY;
-      break;
-    case NID_domainComponent:
-      string_id = IDS_CERT_OID_AVA_DC;
-      break;
-    case NID_rfc822Mailbox:
-      string_id = IDS_CERT_OID_RFC1274_MAIL;
-      break;
-    case NID_userId:
-      string_id = IDS_CERT_OID_RFC1274_UID;
-      break;
-    case NID_pkcs9_emailAddress:
-      string_id = IDS_CERT_OID_PKCS9_EMAIL_ADDRESS;
-      break;
-    case NID_rsaEncryption:
-      string_id = IDS_CERT_OID_PKCS1_RSA_ENCRYPTION;
-      break;
-    case NID_md2WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_md4WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_MD4_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_md5WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_sha1WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_sha256WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_sha384WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_sha512WithRSAEncryption:
-      string_id = IDS_CERT_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION;
-      break;
-    case NID_netscape_cert_type:
-      string_id = IDS_CERT_EXT_NS_CERT_TYPE;
-      break;
-    case NID_netscape_base_url:
-      string_id = IDS_CERT_EXT_NS_CERT_BASE_URL;
-      break;
-    case NID_netscape_revocation_url:
-      string_id = IDS_CERT_EXT_NS_CERT_REVOCATION_URL;
-      break;
-    case NID_netscape_ca_revocation_url:
-      string_id = IDS_CERT_EXT_NS_CA_REVOCATION_URL;
-      break;
-    case NID_netscape_renewal_url:
-      string_id = IDS_CERT_EXT_NS_CERT_RENEWAL_URL;
-      break;
-    case NID_netscape_ca_policy_url:
-      string_id = IDS_CERT_EXT_NS_CA_POLICY_URL;
-      break;
-    case NID_netscape_ssl_server_name:
-      string_id = IDS_CERT_EXT_NS_SSL_SERVER_NAME;
-      break;
-    case NID_netscape_comment:
-      string_id = IDS_CERT_EXT_NS_COMMENT;
-      break;
-    case NID_subject_directory_attributes:
-      string_id = IDS_CERT_X509_SUBJECT_DIRECTORY_ATTR;
-      break;
-    case NID_subject_key_identifier:
-      string_id = IDS_CERT_X509_SUBJECT_KEYID;
-      break;
-    case NID_key_usage:
-      string_id = IDS_CERT_X509_KEY_USAGE;
-      break;
-    case NID_subject_alt_name:
-      string_id = IDS_CERT_X509_SUBJECT_ALT_NAME;
-      break;
-    case NID_issuer_alt_name:
-      string_id = IDS_CERT_X509_ISSUER_ALT_NAME;
-      break;
-    case NID_basic_constraints:
-      string_id = IDS_CERT_X509_BASIC_CONSTRAINTS;
-      break;
-    case NID_name_constraints:
-      string_id = IDS_CERT_X509_NAME_CONSTRAINTS;
-      break;
-    case NID_crl_distribution_points:
-      string_id = IDS_CERT_X509_CRL_DIST_POINTS;
-      break;
-    case NID_certificate_policies:
-      string_id = IDS_CERT_X509_CERT_POLICIES;
-      break;
-    case NID_policy_mappings:
-      string_id = IDS_CERT_X509_POLICY_MAPPINGS;
-      break;
-    case NID_policy_constraints:
-      string_id = IDS_CERT_X509_POLICY_CONSTRAINTS;
-      break;
-    case NID_authority_key_identifier:
-      string_id = IDS_CERT_X509_AUTH_KEYID;
-      break;
-    case NID_ext_key_usage:
-      string_id = IDS_CERT_X509_EXT_KEY_USAGE;
-      break;
-    case NID_info_access:
-      string_id = IDS_CERT_X509_AUTH_INFO_ACCESS;
-      break;
-    case NID_server_auth:
-      string_id = IDS_CERT_EKU_TLS_WEB_SERVER_AUTHENTICATION;
-      break;
-    case NID_client_auth:
-      string_id = IDS_CERT_EKU_TLS_WEB_CLIENT_AUTHENTICATION;
-      break;
-    case NID_code_sign:
-      string_id = IDS_CERT_EKU_CODE_SIGNING;
-      break;
-    case NID_email_protect:
-      string_id = IDS_CERT_EKU_EMAIL_PROTECTION;
-      break;
-    case NID_time_stamp:
-      string_id = IDS_CERT_EKU_TIME_STAMPING;
-      break;
-    case NID_OCSP_sign:
-      string_id = IDS_CERT_EKU_OCSP_SIGNING;
-      break;
-    case NID_id_qt_cps:
-      string_id = IDS_CERT_PKIX_CPS_POINTER_QUALIFIER;
-      break;
-    case NID_id_qt_unotice:
-      string_id = IDS_CERT_PKIX_USER_NOTICE_QUALIFIER;
-      break;
-    case NID_ms_upn:
-      string_id = IDS_CERT_EXT_MS_NT_PRINCIPAL_NAME;
-      break;
-    case NID_ms_code_ind:
-      string_id = IDS_CERT_EKU_MS_INDIVIDUAL_CODE_SIGNING;
-      break;
-    case NID_ms_code_com:
-      string_id = IDS_CERT_EKU_MS_COMMERCIAL_CODE_SIGNING;
-      break;
-    case NID_ms_ctl_sign:
-      string_id = IDS_CERT_EKU_MS_TRUST_LIST_SIGNING;
-      break;
-    case NID_ms_sgc:
-      string_id = IDS_CERT_EKU_MS_SERVER_GATED_CRYPTO;
-      break;
-    case NID_ms_efs:
-      string_id = IDS_CERT_EKU_MS_ENCRYPTING_FILE_SYSTEM;
-      break;
-    case NID_ms_smartcard_login:
-      string_id = IDS_CERT_EKU_MS_SMART_CARD_LOGON;
-      break;
-    case NID_ns_sgc:
-      string_id = IDS_CERT_EKU_NETSCAPE_INTERNATIONAL_STEP_UP;
-      break;
-    case NID_businessCategory:
-      string_id = IDS_CERT_OID_BUSINESS_CATEGORY;
-      break;
-    case NID_undef:
-      string_id = -1;
-      break;
-
-    default:
-      if (nid == ms_cert_ext_certtype)
-        string_id = IDS_CERT_EXT_MS_CERT_TYPE;
-      else if (nid == ms_certsrv_ca_version)
-        string_id = IDS_CERT_EXT_MS_CA_VERSION;
-      else if (nid == ms_ntds_replication)
-        string_id = IDS_CERT_EXT_MS_NTDS_REPLICATION;
-      else if (nid == eku_ms_time_stamping)
-        string_id = IDS_CERT_EKU_MS_TIME_STAMPING;
-      else if (nid == eku_ms_file_recovery)
-        string_id = IDS_CERT_EKU_MS_FILE_RECOVERY;
-      else if (nid == eku_ms_windows_hardware_driver_verification)
-        string_id = IDS_CERT_EKU_MS_WINDOWS_HARDWARE_DRIVER_VERIFICATION;
-      else if (nid == eku_ms_qualified_subordination)
-        string_id = IDS_CERT_EKU_MS_QUALIFIED_SUBORDINATION;
-      else if (nid == eku_ms_key_recovery)
-        string_id = IDS_CERT_EKU_MS_KEY_RECOVERY;
-      else if (nid == eku_ms_document_signing)
-        string_id = IDS_CERT_EKU_MS_DOCUMENT_SIGNING;
-      else if (nid == eku_ms_lifetime_signing)
-        string_id = IDS_CERT_EKU_MS_LIFETIME_SIGNING;
-      else if (nid == eku_ms_key_recovery_agent)
-        string_id = IDS_CERT_EKU_MS_KEY_RECOVERY_AGENT;
-      else if (nid == cert_attribute_ev_incorporation_country)
-        string_id = IDS_CERT_OID_EV_INCORPORATION_COUNTRY;
-      else if (nid == ns_cert_ext_lost_password_url)
-        string_id = IDS_CERT_EXT_NS_LOST_PASSWORD_URL;
-      else if (nid == ns_cert_ext_cert_renewal_time)
-        string_id = IDS_CERT_EXT_NS_CERT_RENEWAL_TIME;
-      else
-        string_id = -1;
-      break;
-  }
-  if (string_id >= 0)
-    return l10n_util::GetStringUTF8(string_id);
-
-  return Asn1ObjectToOIDString(obj);
-}
-
-struct MaskIdPair {
-  unsigned int mask;
-  int string_id;
-};
-
-std::string ProcessBitField(ASN1_BIT_STRING* bitfield,
-                            const MaskIdPair* string_map,
-                            size_t len,
-                            char separator) {
-  unsigned int bits = 0;
-  std::string rv;
-  for (size_t i = 0;
-       i < sizeof(bits) && static_cast<int>(i) < ASN1_STRING_length(bitfield);
-       ++i)
-    bits |= ASN1_STRING_data(bitfield)[i] << (i * 8);
-  for (size_t i = 0; i < len; ++i) {
-    if (bits & string_map[i].mask) {
-      if (!rv.empty())
-        rv += separator;
-      rv += l10n_util::GetStringUTF8(string_map[i].string_id);
-    }
-  }
-  return rv;
-}
-
-std::string ProcessNSCertTypeExtension(X509_EXTENSION* ex) {
-  static const MaskIdPair usage_string_map[] = {
-      {NS_SSL_CLIENT, IDS_CERT_USAGE_SSL_CLIENT},
-      {NS_SSL_SERVER, IDS_CERT_USAGE_SSL_SERVER},
-      {NS_SMIME, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL},
-      {NS_OBJSIGN, IDS_CERT_USAGE_OBJECT_SIGNER},
-      {NS_SSL_CA, IDS_CERT_USAGE_SSL_CA},
-      {NS_SMIME_CA, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL_CA},
-      {NS_OBJSIGN_CA, IDS_CERT_USAGE_OBJECT_SIGNER},
-  };
-
-  crypto::ScopedOpenSSL<ASN1_BIT_STRING, ASN1_BIT_STRING_free> value(
-      reinterpret_cast<ASN1_BIT_STRING*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-  return ProcessBitField(value.get(),
-                         usage_string_map,
-                         arraysize(usage_string_map),
-                         '\n');
-}
-
-std::string ProcessKeyUsageExtension(X509_EXTENSION* ex) {
-  static const MaskIdPair key_usage_string_map[] = {
-      {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING},
-      {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP},
-      {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT},
-      {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT},
-      {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT},
-      {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER},
-      {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER},
-      {KU_ENCIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_ENCIPHER_ONLY},
-      {KU_DECIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_DECIPHER_ONLY},
-  };
-
-  crypto::ScopedOpenSSL<ASN1_BIT_STRING, ASN1_BIT_STRING_free> value(
-      reinterpret_cast<ASN1_BIT_STRING*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-  return ProcessBitField(value.get(),
-                         key_usage_string_map,
-                         arraysize(key_usage_string_map),
-                         '\n');
-}
-
-std::string ProcessBasicConstraints(X509_EXTENSION* ex) {
-  std::string rv;
-  crypto::ScopedOpenSSL<BASIC_CONSTRAINTS, BASIC_CONSTRAINTS_free> value(
-      reinterpret_cast<BASIC_CONSTRAINTS*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-  if (value.get()->ca)
-    rv = l10n_util::GetStringUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_IS_CA);
-  else
-    rv = l10n_util::GetStringUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_IS_NOT_CA);
-  rv += '\n';
-  if (value.get()->ca) {
-    base::string16 depth;
-    if (!value.get()->pathlen) {
-      depth = l10n_util::GetStringUTF16(
-          IDS_CERT_X509_BASIC_CONSTRAINT_PATH_LEN_UNLIMITED);
-    } else {
-      depth = base::FormatNumber(ASN1_INTEGER_get(value.get()->pathlen));
-    }
-    rv += l10n_util::GetStringFUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_PATH_LEN,
-                                    depth);
-  }
-  return rv;
-}
-
-std::string ProcessExtKeyUsage(X509_EXTENSION* ex) {
-  std::string rv;
-  crypto::ScopedOpenSSL<EXTENDED_KEY_USAGE, EXTENDED_KEY_USAGE_free> value(
-      reinterpret_cast<EXTENDED_KEY_USAGE*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-  for (size_t i = 0; i < sk_ASN1_OBJECT_num(value.get()); i++) {
-    ASN1_OBJECT* obj = sk_ASN1_OBJECT_value(value.get(), i);
-    std::string oid_dump = Asn1ObjectToOIDString(obj);
-    std::string oid_text = Asn1ObjectToString(obj);
-
-    // If oid is one we recognize, oid_text will have a text description of the
-    // OID, which we display along with the oid_dump.  If we don't recognize the
-    // OID, they will be the same, so just display the OID alone.
-    if (oid_dump == oid_text)
-      rv += oid_dump;
-    else
-      rv += l10n_util::GetStringFUTF8(IDS_CERT_EXT_KEY_USAGE_FORMAT,
-                                      base::UTF8ToUTF16(oid_text),
-                                      base::UTF8ToUTF16(oid_dump));
-    rv += '\n';
-  }
-  return rv;
-}
-
-std::string ProcessGeneralName(GENERAL_NAME* name) {
-  std::string key;
-  std::string value;
-
-  switch (name->type) {
-    case GEN_OTHERNAME: {
-      ASN1_OBJECT* oid;
-      ASN1_TYPE* asn1_value;
-      GENERAL_NAME_get0_otherName(name, &oid, &asn1_value);
-      key = Asn1ObjectToString(oid);
-      // g_dynamic_oid_registerer.Get() will have been run by
-      // Asn1ObjectToString.
-      int nid = OBJ_obj2nid(oid);
-      if (nid == IDS_CERT_EXT_MS_NT_PRINCIPAL_NAME) {
-        // The type of this name is apparently nowhere explicitly
-        // documented. However, in the generated templates, it is always
-        // UTF-8. So try to decode this as UTF-8; if that fails, dump the
-        // raw data.
-        if (asn1_value->type == V_ASN1_UTF8STRING) {
-          value = std::string(reinterpret_cast<char*>(ASN1_STRING_data(
-                                  asn1_value->value.utf8string)),
-                              ASN1_STRING_length(asn1_value->value.utf8string));
-        } else {
-          value = ProcessRawAsn1Type(asn1_value);
-        }
-      } else if (nid == ms_ntds_replication) {
-        // This should be a 16-byte GUID.
-        if (asn1_value->type == V_ASN1_OCTET_STRING &&
-            asn1_value->value.octet_string->length == 16) {
-          unsigned char* d = asn1_value->value.octet_string->data;
-          base::SStringPrintf(
-              &value,
-              "{%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-"
-              "%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}",
-              d[3], d[2], d[1], d[0], d[5], d[4], d[7], d[6],
-              d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
-        } else {
-          value = ProcessRawAsn1Type(asn1_value);
-        }
-      } else {
-        value = ProcessRawAsn1Type(asn1_value);
-      }
-      break;
-    }
-    case GEN_EMAIL:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_RFC822_NAME);
-      value = std::string(
-          reinterpret_cast<char*>(ASN1_STRING_data(name->d.rfc822Name)),
-          ASN1_STRING_length(name->d.rfc822Name));
-      break;
-    case GEN_DNS:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_DNS_NAME);
-      value = std::string(
-          reinterpret_cast<char*>(ASN1_STRING_data(name->d.dNSName)),
-          ASN1_STRING_length(name->d.dNSName));
-      value = ProcessIDN(value);
-      break;
-    case GEN_X400:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_X400_ADDRESS);
-      value = ProcessRawAsn1Type(name->d.x400Address);
-      break;
-    case GEN_DIRNAME:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_DIRECTORY_NAME);
-      value = GetKeyValuesFromName(name->d.directoryName);
-      break;
-    case GEN_EDIPARTY:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_EDI_PARTY_NAME);
-      if (name->d.ediPartyName->nameAssigner &&
-          ASN1_STRING_length(name->d.ediPartyName->nameAssigner) > 0) {
-        value += l10n_util::GetStringFUTF8(
-            IDS_CERT_EDI_NAME_ASSIGNER,
-            base::UTF8ToUTF16(
-                Asn1StringToUTF8(name->d.ediPartyName->nameAssigner)));
-        value += "\n";
-      }
-      if (name->d.ediPartyName->partyName &&
-          ASN1_STRING_length(name->d.ediPartyName->partyName) > 0) {
-        value += l10n_util::GetStringFUTF8(
-            IDS_CERT_EDI_PARTY_NAME,
-            base::UTF8ToUTF16(
-                Asn1StringToUTF8(name->d.ediPartyName->partyName)));
-        value += "\n";
-      }
-      break;
-    case GEN_URI:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_URI);
-      value =
-          std::string(reinterpret_cast<char*>(
-                          ASN1_STRING_data(name->d.uniformResourceIdentifier)),
-                      ASN1_STRING_length(name->d.uniformResourceIdentifier));
-      break;
-    case GEN_IPADD: {
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_IP_ADDRESS);
-      net::IPAddressNumber ip(ASN1_STRING_data(name->d.iPAddress),
-                              ASN1_STRING_data(name->d.iPAddress) +
-                                  ASN1_STRING_length(name->d.iPAddress));
-      if (net::GetAddressFamily(ip) != net::ADDRESS_FAMILY_UNSPECIFIED) {
-        value = net::IPAddressToString(ip);
-      } else {
-        // Invalid IP address.
-        value = ProcessRawBytes(ip.data(), ip.size());
-      }
-      break;
-    }
-    case GEN_RID:
-      key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_REGISTERED_ID);
-      value = Asn1ObjectToString(name->d.registeredID);
-      break;
-  }
-  std::string rv(l10n_util::GetStringFUTF8(IDS_CERT_UNKNOWN_OID_INFO_FORMAT,
-                                           base::UTF8ToUTF16(key),
-                                           base::UTF8ToUTF16(value)));
-  rv += '\n';
-  return rv;
-}
-
-std::string ProcessGeneralNames(GENERAL_NAMES* names) {
-  std::string rv;
-  for (size_t i = 0; i < sk_GENERAL_NAME_num(names); ++i) {
-    GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i);
-    rv += ProcessGeneralName(name);
-  }
-  return rv;
-}
-
-std::string ProcessAltName(X509_EXTENSION* ex) {
-  crypto::ScopedOpenSSL<GENERAL_NAMES, GENERAL_NAMES_free> alt_names(
-      reinterpret_cast<GENERAL_NAMES*>(X509V3_EXT_d2i(ex)));
-  if (!alt_names.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  return ProcessGeneralNames(alt_names.get());
-}
-
-std::string ProcessSubjectKeyId(X509_EXTENSION* ex) {
-  crypto::ScopedOpenSSL<ASN1_OCTET_STRING, ASN1_OCTET_STRING_free> value(
-      reinterpret_cast<ASN1_OCTET_STRING*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  return l10n_util::GetStringFUTF8(
-      IDS_CERT_KEYID_FORMAT,
-      base::ASCIIToUTF16(ProcessRawAsn1String(value.get())));
-}
-
-std::string ProcessAuthKeyId(X509_EXTENSION* ex) {
-  std::string rv;
-  crypto::ScopedOpenSSL<AUTHORITY_KEYID, AUTHORITY_KEYID_free> value(
-      reinterpret_cast<AUTHORITY_KEYID*>(X509V3_EXT_d2i(ex)));
-  if (!value.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  if (value.get()->keyid && ASN1_STRING_length(value.get()->keyid) > 0) {
-    rv += l10n_util::GetStringFUTF8(
-        IDS_CERT_KEYID_FORMAT,
-        base::ASCIIToUTF16(ProcessRawAsn1String(value.get()->keyid)));
-    rv += '\n';
-  }
-
-  if (value.get()->issuer) {
-    rv += l10n_util::GetStringFUTF8(
-        IDS_CERT_ISSUER_FORMAT,
-        base::UTF8ToUTF16(ProcessGeneralNames(value.get()->issuer)));
-    rv += '\n';
-  }
-
-  if (value.get()->serial) {
-    rv += l10n_util::GetStringFUTF8(
-        IDS_CERT_SERIAL_NUMBER_FORMAT,
-        base::ASCIIToUTF16(ProcessRawAsn1String(value.get()->serial)));
-    rv += '\n';
-  }
-
-  return rv;
-}
-
-std::string ProcessUserNotice(USERNOTICE* notice) {
-  std::string rv;
-  if (notice->noticeref) {
-    rv += Asn1StringToUTF8(notice->noticeref->organization);
-    rv += " - ";
-    for (size_t i = 0; i < sk_ASN1_INTEGER_num(notice->noticeref->noticenos);
-         ++i) {
-      ASN1_INTEGER* info =
-          sk_ASN1_INTEGER_value(notice->noticeref->noticenos, i);
-      long number = ASN1_INTEGER_get(info);
-      if (number != -1) {
-        if (i != sk_ASN1_INTEGER_num(notice->noticeref->noticenos) - 1)
-          rv += ", ";
-        rv += '#';
-        rv += base::IntToString(number);
-      }
-    }
-  }
-  if (notice->exptext && notice->exptext->length != 0) {
-    rv += "\n    ";
-    rv += Asn1StringToUTF8(notice->exptext);
-  }
-  return rv;
-}
-
-std::string ProcessCertificatePolicies(X509_EXTENSION* ex) {
-  std::string rv;
-  crypto::ScopedOpenSSL<CERTIFICATEPOLICIES, CERTIFICATEPOLICIES_free> policies(
-      reinterpret_cast<CERTIFICATEPOLICIES*>(X509V3_EXT_d2i(ex)));
-
-  if (!policies.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  for (size_t i = 0; i < sk_POLICYINFO_num(policies.get()); ++i) {
-    POLICYINFO* info = sk_POLICYINFO_value(policies.get(), i);
-    std::string key = Asn1ObjectToString(info->policyid);
-    // If we have policy qualifiers, display the oid text
-    // with a ':', otherwise just put the oid text and a newline.
-    if (info->qualifiers && sk_POLICYQUALINFO_num(info->qualifiers)) {
-      rv += l10n_util::GetStringFUTF8(IDS_CERT_MULTILINE_INFO_START_FORMAT,
-                                      base::UTF8ToUTF16(key));
-    } else {
-      rv += key;
-    }
-    rv += '\n';
-
-    if (info->qualifiers && sk_POLICYQUALINFO_num(info->qualifiers)) {
-      // Add all qualifiers on separate lines, indented.
-      for (size_t i = 0; i < sk_POLICYQUALINFO_num(info->qualifiers); ++i) {
-        POLICYQUALINFO* qualifier =
-            sk_POLICYQUALINFO_value(info->qualifiers, i);
-        rv += "  ";
-        rv += l10n_util::GetStringFUTF8(
-            IDS_CERT_MULTILINE_INFO_START_FORMAT,
-            base::UTF8ToUTF16(Asn1ObjectToString(qualifier->pqualid)));
-        int nid = OBJ_obj2nid(qualifier->pqualid);
-        switch (nid) {
-          case NID_id_qt_cps:
-            rv += "    ";
-            rv += std::string(
-                reinterpret_cast<char*>(ASN1_STRING_data(qualifier->d.cpsuri)),
-                ASN1_STRING_length(qualifier->d.cpsuri));
-            break;
-          case NID_id_qt_unotice:
-            rv += ProcessUserNotice(qualifier->d.usernotice);
-            break;
-          default:
-            rv += ProcessRawAsn1Type(qualifier->d.other);
-            break;
-        }
-        rv += '\n';
-      }
-    }
-  }
-  return rv;
-}
-
-std::string ProcessCrlDistPoints(X509_EXTENSION* ex) {
-  static const MaskIdPair reason_string_map[] = {
-      // OpenSSL doesn't define contants for these.  (The CRL_REASON_ defines in
-      // x509v3.h are for the "X509v3 CRL Reason Code" extension.)
-      // These are from RFC5280 section 4.2.1.13.
-      {0, IDS_CERT_REVOCATION_REASON_UNUSED},
-      {1, IDS_CERT_REVOCATION_REASON_KEY_COMPROMISE},
-      {2, IDS_CERT_REVOCATION_REASON_CA_COMPROMISE},
-      {3, IDS_CERT_REVOCATION_REASON_AFFILIATION_CHANGED},
-      {4, IDS_CERT_REVOCATION_REASON_SUPERSEDED},
-      {5, IDS_CERT_REVOCATION_REASON_CESSATION_OF_OPERATION},
-      {6, IDS_CERT_REVOCATION_REASON_CERTIFICATE_HOLD},
-      {7, IDS_CERT_REVOCATION_REASON_PRIVILEGE_WITHDRAWN},
-      {8, IDS_CERT_REVOCATION_REASON_AA_COMPROMISE},
-  };
-  // OpenSSL doesn't define constants for the DIST_POINT type field. These
-  // values are from reading openssl/crypto/x509v3/v3_crld.c
-  const int kDistPointFullName = 0;
-  const int kDistPointRelativeName = 1;
-
-  std::string rv;
-  crypto::ScopedOpenSSL<CRL_DIST_POINTS, CRL_DIST_POINTS_free> dist_points(
-      reinterpret_cast<CRL_DIST_POINTS*>(X509V3_EXT_d2i(ex)));
-
-  if (!dist_points.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  for (size_t i = 0; i < sk_DIST_POINT_num(dist_points.get()); ++i) {
-    DIST_POINT* point = sk_DIST_POINT_value(dist_points.get(), i);
-    if (point->distpoint) {
-      switch (point->distpoint->type) {
-        case kDistPointFullName:
-          rv += ProcessGeneralNames(point->distpoint->name.fullname);
-          break;
-        case kDistPointRelativeName:
-          rv +=
-              GetKeyValuesFromNameEntries(point->distpoint->name.relativename);
-          // TODO(mattm): should something be done with
-          // point->distpoint->dpname?
-          break;
-      }
-    }
-    if (point->reasons) {
-      rv += ' ';
-      rv += ProcessBitField(point->reasons,
-                            reason_string_map,
-                            arraysize(reason_string_map),
-                            ',');
-      rv += '\n';
-    }
-    if (point->CRLissuer) {
-      rv += l10n_util::GetStringFUTF8(
-          IDS_CERT_ISSUER_FORMAT,
-          base::UTF8ToUTF16(ProcessGeneralNames(point->CRLissuer)));
-    }
-  }
-
-  return rv;
-}
-
-std::string ProcessAuthInfoAccess(X509_EXTENSION* ex) {
-  std::string rv;
-  crypto::ScopedOpenSSL<AUTHORITY_INFO_ACCESS, AUTHORITY_INFO_ACCESS_free> aia(
-      reinterpret_cast<AUTHORITY_INFO_ACCESS*>(X509V3_EXT_d2i(ex)));
-
-  if (!aia.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  for (size_t i = 0; i < sk_ACCESS_DESCRIPTION_num(aia.get()); ++i) {
-    ACCESS_DESCRIPTION* desc = sk_ACCESS_DESCRIPTION_value(aia.get(), i);
-
-    base::string16 location_str =
-        base::UTF8ToUTF16(ProcessGeneralName(desc->location));
-    switch (OBJ_obj2nid(desc->method)) {
-      case NID_ad_OCSP:
-        rv += l10n_util::GetStringFUTF8(IDS_CERT_OCSP_RESPONDER_FORMAT,
-                                        location_str);
-        break;
-      case NID_ad_ca_issuers:
-        rv +=
-            l10n_util::GetStringFUTF8(IDS_CERT_CA_ISSUERS_FORMAT, location_str);
-        break;
-      default:
-        rv += l10n_util::GetStringFUTF8(
-            IDS_CERT_UNKNOWN_OID_INFO_FORMAT,
-            base::UTF8ToUTF16(Asn1ObjectToString(desc->method)),
-            location_str);
-        break;
-    }
-  }
-  return rv;
-}
-
-std::string ProcessIA5StringData(ASN1_OCTET_STRING* asn1_string) {
-  const unsigned char* data = ASN1_STRING_data(asn1_string);
-  crypto::ScopedOpenSSL<ASN1_IA5STRING, ASN1_IA5STRING_free> ia5_string(
-      d2i_ASN1_IA5STRING(NULL, &data, ASN1_STRING_length(asn1_string)));
-
-  if (!ia5_string.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  return std::string(
-      reinterpret_cast<char*>(ASN1_STRING_data(ia5_string.get())),
-      ASN1_STRING_length(ia5_string.get()));
-}
-
-std::string ProcessBMPStringData(ASN1_OCTET_STRING* asn1_string) {
-  const unsigned char* data = ASN1_STRING_data(asn1_string);
-  crypto::ScopedOpenSSL<ASN1_BMPSTRING, ASN1_BMPSTRING_free> bmp_string(
-      d2i_ASN1_BMPSTRING(NULL, &data, ASN1_STRING_length(asn1_string)));
-
-  if (!bmp_string.get())
-    return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
-
-  return Asn1StringToUTF8(bmp_string.get());
-}
-
-std::string X509ExtensionValueToString(X509_EXTENSION* ex) {
-  g_dynamic_oid_registerer.Get();
-  int nid = OBJ_obj2nid(X509_EXTENSION_get_object(ex));
-  switch (nid) {
-    case NID_netscape_cert_type:
-      return ProcessNSCertTypeExtension(ex);
-    case NID_key_usage:
-      return ProcessKeyUsageExtension(ex);
-    case NID_basic_constraints:
-      return ProcessBasicConstraints(ex);
-    case NID_ext_key_usage:
-      return ProcessExtKeyUsage(ex);
-    case NID_issuer_alt_name:
-    case NID_subject_alt_name:
-      return ProcessAltName(ex);
-    case NID_subject_key_identifier:
-      return ProcessSubjectKeyId(ex);
-    case NID_authority_key_identifier:
-      return ProcessAuthKeyId(ex);
-    case NID_certificate_policies:
-      return ProcessCertificatePolicies(ex);
-    case NID_crl_distribution_points:
-      return ProcessCrlDistPoints(ex);
-    case NID_info_access:
-      return ProcessAuthInfoAccess(ex);
-    case NID_netscape_base_url:
-    case NID_netscape_revocation_url:
-    case NID_netscape_ca_revocation_url:
-    case NID_netscape_renewal_url:
-    case NID_netscape_ca_policy_url:
-    case NID_netscape_comment:
-    case NID_netscape_ssl_server_name:
-      return ProcessIA5StringData(X509_EXTENSION_get_data(ex));
-    default:
-      if (nid == ns_cert_ext_ca_cert_url ||
-          nid == ns_cert_ext_homepage_url ||
-          nid == ns_cert_ext_lost_password_url)
-        return ProcessIA5StringData(X509_EXTENSION_get_data(ex));
-      if (nid == ms_cert_ext_certtype)
-        return ProcessBMPStringData(X509_EXTENSION_get_data(ex));
-      return ProcessRawAsn1String(X509_EXTENSION_get_data(ex));
-  }
-}
-
-}  // namespace
-
-using net::X509Certificate;
-
-std::string GetCertNameOrNickname(X509Certificate::OSCertHandle cert_handle) {
-  std::string name =
-      ProcessIDN(GetSubjectCommonName(cert_handle, std::string()));
-  if (!name.empty())
-    return name;
-
-  crypto::ScopedBIO bio(crypto::BIO_new_string(&name));
-  if (!bio.get())
-    return name;
-  X509_NAME_print_ex(bio.get(),
-                     X509_get_subject_name(cert_handle),
-                     0 /* indent */,
-                     XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB);
-  return name;
-}
-
-std::string GetTokenName(X509Certificate::OSCertHandle cert_handle) {
-  // TODO(bulach): implement me.
-  return "";
-}
-
-std::string GetVersion(net::X509Certificate::OSCertHandle cert_handle) {
-  unsigned long version = X509_get_version(cert_handle);
-  if (version != ULONG_MAX)
-    return base::UintToString(version + 1);
-  return "";
-}
-
-net::CertType GetType(X509Certificate::OSCertHandle os_cert) {
-  // TODO(bulach): implement me.
-  return net::OTHER_CERT;
-}
-
-void GetUsageStrings(X509Certificate::OSCertHandle cert_handle,
-                         std::vector<std::string>* usages) {
-  // TODO(bulach): implement me.
-}
-
-std::string GetSerialNumberHexified(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  ASN1_INTEGER* num = X509_get_serialNumber(cert_handle);
-  const char kSerialNumberSeparator = ':';
-  std::string hex_string = ProcessRawBytesWithSeparators(
-      num->data, num->length, kSerialNumberSeparator, kSerialNumberSeparator);
-  return AlternativeWhenEmpty(hex_string, alternative_text);
-}
-
-std::string GetIssuerCommonName(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle),
-                                      NID_commonName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-std::string GetIssuerOrgName(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle),
-                                      NID_organizationName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-std::string GetIssuerOrgUnitName(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle),
-                                      NID_organizationalUnitName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-std::string GetSubjectOrgName(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle),
-                                      NID_organizationName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-std::string GetSubjectOrgUnitName(
-    X509Certificate::OSCertHandle cert_handle,
-    const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle),
-                                      NID_organizationalUnitName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-std::string GetSubjectCommonName(X509Certificate::OSCertHandle cert_handle,
-                                 const std::string& alternative_text) {
-  std::string ret;
-  x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle),
-                                      NID_commonName, &ret);
-  return AlternativeWhenEmpty(ret, alternative_text);
-}
-
-bool GetTimes(X509Certificate::OSCertHandle cert_handle,
-              base::Time* issued, base::Time* expires) {
-  return x509_util::ParseDate(X509_get_notBefore(cert_handle), issued) &&
-         x509_util::ParseDate(X509_get_notAfter(cert_handle), expires);
-}
-
-std::string GetTitle(net::X509Certificate::OSCertHandle cert_handle) {
-  // TODO(mattm): merge GetTitle and GetCertNameOrNickname?
-  // Is there any reason GetCertNameOrNickname calls ProcessIDN and this
-  // doesn't?
-  std::string title =
-      GetSubjectCommonName(cert_handle, std::string());
-  if (!title.empty())
-    return title;
-
-  crypto::ScopedBIO bio(crypto::BIO_new_string(&title));
-  if (!bio.get())
-    return title;
-  X509_NAME_print_ex(bio.get(),
-                     X509_get_subject_name(cert_handle),
-                     0 /* indent */,
-                     XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB);
-  return title;
-}
-
-std::string GetIssuerName(net::X509Certificate::OSCertHandle cert_handle) {
-  return GetKeyValuesFromName(X509_get_issuer_name(cert_handle));
-}
-
-std::string GetSubjectName(net::X509Certificate::OSCertHandle cert_handle) {
-  return GetKeyValuesFromName(X509_get_subject_name(cert_handle));
-}
-
-void GetExtensions(
-    const std::string& critical_label,
-    const std::string& non_critical_label,
-    net::X509Certificate::OSCertHandle cert_handle,
-    Extensions* extensions) {
-  for (int i = 0; i < X509_get_ext_count(cert_handle); ++i) {
-    X509_EXTENSION* ex = X509_get_ext(cert_handle, i);
-    ASN1_OBJECT* obj = X509_EXTENSION_get_object(ex);
-
-    Extension extension;
-    extension.name = Asn1ObjectToString(obj);
-    extension.value = (X509_EXTENSION_get_critical(ex) ? critical_label
-                                                       : non_critical_label) +
-                      "\n" + X509ExtensionValueToString(ex);
-    extensions->push_back(extension);
-  }
-}
-
-std::string HashCertSHA256(net::X509Certificate::OSCertHandle cert_handle) {
-  unsigned char sha256_data[SHA256_DIGEST_LENGTH] = {0};
-  unsigned int sha256_size = sizeof(sha256_data);
-  int ret = X509_digest(cert_handle, EVP_sha256(), sha256_data, &sha256_size);
-  DCHECK(ret);
-  DCHECK_EQ(sha256_size, sizeof(sha256_data));
-  return ProcessRawBytes(sha256_data, sha256_size);
-}
-
-std::string HashCertSHA1(net::X509Certificate::OSCertHandle cert_handle) {
-  unsigned char sha1_data[SHA_DIGEST_LENGTH] = {0};
-  unsigned int sha1_size = sizeof(sha1_data);
-  int ret = X509_digest(cert_handle, EVP_sha1(), sha1_data, &sha1_size);
-  DCHECK(ret);
-  DCHECK_EQ(sha1_size, sizeof(sha1_data));
-  return ProcessRawBytes(sha1_data, sha1_size);
-}
-
-std::string GetCMSString(const net::X509Certificate::OSCertHandles& cert_chain,
-                         size_t start, size_t end) {
-  STACK_OF(X509)* certs = sk_X509_new_null();
-
-  for (size_t i = start; i < end; ++i) {
-    sk_X509_push(certs, cert_chain[i]);
-  }
-
-  CBB pkcs7;
-  CBB_init(&pkcs7, 1024 * sk_X509_num(certs));
-
-  uint8_t *pkcs7_data;
-  size_t pkcs7_len;
-  if (!PKCS7_bundle_certificates(&pkcs7, certs) ||
-      !CBB_finish(&pkcs7, &pkcs7_data, &pkcs7_len)) {
-    CBB_cleanup(&pkcs7);
-    sk_X509_free(certs);
-    return "";
-  }
-
-  std::string ret(reinterpret_cast<char*>(pkcs7_data), pkcs7_len);
-  OPENSSL_free(pkcs7_data);
-  sk_X509_free(certs);
-
-  return ret;
-}
-
-std::string ProcessSecAlgorithmSignature(
-    net::X509Certificate::OSCertHandle cert_handle) {
-  return Asn1ObjectToString(cert_handle->cert_info->signature->algorithm);
-}
-
-std::string ProcessSecAlgorithmSubjectPublicKey(
-    net::X509Certificate::OSCertHandle cert_handle) {
-  return Asn1ObjectToString(
-      X509_get_X509_PUBKEY(cert_handle)->algor->algorithm);
-}
-
-std::string ProcessSecAlgorithmSignatureWrap(
-    net::X509Certificate::OSCertHandle cert_handle) {
-  return Asn1ObjectToString(cert_handle->sig_alg->algorithm);
-}
-
-std::string ProcessSubjectPublicKeyInfo(
-    net::X509Certificate::OSCertHandle cert_handle) {
-  std::string rv;
-  crypto::ScopedEVP_PKEY public_key(X509_get_pubkey(cert_handle));
-  if (!public_key.get())
-    return rv;
-  switch (EVP_PKEY_type(public_key.get()->type)) {
-    case EVP_PKEY_RSA: {
-      crypto::ScopedRSA rsa_key(EVP_PKEY_get1_RSA(public_key.get()));
-      if (!rsa_key)
-        return rv;
-      rv = l10n_util::GetStringFUTF8(
-          IDS_CERT_RSA_PUBLIC_KEY_DUMP_FORMAT,
-          base::UintToString16(BN_num_bits(rsa_key.get()->n)),
-          base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->n)),
-          base::UintToString16(BN_num_bits(rsa_key.get()->e)),
-          base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->e)));
-      return rv;
-    }
-    default:
-      rv = ProcessRawAsn1String(X509_get_X509_PUBKEY(cert_handle)->public_key);
-      return rv;
-  }
-}
-
-std::string ProcessRawBitsSignatureWrap(
-    net::X509Certificate::OSCertHandle cert_handle) {
-  return ProcessRawAsn1String(cert_handle->signature);
-}
-
-}  // namespace x509_certificate_model
diff --git a/chrome/common/net/x509_certificate_model_unittest.cc b/chrome/common/net/x509_certificate_model_unittest.cc
index 53e253d..9a51f28 100644
--- a/chrome/common/net/x509_certificate_model_unittest.cc
+++ b/chrome/common/net/x509_certificate_model_unittest.cc
@@ -37,30 +37,18 @@
       net::ImportCertFromFile(net::GetTestCertsDirectory(),
                               "no_subject_common_name_cert.pem"));
   ASSERT_TRUE(no_cn_cert.get());
-#if defined(USE_OPENSSL_CERTS)
-  EXPECT_EQ("emailAddress=wtc@google.com",
-            x509_certificate_model::GetCertNameOrNickname(
-                no_cn_cert->os_cert_handle()));
-#else
   // Temp cert has no nickname.
   EXPECT_EQ("",
             x509_certificate_model::GetCertNameOrNickname(
                 no_cn_cert->os_cert_handle()));
-#endif
 
   EXPECT_EQ("xn--wgv71a119e.com",
             x509_certificate_model::GetTitle(
                 punycode_cert->os_cert_handle()));
 
-#if defined(USE_OPENSSL_CERTS)
-  EXPECT_EQ("emailAddress=wtc@google.com",
-            x509_certificate_model::GetTitle(
-                no_cn_cert->os_cert_handle()));
-#else
   EXPECT_EQ("E=wtc@google.com",
             x509_certificate_model::GetTitle(
                 no_cn_cert->os_cert_handle()));
-#endif
 
   scoped_refptr<net::X509Certificate> no_cn_cert2(net::ImportCertFromFile(
       net::GetTestCertsDirectory(), "ct-test-embedded-cert.pem"));
@@ -225,11 +213,6 @@
                               "root_ca_cert.pem"));
   ASSERT_TRUE(cert.get());
 
-#if defined(USE_OPENSSL_CERTS)
-  // Remove this when OpenSSL build implements the necessary functions.
-  EXPECT_EQ(net::OTHER_CERT,
-            x509_certificate_model::GetType(cert->os_cert_handle()));
-#else
   EXPECT_EQ(net::CA_CERT,
             x509_certificate_model::GetType(cert->os_cert_handle()));
 
@@ -246,7 +229,6 @@
 
   EXPECT_EQ(net::CA_CERT,
             x509_certificate_model::GetType(cert->os_cert_handle()));
-#endif
 }
 
 TEST(X509CertificateModelTest, GetTypeServer) {
@@ -255,11 +237,6 @@
                               "google.single.der"));
   ASSERT_TRUE(cert.get());
 
-#if defined(USE_OPENSSL_CERTS)
-  // Remove this when OpenSSL build implements the necessary functions.
-  EXPECT_EQ(net::OTHER_CERT,
-            x509_certificate_model::GetType(cert->os_cert_handle()));
-#else
   // Test mozilla_security_manager::GetCertType with server certs and default
   // trust.  Currently this doesn't work.
   // TODO(mattm): make mozilla_security_manager::GetCertType smarter so we can
@@ -286,7 +263,6 @@
 
   EXPECT_EQ(net::SERVER_CERT,
             x509_certificate_model::GetType(cert->os_cert_handle()));
-#endif
 }
 
 // An X.509 v1 certificate with the version field omitted should get
@@ -325,15 +301,11 @@
             net::X509Certificate::FORMAT_PKCS7);
 
     ASSERT_EQ(certs.size(), decoded_certs.size());
-#if defined(USE_OPENSSL_CERTS)
-    for (size_t i = 0; i < certs.size(); ++i)
-      EXPECT_TRUE(certs[i]->Equals(decoded_certs[i].get()));
-#else
+
     // NSS sorts the certs before writing the file.
     EXPECT_TRUE(certs[0]->Equals(decoded_certs.back().get()));
     for (size_t i = 1; i < certs.size(); ++i)
       EXPECT_TRUE(certs[i]->Equals(decoded_certs[i - 1].get()));
-#endif
   }
 
   {
@@ -410,11 +382,7 @@
         "2A 15 84 49 F1 01 BF 9B 30 06 D0 15 A0 1F 9D 51\n"
         "91 47 E1 53 5F EF 5E EC C2 61 79 C2 14 9F C4 E3\n"
         "\n"
-#if defined(USE_OPENSSL_CERTS)
-        "  Public Exponent (17 bits):\n"
-#else
         "  Public Exponent (24 bits):\n"
-#endif
         "  01 00 01",
         x509_certificate_model::ProcessSubjectPublicKeyInfo(
             cert->os_cert_handle()));
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 32678c0..21ad3fa 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2128,7 +2128,7 @@
               "//chrome")
     }
   }
-  if (!is_android && (use_nss_certs || use_openssl_certs)) {
+  if (!is_android && use_nss_certs) {
     sources += [ "../common/net/x509_certificate_model_unittest.cc" ]
   }
   if (enable_supervised_users) {
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc
index 4dc9b44..7e951f1 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc
@@ -16,7 +16,6 @@
 #include "base/process/process.h"
 #include "content/browser/bad_message.h"
 #include "content/browser/browser_main_loop.h"
-#include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/media/audio_stream_monitor.h"
 #include "content/browser/media/capture/audio_mirroring_manager.h"
 #include "content/browser/media/media_internals.h"
@@ -56,10 +55,6 @@
                         std::make_pair(authorized, device_unique_id));
 }
 
-GURL ConvertToGURL(const url::Origin& origin) {
-  return origin.unique() ? GURL() : GURL(origin.Serialize());
-}
-
 bool IsValidDeviceId(const std::string& device_id) {
   static const std::string::size_type kValidLength = 64;
 
@@ -438,10 +433,9 @@
           stream_id, true, info->device.matched_output_device_id));
       MaybeFixAudioParameters(&output_params);
       // Hash matched device id and pass it to the renderer
-      GURL gurl_security_origin = ConvertToGURL(security_origin);
       Send(new AudioMsg_NotifyDeviceAuthorized(
           stream_id, media::OUTPUT_DEVICE_STATUS_OK, output_params,
-          GetHMACForMediaDeviceID(salt_callback_, gurl_security_origin,
+          GetHMACForMediaDeviceID(salt_callback_, security_origin,
                                   info->device.matched_output_device_id)));
       return;
     }
@@ -449,16 +443,15 @@
 
   authorizations_.insert(
       MakeAuthorizationData(stream_id, false, std::string()));
-  GURL gurl_security_origin = ConvertToGURL(security_origin);
   CheckOutputDeviceAccess(
-      render_frame_id, device_id, gurl_security_origin,
+      render_frame_id, device_id, security_origin,
       base::Bind(&AudioRendererHost::OnDeviceAuthorized, this, stream_id,
-                 device_id, gurl_security_origin));
+                 device_id, security_origin));
 }
 
 void AudioRendererHost::OnDeviceAuthorized(int stream_id,
                                            const std::string& device_id,
-                                           const GURL& gurl_security_origin,
+                                           const url::Origin& security_origin,
                                            bool have_access) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   const auto& auth_data = authorizations_.find(stream_id);
@@ -490,7 +483,7 @@
   } else {
     media_stream_manager_->audio_output_device_enumerator()->Enumerate(
         base::Bind(&AudioRendererHost::TranslateDeviceID, this, device_id,
-                   gurl_security_origin,
+                   security_origin,
                    base::Bind(&AudioRendererHost::OnDeviceIDTranslated, this,
                               stream_id)));
   }
@@ -747,15 +740,15 @@
 void AudioRendererHost::CheckOutputDeviceAccess(
     int render_frame_id,
     const std::string& device_id,
-    const GURL& gurl_security_origin,
+    const url::Origin& security_origin,
     const OutputDeviceAccessCB& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   // Check security origin if nondefault device is requested.
   // Ignore check for default device, which is always authorized.
   if (!media::AudioDeviceDescription::IsDefaultDevice(device_id) &&
-      !ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
-          render_process_id_, gurl_security_origin)) {
+      !MediaStreamManager::IsOriginAllowed(render_process_id_,
+                                           security_origin)) {
     content::bad_message::ReceivedBadMessage(this,
                                              bad_message::ARH_UNAUTHORIZED_URL);
     return;
@@ -773,7 +766,7 @@
     // MEDIA_DEVICE_AUDIO_OUTPUT.
     // TODO(guidou): Change to MEDIA_DEVICE_AUDIO_OUTPUT when support becomes
     // available. http://crbug.com/498675
-    ui_proxy->CheckAccess(gurl_security_origin, MEDIA_DEVICE_AUDIO_CAPTURE,
+    ui_proxy->CheckAccess(security_origin, MEDIA_DEVICE_AUDIO_CAPTURE,
                           render_process_id_, render_frame_id,
                           base::Bind(&AudioRendererHost::AccessChecked, this,
                                      base::Passed(&ui_proxy), callback));
@@ -790,7 +783,7 @@
 
 void AudioRendererHost::TranslateDeviceID(
     const std::string& device_id,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const OutputDeviceInfoCB& callback,
     const AudioOutputDeviceEnumeration& enumeration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/renderer_host/media/audio_renderer_host.h b/content/browser/renderer_host/media/audio_renderer_host.h
index b4e9d3f..4f2747be 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.h
+++ b/content/browser/renderer_host/media/audio_renderer_host.h
@@ -147,7 +147,7 @@
                                     int render_frame_id,
                                     int session_id,
                                     const std::string& device_id,
-                                    const url::Origin& gurl_security_origin);
+                                    const url::Origin& security_origin);
 
   // Creates an audio output stream with the specified format.
   // Upon success/failure, the peer is notified via the NotifyStreamCreated
@@ -173,7 +173,7 @@
   // Proceed with device authorization after checking permissions.
   void OnDeviceAuthorized(int stream_id,
                           const std::string& device_id,
-                          const GURL& security_origin,
+                          const url::Origin& security_origin,
                           bool have_access);
 
   // Proceed with device authorization after translating device ID.
@@ -219,7 +219,7 @@
   // Check if the renderer process has access to the requested output device.
   void CheckOutputDeviceAccess(int render_frame_id,
                                const std::string& device_id,
-                               const GURL& gurl_security_origin,
+                               const url::Origin& security_origin,
                                const OutputDeviceAccessCB& callback);
 
   // Invoke |callback| after permission to use a device has been checked.
@@ -229,7 +229,7 @@
 
   // Translate the hashed |device_id| to a unique device ID.
   void TranslateDeviceID(const std::string& device_id,
-                         const GURL& gurl_security_origin,
+                         const url::Origin& security_origin,
                          const OutputDeviceInfoCB& callback,
                          const AudioOutputDeviceEnumeration& enumeration);
 
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 f325e92..1a1323b 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -5,7 +5,6 @@
 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
 
 #include "content/browser/browser_main_loop.h"
-#include "content/browser/child_process_security_policy_impl.h"
 #include "content/common/media/media_stream_messages.h"
 #include "content/common/media/media_stream_options.h"
 #include "content/public/browser/render_process_host.h"
@@ -129,18 +128,19 @@
 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() {
 }
 
-void MediaStreamDispatcherHost::OnGenerateStream(int render_frame_id,
-                                                 int page_request_id,
-                                                 const StreamControls& controls,
-                                                 const GURL& security_origin,
-                                                 bool user_gesture) {
+void MediaStreamDispatcherHost::OnGenerateStream(
+    int render_frame_id,
+    int page_request_id,
+    const StreamControls& controls,
+    const url::Origin& security_origin,
+    bool user_gesture) {
   DVLOG(1) << "MediaStreamDispatcherHost::OnGenerateStream(" << render_frame_id
            << ", " << page_request_id << ", ["
            << " audio:" << controls.audio.requested
-           << " video:" << controls.video.requested << " ], "
-           << security_origin.spec() << ", " << user_gesture << ")";
+           << " video:" << controls.video.requested << " ], " << security_origin
+           << ", " << user_gesture << ")";
 
-  if (!IsURLAllowed(security_origin))
+  if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin))
     return;
 
   media_stream_manager_->GenerateStream(
@@ -171,14 +171,12 @@
     int render_frame_id,
     int page_request_id,
     MediaStreamType type,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   DVLOG(1) << "MediaStreamDispatcherHost::OnEnumerateDevices("
-           << render_frame_id << ", "
-           << page_request_id << ", "
-           << type << ", "
-           << security_origin.spec() << ")";
+           << render_frame_id << ", " << page_request_id << ", " << type << ", "
+           << security_origin << ")";
 
-  if (!IsURLAllowed(security_origin))
+  if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin))
     return;
 
   media_stream_manager_->EnumerateDevices(
@@ -201,15 +199,12 @@
     int page_request_id,
     const std::string& device_id,
     MediaStreamType type,
-    const GURL& security_origin) {
-  DVLOG(1) << "MediaStreamDispatcherHost::OnOpenDevice("
-           << render_frame_id << ", "
-           << page_request_id << ", device_id: "
-           << device_id.c_str() << ", type: "
-           << type << ", "
-           << security_origin.spec() << ")";
+    const url::Origin& security_origin) {
+  DVLOG(1) << "MediaStreamDispatcherHost::OnOpenDevice(" << render_frame_id
+           << ", " << page_request_id << ", device_id: " << device_id.c_str()
+           << ", type: " << type << ", " << security_origin << ")";
 
-  if (!IsURLAllowed(security_origin))
+  if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin))
     return;
 
   media_stream_manager_->OpenDevice(
@@ -227,14 +222,4 @@
   media_stream_manager_->CancelRequest(label);
 }
 
-bool MediaStreamDispatcherHost::IsURLAllowed(const GURL& url) {
-  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
-          render_process_id_, url)) {
-    LOG(ERROR) << "MSDH: Renderer requested a URL it's not allowed to use.";
-    return false;
-  }
-
-  return true;
-}
-
 }  // namespace content
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 088154b..65343a3 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.h
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
@@ -17,6 +17,10 @@
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/resource_context.h"
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 class MediaStreamManager;
@@ -69,7 +73,7 @@
   void OnGenerateStream(int render_frame_id,
                         int page_request_id,
                         const StreamControls& controls,
-                        const GURL& security_origin,
+                        const url::Origin& security_origin,
                         bool user_gesture);
   void OnCancelGenerateStream(int render_frame_id,
                               int page_request_id);
@@ -79,7 +83,7 @@
   void OnEnumerateDevices(int render_frame_id,
                           int page_request_id,
                           MediaStreamType type,
-                          const GURL& security_origin);
+                          const url::Origin& security_origin);
 
   void OnCancelEnumerateDevices(int render_frame_id,
                                 int page_request_id);
@@ -88,7 +92,7 @@
                     int page_request_id,
                     const std::string& device_id,
                     MediaStreamType type,
-                    const GURL& security_origin);
+                    const url::Origin& security_origin);
 
   void OnCloseDevice(int render_frame_id,
                      const std::string& label);
@@ -97,8 +101,6 @@
                     int page_request_id,
                     const std::string& label);
 
-  bool IsURLAllowed(const GURL& url);
-
   int render_process_id_;
   ResourceContext::SaltCallback salt_callback_;
   MediaStreamManager* media_stream_manager_;
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index 5560d0e..8e435a7 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -38,6 +38,8 @@
 #include "net/url_request/url_request_context.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 #if defined(OS_CHROMEOS)
 #include "chromeos/audio/cras_audio_handler.h"
@@ -81,7 +83,7 @@
   void OnGenerateStream(int render_frame_id,
                         int page_request_id,
                         const StreamControls& controls,
-                        const GURL& security_origin,
+                        const url::Origin& security_origin,
                         const base::Closure& quit_closure) {
     quit_closures_.push(quit_closure);
     MediaStreamDispatcherHost::OnGenerateStream(
@@ -97,7 +99,7 @@
                     int page_request_id,
                     const std::string& device_id,
                     MediaStreamType type,
-                    const GURL& security_origin,
+                    const url::Origin& security_origin,
                     const base::Closure& quit_closure) {
     quit_closures_.push(quit_closure);
     MediaStreamDispatcherHost::OnOpenDevice(
@@ -107,7 +109,7 @@
   void OnEnumerateDevices(int render_frame_id,
                           int page_request_id,
                           MediaStreamType type,
-                          const GURL& security_origin,
+                          const url::Origin& security_origin,
                           const base::Closure& quit_closure) {
     quit_closures_.push(quit_closure);
     MediaStreamDispatcherHost::OnEnumerateDevices(
@@ -178,7 +180,7 @@
       task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure));
     }
 
-    label_= "";
+    label_ = "";
   }
 
   void OnDeviceStoppedInternal(const std::string& label,
@@ -227,7 +229,7 @@
   MediaStreamDispatcherHostTest()
       : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
         old_browser_client_(NULL),
-        origin_("https://test.com") {
+        origin_(GURL("https://test.com")) {
     audio_manager_.reset(
         new media::MockAudioManager(base::ThreadTaskRunnerHandle::Get()));
     // Make sure we use fake devices to avoid long delays.
@@ -370,7 +372,7 @@
   }
 
   bool DoesEveryDeviceMapToRawId(const StreamDeviceInfoArray& devices,
-                                 const GURL& origin) {
+                                 const url::Origin& origin) {
     for (size_t i = 0; i < devices.size(); ++i) {
       bool found_match = false;
       media::AudioDeviceNames::const_iterator audio_it =
@@ -432,7 +434,7 @@
   content::TestBrowserContext browser_context_;
   media::AudioDeviceNames physical_audio_devices_;
   media::VideoCaptureDevice::Names physical_video_devices_;
-  GURL origin_;
+  url::Origin origin_;
   media::FakeVideoCaptureDeviceFactory* video_capture_device_factory_;
 };
 
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index b0609384..1882b0fa 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -30,6 +30,7 @@
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
 #include "content/browser/browser_main_loop.h"
+#include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
 #include "content/browser/renderer_host/media/audio_output_device_enumerator.h"
 #include "content/browser/renderer_host/media/media_capture_devices_impl.h"
@@ -55,6 +56,7 @@
 #include "media/base/media_switches.h"
 #include "media/capture/video/video_capture_device_factory.h"
 #include "url/gurl.h"
+#include "url/origin.h"
 
 #if defined(OS_WIN)
 #include "base/win/scoped_com_initializer.h"
@@ -193,6 +195,10 @@
          !BrowserThread::IsMessageLoopValid(BrowserThread::IO);
 }
 
+GURL ConvertToGURL(const url::Origin& origin) {
+  return origin.unique() ? GURL() : GURL(origin.Serialize());
+}
+
 }  // namespace
 
 
@@ -208,7 +214,7 @@
                 int requesting_process_id,
                 int requesting_frame_id,
                 int page_request_id,
-                const GURL& security_origin,
+                const url::Origin& security_origin,
                 bool user_gesture,
                 MediaStreamRequestType request_type,
                 const StreamControls& controls,
@@ -253,16 +259,11 @@
     DCHECK(!ui_request_);
     target_process_id_ = requesting_process_id;
     target_frame_id_ = requesting_frame_id;
-    ui_request_.reset(new MediaStreamRequest(requesting_process_id,
-                                             requesting_frame_id,
-                                             page_request_id,
-                                             security_origin,
-                                             user_gesture,
-                                             request_type,
-                                             requested_audio_device_id,
-                                             requested_video_device_id,
-                                             audio_type_,
-                                             video_type_));
+    ui_request_.reset(new MediaStreamRequest(
+        requesting_process_id, requesting_frame_id, page_request_id,
+        ConvertToGURL(security_origin), user_gesture, request_type,
+        requested_audio_device_id, requested_video_device_id, audio_type_,
+        video_type_));
   }
 
   // Creates a tab capture specific MediaStreamRequest object that is used by
@@ -272,16 +273,10 @@
     DCHECK(!ui_request_);
     target_process_id_ = target_render_process_id;
     target_frame_id_ = target_render_frame_id;
-    ui_request_.reset(new MediaStreamRequest(target_render_process_id,
-                                             target_render_frame_id,
-                                             page_request_id,
-                                             security_origin,
-                                             user_gesture,
-                                             request_type,
-                                             "",
-                                             "",
-                                             audio_type_,
-                                             video_type_));
+    ui_request_.reset(new MediaStreamRequest(
+        target_render_process_id, target_render_frame_id, page_request_id,
+        ConvertToGURL(security_origin), user_gesture, request_type, "", "",
+        audio_type_, video_type_));
   }
 
   bool HasUIRequest() const { return ui_request_.get() != nullptr; }
@@ -306,8 +301,8 @@
       return;
 
     media_observer->OnMediaRequestStateChanged(
-        target_process_id_, target_frame_id_, page_request_id, security_origin,
-        stream_type, new_state);
+        target_process_id_, target_frame_id_, page_request_id,
+        ConvertToGURL(security_origin), stream_type, new_state);
   }
 
   MediaRequestState state(MediaStreamType stream_type) const {
@@ -332,7 +327,7 @@
   // An ID the render frame provided to identify this request.
   const int page_request_id;
 
-  const GURL security_origin;
+  const url::Origin security_origin;
 
   const bool user_gesture;
 
@@ -454,7 +449,7 @@
     int render_frame_id,
     int page_request_id,
     const StreamControls& controls,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const MediaRequestResponseCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
@@ -487,7 +482,7 @@
                                         const ResourceContext::SaltCallback& sc,
                                         int page_request_id,
                                         const StreamControls& controls,
-                                        const GURL& security_origin,
+                                        const url::Origin& security_origin,
                                         bool user_gesture) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DVLOG(1) << "GenerateStream()";
@@ -667,7 +662,7 @@
     const ResourceContext::SaltCallback& sc,
     int page_request_id,
     MediaStreamType type,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(requester);
   DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
@@ -784,7 +779,7 @@
                                     int page_request_id,
                                     const std::string& device_id,
                                     MediaStreamType type,
-                                    const GURL& security_origin) {
+                                    const url::Origin& security_origin) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
          type == MEDIA_DEVICE_VIDEO_CAPTURE);
@@ -820,7 +815,7 @@
 bool MediaStreamManager::TranslateSourceIdToDeviceId(
     MediaStreamType stream_type,
     const ResourceContext::SaltCallback& sc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& source_id,
     std::string* device_id) const {
   DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
@@ -973,7 +968,7 @@
 bool MediaStreamManager::PickDeviceId(
     MediaStreamType type,
     const ResourceContext::SaltCallback& salt_callback,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const TrackControls& controls,
     std::string* device_id) const {
   if (!controls.device_ids.empty()) {
@@ -1200,14 +1195,6 @@
     return;  // This can happen if the request has been canceled.
   }
 
-  if (!request->security_origin.is_valid()) {
-    LOG(ERROR) << "Invalid security origin. " << request->security_origin;
-    FinalizeRequestFailed(label,
-                          request,
-                          MEDIA_DEVICE_INVALID_SECURITY_ORIGIN);
-    return;
-  }
-
   MediaStreamType audio_type = MEDIA_NO_SERVICE;
   MediaStreamType video_type = MEDIA_NO_SERVICE;
   ParseStreamType(request->controls, &audio_type, &video_type);
@@ -1458,12 +1445,8 @@
          (request->audio_type() == MEDIA_NO_SERVICE &&
           request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE));
 
-  if (request->security_origin.is_valid()) {
-    for (StreamDeviceInfo& device_info : request->devices)
-      TranslateDeviceIdToSourceId(request, &device_info.device);
-  } else {
-    request->devices.clear();
-  }
+  for (StreamDeviceInfo& device_info : request->devices)
+    TranslateDeviceIdToSourceId(request, &device_info.device);
 
   if (use_fake_ui_) {
     if (!fake_ui_)
@@ -2125,9 +2108,8 @@
 // static
 std::string MediaStreamManager::GetHMACForMediaDeviceID(
     const ResourceContext::SaltCallback& sc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& raw_unique_id) {
-  DCHECK(security_origin.is_valid());
   DCHECK(!raw_unique_id.empty());
   if (raw_unique_id == media::AudioDeviceDescription::kDefaultDeviceId ||
       raw_unique_id == media::AudioDeviceDescription::kCommunicationsDeviceId) {
@@ -2138,7 +2120,7 @@
   const size_t digest_length = hmac.DigestLength();
   std::vector<uint8_t> digest(digest_length);
   std::string salt = sc.Run();
-  bool result = hmac.Init(security_origin.spec()) &&
+  bool result = hmac.Init(security_origin.Serialize()) &&
                 hmac.Sign(raw_unique_id + salt, &digest[0], digest.size());
   DCHECK(result);
   return base::ToLowerASCII(base::HexEncode(&digest[0], digest.size()));
@@ -2147,14 +2129,25 @@
 // static
 bool MediaStreamManager::DoesMediaDeviceIDMatchHMAC(
     const ResourceContext::SaltCallback& sc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& device_guid,
     const std::string& raw_unique_id) {
-  DCHECK(security_origin.is_valid());
   DCHECK(!raw_unique_id.empty());
   std::string guid_from_raw_device_id =
       GetHMACForMediaDeviceID(sc, security_origin, raw_unique_id);
   return guid_from_raw_device_id == device_guid;
 }
 
+// static
+bool MediaStreamManager::IsOriginAllowed(int render_process_id,
+                                         const url::Origin& origin) {
+  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
+          render_process_id, ConvertToGURL(origin))) {
+    LOG(ERROR) << "MSM: Renderer requested a URL it's not allowed to use.";
+    return false;
+  }
+
+  return true;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h
index afca478..a1f2272 100644
--- a/content/browser/renderer_host/media/media_stream_manager.h
+++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -51,6 +51,10 @@
 class AudioManager;
 }
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 class AudioInputDeviceManager;
@@ -105,7 +109,7 @@
       int render_frame_id,
       int page_request_id,
       const StreamControls& controls,
-      const GURL& security_origin,
+      const url::Origin& security_origin,
       const MediaRequestResponseCallback& callback);
 
   // GenerateStream opens new media devices according to |components|.  It
@@ -118,7 +122,7 @@
                       const ResourceContext::SaltCallback& sc,
                       int page_request_id,
                       const StreamControls& controls,
-                      const GURL& security_origin,
+                      const url::Origin& security_origin,
                       bool user_gesture);
 
   void CancelRequest(int render_process_id,
@@ -150,7 +154,7 @@
                                        const ResourceContext::SaltCallback& sc,
                                        int page_request_id,
                                        MediaStreamType type,
-                                       const GURL& security_origin);
+                                       const url::Origin& security_origin);
 
   // Open a device identified by |device_id|.  |type| must be either
   // MEDIA_DEVICE_AUDIO_CAPTURE or MEDIA_DEVICE_VIDEO_CAPTURE.
@@ -162,14 +166,14 @@
                   int page_request_id,
                   const std::string& device_id,
                   MediaStreamType type,
-                  const GURL& security_origin);
+                  const url::Origin& security_origin);
 
   // Finds and returns the device id corresponding to the given
   // |source_id|. Returns true if there was a raw device id that matched the
   // given |source_id|, false if nothing matched it.
   bool TranslateSourceIdToDeviceId(MediaStreamType stream_type,
                                    const ResourceContext::SaltCallback& rc,
-                                   const GURL& security_origin,
+                                   const url::Origin& security_origin,
                                    const std::string& source_id,
                                    std::string* device_id) const;
 
@@ -236,17 +240,21 @@
   // particular security origin.
   static std::string GetHMACForMediaDeviceID(
       const ResourceContext::SaltCallback& sc,
-      const GURL& security_origin,
+      const url::Origin& security_origin,
       const std::string& raw_unique_id);
 
   // Convenience method to check if |device_guid| is an HMAC of
   // |raw_device_id| for |security_origin|.
   static bool DoesMediaDeviceIDMatchHMAC(
       const ResourceContext::SaltCallback& sc,
-      const GURL& security_origin,
+      const url::Origin& security_origin,
       const std::string& device_guid,
       const std::string& raw_unique_id);
 
+  // Returns true if the renderer process identified with |render_process_id|
+  // is allowed to access |origin|.
+  static bool IsOriginAllowed(int render_process_id, const url::Origin& origin);
+
  private:
   // Contains all data needed to keep track of requests.
   class DeviceRequest;
@@ -387,7 +395,7 @@
   // Otherwise, if no valid device is found, device_id is unchanged.
   bool PickDeviceId(MediaStreamType type,
                     const ResourceContext::SaltCallback& salt_callback,
-                    const GURL& security_origin,
+                    const url::Origin& security_origin,
                     const TrackControls& controls,
                     std::string* device_id) const;
 
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
index 5d329e41..ecce174 100644
--- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -27,6 +27,8 @@
 #include "media/base/media_switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 #if defined(USE_ALSA)
 #include "media/audio/alsa/audio_manager_alsa.h"
@@ -236,7 +238,7 @@
     const int render_process_id = 1;
     const int render_frame_id = 1;
     const int page_request_id = 1;
-    const GURL security_origin;
+    const url::Origin security_origin;
     MediaStreamManager::MediaRequestResponseCallback callback =
         base::Bind(&MediaStreamManagerTest::ResponseCallback,
                    base::Unretained(this), index);
@@ -281,7 +283,7 @@
   int render_process_id = 2;
   int render_frame_id = 2;
   int page_request_id = 2;
-  GURL security_origin;
+  url::Origin security_origin;
   StreamControls controls(true, true);
   MediaStreamManager::MediaRequestResponseCallback callback =
       base::Bind(&MediaStreamManagerTest::ResponseCallback,
@@ -310,7 +312,7 @@
 }
 
 TEST_F(MediaStreamManagerTest, DeviceID) {
-  GURL security_origin("http://localhost");
+  url::Origin security_origin(GURL("http://localhost"));
   const std::string unique_default_id(
       media::AudioDeviceDescription::kDefaultDeviceId);
   const std::string hashed_default_id =
@@ -354,7 +356,7 @@
     const int render_process_id = 1;
     const int render_frame_id = 1;
     const int page_request_id = 1;
-    const GURL security_origin("http://localhost");
+    const url::Origin security_origin(GURL("http://localhost"));
     EXPECT_CALL(requester,
                 MockDevicesEnumerated(render_frame_id, page_request_id, _, _));
     std::string label = media_stream_manager_->EnumerateDevices(
@@ -370,7 +372,7 @@
   const int render_process_id = 1;
   const int render_frame_id = 1;
   const int page_request_id = 1;
-  const GURL security_origin("http://localhost");
+  const url::Origin security_origin(GURL("http://localhost"));
 
   // Check that device change notifications are received
   {
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.cc b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
index 79ae89de..9997a76 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
@@ -14,9 +14,19 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "media/capture/video/fake_video_capture_device.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 
+namespace {
+
+GURL ConvertToGURL(const url::Origin& origin) {
+  return origin.unique() ? GURL() : GURL(origin.Serialize());
+}
+
+}  // namespace
+
 void SetAndCheckAncestorFlag(MediaStreamRequest* request) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RenderFrameHostImpl* rfh =
@@ -193,7 +203,7 @@
 }
 
 void MediaStreamUIProxy::CheckAccess(
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     MediaStreamType type,
     int render_process_id,
     int render_frame_id,
@@ -201,17 +211,12 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&Core::CheckAccess,
-                 base::Unretained(core_.get()),
-                 security_origin,
-                 type,
-                 render_process_id,
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&Core::CheckAccess, base::Unretained(core_.get()),
+                 ConvertToGURL(security_origin), type, render_process_id,
                  render_frame_id),
       base::Bind(&MediaStreamUIProxy::OnCheckedAccess,
-                 weak_factory_.GetWeakPtr(),
-                 callback));
+                 weak_factory_.GetWeakPtr(), callback));
 }
 
 void MediaStreamUIProxy::OnStarted(const base::Closure& stop_callback,
@@ -350,7 +355,7 @@
 }
 
 void FakeMediaStreamUIProxy::CheckAccess(
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     MediaStreamType type,
     int render_process_id,
     int render_frame_id,
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.h b/content/browser/renderer_host/media/media_stream_ui_proxy.h
index a89d35b8..2e2e037 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy.h
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy.h
@@ -13,6 +13,10 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/media_stream_request.h"
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 class RenderFrameHostDelegate;
@@ -23,8 +27,8 @@
 class CONTENT_EXPORT MediaStreamUIProxy {
  public:
   typedef base::Callback<
-      void (const MediaStreamDevices& devices,
-            content::MediaStreamRequestResult result)>
+      void(const MediaStreamDevices& devices,
+           content::MediaStreamRequestResult result)>
         ResponseCallback;
 
   typedef base::Callback<void(gfx::NativeViewId window_id)> WindowIdCallback;
@@ -46,7 +50,7 @@
   // this does not query the user, it checks any stored settings such as policy
   // or extension permissions. |type| must be MEDIA_DEVICE_AUDIO_CAPTURE
   // or MEDIA_DEVICE_VIDEO_CAPTURE.
-  virtual void CheckAccess(const GURL& security_origin,
+  virtual void CheckAccess(const url::Origin& security_origin,
                            MediaStreamType type,
                            int render_process_id,
                            int render_frame_id,
@@ -100,7 +104,7 @@
   // MediaStreamUIProxy overrides.
   void RequestAccess(std::unique_ptr<MediaStreamRequest> request,
                      const ResponseCallback& response_callback) override;
-  void CheckAccess(const GURL& security_origin,
+  void CheckAccess(const url::Origin& security_origin,
                    MediaStreamType type,
                    int render_process_id,
                    int render_frame_id,
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
index a3ce770..0491a0c 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
@@ -12,6 +12,8 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/rect.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 using testing::_;
 using testing::Return;
@@ -256,15 +258,13 @@
 }
 
 TEST_F(MediaStreamUIProxyTest, CheckAccess) {
-  proxy_->CheckAccess(GURL("http://origin/"),
-                           MEDIA_DEVICE_AUDIO_CAPTURE,
-                           0,
-                           0,
-                           base::Bind(&MockResponseCallback::OnCheckResponse,
-                                      base::Unretained(&response_callback_)));
+  proxy_->CheckAccess(url::Origin(GURL("http://origin/")),
+                      MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0,
+                      base::Bind(&MockResponseCallback::OnCheckResponse,
+                                 base::Unretained(&response_callback_)));
   EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _));
   EXPECT_CALL(response_callback_, OnCheckResponse(_));
   message_loop_.RunUntilIdle();
 }
 
-}  // content
+}  // namespace content
diff --git a/content/browser/renderer_host/media/video_capture_host_unittest.cc b/content/browser/renderer_host/media/video_capture_host_unittest.cc
index 93c8d583..fb120a2 100644
--- a/content/browser/renderer_host/media/video_capture_host_unittest.cc
+++ b/content/browser/renderer_host/media/video_capture_host_unittest.cc
@@ -315,7 +315,7 @@
     const int render_process_id = 1;
     const int render_frame_id = 1;
     const int page_request_id = 1;
-    const GURL security_origin("http://test.com");
+    const url::Origin security_origin(GURL("http://test.com"));
 
     ASSERT_TRUE(opened_device_label_.empty());
 
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc
index 7cc9137e..f6b9d5e 100644
--- a/content/browser/speech/speech_recognition_manager_impl.cc
+++ b/content/browser/speech/speech_recognition_manager_impl.cc
@@ -27,6 +27,8 @@
 #include "content/public/common/speech_recognition_result.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/audio_manager.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 #if defined(OS_ANDROID)
 #include "content/browser/speech/speech_recognizer_impl_android.h"
@@ -186,7 +188,7 @@
     SpeechRecognitionSessionContext& context = session->context;
     context.label = media_stream_manager_->MakeMediaAccessRequest(
         context.render_process_id, context.render_frame_id, context.request_id,
-        StreamControls(true, false), GURL(context.context_name),
+        StreamControls(true, false), url::Origin(GURL(context.context_name)),
         base::Bind(
             &SpeechRecognitionManagerImpl::MediaRequestPermissionCallback,
             weak_factory_.GetWeakPtr(), session_id));
diff --git a/content/common/media/media_stream_messages.h b/content/common/media/media_stream_messages.h
index 46acb9b..9a745a1 100644
--- a/content/common/media/media_stream_messages.h
+++ b/content/common/media/media_stream_messages.h
@@ -11,7 +11,7 @@
 #include "content/common/media/media_stream_options.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_platform_file.h"
-#include "url/gurl.h"
+#include "url/origin.h"
 
 #undef IPC_MESSAGE_EXPORT
 #define IPC_MESSAGE_EXPORT CONTENT_EXPORT
@@ -102,7 +102,7 @@
                      int /* render frame id */,
                      int /* request id */,
                      content::StreamControls /* controls */,
-                     GURL /* security origin */,
+                     url::Origin /* security origin */,
                      bool /* user_gesture */)
 
 // Request to cancel the request for a new media stream.
@@ -121,7 +121,7 @@
                      int /* render frame id */,
                      int /* request id */,
                      content::MediaStreamType /* type */,
-                     GURL /* security origin */)
+                     url::Origin /* security origin */)
 
 // Request to stop enumerating devices.
 IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_CancelEnumerateDevices,
@@ -134,7 +134,7 @@
                      int /* request id */,
                      std::string /* device_id */,
                      content::MediaStreamType /* type */,
-                     GURL /* security origin */)
+                     url::Origin /* security origin */)
 
 // Request to close a device.
 IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_CloseDevice,
diff --git a/content/public/browser/media_device_id.cc b/content/public/browser/media_device_id.cc
index 876e12ac..d99d0f2 100644
--- a/content/public/browser/media_device_id.cc
+++ b/content/public/browser/media_device_id.cc
@@ -9,14 +9,14 @@
 namespace content {
 
 std::string GetHMACForMediaDeviceID(const ResourceContext::SaltCallback& sc,
-                                    const GURL& security_origin,
+                                    const url::Origin& security_origin,
                                     const std::string& raw_unique_id) {
   return MediaStreamManager::GetHMACForMediaDeviceID(sc, security_origin,
                                                      raw_unique_id);
 }
 
 bool DoesMediaDeviceIDMatchHMAC(const ResourceContext::SaltCallback& sc,
-                                const GURL& security_origin,
+                                const url::Origin& security_origin,
                                 const std::string& device_guid,
                                 const std::string& raw_unique_id) {
   return MediaStreamManager::DoesMediaDeviceIDMatchHMAC(
@@ -25,7 +25,7 @@
 
 bool GetMediaDeviceIDForHMAC(MediaStreamType stream_type,
                              const ResourceContext::SaltCallback& rc,
-                             const GURL& security_origin,
+                             const url::Origin& security_origin,
                              const std::string& source_id,
                              std::string* device_id) {
   content::MediaStreamManager* manager =
diff --git a/content/public/browser/media_device_id.h b/content/public/browser/media_device_id.h
index 3a42060..579d995 100644
--- a/content/public/browser/media_device_id.h
+++ b/content/public/browser/media_device_id.h
@@ -15,7 +15,7 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/resource_context.h"
 #include "content/public/common/media_stream_request.h"
-#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 
@@ -23,21 +23,21 @@
 // particular security origin.
 CONTENT_EXPORT std::string GetHMACForMediaDeviceID(
     const ResourceContext::SaltCallback& sc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& raw_unique_id);
 
 // Convenience method to check if |device_guid| is an HMAC of
 // |raw_device_id| for |security_origin|.
 CONTENT_EXPORT bool DoesMediaDeviceIDMatchHMAC(
     const ResourceContext::SaltCallback& sc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& device_guid,
     const std::string& raw_unique_id);
 
 CONTENT_EXPORT bool GetMediaDeviceIDForHMAC(
     MediaStreamType stream_type,
     const ResourceContext::SaltCallback& rc,
-    const GURL& security_origin,
+    const url::Origin& security_origin,
     const std::string& source_id,
     std::string* device_id);
 
diff --git a/content/renderer/media/media_stream_dispatcher.cc b/content/renderer/media/media_stream_dispatcher.cc
index 65551805..786196f 100644
--- a/content/renderer/media/media_stream_dispatcher.cc
+++ b/content/renderer/media/media_stream_dispatcher.cc
@@ -12,7 +12,7 @@
 #include "content/renderer/render_thread_impl.h"
 #include "media/base/audio_parameters.h"
 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
-#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 
@@ -74,7 +74,7 @@
     int request_id,
     const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
     const StreamControls& controls,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")";
 
@@ -135,7 +135,7 @@
     int request_id,
     const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
     MediaStreamType type,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
          type == MEDIA_DEVICE_VIDEO_CAPTURE ||
@@ -177,7 +177,7 @@
     const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
     const std::string& device_id,
     MediaStreamType type,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")";
 
diff --git a/content/renderer/media/media_stream_dispatcher.h b/content/renderer/media/media_stream_dispatcher.h
index 6c0220e2..a41850d 100644
--- a/content/renderer/media/media_stream_dispatcher.h
+++ b/content/renderer/media/media_stream_dispatcher.h
@@ -19,6 +19,10 @@
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 // MediaStreamDispatcher is a delegate for the Media Stream API messages.
@@ -40,7 +44,7 @@
       int request_id,
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
       const StreamControls& controls,
-      const GURL& security_origin);
+      const url::Origin& security_origin);
 
   // Cancel the request for a new media stream to be created.
   virtual void CancelGenerateStream(
@@ -55,7 +59,7 @@
       int request_id,
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
       MediaStreamType type,
-      const GURL& security_origin);
+      const url::Origin& security_origin);
 
   // Request to stop enumerating devices.
   void StopEnumerateDevices(
@@ -68,7 +72,7 @@
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
       const std::string& device_id,
       MediaStreamType type,
-      const GURL& security_origin);
+      const url::Origin& security_origin);
 
   // Cancel the request to open a device.
   virtual void CancelOpenDevice(
diff --git a/content/renderer/media/media_stream_dispatcher_unittest.cc b/content/renderer/media/media_stream_dispatcher_unittest.cc
index 5ed18dfd..21b5816 100644
--- a/content/renderer/media/media_stream_dispatcher_unittest.cc
+++ b/content/renderer/media/media_stream_dispatcher_unittest.cc
@@ -18,6 +18,7 @@
 #include "media/base/audio_parameters.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 namespace {
@@ -116,7 +117,7 @@
   MediaStreamDispatcherTest()
       : dispatcher_(new MediaStreamDispatcherUnderTest()),
         handler_(new MockMediaStreamDispatcherEventHandler),
-        security_origin_("http://test.com") {}
+        security_origin_(url::Origin(GURL("http://test.com"))) {}
 
   // Generates a request for a MediaStream and returns the request id that is
   // used in IPC. Use this returned id in CompleteGenerateStream to identify
@@ -175,7 +176,7 @@
   base::MessageLoop message_loop_;
   std::unique_ptr<MediaStreamDispatcherUnderTest> dispatcher_;
   std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler_;
-  GURL security_origin_;
+  url::Origin security_origin_;
 };
 
 }  // namespace
@@ -219,7 +220,7 @@
       new MockMediaStreamDispatcherEventHandler);
   std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2(
       new MockMediaStreamDispatcherEventHandler);
-  GURL security_origin;
+  url::Origin security_origin;
 
   int ipc_request_id1 = dispatcher->next_ipc_id_;
   dispatcher->EnumerateDevices(
@@ -308,7 +309,7 @@
   std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler(
       new MockMediaStreamDispatcherEventHandler);
   StreamControls components(true, true);
-  GURL security_origin;
+  url::Origin security_origin;
 
   // Test failure when creating a stream.
   int ipc_request_id1 = dispatcher->next_ipc_id_;
@@ -359,9 +360,9 @@
   int ipc_request_id1 = dispatcher->next_ipc_id_;
 
   dispatcher->GenerateStream(kRequestId1, handler.get()->AsWeakPtr(),
-                             components, GURL());
+                             components, url::Origin());
   dispatcher->GenerateStream(kRequestId2, handler.get()->AsWeakPtr(),
-                             components, GURL());
+                             components, url::Origin());
 
   EXPECT_EQ(2u, dispatcher->requests_.size());
   dispatcher->CancelGenerateStream(kRequestId2, handler.get()->AsWeakPtr());
diff --git a/content/renderer/media/mock_media_stream_dispatcher.cc b/content/renderer/media/mock_media_stream_dispatcher.cc
index 739f689..b173192e 100644
--- a/content/renderer/media/mock_media_stream_dispatcher.cc
+++ b/content/renderer/media/mock_media_stream_dispatcher.cc
@@ -31,7 +31,7 @@
     int request_id,
     const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
     const StreamControls& controls,
-    const GURL& url) {
+    const url::Origin& url) {
   // Audio and video share the same request so we use |audio_input_request_id_|
   // only.
   audio_input_request_id_ = request_id;
@@ -59,7 +59,7 @@
     int request_id,
     const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
     MediaStreamType type,
-    const GURL& security_origin) {
+    const url::Origin& security_origin) {
   if (type == MEDIA_DEVICE_AUDIO_CAPTURE) {
     audio_input_request_id_ = request_id;
     audio_input_array_.clear();
diff --git a/content/renderer/media/mock_media_stream_dispatcher.h b/content/renderer/media/mock_media_stream_dispatcher.h
index 6c270cea..b02480b 100644
--- a/content/renderer/media/mock_media_stream_dispatcher.h
+++ b/content/renderer/media/mock_media_stream_dispatcher.h
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "content/renderer/media/media_stream_dispatcher.h"
-#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 
@@ -23,7 +23,7 @@
       int request_id,
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
       const StreamControls& controls,
-      const GURL& url) override;
+      const url::Origin& url) override;
   void CancelGenerateStream(
       int request_id,
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler)
@@ -32,7 +32,7 @@
       int request_id,
       const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
       MediaStreamType type,
-      const GURL& security_origin) override;
+      const url::Origin& security_origin) override;
   void StopStreamDevice(const StreamDeviceInfo& device_info) override;
   bool IsStream(const std::string& label) override;
   int video_session_id(const std::string& label, int index) override;
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc
index a19028a..c8f32b1 100644
--- a/content/renderer/media/user_media_client_impl.cc
+++ b/content/renderer/media/user_media_client_impl.cc
@@ -205,7 +205,7 @@
 
   int request_id = g_next_request_id++;
   StreamControls controls;
-  GURL security_origin;
+  url::Origin security_origin;
   bool enable_automatic_output_device_selection = false;
 
   // |user_media_request| can't be mocked. So in order to test at all we check
@@ -229,8 +229,7 @@
       controls.video.requested = true;
     }
     CopyBlinkRequestToStreamControls(user_media_request, &controls);
-    security_origin = blink::WebStringToGURL(
-        user_media_request.getSecurityOrigin().toString());
+    security_origin = user_media_request.getSecurityOrigin();
     // ownerDocument may be null if we are in a test.
     // In that case, it's OK to not check frame().
     DCHECK(user_media_request.ownerDocument().isNull() ||
@@ -244,7 +243,7 @@
            << " select associated sink: "
            << enable_automatic_output_device_selection
            << ", video=" << (controls.video.requested) << " ], "
-           << security_origin.spec() << ")";
+           << security_origin << ")";
 
   std::string audio_device_id;
   if (!user_media_request.isNull() && user_media_request.audio()) {
@@ -299,16 +298,13 @@
   // |media_devices_request| can't be mocked, so in tests it will be empty (the
   // underlying pointer is null). In order to use this function in a test we
   // need to check if it isNull.
-  GURL security_origin;
-  if (!media_devices_request.isNull()) {
-    security_origin = blink::WebStringToGURL(
-        media_devices_request.getSecurityOrigin().toString());
-  }
+  url::Origin security_origin;
+  if (!media_devices_request.isNull())
+    security_origin = media_devices_request.getSecurityOrigin();
 
   DVLOG(1) << "UserMediaClientImpl::requestMediaDevices("
-           << audio_input_request_id
-           << ", " << video_input_request_id << ", " << audio_output_request_id
-           << ", " << security_origin.spec() << ")";
+           << audio_input_request_id << ", " << video_input_request_id << ", "
+           << audio_output_request_id << ", " << security_origin << ")";
 
   media_devices_requests_.push_back(new MediaDevicesRequestInfo(
       media_devices_request,
@@ -357,14 +353,12 @@
   // |sources_request| can't be mocked, so in tests it will be empty (the
   // underlying pointer is null). In order to use this function in a test we
   // need to check if it isNull.
-  GURL security_origin;
+  url::Origin security_origin;
   if (!sources_request.isNull())
-    security_origin = GURL(sources_request.origin().utf8());
+    security_origin = sources_request.origin();
 
-  DVLOG(1) << "UserMediaClientImpl::requestSources("
-           << audio_input_request_id
-           << ", " << video_input_request_id
-           << ", " << security_origin.spec() << ")";
+  DVLOG(1) << "UserMediaClientImpl::requestSources(" << audio_input_request_id
+           << ", " << video_input_request_id << ", " << security_origin << ")";
 
   media_devices_requests_.push_back(new MediaDevicesRequestInfo(
       sources_request,
diff --git a/content/renderer/pepper/pepper_media_device_manager.cc b/content/renderer/pepper/pepper_media_device_manager.cc
index e4dd1f6a..0b04f28 100644
--- a/content/renderer/pepper/pepper_media_device_manager.cc
+++ b/content/renderer/pepper/pepper_media_device_manager.cc
@@ -57,10 +57,9 @@
 
 #if defined(ENABLE_WEBRTC)
   GetMediaStreamDispatcher()->EnumerateDevices(
-      request_id,
-      AsWeakPtr(),
+      request_id, AsWeakPtr(),
       PepperMediaDeviceManager::FromPepperDeviceType(type),
-      document_url.GetOrigin());
+      url::Origin(document_url.GetOrigin()));
 #else
   base::MessageLoop::current()->PostTask(
       FROM_HERE,
@@ -106,11 +105,9 @@
 
 #if defined(ENABLE_WEBRTC)
   GetMediaStreamDispatcher()->OpenDevice(
-      request_id,
-      AsWeakPtr(),
-      device_id,
+      request_id, AsWeakPtr(), device_id,
       PepperMediaDeviceManager::FromPepperDeviceType(type),
-      document_url.GetOrigin());
+      url::Origin(document_url.GetOrigin()));
 #else
   base::MessageLoop::current()->PostTask(
       FROM_HERE,
diff --git a/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc b/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc
index bfdc47a..353517c0 100644
--- a/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc
+++ b/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc
@@ -13,6 +13,7 @@
 #include "extensions/browser/process_manager.h"
 #include "extensions/browser/process_manager_factory.h"
 #include "extensions/common/api/webcam_private.h"
+#include "url/origin.h"
 
 namespace webcam_private = extensions::api::webcam_private;
 
@@ -113,8 +114,8 @@
 bool WebcamPrivateAPI::GetDeviceId(const std::string& extension_id,
                                    const std::string& webcam_id,
                                    std::string* device_id) {
-  GURL security_origin =
-      extensions::Extension::GetBaseURLFromExtensionId(extension_id);
+  url::Origin security_origin(
+      extensions::Extension::GetBaseURLFromExtensionId(extension_id));
 
   return content::GetMediaDeviceIDForHMAC(
       content::MEDIA_DEVICE_VIDEO_CAPTURE,
@@ -126,8 +127,8 @@
 
 std::string WebcamPrivateAPI::GetWebcamId(const std::string& extension_id,
                                           const std::string& device_id) {
-  GURL security_origin =
-      extensions::Extension::GetBaseURLFromExtensionId(extension_id);
+  url::Origin security_origin(
+      extensions::Extension::GetBaseURLFromExtensionId(extension_id));
 
   return content::GetHMACForMediaDeviceID(
       browser_context_->GetResourceContext()->GetMediaDeviceIDSalt(),
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp
index 9619d45..0e99826 100644
--- a/ios/chrome/ios_chrome.gyp
+++ b/ios/chrome/ios_chrome.gyp
@@ -147,9 +147,9 @@
           '$(SDKROOT)/System/Library/Frameworks/CoreGraphics.framework',
           '$(SDKROOT)/System/Library/Frameworks/CoreLocation.framework',
           '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
+          '$(SDKROOT)/System/Library/Frameworks/Photos.framework',
           '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
           '$(SDKROOT)/System/Library/Frameworks/UIKit.framework',
-          '$(SDKROOT)/System/Library/Frameworks/Photos.framework',
         ],
       },
       'sources': [
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc
index 7652b3c..ea64065b 100644
--- a/net/base/ip_address.cc
+++ b/net/base/ip_address.cc
@@ -4,8 +4,11 @@
 
 #include "net/base/ip_address.h"
 
+#include <limits.h>
+
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
+#include "base/strings/stringprintf.h"
 #include "net/base/ip_address_number.h"
 #include "net/base/parse_number.h"
 #include "url/gurl.h"
@@ -100,6 +103,32 @@
   return true;
 }
 
+bool ParseIPLiteralToBytes(const base::StringPiece& ip_literal,
+                           std::vector<uint8_t>* bytes) {
+  // |ip_literal| could be either an IPv4 or an IPv6 literal. If it contains
+  // a colon however, it must be an IPv6 address.
+  if (ip_literal.find(':') != base::StringPiece::npos) {
+    // GURL expects IPv6 hostnames to be surrounded with brackets.
+    std::string host_brackets = "[";
+    ip_literal.AppendToString(&host_brackets);
+    host_brackets.push_back(']');
+    url::Component host_comp(0, host_brackets.size());
+
+    // Try parsing the hostname as an IPv6 literal.
+    bytes->resize(16);  // 128 bits.
+    return url::IPv6AddressToNumber(host_brackets.data(), host_comp,
+                                    bytes->data());
+  }
+
+  // Otherwise the string is an IPv4 address.
+  bytes->resize(4);  // 32 bits.
+  url::Component host_comp(0, ip_literal.size());
+  int num_components;
+  url::CanonHostInfo::Family family = url::IPv4AddressToNumber(
+      ip_literal.data(), host_comp, bytes->data(), &num_components);
+  return family == url::CanonHostInfo::IPV4;
+}
+
 }  // namespace
 
 namespace net {
@@ -178,13 +207,10 @@
   return IsIPv6() && IPAddressStartsWith(*this, kIPv4MappedPrefix);
 }
 
-std::string IPAddress::ToString() const {
-  return IPAddressToString(ip_address_);
-}
-
 bool IPAddress::AssignFromIPLiteral(const base::StringPiece& ip_literal) {
   std::vector<uint8_t> number;
-  if (!ParseIPLiteralToNumber(ip_literal, &number))
+
+  if (!ParseIPLiteralToBytes(ip_literal, &number))
     return false;
 
   std::swap(number, ip_address_);
@@ -236,12 +262,35 @@
   return ip_address_ < that.ip_address_;
 }
 
+std::string IPAddress::ToString() const {
+  std::string str;
+  url::StdStringCanonOutput output(&str);
+
+  if (IsIPv4()) {
+    url::AppendIPv4Address(ip_address_.data(), &output);
+  } else if (IsIPv6()) {
+    url::AppendIPv6Address(ip_address_.data(), &output);
+  }
+
+  output.Complete();
+  return str;
+}
+
 std::string IPAddressToStringWithPort(const IPAddress& address, uint16_t port) {
-  return IPAddressToStringWithPort(address.bytes(), port);
+  std::string address_str = address.ToString();
+  if (address_str.empty())
+    return address_str;
+
+  if (address.IsIPv6()) {
+    // Need to bracket IPv6 addresses since they contain colons.
+    return base::StringPrintf("[%s]:%d", address_str.c_str(), port);
+  }
+  return base::StringPrintf("%s:%d", address_str.c_str(), port);
 }
 
 std::string IPAddressToPackedString(const IPAddress& address) {
-  return IPAddressToPackedString(address.bytes());
+  return std::string(reinterpret_cast<const char*>(address.bytes().data()),
+                     address.size());
 }
 
 IPAddress ConvertIPv4ToIPv4MappedIPv6(const IPAddress& address) {
@@ -333,11 +382,24 @@
 }
 
 unsigned CommonPrefixLength(const IPAddress& a1, const IPAddress& a2) {
-  return CommonPrefixLength(a1.bytes(), a2.bytes());
+  DCHECK_EQ(a1.size(), a2.size());
+  for (size_t i = 0; i < a1.size(); ++i) {
+    unsigned diff = a1.bytes()[i] ^ a2.bytes()[i];
+    if (!diff)
+      continue;
+    for (unsigned j = 0; j < CHAR_BIT; ++j) {
+      if (diff & (1 << (CHAR_BIT - 1)))
+        return i * CHAR_BIT + j;
+      diff <<= 1;
+    }
+    NOTREACHED();
+  }
+  return a1.size() * CHAR_BIT;
 }
 
 unsigned MaskPrefixLength(const IPAddress& mask) {
-  return MaskPrefixLength(mask.bytes());
+  std::vector<uint8_t> all_ones(mask.size(), 0xFF);
+  return CommonPrefixLength(mask, IPAddress(all_ones));
 }
 
 }  // namespace net
diff --git a/net/base/ip_address.h b/net/base/ip_address.h
index 50bfb2b..5ccddde 100644
--- a/net/base/ip_address.h
+++ b/net/base/ip_address.h
@@ -134,10 +134,6 @@
 
 using IPAddressList = std::vector<IPAddress>;
 
-// TODO(Martijnc): These utility functions currently forward the calls to
-// the IPAddressNumber implementations. Move the implementations over when
-// the IPAddressNumber migration is complete. https://crbug.com/496258.
-
 // Returns the canonical string representation of an IP address along with its
 // port. For example: "192.168.0.1:99" or "[::1]:80".
 NET_EXPORT std::string IPAddressToStringWithPort(const IPAddress& address,
diff --git a/net/base/ip_address_number.cc b/net/base/ip_address_number.cc
deleted file mode 100644
index 8564888..0000000
--- a/net/base/ip_address_number.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "net/base/ip_address_number.h"
-
-#include <limits.h>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "url/gurl.h"
-#include "url/url_canon_ip.h"
-
-namespace net {
-
-std::string IPAddressToString(const uint8_t* address, size_t address_len) {
-  std::string str;
-  url::StdStringCanonOutput output(&str);
-
-  if (address_len == kIPv4AddressSize) {
-    url::AppendIPv4Address(address, &output);
-  } else if (address_len == kIPv6AddressSize) {
-    url::AppendIPv6Address(address, &output);
-  }
-
-  output.Complete();
-  return str;
-}
-
-std::string IPAddressToStringWithPort(const uint8_t* address,
-                                      size_t address_len,
-                                      uint16_t port) {
-  std::string address_str = IPAddressToString(address, address_len);
-  if (address_str.empty())
-    return address_str;
-
-  if (address_len == kIPv6AddressSize) {
-    // Need to bracket IPv6 addresses since they contain colons.
-    return base::StringPrintf("[%s]:%d", address_str.c_str(), port);
-  }
-  return base::StringPrintf("%s:%d", address_str.c_str(), port);
-}
-
-std::string IPAddressToString(const IPAddressNumber& addr) {
-  return IPAddressToString(addr.data(), addr.size());
-}
-
-std::string IPAddressToStringWithPort(const IPAddressNumber& addr,
-                                      uint16_t port) {
-  return IPAddressToStringWithPort(addr.data(), addr.size(), port);
-}
-
-std::string IPAddressToPackedString(const IPAddressNumber& addr) {
-  return std::string(reinterpret_cast<const char*>(addr.data()), addr.size());
-}
-
-bool ParseIPLiteralToNumber(const base::StringPiece& ip_literal,
-                            IPAddressNumber* ip_number) {
-  // |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains
-  // a colon however, it must be an IPv6 address.
-  if (ip_literal.find(':') != base::StringPiece::npos) {
-    // GURL expects IPv6 hostnames to be surrounded with brackets.
-    std::string host_brackets = "[";
-    ip_literal.AppendToString(&host_brackets);
-    host_brackets.push_back(']');
-    url::Component host_comp(0, host_brackets.size());
-
-    // Try parsing the hostname as an IPv6 literal.
-    ip_number->resize(16);  // 128 bits.
-    return url::IPv6AddressToNumber(host_brackets.data(), host_comp,
-                                    &(*ip_number)[0]);
-  }
-
-  // Otherwise the string is an IPv4 address.
-  ip_number->resize(4);  // 32 bits.
-  url::Component host_comp(0, ip_literal.size());
-  int num_components;
-  url::CanonHostInfo::Family family = url::IPv4AddressToNumber(
-      ip_literal.data(), host_comp, &(*ip_number)[0], &num_components);
-  return family == url::CanonHostInfo::IPV4;
-}
-
-unsigned CommonPrefixLength(const IPAddressNumber& a1,
-                            const IPAddressNumber& a2) {
-  DCHECK_EQ(a1.size(), a2.size());
-  for (size_t i = 0; i < a1.size(); ++i) {
-    unsigned diff = a1[i] ^ a2[i];
-    if (!diff)
-      continue;
-    for (unsigned j = 0; j < CHAR_BIT; ++j) {
-      if (diff & (1 << (CHAR_BIT - 1)))
-        return i * CHAR_BIT + j;
-      diff <<= 1;
-    }
-    NOTREACHED();
-  }
-  return a1.size() * CHAR_BIT;
-}
-
-unsigned MaskPrefixLength(const IPAddressNumber& mask) {
-  IPAddressNumber all_ones(mask.size(), 0xFF);
-  return CommonPrefixLength(mask, all_ones);
-}
-
-}  // namespace net
diff --git a/net/base/ip_address_number.h b/net/base/ip_address_number.h
index a0894b6..4f8c249 100644
--- a/net/base/ip_address_number.h
+++ b/net/base/ip_address_number.h
@@ -5,15 +5,8 @@
 #ifndef NET_BASE_IP_ADDRESS_NUMBER_H_
 #define NET_BASE_IP_ADDRESS_NUMBER_H_
 
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
 #include <vector>
 
-#include "base/strings/string_piece.h"
-#include "net/base/net_export.h"
-
 namespace net {
 
 // IPAddressNumber is used to represent an IP address's numeric value as an
@@ -30,41 +23,6 @@
 static const size_t kIPv4AddressSize = 4;
 static const size_t kIPv6AddressSize = 16;
 
-// Returns the string representation of an IP address.
-// For example: "192.168.0.1" or "::1". Returns the empty string when |address|
-// is invalid.
-NET_EXPORT std::string IPAddressToString(const uint8_t* address,
-                                         size_t address_len);
-
-// Returns the string representation of an IP address along with its port.
-// For example: "192.168.0.1:99" or "[::1]:80". Returns the empty string when
-// |address| is invalid (the port will be ignored).
-NET_EXPORT std::string IPAddressToStringWithPort(const uint8_t* address,
-                                                 size_t address_len,
-                                                 uint16_t port);
-
-// Same as IPAddressToString() but for an IPAddressNumber.
-NET_EXPORT std::string IPAddressToString(const IPAddressNumber& addr);
-
-// Same as IPAddressToStringWithPort() but for an IPAddressNumber.
-NET_EXPORT std::string IPAddressToStringWithPort(const IPAddressNumber& addr,
-                                                 uint16_t port);
-
-// Returns the address as a sequence of bytes in network-byte-order.
-NET_EXPORT std::string IPAddressToPackedString(const IPAddressNumber& addr);
-
-// Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
-// Returns true on success and fills |ip_number| with the numeric value.
-NET_EXPORT bool ParseIPLiteralToNumber(const base::StringPiece& ip_literal,
-                                       IPAddressNumber* ip_number);
-
-// Returns number of matching initial bits between the addresses |a1| and |a2|.
-unsigned CommonPrefixLength(const IPAddressNumber& a1,
-                            const IPAddressNumber& a2);
-
-// Computes the number of leading 1-bits in |mask|.
-unsigned MaskPrefixLength(const IPAddressNumber& mask);
-
 }  // namespace net
 
 #endif  // NET_BASE_IP_ADDRESS_NUMBER_H_
diff --git a/net/base/ip_address_number_unittest.cc b/net/base/ip_address_number_unittest.cc
deleted file mode 100644
index cc68a25..0000000
--- a/net/base/ip_address_number_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "net/base/ip_address_number.h"
-
-#include "base/strings/string_number_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-// Helper to strignize an IP number (used to define expectations).
-std::string DumpIPNumber(const IPAddressNumber& v) {
-  std::string out;
-  for (size_t i = 0; i < v.size(); ++i) {
-    if (i != 0)
-      out.append(",");
-    out.append(base::IntToString(static_cast<int>(v[i])));
-  }
-  return out;
-}
-
-TEST(IpAddressNumberTest, IPAddressToString) {
-  uint8_t addr1[4] = {0, 0, 0, 0};
-  EXPECT_EQ("0.0.0.0", IPAddressToString(addr1, sizeof(addr1)));
-
-  uint8_t addr2[4] = {192, 168, 0, 1};
-  EXPECT_EQ("192.168.0.1", IPAddressToString(addr2, sizeof(addr2)));
-
-  uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
-  EXPECT_EQ("fedc:ba98::", IPAddressToString(addr3, sizeof(addr3)));
-
-  // IPAddressToString() shouldn't crash on invalid addresses.
-  uint8_t addr4[2];
-  EXPECT_EQ("", IPAddressToString(addr4, sizeof(addr4)));
-}
-
-TEST(IpAddressNumberTest, IPAddressToStringWithPort) {
-  uint8_t addr1[4] = {0, 0, 0, 0};
-  EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(addr1, sizeof(addr1), 3));
-
-  uint8_t addr2[4] = {192, 168, 0, 1};
-  EXPECT_EQ("192.168.0.1:99",
-            IPAddressToStringWithPort(addr2, sizeof(addr2), 99));
-
-  uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
-  EXPECT_EQ("[fedc:ba98::]:8080",
-            IPAddressToStringWithPort(addr3, sizeof(addr3), 8080));
-
-  // IPAddressToStringWithPort() shouldn't crash on invalid addresses.
-  uint8_t addr4[2];
-  EXPECT_EQ("", IPAddressToStringWithPort(addr4, sizeof(addr4), 8080));
-}
-
-// Test that invalid IP literals fail to parse.
-TEST(IpAddressNumberTest, ParseIPLiteralToNumber_FailParse) {
-  IPAddressNumber number;
-
-  EXPECT_FALSE(ParseIPLiteralToNumber("bad value", &number));
-  EXPECT_FALSE(ParseIPLiteralToNumber("bad:value", &number));
-  EXPECT_FALSE(ParseIPLiteralToNumber(std::string(), &number));
-  EXPECT_FALSE(ParseIPLiteralToNumber("192.168.0.1:30", &number));
-  EXPECT_FALSE(ParseIPLiteralToNumber("  192.168.0.1  ", &number));
-  EXPECT_FALSE(ParseIPLiteralToNumber("[::1]", &number));
-}
-
-// Test parsing an IPv4 literal.
-TEST(IpAddressNumberTest, ParseIPLiteralToNumber_IPv4) {
-  IPAddressNumber number;
-  EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
-  EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
-  EXPECT_EQ("192.168.0.1", IPAddressToString(number));
-}
-
-// Test parsing an IPv6 literal.
-TEST(IpAddressNumberTest, ParseIPLiteralToNumber_IPv6) {
-  IPAddressNumber number;
-  EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
-  EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
-  EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
-}
-
-}  // anonymous namespace
-
-}  // namespace net
diff --git a/net/base/ip_address_unittest.cc b/net/base/ip_address_unittest.cc
index c001b70..09ff745 100644
--- a/net/base/ip_address_unittest.cc
+++ b/net/base/ip_address_unittest.cc
@@ -308,25 +308,53 @@
 }
 
 TEST(IPAddressTest, ToString) {
-  uint8_t addr1[4] = {0, 0, 0, 0};
-  IPAddress ip_address1(addr1);
-  EXPECT_EQ("0.0.0.0", ip_address1.ToString());
+  EXPECT_EQ("0.0.0.0", IPAddress::IPv4AllZeros().ToString());
 
-  uint8_t addr2[4] = {192, 168, 0, 1};
-  IPAddress ip_address2(addr2);
-  EXPECT_EQ("192.168.0.1", ip_address2.ToString());
+  IPAddress address(192, 168, 0, 1);
+  EXPECT_EQ("192.168.0.1", address.ToString());
 
-  uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
-  IPAddress ip_address3(addr3);
-  EXPECT_EQ("fedc:ba98::", ip_address3.ToString());
+  IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                     0);
+  EXPECT_EQ("fedc:ba98::", address2.ToString());
 
   // ToString() shouldn't crash on invalid addresses.
   uint8_t addr4[2];
-  IPAddress ip_address4(addr4);
-  EXPECT_EQ("", ip_address4.ToString());
+  IPAddress address4(addr4);
+  EXPECT_EQ("", address4.ToString());
 
-  IPAddress ip_address5;
-  EXPECT_EQ("", ip_address5.ToString());
+  IPAddress address5;
+  EXPECT_EQ("", address5.ToString());
+}
+
+TEST(IPAddressTest, IPAddressToStringWithPort) {
+  EXPECT_EQ("0.0.0.0:3",
+            IPAddressToStringWithPort(IPAddress::IPv4AllZeros(), 3));
+
+  IPAddress address1(192, 168, 0, 1);
+  EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address1, 99));
+
+  IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                     0);
+  EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address2, 8080));
+
+  // IPAddressToStringWithPort() shouldn't crash on invalid addresses.
+  uint8_t addr3[2];
+  EXPECT_EQ("", IPAddressToStringWithPort(IPAddress(addr3), 8080));
+}
+
+TEST(IPAddressTest, IPAddressToPackedString) {
+  IPAddress ipv4_address;
+  EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44"));
+  std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4);
+  EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address));
+
+  IPAddress ipv6_address;
+  EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f"));
+  std::string expected_ipv6_address(
+      "\x20\x01\x07\x00\x03\x00\x18\x00"
+      "\x00\x00\x00\x00\x00\x00\x00\x0f",
+      16);
+  EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address));
 }
 
 // Test that invalid IP literals fail to parse.
@@ -394,39 +422,6 @@
   EXPECT_FALSE(ip_address3 < ip_address1);
 }
 
-TEST(IPAddressTest, IPAddressToStringWithPort) {
-  IPAddress address1;
-  EXPECT_TRUE(address1.AssignFromIPLiteral("0.0.0.0"));
-  EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3));
-
-  IPAddress address2;
-  EXPECT_TRUE(address2.AssignFromIPLiteral("192.168.0.1"));
-  EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99));
-
-  IPAddress address3;
-  EXPECT_TRUE(address3.AssignFromIPLiteral("fedc:ba98::"));
-  EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080));
-
-  // ToString() shouldn't crash on invalid addresses.
-  IPAddress address4;
-  EXPECT_EQ("", IPAddressToStringWithPort(address4, 8080));
-}
-
-TEST(IPAddressTest, IPAddressToPackedString) {
-  IPAddress ipv4_address;
-  EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44"));
-  std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4);
-  EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address));
-
-  IPAddress ipv6_address;
-  EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f"));
-  std::string expected_ipv6_address(
-      "\x20\x01\x07\x00\x03\x00\x18\x00"
-      "\x00\x00\x00\x00\x00\x00\x00\x0f",
-      16);
-  EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address));
-}
-
 // Test mapping an IPv4 address to an IPv6 address.
 TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) {
   IPAddress ipv4_address(192, 168, 0, 1);
diff --git a/net/base/ip_endpoint.cc b/net/base/ip_endpoint.cc
index 9b4695b1..150093c0 100644
--- a/net/base/ip_endpoint.cc
+++ b/net/base/ip_endpoint.cc
@@ -164,7 +164,7 @@
 }
 
 std::string IPEndPoint::ToString() const {
-  return IPAddressToStringWithPort(address_.bytes(), port_);
+  return IPAddressToStringWithPort(address_, port_);
 }
 
 std::string IPEndPoint::ToStringWithoutPort() const {
diff --git a/net/net.gypi b/net/net.gypi
index 657582f7..b3868c1 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -30,7 +30,6 @@
       'base/io_buffer.h',
       'base/ip_address.cc',
       'base/ip_address.h',
-      'base/ip_address_number.cc',
       'base/ip_address_number.h',
       'base/ip_endpoint.cc',
       'base/ip_endpoint.h',
@@ -1318,7 +1317,6 @@
       'base/host_mapping_rules_unittest.cc',
       'base/host_port_pair_unittest.cc',
       'base/int128_unittest.cc',
-      'base/ip_address_number_unittest.cc',
       'base/ip_address_unittest.cc',
       'base/ip_endpoint_unittest.cc',
       'base/ip_pattern_unittest.cc',
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt
index d4e510d..c39ef5c679 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt
@@ -36,22 +36,22 @@
 console-object-preview.html:20 [0, 0, 1] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > object-value-number > object-value-number > object-value-number
 console-object-preview.html:20 [0, 0, 2] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > object-value-number > object-value-number > object-value-number
 console-object-preview.html:23 Object with many properties console-message-text source-code > console-message-url webkit-html-resource-link
-console-object-preview.html:28 Object {property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-info-state-note > children
+console-object-preview.html:28 Object {property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-state-note info-note > children
 console-object-preview.html:30 Array with many properties console-message-text source-code > console-message-url webkit-html-resource-link
-console-object-preview.html:35 [0, 1, property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-info-state-note > children
+console-object-preview.html:35 [0, 1, property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-state-note info-note > children
 console-object-preview.html:37 Object with proto console-message-text source-code > console-message-url webkit-html-resource-link
-console-object-preview.html:40 Object {d: 1} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > object-info-state-note > children
+console-object-preview.html:40 Object {d: 1} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > object-state-note info-note > children
 console-object-preview.html:42 Sparse array console-message-text source-code > console-message-url webkit-html-resource-link
 console-object-preview.html:45 [50: 50] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > name > object-value-number
 console-object-preview.html:47 Dense array with indexes and propeties console-message-text source-code > console-message-url webkit-html-resource-link
-console-object-preview.html:53 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-info-state-note > children
+console-object-preview.html:53 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-state-note info-note > children
 console-object-preview.html:55 Object with properties containing whitespaces console-message-text source-code > console-message-url webkit-html-resource-link
 console-object-preview.html:62 Object {" a b ": " a b ", c d: "c d", "": "", "  ": "  ", "a↵↵b↵c": "a↵↵b↵c"} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-string > name > object-value-string > name > object-value-string > name > object-value-string > name > object-value-string
 console-object-preview.html:64 Object with a document.all property console-message-text source-code > console-message-url webkit-html-resource-link
-console-object-preview.html:65 Object {all: HTMLAllCollection[7]} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-array > object-info-state-note > children
+console-object-preview.html:65 Object {all: HTMLAllCollection[7]} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-array > object-state-note info-note > children
 console-object-preview.html:67 Object with special numbers console-message-text source-code > console-message-url webkit-html-resource-link
 console-object-preview.html:69 Object {nan: NaN, posInf: Infinity, negInf: -Infinity, negZero: -0} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number
 console-object-preview.html:71 Object with exactly 5 properties: expected to be lossless console-message-text source-code > console-message-url webkit-html-resource-link
 console-object-preview.html:72 Object {a: 1, b: 2, c: 3, d: 4, e: 5} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number
-console-object-preview.html:74 Object {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-null > name > object-value-undefined > name > object-value-regexp > name > object-value-boolean > object-info-state-note > children
+console-object-preview.html:74 Object {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-null > name > object-value-undefined > name > object-value-regexp > name > object-value-boolean > object-state-note info-note > children
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
new file mode 100644
index 0000000..b306800
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
@@ -0,0 +1,12 @@
+CONSOLE MESSAGE: line 20: [object Proxy]
+Tests that console logging dumps proxy properly.
+
+warning-note display: inline-block
+info-note display: none
+console-proxy.html:20 Proxy console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > object-state-note warning-note > object-state-note info-note > children
+window.accessedGet = false
+warning-note display: none
+info-note display: inline-block
+console-proxy.html:20 Proxy__proto__: Object console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section expanded > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element expanded > selection fill > object-state-note warning-note > object-state-note info-note > children expanded > parent > selection fill > name object-properties-section-dimmed > object-properties-section-separator > value object-value-object > children
+window.accessedGet = true
+
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
new file mode 100644
index 0000000..f72667a3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
@@ -0,0 +1,78 @@
+<html>
+<head>
+<script src="../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../http/tests/inspector/console-test.js"></script>
+<script>
+
+window.accessedGet = false;
+function testFunction()
+{
+    let proxied = new Proxy({}, {
+        get: function (target, name, receiver) {
+            window.accessedGet = true;
+            return target[name];
+        },
+        set: function(target, name, value, receiver) {
+            target[name] = value;
+            return value;
+        }
+    });
+    console.log(proxied);
+}
+
+function test()
+{
+    InspectorTest.waitUntilMessageReceived(dumpMessages);
+    InspectorTest.evaluateInPage("testFunction()");
+
+    function dumpMessages()
+    {
+        var consoleView = WebInspector.ConsoleView.instance();
+        consoleView._viewport.invalidate()
+        var element = consoleView._visibleViewMessages[0].contentElement();
+        dumpNoteVisible(element, "warning-note");
+        dumpNoteVisible(element, "info-note");
+
+        InspectorTest.dumpConsoleMessages(false, true);
+        InspectorTest.evaluateInPage("window.accessedGet", dumpAccessedGetAndExpand);
+    }
+
+    function dumpAccessedGetAndExpand(result)
+    {
+        InspectorTest.addResult("window.accessedGet = " + result.value);
+        InspectorTest.expandConsoleMessages(dumpExpandedConsoleMessages);
+    }
+
+    function dumpExpandedConsoleMessages()
+    {
+        var element = WebInspector.ConsoleView.instance()._visibleViewMessages[0].contentElement();
+        dumpNoteVisible(element, "warning-note");
+        dumpNoteVisible(element, "info-note");
+
+        InspectorTest.dumpConsoleMessages(false, true);
+        InspectorTest.evaluateInPage("window.accessedGet", dumpAccessedGetAndCompleteTest);
+    }
+
+    function dumpAccessedGetAndCompleteTest(result)
+    {
+        InspectorTest.addResult("window.accessedGet = " + result.value);
+        InspectorTest.completeTest();
+    }
+
+    function dumpNoteVisible(element, name)
+    {
+        var note = window.getComputedStyle(element.querySelector('.object-state-note.' + name)).display;
+        InspectorTest.addResult(name + " display: " + note);
+    }
+}
+
+</script>
+</head>
+
+<body onload="runTest()">
+<p>
+Tests that console logging dumps proxy properly.
+</p>
+
+</body>
+</html>
diff --git a/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp b/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp
index bdf3370..bec35a0 100644
--- a/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp
+++ b/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp
@@ -95,6 +95,10 @@
             m_builder.append("[object Window]");
             return true;
         }
+        if (value->IsProxy()) {
+            m_builder.append("[object Proxy]");
+            return true;
+        }
         if (value->IsObject()
             && !value->IsDate()
             && !value->IsFunction()
diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
index 052c0727..a5ee48b 100644
--- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
+++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
@@ -56,6 +56,7 @@
         "map": this._formatParameterAsObject,
         "node": this._formatParameterAsNode,
         "object": this._formatParameterAsObject,
+        "proxy": this._formatParameterAsObject,
         "set": this._formatParameterAsObject,
         "string": this._formatParameterAsString
     };
@@ -424,7 +425,13 @@
                 titleElement.createTextChild(obj.description || "");
             }
         }
-        var note = titleElement.createChild("span", "object-info-state-note");
+        if (obj.subtype === "proxy") {
+            var warning = titleElement.createChild("span", "object-state-note");
+            warning.classList.add("warning-note");
+            warning.title = WebInspector.UIString("Expansion of the Proxy object can lead to JavaScript execution.");
+        }
+        var note = titleElement.createChild("span", "object-state-note");
+        note.classList.add("info-note");
         note.title = WebInspector.UIString("Object value at left was snapshotted when logged, value below was evaluated just now.");
         var section = new WebInspector.ObjectPropertiesSection(obj, titleElement);
         section.enableContextMenu();
diff --git a/third_party/WebKit/Source/devtools/front_end/console/consoleView.css b/third_party/WebKit/Source/devtools/front_end/console/consoleView.css
index 773921b..b37f0a6 100644
--- a/third_party/WebKit/Source/devtools/front_end/console/consoleView.css
+++ b/third_party/WebKit/Source/devtools/front_end/console/consoleView.css
@@ -425,11 +425,10 @@
     white-space: nowrap !important;
 }
 
-.object-info-state-note {
+.object-state-note {
     display: inline-block;
     width: 11px;
     height: 11px;
-    background-color: rgb(179, 203, 247);
     color: white;
     text-align: center;
     border-radius: 3px;
@@ -438,14 +437,30 @@
     font-size: 9px;
 }
 
-.-theme-with-dark-background .object-info-state-note {
+.-theme-with-dark-background .object-state-note {
     background-color: hsl(230, 100%, 80%);
 }
 
-.object-info-state-note::before {
+.info-note {
+    background-color: rgb(179, 203, 247);
+}
+
+.info-note::before {
     content: "i";
 }
 
-.console-view-object-properties-section:not(.expanded) .object-info-state-note {
+.warning-note {
+    background-color: rgb(255, 161, 45);
+}
+
+.warning-note::before {
+    content: "!";
+}
+
+.console-view-object-properties-section:not(.expanded) .info-note {
+    display: none;
+}
+
+.console-view-object-properties-section.expanded .warning-note {
     display: none;
 }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
index 5ac92a7..7cbafd9 100644
--- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
+++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
@@ -51,9 +51,9 @@
 {
 }
 
-String MediaStreamTrackSourcesRequestImpl::origin()
+PassRefPtr<SecurityOrigin> MediaStreamTrackSourcesRequestImpl::origin()
 {
-    return m_executionContext->getSecurityOrigin()->toString();
+    return m_executionContext->getSecurityOrigin()->isolatedCopy();
 }
 
 void MediaStreamTrackSourcesRequestImpl::requestSucceeded(const WebVector<WebSourceInfo>& webSourceInfos)
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h
index 80651ff..475bd09 100644
--- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h
+++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h
@@ -33,6 +33,7 @@
 
 class ExecutionContext;
 class MediaStreamTrackSourcesCallback;
+class SecurityOrigin;
 class WebSourceInfo;
 template<typename T> class WebVector;
 
@@ -41,7 +42,7 @@
     static MediaStreamTrackSourcesRequestImpl* create(ExecutionContext&, MediaStreamTrackSourcesCallback*);
     ~MediaStreamTrackSourcesRequestImpl();
 
-    String origin() override;
+    PassRefPtr<SecurityOrigin> origin() override;
     void requestSucceeded(const WebVector<WebSourceInfo>&) override;
 
     DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp b/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp
index 1b4ecdb0..8e9b69b 100644
--- a/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp
@@ -26,6 +26,7 @@
 #include "public/platform/WebMediaStreamTrackSourcesRequest.h"
 
 #include "platform/mediastream/MediaStreamTrackSourcesRequest.h"
+#include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/WebSourceInfo.h"
 #include "wtf/PassOwnPtr.h"
 #include "wtf/text/WTFString.h"
@@ -47,7 +48,7 @@
     m_private.reset();
 }
 
-WebString WebMediaStreamTrackSourcesRequest::origin() const
+WebSecurityOrigin WebMediaStreamTrackSourcesRequest::origin() const
 {
     ASSERT(m_private.get());
     return m_private->origin();
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h b/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h
index 1b6c7ea..34591ab 100644
--- a/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h
+++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h
@@ -32,13 +32,14 @@
 
 namespace blink {
 
+class SecurityOrigin;
 class WebSourceInfo;
 
 class MediaStreamTrackSourcesRequest : public GarbageCollectedFinalized<MediaStreamTrackSourcesRequest> {
 public:
     virtual ~MediaStreamTrackSourcesRequest() { }
 
-    virtual String origin() = 0;
+    virtual PassRefPtr<SecurityOrigin> origin() = 0;
     virtual void requestSucceeded(const WebVector<WebSourceInfo>&) = 0;
 
     DEFINE_INLINE_VIRTUAL_TRACE() { }
diff --git a/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp b/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp
index 5562cfe..d5d84f93 100644
--- a/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp
+++ b/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp
@@ -4,7 +4,7 @@
 
 #include "platform/network/NetworkUtils.h"
 
-#include "net/base/ip_address_number.h"
+#include "net/base/ip_address.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/text/WTFString.h"
 
@@ -46,10 +46,9 @@
     EXPECT_FALSE(NetworkUtils::isReservedIPAddress("127.0.0.1.example.com"));
 
     // Moar IPv4
-    uint8_t address[4] = { 0, 0, 0, 1 };
     for (int i = 0; i < 256; i++) {
-        address[0] = i;
-        std::string addressString = net::IPAddressToString(address, sizeof(address));
+        net::IPAddress address(i, 0, 0, 1);
+        std::string addressString = address.ToString();
         if (i == 0 || i == 10 || i == 127 || i > 223) {
             EXPECT_TRUE(NetworkUtils::isReservedIPAddress(
                 String::fromUTF8(addressString.data(),
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
index 1a9ae17f..9c7d693 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
+++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
@@ -726,6 +726,9 @@
             return description;
         }
 
+        if (subtype === "proxy")
+            return "Proxy";
+
         var className = InjectedScriptHost.internalConstructorName(obj);
         if (subtype === "array") {
             if (typeof obj.length === "number")
@@ -833,7 +836,7 @@
         this.className = className;
     this.description = injectedScript._describe(object);
 
-    if (generatePreview && this.type === "object" && this.subtype !== "node")
+    if (generatePreview && this.type === "object" && this.subtype !== "node" && this.subtype !== "proxy")
         this.preview = this._generatePreview(object, undefined, columnNames, isTable, skipEntriesPreview);
 
     if (injectedScript._customObjectFormatterEnabled) {
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
index 24d416d..040d28e 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
@@ -116,11 +116,14 @@
         info.GetReturnValue().Set(toV8StringInternalized(isolate, "generator"));
         return;
     }
-
     if (value->IsNativeError()) {
         info.GetReturnValue().Set(toV8StringInternalized(isolate, "error"));
         return;
     }
+    if (value->IsProxy()) {
+        info.GetReturnValue().Set(toV8StringInternalized(isolate, "proxy"));
+        return;
+    }
     String16 subtype = unwrapDebugger(info)->client()->valueSubtype(value);
     if (!subtype.isEmpty()) {
         info.GetReturnValue().Set(toV8String(isolate, subtype));
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoader.cpp b/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
index 2c4d3a3ac..b8e12ec 100644
--- a/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
+++ b/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
@@ -248,9 +248,12 @@
     if (!m_client)
         return;
 
-    m_loader->disposeObserver();
+    m_loader->clientAdapterDone();
 
-    m_client->didFinishLoading(m_loader, finishTime, WebURLLoaderClient::kUnknownEncodedDataLength);
+    auto client = m_client;
+    m_client = nullptr;
+    client->didFinishLoading(m_loader, finishTime, WebURLLoaderClient::kUnknownEncodedDataLength);
+    // |this| may be dead here.
 }
 
 void AssociatedURLLoader::ClientAdapter::didFail(const ResourceError& error)
@@ -258,7 +261,7 @@
     if (!m_client)
         return;
 
-    m_loader->disposeObserver();
+    m_loader->clientAdapterDone();
 
     m_didFail = true;
     m_error = WebURLError(error);
@@ -287,7 +290,10 @@
     if (!m_client)
         return;
 
-    m_client->didFail(m_loader, m_error);
+    auto client = m_client;
+    m_client = nullptr;
+    client->didFail(m_loader, m_error);
+    // |this| may be dead here.
 }
 
 class AssociatedURLLoader::Observer final : public GarbageCollected<Observer>, public ContextLifecycleObserver {
@@ -320,7 +326,8 @@
 };
 
 AssociatedURLLoader::AssociatedURLLoader(WebLocalFrameImpl* frameImpl, const WebURLLoaderOptions& options)
-    : m_options(options)
+    : m_client(nullptr)
+    , m_options(options)
     , m_observer(new Observer(this, frameImpl->frame()->document()))
 {
 }
@@ -349,6 +356,7 @@
 
 void AssociatedURLLoader::loadAsynchronously(const WebURLRequest& request, WebURLLoaderClient* client)
 {
+    DCHECK(!m_client);
     DCHECK(!m_loader);
     DCHECK(!m_clientAdapter);
 
@@ -367,6 +375,7 @@
         }
     }
 
+    m_client = client;
     m_clientAdapter = ClientAdapter::create(this, client, m_options);
 
     if (allowLoad) {
@@ -402,7 +411,18 @@
 void AssociatedURLLoader::cancel()
 {
     disposeObserver();
+    cancelLoader();
+    m_client = nullptr;
+}
 
+void AssociatedURLLoader::clientAdapterDone()
+{
+    disposeObserver();
+    m_client = nullptr;
+}
+
+void AssociatedURLLoader::cancelLoader()
+{
     if (!m_clientAdapter)
         return;
 
@@ -429,9 +449,15 @@
 
 void AssociatedURLLoader::documentDestroyed()
 {
-    cancel();
+    disposeObserver();
+    cancelLoader();
 
-    m_client->didFail(this, ResourceError());
+    if (!m_client)
+        return;
+
+    WebURLLoaderClient* client = m_client;
+    m_client = nullptr;
+    client->didFail(this, ResourceError());
     // |this| may be dead here.
 }
 
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoader.h b/third_party/WebKit/Source/web/AssociatedURLLoader.h
index 3555962..499cb81 100644
--- a/third_party/WebKit/Source/web/AssociatedURLLoader.h
+++ b/third_party/WebKit/Source/web/AssociatedURLLoader.h
@@ -60,12 +60,17 @@
     // Called by |m_observer| to handle destruction of the Document associated
     // with the frame given to the constructor.
     void documentDestroyed();
-    void disposeObserver();
+
+    // Called by ClientAdapter to handle completion of loading.
+    void clientAdapterDone();
 
 private:
     class ClientAdapter;
     class Observer;
 
+    void cancelLoader();
+    void disposeObserver();
+
     WebURLLoaderClient* m_client;
     WebURLLoaderOptions m_options;
 
diff --git a/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h b/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
index 9eda45b..4351775 100644
--- a/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
+++ b/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
@@ -29,7 +29,7 @@
 #include "WebCommon.h"
 #include "WebNonCopyable.h"
 #include "WebPrivatePtr.h"
-#include "WebString.h"
+#include "WebSecurityOrigin.h"
 #include "WebVector.h"
 
 namespace blink {
@@ -54,7 +54,7 @@
     BLINK_PLATFORM_EXPORT void reset();
     bool isNull() const { return m_private.isNull(); }
 
-    BLINK_PLATFORM_EXPORT WebString origin() const;
+    BLINK_PLATFORM_EXPORT WebSecurityOrigin origin() const;
     BLINK_PLATFORM_EXPORT void requestSucceeded(const WebVector<WebSourceInfo>&) const;
 
 #if INSIDE_BLINK