summaryrefslogtreecommitdiff
path: root/chromium/net/base
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-05-15 10:20:33 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-05-15 10:28:57 +0000
commitd17ea114e5ef69ad5d5d7413280a13e6428098aa (patch)
tree2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/net/base
parent8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff)
downloadqtwebengine-chromium-d17ea114e5ef69ad5d5d7413280a13e6428098aa.tar.gz
BASELINE: Update Chromium to 67.0.3396.47
Change-Id: Idcb1341782e417561a2473eeecc82642dafda5b7 Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/net/base')
-rw-r--r--chromium/net/base/address_tracker_linux.cc2
-rw-r--r--chromium/net/base/address_tracker_linux.h9
-rw-r--r--chromium/net/base/backoff_entry.cc2
-rw-r--r--chromium/net/base/backoff_entry.h4
-rw-r--r--chromium/net/base/backoff_entry_serializer.cc2
-rw-r--r--chromium/net/base/backoff_entry_serializer.h2
-rw-r--r--chromium/net/base/backoff_entry_serializer_unittest.cc2
-rw-r--r--chromium/net/base/backoff_entry_unittest.cc2
-rw-r--r--chromium/net/base/datagram_buffer.cc56
-rw-r--r--chromium/net/base/datagram_buffer.h102
-rw-r--r--chromium/net/base/datagram_buffer_unittest.cc54
-rw-r--r--chromium/net/base/escape.cc340
-rw-r--r--chromium/net/base/escape.h18
-rw-r--r--chromium/net/base/escape_unittest.cc373
-rw-r--r--chromium/net/base/file_stream_context.cc32
-rw-r--r--chromium/net/base/file_stream_context.h34
-rw-r--r--chromium/net/base/file_stream_context_posix.cc7
-rw-r--r--chromium/net/base/file_stream_context_win.cc17
-rw-r--r--chromium/net/base/filename_util_unittest.cc884
-rw-r--r--chromium/net/base/ip_address.cc68
-rw-r--r--chromium/net/base/ip_address.h15
-rw-r--r--chromium/net/base/ip_address_unittest.cc29
-rw-r--r--chromium/net/base/load_flags_list.h37
-rw-r--r--chromium/net/base/load_states_list.h39
-rw-r--r--chromium/net/base/load_timing_info.h13
-rw-r--r--chromium/net/base/mime_sniffer.cc4
-rw-r--r--chromium/net/base/mime_sniffer_unittest.cc109
-rw-r--r--chromium/net/base/mime_util.cc1
-rw-r--r--chromium/net/base/net_error_list.h6
-rw-r--r--chromium/net/base/net_errors.cc11
-rw-r--r--chromium/net/base/net_errors.h5
-rw-r--r--chromium/net/base/net_info_source_list.h4
-rw-r--r--chromium/net/base/network_config_watcher_mac.cc147
-rw-r--r--chromium/net/base/network_config_watcher_mac.h2
-rw-r--r--chromium/net/base/network_interfaces.h7
-rw-r--r--chromium/net/base/network_interfaces_fuchsia.cc33
-rw-r--r--chromium/net/base/network_throttle_manager.h97
-rw-r--r--chromium/net/base/network_throttle_manager_impl.cc2
-rw-r--r--chromium/net/base/network_throttle_manager_impl.h4
-rw-r--r--chromium/net/base/network_throttle_manager_impl_unittest.cc564
-rw-r--r--chromium/net/base/percentile_estimator.cc100
-rw-r--r--chromium/net/base/percentile_estimator.h59
-rw-r--r--chromium/net/base/percentile_estimator_unittest.cc242
-rw-r--r--chromium/net/base/proxy_server.cc56
-rw-r--r--chromium/net/base/proxy_server.h16
-rw-r--r--chromium/net/base/registry_controlled_domains/effective_tld_names.dat1078
-rw-r--r--chromium/net/base/registry_controlled_domains/effective_tld_names.gperf172
-rw-r--r--chromium/net/base/test_proxy_delegate.cc5
-rw-r--r--chromium/net/base/unescape_url_component_fuzzer.cc6
-rw-r--r--chromium/net/base/upload_data_stream.h2
-rw-r--r--chromium/net/base/url_util.cc42
-rw-r--r--chromium/net/base/url_util.h9
52 files changed, 2126 insertions, 2800 deletions
diff --git a/chromium/net/base/address_tracker_linux.cc b/chromium/net/base/address_tracker_linux.cc
index 600e2c7d541..be8da1aa986 100644
--- a/chromium/net/base/address_tracker_linux.cc
+++ b/chromium/net/base/address_tracker_linux.cc
@@ -231,7 +231,7 @@ void AddressTrackerLinux::Init() {
if (tracking_) {
rv = base::MessageLoopForIO::current()->WatchFileDescriptor(
- netlink_fd_, true, base::MessageLoopForIO::WATCH_READ, &watcher_, this);
+ netlink_fd_, true, base::MessagePumpForIO::WATCH_READ, &watcher_, this);
if (rv < 0) {
PLOG(ERROR) << "Could not watch NETLINK socket";
AbortAndForceOnline();
diff --git a/chromium/net/base/address_tracker_linux.h b/chromium/net/base/address_tracker_linux.h
index c0c89173e68..751f994c60e 100644
--- a/chromium/net/base/address_tracker_linux.h
+++ b/chromium/net/base/address_tracker_linux.h
@@ -19,6 +19,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_for_io.h"
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
@@ -31,8 +32,8 @@ namespace internal {
// Keeps track of network interface addresses using rtnetlink. Used by
// NetworkChangeNotifier to provide signals to registered IPAddressObservers.
-class NET_EXPORT_PRIVATE AddressTrackerLinux :
- public base::MessageLoopForIO::Watcher {
+class NET_EXPORT_PRIVATE AddressTrackerLinux
+ : public base::MessagePumpForIO::FdWatcher {
public:
typedef std::map<IPAddress, struct ifaddrmsg> AddressMap;
@@ -128,7 +129,7 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux :
// Call when some part of initialization failed; forces online and unblocks.
void AbortAndForceOnline();
- // MessageLoopForIO::Watcher:
+ // MessagePumpForIO::FdWatcher:
void OnFileCanReadWithoutBlocking(int fd) override;
void OnFileCanWriteWithoutBlocking(int /* fd */) override;
@@ -158,7 +159,7 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux :
base::Closure tunnel_callback_;
int netlink_fd_;
- base::MessageLoopForIO::FileDescriptorWatcher watcher_;
+ base::MessagePumpForIO::FdWatchController watcher_;
mutable base::Lock address_map_lock_;
AddressMap address_map_;
diff --git a/chromium/net/base/backoff_entry.cc b/chromium/net/base/backoff_entry.cc
index 5914711a288..db70d42726e 100644
--- a/chromium/net/base/backoff_entry.cc
+++ b/chromium/net/base/backoff_entry.cc
@@ -19,7 +19,7 @@ BackoffEntry::BackoffEntry(const BackoffEntry::Policy* policy)
: BackoffEntry(policy, nullptr) {}
BackoffEntry::BackoffEntry(const BackoffEntry::Policy* policy,
- base::TickClock* clock)
+ const base::TickClock* clock)
: policy_(policy), clock_(clock) {
DCHECK(policy_);
Reset();
diff --git a/chromium/net/base/backoff_entry.h b/chromium/net/base/backoff_entry.h
index db440207213..2c4cd180665 100644
--- a/chromium/net/base/backoff_entry.h
+++ b/chromium/net/base/backoff_entry.h
@@ -69,7 +69,7 @@ class NET_EXPORT BackoffEntry {
// Lifetime of policy and clock must enclose lifetime of BackoffEntry.
// |policy| pointer must be valid but isn't dereferenced during construction.
// |clock| pointer may be null.
- BackoffEntry(const Policy* policy, base::TickClock* clock);
+ BackoffEntry(const Policy* policy, const base::TickClock* clock);
virtual ~BackoffEntry();
// Inform this item that a request for the network resource it is
@@ -124,7 +124,7 @@ class NET_EXPORT BackoffEntry {
const Policy* const policy_; // Not owned.
- base::TickClock* const clock_; // Not owned.
+ const base::TickClock* const clock_; // Not owned.
THREAD_CHECKER(thread_checker_);
diff --git a/chromium/net/base/backoff_entry_serializer.cc b/chromium/net/base/backoff_entry_serializer.cc
index f2cbec753e0..57f5a3ee213 100644
--- a/chromium/net/base/backoff_entry_serializer.cc
+++ b/chromium/net/base/backoff_entry_serializer.cc
@@ -43,7 +43,7 @@ std::unique_ptr<base::Value> BackoffEntrySerializer::SerializeToValue(
std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
const base::Value& serialized,
const BackoffEntry::Policy* policy,
- base::TickClock* tick_clock,
+ const base::TickClock* tick_clock,
base::Time time_now) {
const base::ListValue* serialized_list = nullptr;
if (!serialized.GetAsList(&serialized_list))
diff --git a/chromium/net/base/backoff_entry_serializer.h b/chromium/net/base/backoff_entry_serializer.h
index 1ecaf015d70..d5fde2c768d 100644
--- a/chromium/net/base/backoff_entry_serializer.h
+++ b/chromium/net/base/backoff_entry_serializer.h
@@ -45,7 +45,7 @@ class NET_EXPORT BackoffEntrySerializer {
static std::unique_ptr<BackoffEntry> DeserializeFromValue(
const base::Value& serialized,
const BackoffEntry::Policy* policy,
- base::TickClock* clock,
+ const base::TickClock* clock,
base::Time time_now);
private:
diff --git a/chromium/net/base/backoff_entry_serializer_unittest.cc b/chromium/net/base/backoff_entry_serializer_unittest.cc
index e5d22cfd469..748e22681a5 100644
--- a/chromium/net/base/backoff_entry_serializer_unittest.cc
+++ b/chromium/net/base/backoff_entry_serializer_unittest.cc
@@ -34,7 +34,7 @@ class TestTickClock : public base::TickClock {
TestTickClock() = default;
~TestTickClock() override = default;
- TimeTicks NowTicks() override { return now_ticks_; }
+ TimeTicks NowTicks() const override { return now_ticks_; }
void set_now(TimeTicks now) { now_ticks_ = now; }
private:
diff --git a/chromium/net/base/backoff_entry_unittest.cc b/chromium/net/base/backoff_entry_unittest.cc
index 0bed782e098..191097a0ec6 100644
--- a/chromium/net/base/backoff_entry_unittest.cc
+++ b/chromium/net/base/backoff_entry_unittest.cc
@@ -22,7 +22,7 @@ class TestTickClock : public base::TickClock {
TestTickClock() = default;
~TestTickClock() override = default;
- TimeTicks NowTicks() override { return now_ticks_; }
+ TimeTicks NowTicks() const override { return now_ticks_; }
void set_now(TimeTicks now) { now_ticks_ = now; }
private:
diff --git a/chromium/net/base/datagram_buffer.cc b/chromium/net/base/datagram_buffer.cc
new file mode 100644
index 00000000000..c4f3eaa2dcf
--- /dev/null
+++ b/chromium/net/base/datagram_buffer.cc
@@ -0,0 +1,56 @@
+// Copyright 2018 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/datagram_buffer.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
+
+namespace net {
+
+DatagramBufferPool::DatagramBufferPool(size_t max_buffer_size)
+ : max_buffer_size_(max_buffer_size) {}
+
+DatagramBufferPool::~DatagramBufferPool() {}
+
+void DatagramBufferPool::Enqueue(const char* buffer,
+ size_t buf_len,
+ DatagramBuffers* buffers) {
+ DCHECK_LE(buf_len, max_buffer_size_);
+ std::unique_ptr<DatagramBuffer> datagram_buffer;
+ if (free_list_.empty()) {
+ datagram_buffer =
+ QuicWrapUnique<DatagramBuffer>(new DatagramBuffer(max_buffer_size_));
+ } else {
+ datagram_buffer = std::move(free_list_.front());
+ free_list_.pop_front();
+ }
+ datagram_buffer->Set(buffer, buf_len);
+ buffers->emplace_back(std::move(datagram_buffer));
+}
+
+void DatagramBufferPool::Dequeue(DatagramBuffers* buffers) {
+ if (buffers->size() == 0)
+ return;
+
+ free_list_.splice(free_list_.cend(), *buffers);
+}
+
+DatagramBuffer::DatagramBuffer(size_t max_buffer_size)
+ : data_(new char[max_buffer_size]), length_(0) {}
+
+DatagramBuffer::~DatagramBuffer() {}
+
+void DatagramBuffer::Set(const char* buffer, size_t buf_len) {
+ length_ = buf_len;
+ std::memcpy(data_.get(), buffer, buf_len);
+}
+
+char* DatagramBuffer::data() const {
+ return data_.get();
+}
+
+size_t DatagramBuffer::length() const {
+ return length_;
+}
+
+} // namespace net
diff --git a/chromium/net/base/datagram_buffer.h b/chromium/net/base/datagram_buffer.h
new file mode 100644
index 00000000000..a7622b831d0
--- /dev/null
+++ b/chromium/net/base/datagram_buffer.h
@@ -0,0 +1,102 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_BASE_DATAGRAM_BUFFER_H_
+#define NET_BASE_DATAGRAM_BUFFER_H_
+
+#include <list>
+
+#include "base/memory/weak_ptr.h"
+#include "net/base/net_export.h"
+
+namespace net {
+
+// An IO buffer, (at least initially) specifically for use with the
+// new DatagramClientSocket::WriteAsync method, with the following key
+// features:
+//
+// 1) Meant to be easily batched when that improves efficiency. The
+// primary goal of WriteAsync is to enable enlisting an
+// additional cpu core for the kernel part of socket write.
+// 2) Uses unique_ptr (with std::move) rather than reference
+// counting as in IOBuffers. The benefit is safer cancellation
+// semantics, IOBuffer used reference count to enforce unique
+// ownership in an idiomatic fashion. unique_ptr is ligher weight
+// as it doesn't use thread safe primitives as
+// RefCountedThreadSafe does.
+// 3) Provides a pooling allocator, which for datagram buffers is
+// much cheaper than using fully general allocator (e.g. malloc
+// etc.). The implementation takes advantage of
+// std::list::splice so that costs associated with allocations
+// and copies of pool metadata quickly amortize to zero, and all
+// common operations are O(1).
+
+class DatagramBuffer;
+
+// Batches of DatagramBuffers are treated as a FIFO queue, implemented
+// by |std::list|. Note that |std::list::splice()| is attractive for
+// this use case because it keeps most operations to O(1) and
+// minimizes allocations/frees and copies.
+typedef std::list<std::unique_ptr<DatagramBuffer>> DatagramBuffers;
+
+class NET_EXPORT_PRIVATE DatagramBufferPool {
+ public:
+ // |max_buffer_size| must be >= largest |buf_len| provided to
+ // ||New()|.
+ DatagramBufferPool(size_t max_buffer_size);
+ DatagramBufferPool(const DatagramBufferPool&) = delete;
+ DatagramBufferPool& operator=(const DatagramBufferPool&) = delete;
+ virtual ~DatagramBufferPool();
+ // Insert a new element (drawn from the pool) containing a copy of
+ // |buffer| to |buffers|. Caller retains owenership of |buffers| and |buffer|.
+ void Enqueue(const char* buffer, size_t buf_len, DatagramBuffers* buffers);
+ // Return all elements of |buffers| to the pool. Caller retains
+ // ownership of |buffers|.
+ void Dequeue(DatagramBuffers* buffers);
+
+ size_t max_buffer_size() { return max_buffer_size_; }
+
+ private:
+ const size_t max_buffer_size_;
+ DatagramBuffers free_list_;
+};
+
+// |DatagramBuffer|s can only be created via
+// |DatagramBufferPool::Enqueue()|.
+//
+
+// |DatagramBuffer|s should be recycled via
+// |DatagramBufferPool::Dequeue|. Care must be taken when a
+// |DatagramBuffer| is moved to another thread via
+// |PostTask|. |Dequeue| is not expected to be thread-safe, so it
+// is preferred to move the |DatagramBuffer|s back to the thread where
+// the pool lives (e.g. using |PostTaskAndReturnWithResult|) and
+// dequeuing them from there. In the exception of pathalogical
+// cancellation (e.g. due to thread tear-down), the destructor will
+// release its memory permanently rather than returning to the pool.
+class NET_EXPORT_PRIVATE DatagramBuffer {
+ public:
+ DatagramBuffer() = delete;
+ DatagramBuffer(const DatagramBuffer&) = delete;
+ DatagramBuffer& operator=(const DatagramBuffer&) = delete;
+ ~DatagramBuffer();
+
+ char* data() const;
+ size_t length() const;
+
+ protected:
+ DatagramBuffer(size_t max_packet_size);
+
+ private:
+ friend class DatagramBufferPool;
+
+ void Set(const char* buffer, size_t buf_len);
+
+ std::unique_ptr<char[]> data_;
+ size_t length_;
+};
+
+} // namespace net
+
+#endif // NET_BASE_DATAGRAM_BUFFER_H_
diff --git a/chromium/net/base/datagram_buffer_unittest.cc b/chromium/net/base/datagram_buffer_unittest.cc
new file mode 100644
index 00000000000..0f65ffd669c
--- /dev/null
+++ b/chromium/net/base/datagram_buffer_unittest.cc
@@ -0,0 +1,54 @@
+// Copyright 2018 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/datagram_buffer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace test {
+
+const size_t kMaxBufferSize = 1024;
+
+class DatagramBufferTest : public testing::Test {
+ public:
+ DatagramBufferTest() : pool_(kMaxBufferSize) {}
+
+ DatagramBufferPool pool_;
+};
+
+TEST_F(DatagramBufferTest, EnqueueCopiesData) {
+ DatagramBuffers buffers;
+ const char data[] = "foo";
+ pool_.Enqueue(data, sizeof(data), &buffers);
+ EXPECT_EQ(sizeof(data), buffers.front()->length());
+ EXPECT_NE(data, buffers.front()->data());
+ EXPECT_EQ(0, memcmp(data, buffers.front()->data(), sizeof(data)));
+}
+
+TEST_F(DatagramBufferTest, DatgramBufferPoolRecycles) {
+ DatagramBuffers buffers;
+ const char data1[] = "foo";
+ pool_.Enqueue(data1, sizeof(data1), &buffers);
+ DatagramBuffer* buffer1_ptr = buffers.back().get();
+ EXPECT_EQ(1u, buffers.size());
+ const char data2[] = "bar";
+ pool_.Enqueue(data2, sizeof(data2), &buffers);
+ DatagramBuffer* buffer2_ptr = buffers.back().get();
+ EXPECT_EQ(2u, buffers.size());
+ pool_.Dequeue(&buffers);
+ EXPECT_EQ(0u, buffers.size());
+ const char data3[] = "baz";
+ pool_.Enqueue(data3, sizeof(data3), &buffers);
+ EXPECT_EQ(1u, buffers.size());
+ EXPECT_EQ(buffer1_ptr, buffers.back().get());
+ const char data4[] = "bag";
+ pool_.Enqueue(data4, sizeof(data4), &buffers);
+ EXPECT_EQ(2u, buffers.size());
+ EXPECT_EQ(buffer2_ptr, buffers.back().get());
+}
+
+} // namespace test
+
+} // namespace net
diff --git a/chromium/net/base/escape.cc b/chromium/net/base/escape.cc
index 65a23c1c395..7578bb67001 100644
--- a/chromium/net/base/escape.cc
+++ b/chromium/net/base/escape.cc
@@ -6,7 +6,9 @@
#include "base/logging.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversion_utils.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/third_party/icu/icu_utf.h"
namespace net {
@@ -101,18 +103,15 @@ const char kUrlUnescape[128] = {
// Attempts to unescape the sequence at |index| within |escaped_text|. If
// successful, sets |value| to the unescaped value. Returns whether
// unescaping succeeded.
-template <typename STR>
-bool UnescapeUnsignedCharAtIndex(STR escaped_text,
+bool UnescapeUnsignedByteAtIndex(base::StringPiece escaped_text,
size_t index,
unsigned char* value) {
if ((index + 2) >= escaped_text.size())
return false;
if (escaped_text[index] != '%')
return false;
- const typename STR::value_type most_sig_digit(
- static_cast<typename STR::value_type>(escaped_text[index + 1]));
- const typename STR::value_type least_sig_digit(
- static_cast<typename STR::value_type>(escaped_text[index + 2]));
+ char most_sig_digit(escaped_text[index + 1]);
+ char least_sig_digit(escaped_text[index + 2]);
if (base::IsHexDigit(most_sig_digit) && base::IsHexDigit(least_sig_digit)) {
*value = base::HexDigitToInt(most_sig_digit) * 16 +
base::HexDigitToInt(least_sig_digit);
@@ -121,74 +120,136 @@ bool UnescapeUnsignedCharAtIndex(STR escaped_text,
return false;
}
-// Returns true if there is an Arabic Language Mark at |index|. |first_byte|
-// is the byte at |index|.
-template <typename STR>
-bool HasArabicLanguageMarkAtIndex(STR escaped_text,
- unsigned char first_byte,
- size_t index) {
- if (first_byte != 0xD8)
+// Attempts to unescape and decode a UTF-8-encoded percent-escaped character at
+// the specified index. On success, returns true, sets |code_point_out| to be
+// the character's code point and |unescaped_out| to be the unescaped UTF-8
+// string. |unescaped_out| will always be 1/3rd the length of the substring of
+// |escaped_text| that corresponds to the unescaped character.
+bool UnescapeUTF8CharacterAtIndex(base::StringPiece escaped_text,
+ size_t index,
+ uint32_t* code_point_out,
+ std::string* unescaped_out) {
+ DCHECK(unescaped_out->empty());
+
+ unsigned char bytes[CBU8_MAX_LENGTH];
+ if (!UnescapeUnsignedByteAtIndex(escaped_text, index, &bytes[0]))
return false;
- unsigned char second_byte;
- if (!UnescapeUnsignedCharAtIndex(escaped_text, index + 3, &second_byte))
- return false;
- return second_byte == 0x9c;
-}
-// Returns true if there is a BiDi control char at |index|. |first_byte| is the
-// byte at |index|.
-template <typename STR>
-bool HasThreeByteBidiControlCharAtIndex(STR escaped_text,
- unsigned char first_byte,
- size_t index) {
- if (first_byte != 0xE2)
- return false;
- unsigned char second_byte;
- if (!UnescapeUnsignedCharAtIndex(escaped_text, index + 3, &second_byte))
- return false;
- if (second_byte != 0x80 && second_byte != 0x81)
- return false;
- unsigned char third_byte;
- if (!UnescapeUnsignedCharAtIndex(escaped_text, index + 6, &third_byte))
- return false;
- if (second_byte == 0x80) {
- return third_byte == 0x8E ||
- third_byte == 0x8F ||
- (third_byte >= 0xAA && third_byte <= 0xAE);
+ size_t num_bytes = 1;
+
+ // If this is a lead byte, need to collect trail bytes as well.
+ if (CBU8_IS_LEAD(bytes[0])) {
+ // Look for the last trail byte of the UTF-8 character. Give up once
+ // reach max character length number of bytes, or hit an unescaped
+ // character. No need to check length of escaped_text, as
+ // UnescapeUnsignedByteAtIndex checks lengths.
+ while (num_bytes < arraysize(bytes) &&
+ UnescapeUnsignedByteAtIndex(escaped_text, index + num_bytes * 3,
+ &bytes[num_bytes]) &&
+ CBU8_IS_TRAIL(bytes[num_bytes])) {
+ ++num_bytes;
+ }
}
- return third_byte >= 0xA6 && third_byte <= 0xA9;
-}
-
-// Returns true if there is a four-byte banned char at |index|. |first_byte| is
-// the byte at |index|.
-template <typename STR>
-bool HasFourByteBannedCharAtIndex(STR escaped_text,
- unsigned char first_byte,
- size_t index) {
- // The following characters are blacklisted for spoofability concerns.
- // U+1F50F LOCK WITH INK PEN (%F0%9F%94%8F)
- // U+1F510 CLOSED LOCK WITH KEY (%F0%9F%94%90)
- // U+1F512 LOCK (%F0%9F%94%92)
- // U+1F513 OPEN LOCK (%F0%9F%94%93)
- if (first_byte != 0xF0)
- return false;
- unsigned char second_byte;
- if (!UnescapeUnsignedCharAtIndex(escaped_text, index + 3, &second_byte) ||
- second_byte != 0x9F) {
+ int32_t char_index = 0;
+ // Check if the unicode "character" that was just unescaped is valid.
+ if (!base::ReadUnicodeCharacter(reinterpret_cast<char*>(bytes), num_bytes,
+ &char_index, code_point_out)) {
return false;
}
- unsigned char third_byte;
- if (!UnescapeUnsignedCharAtIndex(escaped_text, index + 6, &third_byte) ||
- third_byte != 0x94) {
- return false;
+ // It's possible that a prefix of |bytes| forms a valid UTF-8 character,
+ // and the rest are not valid UTF-8, so need to update |num_bytes| based
+ // on the result of ReadUnicodeCharacter().
+ num_bytes = char_index + 1;
+ *unescaped_out = std::string(reinterpret_cast<char*>(bytes), num_bytes);
+ return true;
+}
+
+// This method takes a Unicode code point and returns true if it should be
+// unescaped, based on |rules|.
+bool ShouldUnescapeCodePoint(UnescapeRule::Type rules, uint32_t code_point) {
+ // If this is an ASCII character, use the lookup table.
+ if (code_point < 0x80) {
+ return kUrlUnescape[code_point] ||
+ // Allow some additional unescaping when flags are set.
+ (code_point == ' ' && (rules & UnescapeRule::SPACES)) ||
+ // Allow any of the prohibited but non-control characters when doing
+ // "special" chars.
+ ((code_point == '/' || code_point == '\\') &&
+ (rules & UnescapeRule::PATH_SEPARATORS)) ||
+ (code_point > ' ' && code_point != '/' && code_point != '\\' &&
+ (rules & UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS)) ||
+ // Additionally allow non-display characters if requested.
+ (code_point < ' ' &&
+ (rules & UnescapeRule::SPOOFING_AND_CONTROL_CHARS));
}
- unsigned char fourth_byte;
- return UnescapeUnsignedCharAtIndex(escaped_text, index + 9, &fourth_byte) &&
- (fourth_byte == 0x8F || fourth_byte == 0x90 || fourth_byte == 0x92 ||
- fourth_byte == 0x93);
+ // Some schemes such as data: and file: need to parse the exact binary data
+ // when loading the URL. For that reason, SPOOFING_AND_CONTROL_CHARS allows
+ // unescaping UTF-8 byte sequences that are not safe to display. DO NOT use
+ // SPOOFING_AND_CONTROL_CHARS if the parsed URL is going to be displayed in
+ // the UI.
+ if (rules & UnescapeRule::SPOOFING_AND_CONTROL_CHARS)
+ return true;
+
+ // Compare the codepoint against a list of characters that can be used
+ // to spoof other URLs.
+ //
+ // Can't use icu to make this cleaner, because Cronet cannot depend on
+ // icu, and currently uses this file.
+ // TODO(https://crbug.com/829873): Try to make this use icu, both to
+ // protect against regressions as the Unicode stndard is updated and to
+ // reduce the number of long lists of characters.
+ // TODO(https://crbug.com/824715): Add default ignoreable and formatting
+ // codepoints.
+ return !(
+ // Per http://tools.ietf.org/html/rfc3987#section-4.1, certain BiDi
+ // control characters are not allowed to appear unescaped in URLs.
+ code_point == 0x200E || // LEFT-TO-RIGHT MARK (%E2%80%8E)
+ code_point == 0x200F || // RIGHT-TO-LEFT MARK (%E2%80%8F)
+ code_point == 0x202A || // LEFT-TO-RIGHT EMBEDDING (%E2%80%AA)
+ code_point == 0x202B || // RIGHT-TO-LEFT EMBEDDING (%E2%80%AB)
+ code_point == 0x202C || // POP DIRECTIONAL FORMATTING (%E2%80%AC)
+ code_point == 0x202D || // LEFT-TO-RIGHT OVERRIDE (%E2%80%AD)
+ code_point == 0x202E || // RIGHT-TO-LEFT OVERRIDE (%E2%80%AE)
+
+ // The Unicode Technical Report (TR9) as referenced by RFC 3987 above has
+ // since added some new BiDi control characters that are not safe to
+ // unescape. http://www.unicode.org/reports/tr9
+ code_point == 0x061C || // ARABIC LETTER MARK (%D8%9C)
+ code_point == 0x2066 || // LEFT-TO-RIGHT ISOLATE (%E2%81%A6)
+ code_point == 0x2067 || // RIGHT-TO-LEFT ISOLATE (%E2%81%A7)
+ code_point == 0x2068 || // FIRST STRONG ISOLATE (%E2%81%A8)
+ code_point == 0x2069 || // POP DIRECTIONAL ISOLATE (%E2%81%A9)
+
+ // The following spoofable characters are also banned in unescaped URLs,
+ // because they could be used to imitate parts of a web browser's UI.
+ code_point == 0x1F50F || // LOCK WITH INK PEN (%F0%9F%94%8F)
+ code_point == 0x1F510 || // CLOSED LOCK WITH KEY (%F0%9F%94%90)
+ code_point == 0x1F512 || // LOCK (%F0%9F%94%92)
+ code_point == 0x1F513 || // OPEN LOCK (%F0%9F%94%93)
+
+ // Spaces are also banned, as they can be used to scroll text out of view.
+ code_point == 0x0085 || // NEXT LINE (%C2%85)
+ code_point == 0x00A0 || // NO-BREAK SPACE (%C2%A0)
+ code_point == 0x1680 || // OGHAM SPACE MARK (%E1%9A%80)
+ code_point == 0x2000 || // EN QUAD (%E2%80%80)
+ code_point == 0x2001 || // EM QUAD (%E2%80%81)
+ code_point == 0x2002 || // EN SPACE (%E2%80%82)
+ code_point == 0x2003 || // EM SPACE (%E2%80%83)
+ code_point == 0x2004 || // THREE-PER-EM SPACE (%E2%80%84)
+ code_point == 0x2005 || // FOUR-PER-EM SPACE (%E2%80%85)
+ code_point == 0x2006 || // SIX-PER-EM SPACE (%E2%80%86)
+ code_point == 0x2007 || // FIGURE SPACE (%E2%80%87)
+ code_point == 0x2008 || // PUNCTUATION SPACE (%E2%80%88)
+ code_point == 0x2009 || // THIN SPACE (%E2%80%89)
+ code_point == 0x200A || // HAIR SPACE (%E2%80%8A)
+ code_point == 0x2028 || // LINE SEPARATOR (%E2%80%A8)
+ code_point == 0x2029 || // PARAGRAPH SEPARATOR (%E2%80%A9)
+ code_point == 0x202F || // NARROW NO-BREAK SPACE (%E2%80%AF)
+ code_point == 0x205F || // MEDIUM MATHEMATICAL SPACE (%E2%81%9F)
+ code_point == 0x3000); // IDEOGRAPHIC SPACE (%E3%80%80)
}
// Unescapes |escaped_text| according to |rules|, returning the resulting
@@ -196,9 +257,8 @@ bool HasFourByteBannedCharAtIndex(STR escaped_text,
// the alterations done to the string that are not one-character-to-one-
// character. The resulting |adjustments| will always be sorted by increasing
// offset.
-template <typename STR>
-STR UnescapeURLWithAdjustmentsImpl(
- base::BasicStringPiece<STR> escaped_text,
+std::string UnescapeURLWithAdjustmentsImpl(
+ base::StringPiece escaped_text,
UnescapeRule::Type rules,
base::OffsetAdjuster::Adjustments* adjustments) {
if (adjustments)
@@ -210,105 +270,64 @@ STR UnescapeURLWithAdjustmentsImpl(
// The output of the unescaping is always smaller than the input, so we can
// reserve the input size to make sure we have enough buffer and don't have
// to allocate in the loop below.
- STR result;
+ std::string result;
result.reserve(escaped_text.length());
// Locations of adjusted text.
- for (size_t i = 0, max = escaped_text.size(); i < max; ++i) {
- if (static_cast<unsigned char>(escaped_text[i]) >= 128) {
- // Non ASCII character, append as is.
- result.push_back(escaped_text[i]);
- continue;
- }
-
- unsigned char first_byte;
- if (UnescapeUnsignedCharAtIndex(escaped_text, i, &first_byte)) {
- // Per http://tools.ietf.org/html/rfc3987#section-4.1, the following BiDi
- // control characters are not allowed to appear unescaped in URLs:
- //
- // U+200E LEFT-TO-RIGHT MARK (%E2%80%8E)
- // U+200F RIGHT-TO-LEFT MARK (%E2%80%8F)
- // U+202A LEFT-TO-RIGHT EMBEDDING (%E2%80%AA)
- // U+202B RIGHT-TO-LEFT EMBEDDING (%E2%80%AB)
- // U+202C POP DIRECTIONAL FORMATTING (%E2%80%AC)
- // U+202D LEFT-TO-RIGHT OVERRIDE (%E2%80%AD)
- // U+202E RIGHT-TO-LEFT OVERRIDE (%E2%80%AE)
- //
- // Additionally, the Unicode Technical Report (TR9) as referenced by RFC
- // 3987 above has since added some new BiDi control characters.
- // http://www.unicode.org/reports/tr9
- //
- // U+061C ARABIC LETTER MARK (%D8%9C)
- // U+2066 LEFT-TO-RIGHT ISOLATE (%E2%81%A6)
- // U+2067 RIGHT-TO-LEFT ISOLATE (%E2%81%A7)
- // U+2068 FIRST STRONG ISOLATE (%E2%81%A8)
- // U+2069 POP DIRECTIONAL ISOLATE (%E2%81%A9)
- //
- // The following spoofable characters are also banned, because they could
- // be used to imitate parts of a web browser's UI.
+ for (size_t i = 0, max = escaped_text.size(); i < max;) {
+ // Try to unescape the character.
+ uint32_t code_point;
+ std::string unescaped;
+ if (!UnescapeUTF8CharacterAtIndex(escaped_text, i, &code_point,
+ &unescaped)) {
+ // Check if the next character can be unescaped, but not as a valid UTF-8
+ // character. In that case, just unescaped and write the non-sense
+ // character.
//
- // U+1F50F LOCK WITH INK PEN (%F0%9F%94%8F)
- // U+1F510 CLOSED LOCK WITH KEY (%F0%9F%94%90)
- // U+1F512 LOCK (%F0%9F%94%92)
- // U+1F513 OPEN LOCK (%F0%9F%94%93)
- //
- // However, some schemes such as data: and file: need to parse the exact
- // binary data when loading the URL. For that reason,
- // SPOOFING_AND_CONTROL_CHARS allows unescaping BiDi control characters.
- // DO NOT use SPOOFING_AND_CONTROL_CHARS if the parsed URL is going to be
- // displayed in the UI.
- if (!(rules & UnescapeRule::SPOOFING_AND_CONTROL_CHARS)) {
- if (HasArabicLanguageMarkAtIndex(escaped_text, first_byte, i)) {
- // Keep Arabic Language Mark escaped.
- escaped_text.substr(i, 6).AppendToString(&result);
- i += 5;
- continue;
- }
- if (HasThreeByteBidiControlCharAtIndex(escaped_text, first_byte, i)) {
- // Keep BiDi control char escaped.
- escaped_text.substr(i, 9).AppendToString(&result);
- i += 8;
- continue;
- }
- if (HasFourByteBannedCharAtIndex(escaped_text, first_byte, i)) {
- // Keep banned char escaped.
- escaped_text.substr(i, 12).AppendToString(&result);
- i += 11;
- continue;
- }
- }
-
- if (first_byte >= 0x80 || // Unescape all high-bit characters.
- // For 7-bit characters, the lookup table tells us all valid chars.
- (kUrlUnescape[first_byte] ||
- // ...and we allow some additional unescaping when flags are set.
- (first_byte == ' ' && (rules & UnescapeRule::SPACES)) ||
- // Allow any of the prohibited but non-control characters when
- // we're doing "special" chars.
- ((first_byte == '/' || first_byte == '\\') &&
- (rules & UnescapeRule::PATH_SEPARATORS)) ||
- (first_byte > ' ' && first_byte != '/' && first_byte != '\\' &&
- (rules & UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS)) ||
- // Additionally allow non-display characters if requested.
- (first_byte < ' ' &&
- (rules & UnescapeRule::SPOOFING_AND_CONTROL_CHARS)))) {
- // Use the unescaped version of the character.
+ // TODO(https://crbug.com/829868): Do not unescape illegal UTF-8 sequences
+ // unless SPOOFING_AND_CONTROL_CHARS is given. Should also split that
+ // behaviour off into a separate function.
+ unsigned char non_utf8_byte;
+ if (UnescapeUnsignedByteAtIndex(escaped_text, i, &non_utf8_byte)) {
+ result.push_back(non_utf8_byte);
if (adjustments)
adjustments->push_back(base::OffsetAdjuster::Adjustment(i, 3, 1));
- result.push_back(first_byte);
- i += 2;
+ i += 3;
+ continue;
+ }
+
+ // Character is not escaped, so append as is, unless it's a '+' and
+ // REPLACE_PLUS_WITH_SPACE is being applied.
+ if (escaped_text[i] == '+' &&
+ (rules & UnescapeRule::REPLACE_PLUS_WITH_SPACE)) {
+ result.push_back(' ');
} else {
- // Keep escaped. Append a percent and we'll get the following two
- // digits on the next loops through.
- result.push_back('%');
+ result.push_back(escaped_text[i]);
+ }
+ ++i;
+ continue;
+ }
+
+ DCHECK(!unescaped.empty());
+
+ if (!ShouldUnescapeCodePoint(rules, code_point)) {
+ // If it's a valid UTF-8 character, but not safe to unescape, copy all
+ // bytes directly.
+ result.append(escaped_text.begin() + i,
+ escaped_text.begin() + i + 3 * unescaped.length());
+ i += unescaped.length() * 3;
+ continue;
+ }
+
+ // If the code point is allowed, and append the entire unescaped character.
+ result.append(unescaped);
+ if (adjustments) {
+ for (size_t j = 0; j < unescaped.length(); ++j) {
+ adjustments->push_back(
+ base::OffsetAdjuster::Adjustment(i + j * 3, 3, 1));
}
- } else if ((rules & UnescapeRule::REPLACE_PLUS_WITH_SPACE) &&
- escaped_text[i] == '+') {
- result.push_back(' ');
- } else {
- // Normal case for unescaped characters.
- result.push_back(escaped_text[i]);
}
+ i += 3 * unescaped.length();
}
return result;
@@ -436,11 +455,6 @@ std::string UnescapeURLComponent(base::StringPiece escaped_text,
return UnescapeURLWithAdjustmentsImpl(escaped_text, rules, NULL);
}
-base::string16 UnescapeURLComponent(base::StringPiece16 escaped_text,
- UnescapeRule::Type rules) {
- return UnescapeURLWithAdjustmentsImpl(escaped_text, rules, NULL);
-}
-
base::string16 UnescapeAndDecodeUTF8URLComponent(base::StringPiece text,
UnescapeRule::Type rules) {
return UnescapeAndDecodeUTF8URLComponentWithAdjustments(text, rules, NULL);
diff --git a/chromium/net/base/escape.h b/chromium/net/base/escape.h
index 5d494045d22..af4edf0f790 100644
--- a/chromium/net/base/escape.h
+++ b/chromium/net/base/escape.h
@@ -81,7 +81,8 @@ class UnescapeRule {
// Convert %20 to spaces. In some places where we're showing URLs, we may
// want this. In places where the URL may be copied and pasted out, then
// you wouldn't want this since it might not be interpreted in one piece
- // by other applications.
+ // by other applications. Other unicode spaces will not be unescaped unless
+ // SPOOFING_AND_CONTROL_CHARS is used.
SPACES = 1 << 1,
// Unescapes '/' and '\\'. If these characters were unescaped, the resulting
@@ -116,17 +117,16 @@ class UnescapeRule {
// Unescapes |escaped_text| and returns the result.
// Unescaping consists of looking for the exact pattern "%XX", where each X is
// a hex digit, and converting to the character with the numerical value of
-// those digits. Thus "i%20=%203%3b" unescapes to "i = 3;".
+// those digits. Thus "i%20=%203%3b" unescapes to "i = 3;", if the
+// "UnescapeRule::SPACES" used.
//
-// Watch out: this doesn't necessarily result in the correct final result,
-// because the encoding may be unknown. For example, the input might be ASCII,
-// which, after unescaping, is supposed to be interpreted as UTF-8, and then
-// converted into full UTF-16 chars. This function won't tell you if any
-// conversions need to take place, it only unescapes.
+// This method does not ensure that the output is a valid string using any
+// character encoding. However, unless SPOOFING_AND_CONTROL_CHARS is set, it
+// does leave escaped certain byte sequences that would be dangerous to display
+// to the user, because if interpreted as UTF-8, they could be used to mislead
+// the user.
NET_EXPORT std::string UnescapeURLComponent(base::StringPiece escaped_text,
UnescapeRule::Type rules);
-NET_EXPORT base::string16 UnescapeURLComponent(base::StringPiece16 escaped_text,
- UnescapeRule::Type rules);
// Unescapes the given substring as a URL, and then tries to interpret the
// result as being encoded as UTF-8. If the result is convertable into UTF-8, it
diff --git a/chromium/net/base/escape_unittest.cc b/chromium/net/base/escape_unittest.cc
index b828d80b5fe..fb13613f56a 100644
--- a/chromium/net/base/escape_unittest.cc
+++ b/chromium/net/base/escape_unittest.cc
@@ -21,12 +21,6 @@ struct EscapeCase {
};
struct UnescapeURLCase {
- const wchar_t* input;
- UnescapeRule::Type rules;
- const wchar_t* output;
-};
-
-struct UnescapeURLCaseASCII {
const char* input;
UnescapeRule::Type rules;
const char* output;
@@ -148,8 +142,8 @@ TEST(EscapeTest, EscapeUrlEncodedDataSpace) {
ASSERT_EQ(EscapeUrlEncodedData("a b", false), "a%20b");
}
-TEST(EscapeTest, UnescapeURLComponentASCII) {
- const UnescapeURLCaseASCII unescape_cases[] = {
+TEST(EscapeTest, UnescapeURLComponent) {
+ const UnescapeURLCase kUnescapeCases[] = {
{"", UnescapeRule::NORMAL, ""},
{"%2", UnescapeRule::NORMAL, "%2"},
{"%%%%%%", UnescapeRule::NORMAL, "%%%%%%"},
@@ -159,6 +153,115 @@ TEST(EscapeTest, UnescapeURLComponentASCII) {
"Some%20random text %25%2dOK"},
{"Some%20random text %25%2dOK", UnescapeRule::NORMAL,
"Some%20random text %25-OK"},
+ {"Some%20random text %25%E1%A6", UnescapeRule::NORMAL,
+ "Some%20random text %25\xE1\xA6"},
+ {"Some%20random text %25%E1%A6OK", UnescapeRule::NORMAL,
+ "Some%20random text %25\xE1\xA6OK"},
+ {"Some%20random text %25%E1%A6%99OK", UnescapeRule::NORMAL,
+ "Some%20random text %25\xE1\xA6\x99OK"},
+
+ // BiDi Control characters should not be unescaped unless explicity told
+ // to
+ // do so with UnescapeRule::SPOOFING_AND_CONTROL_CHARS
+ {"Some%20random text %25%D8%9COK", UnescapeRule::NORMAL,
+ "Some%20random text %25%D8%9COK"},
+ {"Some%20random text %25%E2%80%8EOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%80%8EOK"},
+ {"Some%20random text %25%E2%80%8FOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%80%8FOK"},
+ {"Some%20random text %25%E2%80%AAOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%80%AAOK"},
+ {"Some%20random text %25%E2%80%ABOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%80%ABOK"},
+ {"Some%20random text %25%E2%80%AEOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%80%AEOK"},
+ {"Some%20random text %25%E2%81%A6OK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%81%A6OK"},
+ {"Some%20random text %25%E2%81%A9OK", UnescapeRule::NORMAL,
+ "Some%20random text %25%E2%81%A9OK"},
+ // UnescapeRule::SPOOFING_AND_CONTROL_CHARS should unescape BiDi Control
+ // characters.
+ {"Some%20random text %25%D8%9COK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xD8\x9COK"},
+ {"Some%20random text %25%E2%80%8EOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x80\x8EOK"},
+ {"Some%20random text %25%E2%80%8FOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x80\x8FOK"},
+ {"Some%20random text %25%E2%80%AAOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x80\xAAOK"},
+ {"Some%20random text %25%E2%80%ABOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x80\xABOK"},
+ {"Some%20random text %25%E2%80%AEOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x80\xAEOK"},
+ {"Some%20random text %25%E2%81%A6OK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x81\xA6OK"},
+ {"Some%20random text %25%E2%81%A9OK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xE2\x81\xA9OK"},
+
+ // Certain banned characters should not be unescaped unless explicitly
+ // told
+ // to do so with UnescapeRule::SPOOFING_AND_CONTROL_CHARS.
+ // U+1F50F LOCK WITH INK PEN
+ {"Some%20random text %25%F0%9F%94%8FOK", UnescapeRule::NORMAL,
+ "Some%20random text %25%F0%9F%94%8FOK"},
+ // U+1F510 CLOSED LOCK WITH KEY
+ {"Some%20random text %25%F0%9F%94%90OK", UnescapeRule::NORMAL,
+ "Some%20random text %25%F0%9F%94%90OK"},
+ // U+1F512 LOCK
+ {"Some%20random text %25%F0%9F%94%92OK", UnescapeRule::NORMAL,
+ "Some%20random text %25%F0%9F%94%92OK"},
+ // U+1F513 OPEN LOCK
+ {"Some%20random text %25%F0%9F%94%93OK", UnescapeRule::NORMAL,
+ "Some%20random text %25%F0%9F%94%93OK"},
+ // UnescapeRule::SPOOFING_AND_CONTROL_CHARS should unescape banned
+ // characters.
+ {"Some%20random text %25%F0%9F%94%8FOK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xF0\x9F\x94\x8FOK"},
+ {"Some%20random text %25%F0%9F%94%90OK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xF0\x9F\x94\x90OK"},
+ {"Some%20random text %25%F0%9F%94%92OK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xF0\x9F\x94\x92OK"},
+ {"Some%20random text %25%F0%9F%94%93OK",
+ UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Some%20random text %25\xF0\x9F\x94\x93OK"},
+
+ // Spaces
+ {"(%C2%85)(%C2%A0)(%E1%9A%80)(%E2%80%80)", UnescapeRule::NORMAL,
+ "(%C2%85)(%C2%A0)(%E1%9A%80)(%E2%80%80)"},
+ {"(%E2%80%81)(%E2%80%82)(%E2%80%83)(%E2%80%84)", UnescapeRule::NORMAL,
+ "(%E2%80%81)(%E2%80%82)(%E2%80%83)(%E2%80%84)"},
+ {"(%E2%80%85)(%E2%80%86)(%E2%80%87)(%E2%80%88)", UnescapeRule::NORMAL,
+ "(%E2%80%85)(%E2%80%86)(%E2%80%87)(%E2%80%88)"},
+ {"(%E2%80%89)(%E2%80%8A)(%E2%80%A8)(%E2%80%A9)", UnescapeRule::NORMAL,
+ "(%E2%80%89)(%E2%80%8A)(%E2%80%A8)(%E2%80%A9)"},
+ {"(%E2%80%AF)(%E2%81%9F)(%E3%80%80)", UnescapeRule::NORMAL,
+ "(%E2%80%AF)(%E2%81%9F)(%E3%80%80)"},
+
+ // Two spoofing characters in a row should not be unescaped.
+ {"%D8%9C%D8%9C", UnescapeRule::NORMAL, "%D8%9C%D8%9C"},
+ // Non-spoofing characters surrounded by spoofing characters should be
+ // unescaped.
+ {"%D8%9C%C2%A1%D8%9C%C2%A1", UnescapeRule::NORMAL,
+ "%D8%9C\xC2\xA1%D8%9C\xC2\xA1"},
+ // Invalid UTF-8 characters surrounded by spoofing characters should be
+ // unescaped.
+ {"%D8%9C%85%D8%9C%85", UnescapeRule::NORMAL, "%D8%9C\x85%D8%9C\x85"},
+ // Test with enough trail bytes to overflow the CBU8_MAX_LENGTH-byte
+ // buffer. The first two bytes are a spoofing character as well.
+ {"%D8%9C%9C%9C%9C%9C%9C%9C%9C%9C%9C", UnescapeRule::NORMAL,
+ "%D8%9C\x9C\x9C\x9C\x9C\x9C\x9C\x9C\x9C\x9C"},
+
{"Some%20random text %25%2dOK", UnescapeRule::SPACES,
"Some random text %25-OK"},
{"Some%20random text %25%2dOK", UnescapeRule::PATH_SEPARATORS,
@@ -192,19 +295,22 @@ TEST(EscapeTest, UnescapeURLComponentASCII) {
{"Hello%20%13%10%02", UnescapeRule::SPACES, "Hello %13%10%02"},
{"Hello%20%13%10%02", UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
"Hello%20\x13\x10\x02"},
+ {"Hello\xE9\xA0\xA4\xE9\xA0\xA7",
+ UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ "Hello\xE9\xA0\xA4\xE9\xA0\xA7"},
// '/' and '\\' should only be unescaped by PATH_SEPARATORS.
{"%2F%5C", UnescapeRule::PATH_SEPARATORS, "/\\"},
- {"%2F%5C", UnescapeRule::SPACES |
- UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS |
- UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
+ {"%2F%5C",
+ UnescapeRule::SPACES |
+ UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS |
+ UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
"%2F%5C"},
};
- for (size_t i = 0; i < arraysize(unescape_cases); i++) {
- std::string str(unescape_cases[i].input);
- EXPECT_EQ(std::string(unescape_cases[i].output),
- UnescapeURLComponent(str, unescape_cases[i].rules));
+ for (const auto unescape_case : kUnescapeCases) {
+ EXPECT_EQ(unescape_case.output,
+ UnescapeURLComponent(unescape_case.input, unescape_case.rules));
}
// Test the NULL character unescaping (which wouldn't work above since those
@@ -228,166 +334,6 @@ TEST(EscapeTest, UnescapeURLComponentASCII) {
EXPECT_EQ(expected, UnescapeURLComponent(input, UnescapeRule::NORMAL));
}
-TEST(EscapeTest, UnescapeURLComponent) {
- const UnescapeURLCase unescape_cases[] = {
- {L"", UnescapeRule::NORMAL, L""},
- {L"%2", UnescapeRule::NORMAL, L"%2"},
- {L"%%%%%%", UnescapeRule::NORMAL, L"%%%%%%"},
- {L"Don't escape anything", UnescapeRule::NORMAL,
- L"Don't escape anything"},
- {L"Invalid %escape %2", UnescapeRule::NORMAL, L"Invalid %escape %2"},
- {L"Some%20random text %25%2dOK", UnescapeRule::NONE,
- L"Some%20random text %25%2dOK"},
- {L"Some%20random text %25%2dOK", UnescapeRule::NORMAL,
- L"Some%20random text %25-OK"},
- {L"Some%20random text %25%E2%80", UnescapeRule::NORMAL,
- L"Some%20random text %25\xE2\x80"},
- {L"Some%20random text %25%E2%80OK", UnescapeRule::NORMAL,
- L"Some%20random text %25\xE2\x80OK"},
- {L"Some%20random text %25%E2%80%84OK", UnescapeRule::NORMAL,
- L"Some%20random text %25\xE2\x80\x84OK"},
-
- // BiDi Control characters should not be unescaped unless explicity told
- // to
- // do so with UnescapeRule::SPOOFING_AND_CONTROL_CHARS
- {L"Some%20random text %25%D8%9COK", UnescapeRule::NORMAL,
- L"Some%20random text %25%D8%9COK"},
- {L"Some%20random text %25%E2%80%8EOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%80%8EOK"},
- {L"Some%20random text %25%E2%80%8FOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%80%8FOK"},
- {L"Some%20random text %25%E2%80%AAOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%80%AAOK"},
- {L"Some%20random text %25%E2%80%ABOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%80%ABOK"},
- {L"Some%20random text %25%E2%80%AEOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%80%AEOK"},
- {L"Some%20random text %25%E2%81%A6OK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%81%A6OK"},
- {L"Some%20random text %25%E2%81%A9OK", UnescapeRule::NORMAL,
- L"Some%20random text %25%E2%81%A9OK"},
- // UnescapeRule::SPOOFING_AND_CONTROL_CHARS should unescape BiDi Control
- // characters.
- {L"Some%20random text %25%D8%9COK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xD8\x9COK"},
- {L"Some%20random text %25%E2%80%8EOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x80\x8EOK"},
- {L"Some%20random text %25%E2%80%8FOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x80\x8FOK"},
- {L"Some%20random text %25%E2%80%AAOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x80\xAAOK"},
- {L"Some%20random text %25%E2%80%ABOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x80\xABOK"},
- {L"Some%20random text %25%E2%80%AEOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x80\xAEOK"},
- {L"Some%20random text %25%E2%81%A6OK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x81\xA6OK"},
- {L"Some%20random text %25%E2%81%A9OK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xE2\x81\xA9OK"},
-
- // Certain banned characters should not be unescaped unless explicitly
- // told
- // to do so with UnescapeRule::SPOOFING_AND_CONTROL_CHARS.
- // U+1F50F LOCK WITH INK PEN
- {L"Some%20random text %25%F0%9F%94%8FOK", UnescapeRule::NORMAL,
- L"Some%20random text %25%F0%9F%94%8FOK"},
- // U+1F510 CLOSED LOCK WITH KEY
- {L"Some%20random text %25%F0%9F%94%90OK", UnescapeRule::NORMAL,
- L"Some%20random text %25%F0%9F%94%90OK"},
- // U+1F512 LOCK
- {L"Some%20random text %25%F0%9F%94%92OK", UnescapeRule::NORMAL,
- L"Some%20random text %25%F0%9F%94%92OK"},
- // U+1F513 OPEN LOCK
- {L"Some%20random text %25%F0%9F%94%93OK", UnescapeRule::NORMAL,
- L"Some%20random text %25%F0%9F%94%93OK"},
- // UnescapeRule::SPOOFING_AND_CONTROL_CHARS should unescape banned
- // characters.
- {L"Some%20random text %25%F0%9F%94%8FOK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xF0\x9F\x94\x8FOK"},
- {L"Some%20random text %25%F0%9F%94%90OK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xF0\x9F\x94\x90OK"},
- {L"Some%20random text %25%F0%9F%94%92OK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xF0\x9F\x94\x92OK"},
- {L"Some%20random text %25%F0%9F%94%93OK",
- UnescapeRule::NORMAL | UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Some%20random text %25\xF0\x9F\x94\x93OK"},
-
- {L"Some%20random text %25%2dOK", UnescapeRule::SPACES,
- L"Some random text %25-OK"},
- {L"Some%20random text %25%2dOK",
- UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS,
- L"Some%20random text %-OK"},
- {L"Some%20random text %25%2dOK",
- UnescapeRule::SPACES |
- UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS,
- L"Some random text %-OK"},
- {L"%A0%B1%C2%D3%E4%F5", UnescapeRule::NORMAL,
- L"\xA0\xB1\xC2\xD3\xE4\xF5"},
- {L"%Aa%Bb%Cc%Dd%Ee%Ff", UnescapeRule::NORMAL,
- L"\xAa\xBb\xCc\xDd\xEe\xFf"},
- // Certain URL-sensitive characters should not be unescaped unless asked.
- {L"Hello%20%13%10world %23# %3F? %3D= %26& %25% %2B+",
- UnescapeRule::SPACES,
- L"Hello %13%10world %23# %3F? %3D= %26& %25% %2B+"},
- {L"Hello%20%13%10world %23# %3F? %3D= %26& %25% %2B+",
- UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS,
- L"Hello%20%13%10world ## ?? == && %% ++"},
- // We can neither escape nor unescape '@' since some websites expect it to
- // be preserved as either '@' or "%40".
- // See http://b/996720 and http://crbug.com/23933 .
- {L"me@my%40example", UnescapeRule::NORMAL, L"me@my%40example"},
- // Control characters.
- {L"%01%02%03%04%05%06%07%08%09 %25",
- UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS,
- L"%01%02%03%04%05%06%07%08%09 %"},
- {L"%01%02%03%04%05%06%07%08%09 %25",
- UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"\x01\x02\x03\x04\x05\x06\x07\x08\x09 %25"},
- {L"Hello%20%13%10%02", UnescapeRule::SPACES, L"Hello %13%10%02"},
- {L"Hello%20%13%10%02", UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Hello%20\x13\x10\x02"},
- {L"Hello\x9824\x9827", UnescapeRule::SPOOFING_AND_CONTROL_CHARS,
- L"Hello\x9824\x9827"},
- };
-
- for (size_t i = 0; i < arraysize(unescape_cases); i++) {
- base::string16 str(base::WideToUTF16(unescape_cases[i].input));
- EXPECT_EQ(base::WideToUTF16(unescape_cases[i].output),
- UnescapeURLComponent(str, unescape_cases[i].rules));
- }
-
- // Test the NULL character unescaping (which wouldn't work above since those
- // are just char pointers).
- base::string16 input(base::WideToUTF16(L"Null"));
- input.push_back(0); // Also have a NULL in the input.
- input.append(base::WideToUTF16(L"%00%39Test"));
-
- // When we're unescaping NULLs
- base::string16 expected(base::WideToUTF16(L"Null"));
- expected.push_back(0);
- expected.push_back(0);
- expected.append(base::ASCIIToUTF16("9Test"));
- EXPECT_EQ(expected, UnescapeURLComponent(
- input, UnescapeRule::SPOOFING_AND_CONTROL_CHARS));
-
- // When we're not unescaping NULLs.
- expected = base::WideToUTF16(L"Null");
- expected.push_back(0);
- expected.append(base::WideToUTF16(L"%009Test"));
- EXPECT_EQ(expected, UnescapeURLComponent(input, UnescapeRule::NORMAL));
-}
-
TEST(EscapeTest, UnescapeAndDecodeUTF8URLComponent) {
const UnescapeAndDecodeCase unescape_cases[] = {
{ "%",
@@ -450,44 +396,45 @@ TEST(EscapeTest, UnescapeAndDecodeUTF8URLComponent) {
TEST(EscapeTest, AdjustOffset) {
const AdjustOffsetCase adjust_cases[] = {
- {"", 0, 0},
- {"test", 0, 0},
- {"test", 2, 2},
- {"test", 4, 4},
- {"test", std::string::npos, std::string::npos},
- {"%2dtest", 6, 4},
- {"%2dtest", 3, 1},
- {"%2dtest", 2, std::string::npos},
- {"%2dtest", 1, std::string::npos},
- {"%2dtest", 0, 0},
- {"test%2d", 2, 2},
- {"%E4%BD%A0+%E5%A5%BD", 9, 1},
- {"%E4%BD%A0+%E5%A5%BD", 6, std::string::npos},
- {"%E4%BD%A0+%E5%A5%BD", 0, 0},
- {"%E4%BD%A0+%E5%A5%BD", 10, 2},
- {"%E4%BD%A0+%E5%A5%BD", 19, 3},
-
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 18, 8},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 15, std::string::npos},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 9, 7},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 19, 9},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 28, 10},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 0, 0},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 2, 2},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 3, std::string::npos},
- {"hi%41test%E4%BD%A0+%E5%A5%BD", 5, 3},
-
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 9, 1},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 6, std::string::npos},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 0, 0},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 10, 2},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 19, 3},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 21, 5},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 22, std::string::npos},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 24, 6},
- {"%E4%BD%A0+%E5%A5%BDhi%41test", 28, 10},
-
- {"%ED%B0%80+%E5%A5%BD", 6, 6}, // not convertable to UTF-8
+ {"", 0, 0},
+ {"test", 0, 0},
+ {"test", 2, 2},
+ {"test", 4, 4},
+ {"test", std::string::npos, std::string::npos},
+ {"%2dtest", 6, 4},
+ {"%2dtest", 3, 1},
+ {"%2dtest", 2, std::string::npos},
+ {"%2dtest", 1, std::string::npos},
+ {"%2dtest", 0, 0},
+ {"test%2d", 2, 2},
+ {"test%2e", 2, 2},
+ {"%E4%BD%A0+%E5%A5%BD", 9, 1},
+ {"%E4%BD%A0+%E5%A5%BD", 6, std::string::npos},
+ {"%E4%BD%A0+%E5%A5%BD", 0, 0},
+ {"%E4%BD%A0+%E5%A5%BD", 10, 2},
+ {"%E4%BD%A0+%E5%A5%BD", 19, 3},
+
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 18, 8},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 15, std::string::npos},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 9, 7},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 19, 9},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 28, 10},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 0, 0},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 2, 2},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 3, std::string::npos},
+ {"hi%41test%E4%BD%A0+%E5%A5%BD", 5, 3},
+
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 9, 1},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 6, std::string::npos},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 0, 0},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 10, 2},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 19, 3},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 21, 5},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 22, std::string::npos},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 24, 6},
+ {"%E4%BD%A0+%E5%A5%BDhi%41test", 28, 10},
+
+ {"%ED%B0%80+%E5%A5%BD", 6, 6}, // not convertable to UTF-8
};
for (size_t i = 0; i < arraysize(adjust_cases); i++) {
diff --git a/chromium/net/base/file_stream_context.cc b/chromium/net/base/file_stream_context.cc
index ecb497b0345..75dcfb97d2a 100644
--- a/chromium/net/base/file_stream_context.cc
+++ b/chromium/net/base/file_stream_context.cc
@@ -6,7 +6,6 @@
#include <utility>
-#include "base/debug/alias.h"
#include "base/files/file_path.h"
#include "base/location.h"
#include "base/task_runner.h"
@@ -82,7 +81,7 @@ void FileStream::Context::Orphan() {
void FileStream::Context::Open(const base::FilePath& path,
int open_flags,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
bool posted = base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
@@ -92,12 +91,12 @@ void FileStream::Context::Open(const base::FilePath& path,
std::move(callback)));
DCHECK(posted);
- last_operation_ = OPEN;
async_in_progress_ = true;
}
void FileStream::Context::Close(CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
+
bool posted = base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
base::BindOnce(&Context::CloseFileImpl, base::Unretained(this)),
@@ -105,13 +104,12 @@ void FileStream::Context::Close(CompletionOnceCallback callback) {
IntToInt64(std::move(callback))));
DCHECK(posted);
- last_operation_ = CLOSE;
async_in_progress_ = true;
}
void FileStream::Context::Seek(int64_t offset,
Int64CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
bool posted = base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
@@ -120,14 +118,11 @@ void FileStream::Context::Seek(int64_t offset,
std::move(callback)));
DCHECK(posted);
- last_operation_ = SEEK;
async_in_progress_ = true;
}
void FileStream::Context::GetFileInfo(base::File::Info* file_info,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
-
base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
base::BindOnce(&Context::GetFileInfoImpl, base::Unretained(this),
@@ -139,7 +134,7 @@ void FileStream::Context::GetFileInfo(base::File::Info* file_info,
}
void FileStream::Context::Flush(CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
bool posted = base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
@@ -148,7 +143,6 @@ void FileStream::Context::Flush(CompletionOnceCallback callback) {
IntToInt64(std::move(callback))));
DCHECK(posted);
- last_operation_ = FLUSH;
async_in_progress_ = true;
}
@@ -156,16 +150,6 @@ bool FileStream::Context::IsOpen() const {
return file_.IsValid();
}
-void FileStream::Context::CheckNoAsyncInProgress() const {
- if (!async_in_progress_)
- return;
- LastOperation state = last_operation_;
- base::debug::Alias(&state);
- // TODO(xunjieli): Once https://crbug.com/732321 is fixed, use
- // DCHECK(!async_in_progress_) directly at call places.
- CHECK(!async_in_progress_);
-}
-
FileStream::Context::OpenResult FileStream::Context::OpenFileImpl(
const base::FilePath& path, int open_flags) {
#if defined(OS_POSIX)
@@ -230,10 +214,7 @@ void FileStream::Context::OnOpenCompleted(CompletionOnceCallback callback,
}
void FileStream::Context::CloseAndDelete() {
- // TODO(ananta)
- // Replace this CHECK with a DCHECK once we figure out the root cause of
- // http://crbug.com/455066
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
if (file_.IsValid()) {
bool posted = task_runner_.get()->PostTask(
@@ -256,7 +237,6 @@ void FileStream::Context::OnAsyncCompleted(Int64CompletionOnceCallback callback,
// should be reset before Close() because it shouldn't run if any async
// operation is in progress.
async_in_progress_ = false;
- last_operation_ = NONE;
if (orphaned_) {
CloseAndDelete();
} else {
diff --git a/chromium/net/base/file_stream_context.h b/chromium/net/base/file_stream_context.h
index 7a34aad19f8..46f0ce36549 100644
--- a/chromium/net/base/file_stream_context.h
+++ b/chromium/net/base/file_stream_context.h
@@ -32,7 +32,7 @@
#include "base/files/file.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_for_io.h"
#include "base/single_thread_task_runner.h"
#include "base/task_runner.h"
#include "net/base/completion_once_callback.h"
@@ -51,7 +51,7 @@ namespace net {
class IOBuffer;
#if defined(OS_WIN)
-class FileStream::Context : public base::MessageLoopForIO::IOHandler {
+class FileStream::Context : public base::MessagePumpForIO::IOHandler {
#elif defined(OS_POSIX)
class FileStream::Context {
#endif
@@ -124,27 +124,6 @@ class FileStream::Context {
DISALLOW_COPY_AND_ASSIGN(OpenResult);
};
- // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
- enum LastOperation {
- // FileStream has a pending Open().
- OPEN,
- // FileStream has a pending Write().
- WRITE,
- // FileStream has a pending Read().
- READ,
- // FileStream has a pending Seek().
- SEEK,
- // FileStream has a pending Flush().
- FLUSH,
- // FileStream has a pending Close().
- CLOSE,
- // FileStream doesn't have any pending operation.
- NONE
- };
-
- // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
- void CheckNoAsyncInProgress() const;
-
////////////////////////////////////////////////////////////////////////////
// Platform-independent methods implemented in file_stream_context.cc.
////////////////////////////////////////////////////////////////////////////
@@ -181,8 +160,8 @@ class FileStream::Context {
#if defined(OS_WIN)
void IOCompletionIsPending(CompletionOnceCallback callback, IOBuffer* buf);
- // Implementation of MessageLoopForIO::IOHandler.
- void OnIOCompleted(base::MessageLoopForIO::IOContext* context,
+ // Implementation of MessagePumpForIO::IOHandler.
+ void OnIOCompleted(base::MessagePumpForIO::IOContext* context,
DWORD bytes_read,
DWORD error) override;
@@ -239,14 +218,11 @@ class FileStream::Context {
base::File file_;
bool async_in_progress_;
- // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
- LastOperation last_operation_;
-
bool orphaned_;
scoped_refptr<base::TaskRunner> task_runner_;
#if defined(OS_WIN)
- base::MessageLoopForIO::IOContext io_context_;
+ base::MessagePumpForIO::IOContext io_context_;
CompletionOnceCallback callback_;
scoped_refptr<IOBuffer> in_flight_buf_;
// This flag is set to true when we receive a Read request which is queued to
diff --git a/chromium/net/base/file_stream_context_posix.cc b/chromium/net/base/file_stream_context_posix.cc
index 1880b95a529..b15c6511aca 100644
--- a/chromium/net/base/file_stream_context_posix.cc
+++ b/chromium/net/base/file_stream_context_posix.cc
@@ -31,7 +31,6 @@ FileStream::Context::Context(base::File file,
const scoped_refptr<base::TaskRunner>& task_runner)
: file_(std::move(file)),
async_in_progress_(false),
- last_operation_(NONE),
orphaned_(false),
task_runner_(task_runner) {}
@@ -40,7 +39,7 @@ FileStream::Context::~Context() = default;
int FileStream::Context::Read(IOBuffer* in_buf,
int buf_len,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
scoped_refptr<IOBuffer> buf = in_buf;
const bool posted = base::PostTaskAndReplyWithResult(
@@ -52,14 +51,13 @@ int FileStream::Context::Read(IOBuffer* in_buf,
DCHECK(posted);
async_in_progress_ = true;
- last_operation_ = READ;
return ERR_IO_PENDING;
}
int FileStream::Context::Write(IOBuffer* in_buf,
int buf_len,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
scoped_refptr<IOBuffer> buf = in_buf;
const bool posted = base::PostTaskAndReplyWithResult(
@@ -71,7 +69,6 @@ int FileStream::Context::Write(IOBuffer* in_buf,
DCHECK(posted);
async_in_progress_ = true;
- last_operation_ = WRITE;
return ERR_IO_PENDING;
}
diff --git a/chromium/net/base/file_stream_context_win.cc b/chromium/net/base/file_stream_context_win.cc
index cf4947fda5f..61118ad1f28 100644
--- a/chromium/net/base/file_stream_context_win.cc
+++ b/chromium/net/base/file_stream_context_win.cc
@@ -11,6 +11,7 @@
#include "base/location.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_for_io.h"
#include "base/single_thread_task_runner.h"
#include "base/task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -38,7 +39,6 @@ void IncrementOffset(OVERLAPPED* overlapped, DWORD count) {
FileStream::Context::Context(const scoped_refptr<base::TaskRunner>& task_runner)
: async_in_progress_(false),
- last_operation_(NONE),
orphaned_(false),
task_runner_(task_runner),
async_read_initiated_(false),
@@ -50,7 +50,6 @@ FileStream::Context::Context(base::File file,
const scoped_refptr<base::TaskRunner>& task_runner)
: file_(std::move(file)),
async_in_progress_(false),
- last_operation_(NONE),
orphaned_(false),
task_runner_(task_runner),
async_read_initiated_(false),
@@ -69,13 +68,12 @@ FileStream::Context::~Context() {
int FileStream::Context::Read(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
DCHECK(!async_read_initiated_);
DCHECK(!async_read_completed_);
DCHECK(!io_complete_for_read_received_);
- last_operation_ = READ;
IOCompletionIsPending(std::move(callback), buf);
async_read_initiated_ = true;
@@ -92,9 +90,8 @@ int FileStream::Context::Read(IOBuffer* buf,
int FileStream::Context::Write(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) {
- CheckNoAsyncInProgress();
+ DCHECK(!async_in_progress_);
- last_operation_ = WRITE;
result_ = 0;
DWORD bytes_written = 0;
@@ -135,17 +132,15 @@ void FileStream::Context::IOCompletionIsPending(CompletionOnceCallback callback,
}
void FileStream::Context::OnIOCompleted(
- base::MessageLoopForIO::IOContext* context,
+ base::MessagePumpForIO::IOContext* context,
DWORD bytes_read,
DWORD error) {
DCHECK_EQ(&io_context_, context);
DCHECK(!callback_.is_null());
DCHECK(async_in_progress_);
- if (!async_read_initiated_) {
- last_operation_ = NONE;
+ if (!async_read_initiated_)
async_in_progress_ = false;
- }
if (orphaned_) {
io_complete_for_read_received_ = true;
@@ -185,7 +180,6 @@ void FileStream::Context::InvokeUserCallback() {
async_read_initiated_ = false;
io_complete_for_read_received_ = false;
async_read_completed_ = false;
- last_operation_ = NONE;
async_in_progress_ = false;
}
scoped_refptr<IOBuffer> temp_buf = in_flight_buf_;
@@ -194,7 +188,6 @@ void FileStream::Context::InvokeUserCallback() {
}
void FileStream::Context::DeleteOrphanedContext() {
- last_operation_ = NONE;
async_in_progress_ = false;
callback_.Reset();
in_flight_buf_ = NULL;
diff --git a/chromium/net/base/filename_util_unittest.cc b/chromium/net/base/filename_util_unittest.cc
index a38c110396d..5b40aeeddcd 100644
--- a/chromium/net/base/filename_util_unittest.cc
+++ b/chromium/net/base/filename_util_unittest.cc
@@ -9,6 +9,8 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/test_file_util.h"
+#include "build/build_config.h"
+#include "net/base/mime_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
@@ -283,507 +285,217 @@ TEST(FilenameUtilTest, FileURLConversion) {
EXPECT_FALSE(FileURLToFilePath(GURL("filefoobar"), &output));
}
-#if defined(OS_WIN)
-#define JPEG_EXT L".jpg"
-#define HTML_EXT L".htm"
-#else
-#define JPEG_EXT L".jpeg"
-#define HTML_EXT L".html"
-#endif
-#define TXT_EXT L".txt"
-#define TAR_EXT L".tar"
-
TEST(FilenameUtilTest, GenerateSafeFileName) {
const struct {
+ int line;
const char* mime_type;
- const base::FilePath::CharType* filename;
- const base::FilePath::CharType* expected_filename;
+ const char* filename;
+ const char* expected_filename;
} safe_tests[] = {
-#if defined(OS_WIN)
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\bar.htm"),
- FILE_PATH_LITERAL("C:\\foo\\bar.htm")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\bar.html"),
- FILE_PATH_LITERAL("C:\\foo\\bar.html")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\bar"),
- FILE_PATH_LITERAL("C:\\foo\\bar.htm")},
- {"image/png",
- FILE_PATH_LITERAL("C:\\bar.html"),
- FILE_PATH_LITERAL("C:\\bar.html")},
- {"image/png",
- FILE_PATH_LITERAL("C:\\bar"),
- FILE_PATH_LITERAL("C:\\bar.png")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
- FILE_PATH_LITERAL("C:\\foo\\bar.exe")},
- {"image/gif",
- FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
- FILE_PATH_LITERAL("C:\\foo\\bar.exe")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\google.com"),
- FILE_PATH_LITERAL("C:\\foo\\google.com")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\con.htm"),
- FILE_PATH_LITERAL("C:\\foo\\_con.htm")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\con"),
- FILE_PATH_LITERAL("C:\\foo\\_con.htm")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\harmless.{not-really-this-may-be-a-guid}"),
- FILE_PATH_LITERAL("C:\\foo\\harmless.download")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\harmless.local"),
- FILE_PATH_LITERAL("C:\\foo\\harmless.download")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\harmless.lnk"),
- FILE_PATH_LITERAL("C:\\foo\\harmless.download")},
- {"text/html",
- FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-"),
- FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-")},
- // Allow extension synonyms.
- {"image/jpeg",
- FILE_PATH_LITERAL("C:\\foo\\bar.jpg"),
- FILE_PATH_LITERAL("C:\\foo\\bar.jpg")},
- {"image/jpeg",
- FILE_PATH_LITERAL("C:\\foo\\bar.jpeg"),
- FILE_PATH_LITERAL("C:\\foo\\bar.jpeg")},
-#else // !defined(OS_WIN)
- {"text/html",
- FILE_PATH_LITERAL("/foo/bar.htm"),
- FILE_PATH_LITERAL("/foo/bar.htm")},
- {"text/html",
- FILE_PATH_LITERAL("/foo/bar.html"),
- FILE_PATH_LITERAL("/foo/bar.html")},
- {"text/html",
- FILE_PATH_LITERAL("/foo/bar"),
- FILE_PATH_LITERAL("/foo/bar.html")},
- {"image/png",
- FILE_PATH_LITERAL("/bar.html"),
- FILE_PATH_LITERAL("/bar.html")},
- {"image/png", FILE_PATH_LITERAL("/bar"), FILE_PATH_LITERAL("/bar.png")},
- {"image/gif",
- FILE_PATH_LITERAL("/foo/bar.exe"),
- FILE_PATH_LITERAL("/foo/bar.exe")},
- {"text/html",
- FILE_PATH_LITERAL("/foo/google.com"),
- FILE_PATH_LITERAL("/foo/google.com")},
- {"text/html",
- FILE_PATH_LITERAL("/foo/con.htm"),
- FILE_PATH_LITERAL("/foo/con.htm")},
- {"text/html",
- FILE_PATH_LITERAL("/foo/con"),
- FILE_PATH_LITERAL("/foo/con.html")},
+ {__LINE__, "text/html", "bar.htm", "bar.htm"},
+ {__LINE__, "text/html", "bar.html", "bar.html"},
+ {__LINE__, "application/x-chrome-extension", "bar", "bar.crx"},
+ {__LINE__, "image/png", "bar.html", "bar.html"},
+ {__LINE__, "text/html", "bar.exe", "bar.exe"},
+ {__LINE__, "image/gif", "bar.exe", "bar.exe"},
+ {__LINE__, "text/html", "google.com", "google.com"},
// Allow extension synonyms.
- {"image/jpeg",
- FILE_PATH_LITERAL("/bar.jpg"),
- FILE_PATH_LITERAL("/bar.jpg")},
- {"image/jpeg",
- FILE_PATH_LITERAL("/bar.jpeg"),
- FILE_PATH_LITERAL("/bar.jpeg")},
+ {__LINE__, "image/jpeg", "bar.jpg", "bar.jpg"},
+ {__LINE__, "image/jpeg", "bar.jpeg", "bar.jpeg"},
+
+#if defined(OS_WIN)
+ // Device names
+ {__LINE__, "text/html", "con.htm", "_con.htm"},
+ {__LINE__, "text/html", "lpt1.htm", "_lpt1.htm"},
+ {__LINE__, "application/x-chrome-extension", "con", "_con.crx"},
+
+ // Looks like foo.{GUID} which get treated as namespace mounts on Windows.
+ {__LINE__, "text/html", "harmless.{not-really-this-may-be-a-guid}",
+ "harmless.download"},
+ {__LINE__, "text/html", "harmless.{mismatched-", "harmless.{mismatched-"},
+
+ // Dangerous extensions
+ {__LINE__, "text/html", "harmless.local", "harmless.download"},
+ {__LINE__, "text/html", "harmless.lnk", "harmless.download"},
+#else // OS_WIN
+ // On Posix, none of the above set is particularly dangerous.
+ {__LINE__, "text/html", "con.htm", "con.htm"},
+ {__LINE__, "text/html", "lpt1.htm", "lpt1.htm"},
+ {__LINE__, "application/x-chrome-extension", "con", "con.crx"},
+ {__LINE__, "text/html", "harmless.{not-really-this-may-be-a-guid}",
+ "harmless.{not-really-this-may-be-a-guid}"},
+ {__LINE__, "text/html", "harmless.{mismatched-", "harmless.{mismatched-"},
+ {__LINE__, "text/html", "harmless.local", "harmless.local"},
+ {__LINE__, "text/html", "harmless.lnk", "harmless.lnk"},
#endif // !defined(OS_WIN)
};
- for (size_t i = 0; i < arraysize(safe_tests); ++i) {
- base::FilePath file_path(safe_tests[i].filename);
- GenerateSafeFileName(safe_tests[i].mime_type, false, &file_path);
- EXPECT_EQ(safe_tests[i].expected_filename, file_path.value())
- << "Iteration " << i;
+#if defined(OS_WIN)
+ base::FilePath base_path(L"C:\\foo");
+#else
+ base::FilePath base_path("/foo");
+#endif
+
+ for (const auto& test : safe_tests) {
+ base::FilePath file_path = base_path.AppendASCII(test.filename);
+ base::FilePath expected_path =
+ base_path.AppendASCII(test.expected_filename);
+ GenerateSafeFileName(test.mime_type, false, &file_path);
+ EXPECT_EQ(expected_path.value(), file_path.value())
+ << "Test case at line " << test.line;
}
}
+TEST(FilenameUtilTest, GenerateFileName_Assumptions) {
+ base::FilePath::StringType extension;
+ EXPECT_TRUE(GetPreferredExtensionForMimeType("application/x-chrome-extension",
+ &extension));
+ EXPECT_EQ(base::FilePath::StringType(FILE_PATH_LITERAL("crx")), extension);
+}
+
TEST(FilenameUtilTest, GenerateFileName) {
// Tests whether the correct filename is selected from the the given
// parameters and that Content-Disposition headers are properly
// handled including failovers when the header is malformed.
const GenerateFilenameCase selection_tests[] = {
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=test.html",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"test.html\"",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename= \"test.html\"",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename = \"test.html\"",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {// filename is whitespace. Should failover to URL host
- __LINE__,
- "http://www.google.com/",
- "attachment; filename= ",
- "",
- "",
- "",
- L"",
- L"www.google.com"},
- {// No filename.
- __LINE__,
- "http://www.google.com/path/test.html",
- "attachment",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {// Ditto
- __LINE__,
- "http://www.google.com/path/test.html",
- "attachment;",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {// No C-D
- __LINE__,
- "http://www.google.com/",
- "",
- "",
- "",
- "",
- L"",
- L"www.google.com"},
- {__LINE__,
- "http://www.google.com/test.html",
- "",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {// Now that we use src/url's ExtractFileName, this case falls back to
- // the hostname. If this behavior is not desirable, we'd better change
- // ExtractFileName (in url_parse.cc).
- __LINE__,
- "http://www.google.com/path/",
- "",
- "",
- "",
- "",
- L"",
- L"www.google.com"},
- {__LINE__, "http://www.google.com/path", "", "", "", "", L"", L"path"},
- {__LINE__, "file:///", "", "", "", "", L"", L"download"},
- {__LINE__, "file:///path/testfile", "", "", "", "", L"", L"testfile"},
- {__LINE__, "non-standard-scheme:", "", "", "", "", L"", L"download"},
- {// C-D should override default
- __LINE__,
- "http://www.google.com/",
- "attachment; filename =\"test.html\"",
- "",
- "",
- "",
- L"download",
- L"test.html"},
- {// But the URL shouldn't
- __LINE__,
- "http://www.google.com/",
- "",
- "",
- "",
- "",
- L"download",
- L"download"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"../test.html\"",
- "",
- "",
- "",
- L"",
- L"_test.html"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"..\\test.html\"",
- "",
- "",
- "",
- L"",
- L"test.html"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"..\\\\test.html\"",
- "",
- "",
- "",
- L"",
- L"_test.html"},
- {// Filename disappears after leading and trailing periods are removed.
- __LINE__,
- "http://www.google.com/",
- "attachment; filename=\"..\"",
- "",
- "",
- "",
- L"default",
- L"default"},
- {// C-D specified filename disappears. Failover to final filename.
- __LINE__,
- "http://www.google.com/test.html",
- "attachment; filename=\"..\"",
- "",
- "",
- "",
- L"default",
- L"default"},
- // Below is a small subset of cases taken from HttpContentDisposition tests.
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"%EC%98%88%EC%88%A0%20"
- "%EC%98%88%EC%88%A0.jpg\"",
- "",
- "",
- "",
- L"",
- L"\uc608\uc220 \uc608\uc220.jpg"},
- {__LINE__,
- "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
- "",
- "",
- "",
- "",
- L"download",
- L"\uc608\uc220 \uc608\uc220.jpg"},
- {__LINE__,
- "http://www.google.com/",
- "attachment;",
- "",
- "",
- "",
- L"\uB2E4\uC6B4\uB85C\uB4DC",
- L"\uB2E4\uC6B4\uB85C\uB4DC"},
- {__LINE__,
- "http://www.google.com/",
- "attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD="
- "D13=2Epng?=\"",
- "",
- "",
- "",
- L"download",
- L"\u82b8\u88533.png"},
- {__LINE__,
- "http://www.example.com/images?id=3",
- "attachment; filename=caf\xc3\xa9.png",
- "iso-8859-1",
- "",
- "",
- L"",
- L"caf\u00e9.png"},
- {__LINE__,
- "http://www.example.com/images?id=3",
- "attachment; filename=caf\xe5.png",
- "windows-1253",
- "",
- "",
- L"",
- L"caf\u03b5.png"},
- {// Invalid C-D header. Name value is skipped now.
- __LINE__,
- "http://www.example.com/file?id=3",
- "attachment; name=\xcf\xc2\xd4\xd8.zip",
- "GBK",
- "",
- "",
- L"",
- L"file"},
- {// Invalid C-D header. Extracts filename from url.
- __LINE__,
- "http://www.google.com/test.html",
- "attachment; filename==?iiso88591?Q?caf=EG?=",
- "",
- "",
- "",
- L"",
- L"test.html"},
- // about: and data: URLs
- {__LINE__, "about:chrome", "", "", "", "", L"", L"download"},
- {__LINE__, "data:,looks/like/a.path", "", "", "", "", L"", L"download"},
- {__LINE__,
- "data:text/plain;base64,VG8gYmUgb3Igbm90IHRvIGJlLg=",
- "",
- "",
- "",
- "",
- L"",
- L"download"},
- {__LINE__,
- "data:,looks/like/a.path",
- "",
- "",
- "",
- "",
- L"default_filename_is_given",
- L"default_filename_is_given"},
- {__LINE__,
- "data:,looks/like/a.path",
- "",
- "",
- "",
- "",
- L"\u65e5\u672c\u8a9e", // Japanese Kanji.
- L"\u65e5\u672c\u8a9e"},
- {// The filename encoding is specified by the referrer charset.
- __LINE__,
- "http://example.com/V%FDvojov%E1%20psychologie.doc",
- "",
- "iso-8859-1",
- "",
- "",
- L"",
- L"V\u00fdvojov\u00e1 psychologie.doc"},
- {// Suggested filename takes precedence over URL
- __LINE__,
- "http://www.google.com/test",
- "",
- "",
- "suggested",
- "",
- L"",
- L"suggested"},
- {// The content-disposition has higher precedence over the suggested name.
- __LINE__,
- "http://www.google.com/test",
- "attachment; filename=test.html",
- "",
- "suggested",
- "",
- L"",
- L"test.html"},
- {__LINE__,
- "http://www.google.com/test",
- "attachment; filename=test",
- "utf-8",
- "",
- "image/png",
- L"",
- L"test"},
-#if 0
- { // The filename encoding doesn't match the referrer charset, the system
- // charset, or UTF-8.
- // TODO(jshin): we need to handle this case.
- __LINE__,
- "http://example.com/V%FDvojov%E1%20psychologie.doc",
- "",
- "utf-8",
- "",
- "",
- L"",
- L"V\u00fdvojov\u00e1 psychologie.doc",
- },
-#endif
- // Raw 8bit characters in C-D
- {__LINE__,
- "http://www.example.com/images?id=3",
- "attachment; filename=caf\xc3\xa9.png",
- "iso-8859-1",
- "",
- "image/png",
- L"",
- L"caf\u00e9.png"},
- {__LINE__,
- "http://www.example.com/images?id=3",
- "attachment; filename=caf\xe5.png",
- "windows-1253",
- "",
- "image/png",
- L"",
- L"caf\u03b5.png"},
- {// No 'filename' keyword in the disposition, use the URL
- __LINE__,
- "http://www.evil.com/my_download.txt",
- "a_file_name.txt",
- "",
- "",
- "text/plain",
- L"download",
- L"my_download.txt"},
- {// Spaces in the disposition file name
- __LINE__,
- "http://www.frontpagehacker.com/a_download.exe",
- "filename=My Downloaded File.exe",
- "",
- "",
- "application/octet-stream",
- L"download",
- L"My Downloaded File.exe"},
- {// % encoded
- __LINE__,
- "http://www.examples.com/",
- "attachment; "
- "filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"",
- "",
- "",
- "image/jpeg",
- L"download",
- L"\uc608\uc220 \uc608\uc220.jpg"},
- {// Invalid C-D header. Name value is skipped now.
- __LINE__,
- "http://www.examples.com/q.cgi?id=abc",
- "attachment; name=abc de.pdf",
- "",
- "",
- "application/octet-stream",
- L"download",
- L"q.cgi"},
- {__LINE__,
- "http://www.example.com/path",
- "filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"",
- "",
- "",
- "image/png",
- L"download",
- L"\x82b8\x8853"
- L"3.png"},
- {// The following two have invalid CD headers and filenames come from the
- // URL.
- __LINE__,
- "http://www.example.com/test%20123",
- "attachment; filename==?iiso88591?Q?caf=EG?=",
- "",
- "",
- "image/jpeg",
- L"download",
- L"test 123" JPEG_EXT},
- {__LINE__,
- "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
- "malformed_disposition",
- "",
- "",
- "image/jpeg",
- L"download",
- L"\uc608\uc220 \uc608\uc220.jpg"},
- {// Invalid C-D. No filename from URL. Falls back to 'download'.
- __LINE__,
- "http://www.google.com/path1/path2/",
- "attachment; filename==?iso88591?Q?caf=E3?",
- "",
- "",
- "image/jpeg",
- L"download",
- L"download" JPEG_EXT},
+ {// Picks the filename from the C-D header.
+ __LINE__, "http://www.google.com/", "attachment; filename=test.html", "",
+ "", "", L"", L"test.html"},
+ {// Ditto. The C-D header uses a quoted string.
+ __LINE__, "http://www.google.com/", "attachment; filename=\"test.html\"",
+ "", "", "", L"", L"test.html"},
+ {// Ditto. Extra whilespace after the '=' sign.
+ __LINE__, "http://www.google.com/",
+ "attachment; filename= \"test.html\"", "", "", "", L"", L"test.html"},
+ {// Ditto. Whitespace before and after '=' sign.
+ __LINE__, "http://www.google.com/",
+ "attachment; filename = \"test.html\"", "", "", "", L"",
+ L"test.html"},
+ {// Filename is whitespace. Should failover to URL host
+ __LINE__, "http://www.google.com/", "attachment; filename= ", "", "",
+ "", L"", L"www.google.com"},
+ {// No filename.
+ __LINE__, "http://www.google.com/path/test.html", "attachment", "", "",
+ "", L"", L"test.html"},
+ {// Ditto
+ __LINE__, "http://www.google.com/path/test.html", "attachment;", "", "",
+ "", L"", L"test.html"},
+ {// No C-D, and no URL path.
+ __LINE__, "http://www.google.com/", "", "", "", "", L"",
+ L"www.google.com"},
+ {// No C-D. URL has a path.
+ __LINE__, "http://www.google.com/test.html", "", "", "", "", L"",
+ L"test.html"},
+ {// No C-D. URL's path ends in a slash which results in an empty final
+ // component.
+ __LINE__, "http://www.google.com/path/", "", "", "", "", L"",
+ L"www.google.com"},
+ {// No C-D. URL has a path, but the path has no extension.
+ __LINE__, "http://www.google.com/path", "", "", "", "", L"", L"path"},
+ {// No C-D. URL gives no filename hints.
+ __LINE__, "file:///", "", "", "", "", L"", L"download"},
+ {// file:// URL.
+ __LINE__, "file:///path/testfile", "", "", "", "", L"", L"testfile"},
+ {// Unknown scheme.
+ __LINE__, "non-standard-scheme:", "", "", "", "", L"", L"download"},
+ {// C-D overrides default
+ __LINE__, "http://www.google.com/",
+ "attachment; filename =\"test.html\"", "", "", "", L"download",
+ L"test.html"},
+ {// But the URL doesn't
+ __LINE__, "http://www.google.com/", "", "", "", "", L"download",
+ L"download"},
+ // Below is a small subset of cases taken from HttpContentDisposition
+ // tests.
+ {__LINE__, "http://www.google.com/",
+ "attachment; filename=\"%EC%98%88%EC%88%A0%20"
+ "%EC%98%88%EC%88%A0.jpg\"",
+ "", "", "", L"", L"\uc608\uc220 \uc608\uc220.jpg"},
+ {__LINE__,
+ "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", "",
+ "", "", "", L"download", L"\uc608\uc220 \uc608\uc220.jpg"},
+ {__LINE__, "http://www.google.com/", "attachment;", "", "", "",
+ L"\uB2E4\uC6B4\uB85C\uB4DC", L"\uB2E4\uC6B4\uB85C\uB4DC"},
+ {__LINE__, "http://www.google.com/",
+ "attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD="
+ "D13=2Epng?=\"",
+ "", "", "", L"download", L"\u82b8\u88533.png"},
+ {__LINE__, "http://www.example.com/images?id=3",
+ "attachment; filename=caf\xc3\xa9.png", "iso-8859-1", "", "", L"",
+ L"caf\u00e9.png"},
+ {__LINE__, "http://www.example.com/images?id=3",
+ "attachment; filename=caf\xe5.png", "windows-1253", "", "", L"",
+ L"caf\u03b5.png"},
+ {// Invalid C-D header. Name value is skipped now.
+ __LINE__, "http://www.example.com/file?id=3",
+ "attachment; name=\xcf\xc2\xd4\xd8.zip", "GBK", "", "", L"", L"file"},
+ {// Invalid C-D header. Extracts filename from url.
+ __LINE__, "http://www.google.com/test.html",
+ "attachment; filename==?iiso88591?Q?caf=EG?=", "", "", "", L"",
+ L"test.html"},
+ // about: and data: URLs
+ {__LINE__, "about:chrome", "", "", "", "", L"", L"download"},
+ {__LINE__, "data:,looks/like/a.path", "", "", "", "", L"", L"download"},
+ {__LINE__, "data:text/plain;base64,VG8gYmUgb3Igbm90IHRvIGJlLg=", "", "",
+ "", "", L"", L"download"},
+ {__LINE__, "data:,looks/like/a.path", "", "", "", "",
+ L"default_filename_is_given", L"default_filename_is_given"},
+ {__LINE__, "data:,looks/like/a.path", "", "", "", "",
+ L"\u65e5\u672c\u8a9e", // Japanese Kanji.
+ L"\u65e5\u672c\u8a9e"},
+ {// The filename encoding is specified by the referrer charset.
+ __LINE__, "http://example.com/V%FDvojov%E1%20psychologie.doc", "",
+ "iso-8859-1", "", "", L"", L"V\u00fdvojov\u00e1 psychologie.doc"},
+ {// Suggested filename takes precedence over URL
+ __LINE__, "http://www.google.com/test", "", "", "suggested", "", L"",
+ L"suggested"},
+ {// The content-disposition has higher precedence over the suggested name.
+ __LINE__, "http://www.google.com/test", "attachment; filename=test.html",
+ "", "suggested", "", L"", L"test.html"},
+ {__LINE__, "http://www.google.com/test", "attachment; filename=test",
+ "utf-8", "", "image/png", L"", L"test"},
+ // Raw 8bit characters in C-D
+ {__LINE__, "http://www.example.com/images?id=3",
+ "attachment; filename=caf\xc3\xa9.png", "iso-8859-1", "", "image/png",
+ L"", L"caf\u00e9.png"},
+ {__LINE__, "http://www.example.com/images?id=3",
+ "attachment; filename=caf\xe5.png", "windows-1253", "", "image/png", L"",
+ L"caf\u03b5.png"},
+ {// No 'filename' keyword in the disposition, use the URL
+ __LINE__, "http://www.evil.com/my_download.txt", "a_file_name.txt", "",
+ "", "text/plain", L"download", L"my_download.txt"},
+ {// Spaces in the disposition file name
+ __LINE__, "http://www.frontpagehacker.com/a_download.exe",
+ "filename=My Downloaded File.exe", "", "", "application/octet-stream",
+ L"download", L"My Downloaded File.exe"},
+ {// % encoded
+ __LINE__, "http://www.examples.com/",
+ "attachment; "
+ "filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"",
+ "", "", "application/x-chrome-extension", L"download",
+ L"\uc608\uc220 \uc608\uc220.jpg"},
+ {// Invalid C-D header. Name value is skipped now.
+ __LINE__, "http://www.examples.com/q.cgi?id=abc",
+ "attachment; name=abc de.pdf", "", "", "application/octet-stream",
+ L"download", L"q.cgi"},
+ {__LINE__, "http://www.example.com/path",
+ "filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"", "", "", "image/png",
+ L"download",
+ L"\x82b8\x8853"
+ L"3.png"},
+ {// The following two have invalid CD headers and filenames come from the
+ // URL.
+ __LINE__, "http://www.example.com/test%20123",
+ "attachment; filename==?iiso88591?Q?caf=EG?=", "", "", "", L"download",
+ L"test 123"},
+ {__LINE__,
+ "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
+ "malformed_disposition", "", "", "", L"download",
+ L"\uc608\uc220 \uc608\uc220.jpg"},
+ {// Invalid C-D. No filename from URL. Falls back to 'download'.
+ __LINE__, "http://www.google.com/path1/path2/",
+ "attachment; filename==?iso88591?Q?caf=E3?", "", "", "", L"download",
+ L"download"},
};
// Tests filename generation. Once the correct filename is
@@ -796,148 +508,92 @@ TEST(FilenameUtilTest, GenerateFileName) {
{__LINE__, "http://www.google.com/.test", "", "", "", "", L"", L"test"},
{__LINE__, "http://www.google.com/..test", "", "", "", "", L"", L"test"},
{// Disposition has relative paths, remove directory separators
- __LINE__, "http://www.evil.com/my_download.txt",
- "filename=../../../../././../a_file_name.txt", "", "", "text/plain",
- L"download", L"_.._.._.._._._.._a_file_name.txt"},
+ __LINE__, "", "filename=../../../../././../a_file_name.txt", "", "",
+ "text/plain", L"download", L"_.._.._.._._._.._a_file_name.txt"},
{// Disposition has parent directories, remove directory separators
- __LINE__, "http://www.evil.com/my_download.txt",
- "filename=dir1/dir2/a_file_name.txt", "", "", "text/plain", L"download",
- L"dir1_dir2_a_file_name.txt"},
+ __LINE__, "", "filename=dir1/dir2/a_file_name.txt", "", "", "text/plain",
+ L"download", L"dir1_dir2_a_file_name.txt"},
{// Disposition has relative paths, remove directory separators
- __LINE__, "http://www.evil.com/my_download.txt",
- "filename=..\\..\\..\\..\\.\\.\\..\\a_file_name.txt", "", "", "text/plain",
- L"download", L"_.._.._.._._._.._a_file_name.txt"},
+ __LINE__, "", "filename=..\\..\\..\\..\\.\\.\\..\\a_file_name.txt", "", "",
+ "text/plain", L"download", L"_.._.._.._._._.._a_file_name.txt"},
{// Disposition has parent directories, remove directory separators
- __LINE__, "http://www.evil.com/my_download.txt",
- "filename=dir1\\dir2\\a_file_name.txt", "", "", "text/plain", L"download",
- L"dir1_dir2_a_file_name.txt"},
- {// No useful information in disposition or URL, use default
- __LINE__, "http://www.truncated.com/path/", "", "", "", "text/plain",
- L"download", L"download" TXT_EXT},
+ __LINE__, "", "filename=dir1\\dir2\\a_file_name.txt", "", "", "text/plain",
+ L"download", L"dir1_dir2_a_file_name.txt"},
{// Filename looks like HTML?
- __LINE__, "http://www.evil.com/get/malware/here",
- "filename=\"<blink>Hello kitty</blink>\"", "", "", "text/plain",
- L"default", L"_blink_Hello kitty__blink_"},
+ __LINE__, "", "filename=\"<blink>Hello kitty</blink>\"", "", "",
+ "text/plain", L"default", L"_blink_Hello kitty__blink_"},
{// A normal avi should get .avi and not .avi.avi
- __LINE__, "https://blah.google.com/misc/2.avi", "", "", "",
- "video/x-msvideo", L"download", L"2.avi"},
+ __LINE__, "https://example.com/misc/2.avi", "", "", "", "video/x-msvideo",
+ L"download", L"2.avi"},
{// Shouldn't unescape slashes.
- __LINE__, "http://www.example.com/foo%2f..%2fbar.jpg", "", "", "",
+ __LINE__, "http://example.com/foo%2f..%2fbar.jpg", "", "", "",
"text/plain", L"download", L"foo%2f..%2fbar.jpg"},
- {// Extension generation
- __LINE__, "http://www.example.com/my-cat", "filename=my-cat", "", "",
- "image/jpeg", L"download", L"my-cat"},
- {__LINE__, "http://www.example.com/my-cat", "filename=my-cat", "", "",
- "text/plain", L"download", L"my-cat"},
- {__LINE__, "http://www.example.com/my-cat", "filename=my-cat", "", "",
- "text/html", L"download", L"my-cat"},
+ {// Extension generation for C-D derived filenames.
+ __LINE__, "", "filename=my-cat", "", "", "image/jpeg", L"download",
+ L"my-cat"},
{// Unknown MIME type
- __LINE__, "http://www.example.com/my-cat", "filename=my-cat", "", "",
- "dance/party", L"download", L"my-cat"},
- {__LINE__, "http://www.example.com/my-cat.jpg", "filename=my-cat.jpg", "",
- "", "text/plain", L"download", L"my-cat.jpg"},
-// Windows specific tests
-#if defined(OS_WIN)
- {__LINE__, "http://www.goodguy.com/evil.exe", "filename=evil.exe", "", "",
- "image/jpeg", L"download", L"evil.exe"},
- {__LINE__, "http://www.goodguy.com/ok.exe", "filename=ok.exe", "", "",
- "binary/octet-stream", L"download", L"ok.exe"},
- {__LINE__, "http://www.goodguy.com/evil.dll", "filename=evil.dll", "", "",
- "dance/party", L"download", L"evil.dll"},
- {__LINE__, "http://www.goodguy.com/evil.exe", "filename=evil", "", "",
- "application/rss+xml", L"download", L"evil"},
- // Test truncation of trailing dots and spaces
- {__LINE__, "http://www.goodguy.com/evil.exe ", "filename=evil.exe ", "", "",
- "binary/octet-stream", L"download", L"evil.exe"},
- {__LINE__, "http://www.goodguy.com/evil.exe.", "filename=evil.exe.", "", "",
- "binary/octet-stream", L"download", L"evil.exe_"},
- {__LINE__, "http://www.goodguy.com/evil.exe. . .",
- "filename=evil.exe. . .", "", "", "binary/octet-stream", L"download",
- L"evil.exe_______"},
- {__LINE__, "http://www.goodguy.com/evil.", "filename=evil.", "", "",
- "binary/octet-stream", L"download", L"evil_"},
- {__LINE__, "http://www.goodguy.com/. . . . .", "filename=. . . . .", "", "",
- "binary/octet-stream", L"download", L"download"},
- {__LINE__, "http://www.badguy.com/attachment?name=meh.exe%C2%A0",
- "attachment; filename=\"meh.exe\xC2\xA0\"", "", "", "binary/octet-stream",
- L"", L"meh.exe_"},
-#endif // OS_WIN
- {__LINE__, "http://www.goodguy.com/utils.js", "filename=utils.js", "", "",
- "application/x-javascript", L"download", L"utils.js"},
- {__LINE__, "http://www.goodguy.com/contacts.js", "filename=contacts.js", "",
- "", "application/json", L"download", L"contacts.js"},
- {__LINE__, "http://www.goodguy.com/utils.js", "filename=utils.js", "", "",
- "text/javascript", L"download", L"utils.js"},
- {__LINE__, "http://www.goodguy.com/utils.js", "filename=utils.js", "", "",
- "text/javascript;version=2", L"download", L"utils.js"},
- {__LINE__, "http://www.goodguy.com/utils.js", "filename=utils.js", "", "",
- "application/ecmascript", L"download", L"utils.js"},
- {__LINE__, "http://www.goodguy.com/utils.js", "filename=utils.js", "", "",
- "application/ecmascript;version=4", L"download", L"utils.js"},
- {__LINE__, "http://www.goodguy.com/program.exe", "filename=program.exe", "",
- "", "application/foo-bar", L"download", L"program.exe"},
- {__LINE__, "http://www.evil.com/../foo.txt", "filename=../foo.txt", "", "",
- "text/plain", L"download", L"_foo.txt"},
- {__LINE__, "http://www.evil.com/..\\foo.txt", "filename=..\\foo.txt", "",
- "", "text/plain", L"download", L"_foo.txt"},
- {__LINE__, "http://www.evil.com/.hidden", "filename=.hidden", "", "",
- "text/plain", L"download", L"hidden"},
- {__LINE__, "http://www.evil.com/trailing.", "filename=trailing.", "", "",
- "dance/party", L"download",
-#if defined(OS_WIN)
- L"trailing_"
-#else
- L"trailing"
-#endif
- },
- {__LINE__, "http://www.evil.com/trailing.", "filename=trailing.", "", "",
- "text/plain", L"download",
+ __LINE__, "", "filename=my-cat", "", "", "dance/party", L"download",
+ L"my-cat"},
+ {// Known MIME type.
+ __LINE__, "", "filename=my-cat.jpg", "", "", "text/plain", L"download",
+ L"my-cat.jpg"},
#if defined(OS_WIN)
- L"trailing_"
-#else
- L"trailing"
-#endif
- },
- {__LINE__, "http://www.evil.com/.", "filename=.", "", "", "dance/party",
- L"download", L"download"},
- {__LINE__, "http://www.evil.com/..", "filename=..", "", "", "dance/party",
- L"download", L"download"},
- {__LINE__, "http://www.evil.com/...", "filename=...", "", "", "dance/party",
+ // Test truncation of trailing dots and spaces (Windows)
+ {__LINE__, "", "filename=evil.exe ", "", "", "binary/octet-stream",
+ L"download", L"evil.exe"},
+ {__LINE__, "", "filename=evil.exe.", "", "", "binary/octet-stream",
+ L"download", L"evil.exe_"},
+ {__LINE__, "", "filename=evil.exe. . .", "", "", "binary/octet-stream",
+ L"download", L"evil.exe_______"},
+ {__LINE__, "", "filename=evil.", "", "", "binary/octet-stream", L"download",
+ L"evil_"},
+ {__LINE__, "", "filename=. . . . .", "", "", "binary/octet-stream",
L"download", L"download"},
- {// Note that this one doesn't have "filename=" on it.
- __LINE__, "http://www.evil.com/", "a_file_name.txt", "", "", "image/jpeg",
- L"download", L"download" JPEG_EXT},
- {__LINE__, "http://www.evil.com/", "filename=", "", "", "image/jpeg",
- L"download", L"download" JPEG_EXT},
- {__LINE__, "http://www.example.com/simple", "filename=simple", "", "",
- "application/octet-stream", L"download", L"simple"},
+#else // OS_WIN
+ // Test truncation of trailing dots and spaces (non-Windows)
+ {__LINE__, "", "filename=evil.exe ", "", "", "binary/octet-stream",
+ L"download", L"evil.exe"},
+ {__LINE__, "", "filename=evil.exe.", "", "", "binary/octet-stream",
+ L"download", L"evil.exe"},
+ {__LINE__, "", "filename=evil.exe. . .", "", "", "binary/octet-stream",
+ L"download", L"evil.exe. . _"},
+ {__LINE__, "", "filename=evil.", "", "", "binary/octet-stream", L"download",
+ L"evil"},
+ {__LINE__, "", "filename=. . . . .", "", "", "binary/octet-stream",
+ L"download", L"_. . ._"},
+#endif
+ {__LINE__, "", "attachment; filename=\"meh.exe\xC2\xA0\"", "", "",
+ "binary/octet-stream", L"", L"meh.exe_"},
+ // Disappearing directory references:
+ {__LINE__, "", "filename=.", "", "", "dance/party", L"download",
+ L"download"},
+ {__LINE__, "", "filename=..", "", "", "dance/party", L"download",
+ L"download"},
+ {__LINE__, "", "filename=...", "", "", "dance/party", L"download",
+ L"download"},
// Reserved words on Windows
- {__LINE__, "http://www.goodguy.com/COM1", "filename=COM1", "", "",
- "application/foo-bar", L"download",
+ {__LINE__, "", "filename=COM1", "", "", "application/foo-bar", L"download",
#if defined(OS_WIN)
L"_COM1"
#else
L"COM1"
#endif
},
- {__LINE__, "http://www.goodguy.com/COM4.txt", "filename=COM4.txt", "", "",
- "text/plain", L"download",
+ {__LINE__, "", "filename=COM4.txt", "", "", "text/plain", L"download",
#if defined(OS_WIN)
L"_COM4.txt"
#else
L"COM4.txt"
#endif
},
- {__LINE__, "http://www.goodguy.com/lpt1.TXT", "filename=lpt1.TXT", "", "",
- "text/plain", L"download",
+ {__LINE__, "", "filename=lpt1.TXT", "", "", "text/plain", L"download",
#if defined(OS_WIN)
L"_lpt1.TXT"
#else
L"lpt1.TXT"
#endif
},
- {__LINE__, "http://www.goodguy.com/clock$.txt", "filename=clock$.txt", "",
- "", "text/plain", L"download",
+ {__LINE__, "", "filename=clock$.txt", "", "", "text/plain", L"download",
#if defined(OS_WIN)
L"_clock$.txt"
#else
@@ -945,59 +601,53 @@ TEST(FilenameUtilTest, GenerateFileName) {
#endif
},
{// Validation should also apply to sugested name
- __LINE__, "http://www.goodguy.com/blah$.txt", "filename=clock$.txt", "",
- "clock$.txt", "text/plain", L"download",
+ __LINE__, "", "", "", "clock$.txt", "text/plain", L"download",
#if defined(OS_WIN)
L"_clock$.txt"
#else
L"clock$.txt"
#endif
},
- {__LINE__, "http://www.goodguy.com/mycom1.foo", "filename=mycom1.foo", "",
- "", "text/plain", L"download", L"mycom1.foo"},
- {__LINE__, "http://www.badguy.com/Setup.exe.local",
- "filename=Setup.exe.local", "", "", "application/foo-bar", L"download",
+ {// Device names only work when present at the start of the string.
+ __LINE__, "", "filename=mycom1.foo", "", "", "", L"download",
+ L"mycom1.foo"},
+ {__LINE__, "", "filename=Setup.exe.local", "", "", "", L"download",
#if defined(OS_WIN)
L"Setup.exe.download"
#else
L"Setup.exe.local"
#endif
},
- {__LINE__, "http://www.badguy.com/Setup.exe.local",
- "filename=Setup.exe.local.local", "", "", "application/foo-bar",
- L"download",
+ {__LINE__, "", "filename=Setup.exe.local.local", "", "", "", L"download",
#if defined(OS_WIN)
L"Setup.exe.local.download"
#else
L"Setup.exe.local.local"
#endif
},
- {__LINE__, "http://www.badguy.com/Setup.exe.lnk", "filename=Setup.exe.lnk",
- "", "", "application/foo-bar", L"download",
+ {__LINE__, "", "filename=Setup.exe.lnk", "", "", "", L"download",
#if defined(OS_WIN)
L"Setup.exe.download"
#else
L"Setup.exe.lnk"
#endif
},
- {__LINE__, "http://www.badguy.com/Desktop.ini", "filename=Desktop.ini", "",
- "", "application/foo-bar", L"download",
+ {__LINE__, "", "filename=Desktop.ini", "", "", "", L"download",
#if defined(OS_WIN)
L"_Desktop.ini"
#else
L"Desktop.ini"
#endif
},
- {__LINE__, "http://www.badguy.com/Thumbs.db", "filename=Thumbs.db", "", "",
- "application/foo-bar", L"download",
+ {__LINE__, "", "filename=Thumbs.db", "", "", "", L"download",
#if defined(OS_WIN)
L"_Thumbs.db"
#else
L"Thumbs.db"
#endif
},
- {__LINE__, "http://www.hotmail.com", "filename=source.jpg", "", "",
- "application/x-javascript", L"download", L"source.jpg"},
+
+ // Regression tests for older issues:
{// http://crbug.com/5772.
__LINE__, "http://www.example.com/foo.tar.gz", "", "", "",
"application/x-tar", L"download", L"foo.tar.gz"},
@@ -1019,13 +669,13 @@ TEST(FilenameUtilTest, GenerateFileName) {
L"download", L"bar.sh"},
{// http://crbug.com/61571
__LINE__, "http://www.example.com/npdf.php?fn=foobar.pdf", "", "", "",
- "text/plain", L"download", L"npdf" TXT_EXT},
+ "application/x-chrome-extension", L"download", L"npdf.crx"},
{// Shouldn't overwrite C-D specified extension.
__LINE__, "http://www.example.com/npdf.php?fn=foobar.pdf",
"filename=foobar.jpg", "", "", "text/plain", L"download", L"foobar.jpg"},
{// http://crbug.com/87719
__LINE__, "http://www.example.com/image.aspx?id=blargh", "", "", "",
- "image/jpeg", L"download", L"image" JPEG_EXT},
+ "application/x-chrome-extension", L"download", L"image.crx"},
{__LINE__, "http://www.example.com/image.aspx?id=blargh", "", "", " .foo",
"", L"download", L"_.foo"},
diff --git a/chromium/net/base/ip_address.cc b/chromium/net/base/ip_address.cc
index 544320617ce..84578bcba3b 100644
--- a/chromium/net/base/ip_address.cc
+++ b/chromium/net/base/ip_address.cc
@@ -47,14 +47,14 @@ bool IPAddressPrefixCheck(const IPAddressBytes& ip_address,
return true;
}
-// Returns true if |ip_address| matches any of the reserved IPv4 ranges. This
+// Returns false if |ip_address| matches any of the reserved IPv4 ranges. This
// method operates on a blacklist of reserved IPv4 ranges. Some ranges are
// consolidated.
// Sources for info:
// www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml
// www.iana.org/assignments/iana-ipv4-special-registry/
// iana-ipv4-special-registry.xhtml
-bool IsReservedIPv4(const IPAddressBytes& ip_address) {
+bool IsPubliclyRoutableIPv4(const IPAddressBytes& ip_address) {
// Different IP versions have different range reservations.
DCHECK_EQ(IPAddress::kIPv4AddressSize, ip_address.size());
struct {
@@ -70,39 +70,46 @@ bool IsReservedIPv4(const IPAddressBytes& ip_address) {
for (const auto& range : kReservedIPv4Ranges) {
if (IPAddressPrefixCheck(ip_address, range.address,
range.prefix_length_in_bits)) {
- return true;
+ return false;
}
}
- return false;
+ return true;
}
-// Returns true if |ip_address| matches any of the reserved IPv6 ranges. This
-// method operates on a whitelist of non-reserved IPv6 ranges. All IPv6
-// addresses outside these ranges are reserved.
+// Returns false if |ip_address| matches any of the IPv6 ranges IANA reserved
+// for local networks. This method operates on a whitelist of non-reserved
+// IPv6 ranges, plus the blacklist of reserved IPv4 ranges mapped to IPv6.
// Sources for info:
// www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
-bool IsReservedIPv6(const IPAddressBytes& ip_address) {
- // Different IP versions have different range reservations.
+bool IsPubliclyRoutableIPv6(const IPAddressBytes& ip_address,
+ bool include_mapped_ipv4) {
DCHECK_EQ(IPAddress::kIPv6AddressSize, ip_address.size());
struct {
const uint8_t address_prefix[2];
size_t prefix_length_in_bits;
- } static const kPublicIPv6Ranges[] = {
- // 2000::/3 -- Global Unicast
- {{0x20, 0}, 3},
- // ff00::/8 -- Multicast
- {{0xff, 0}, 8},
- };
+ } static const kPublicIPv6Ranges[] = {// 2000::/3 -- Global Unicast
+ {{0x20, 0}, 3},
+ // ff00::/8 -- Multicast
+ {{0xff, 0}, 8}};
for (const auto& range : kPublicIPv6Ranges) {
if (IPAddressPrefixCheck(ip_address, range.address_prefix,
range.prefix_length_in_bits)) {
- return false;
+ return true;
}
}
- return true;
+ if (!include_mapped_ipv4)
+ return false;
+
+ IPAddress addr(ip_address);
+ if (addr.IsIPv4MappedIPv6()) {
+ IPAddress ipv4 = ConvertIPv4MappedIPv6ToIPv4(addr);
+ return IsPubliclyRoutableIPv4(ipv4.bytes());
+ }
+
+ return false;
}
bool ParseIPLiteralToBytes(const base::StringPiece& ip_literal,
@@ -229,13 +236,23 @@ bool IPAddress::IsValid() const {
bool IPAddress::IsReserved() const {
if (IsIPv4()) {
- return IsReservedIPv4(ip_address_);
+ return !IsPubliclyRoutableIPv4(ip_address_);
} else if (IsIPv6()) {
- return IsReservedIPv6(ip_address_);
+ return !IsPubliclyRoutableIPv6(ip_address_,
+ false /* include_mapped_ipv4 */);
}
return false;
}
+bool IPAddress::IsPubliclyRoutable() const {
+ if (IsIPv4()) {
+ return IsPubliclyRoutableIPv4(ip_address_);
+ } else if (IsIPv6()) {
+ return IsPubliclyRoutableIPv6(ip_address_, true /* include_mapped_ipv4 */);
+ }
+ return true;
+}
+
bool IPAddress::IsZero() const {
for (auto x : ip_address_) {
if (x != 0)
@@ -250,15 +267,10 @@ bool IPAddress::IsIPv4MappedIPv6() const {
}
bool IPAddress::AssignFromIPLiteral(const base::StringPiece& ip_literal) {
- IPAddressBytes number;
-
- // TODO(rch): change the contract so ip_address_ is cleared on failure,
- // to avoid needing this temporary at all.
- if (!ParseIPLiteralToBytes(ip_literal, &number))
- return false;
-
- ip_address_ = number;
- return true;
+ bool success = ParseIPLiteralToBytes(ip_literal, &ip_address_);
+ if (!success)
+ ip_address_.Resize(0);
+ return success;
}
std::vector<uint8_t> IPAddress::CopyBytesToVector() const {
diff --git a/chromium/net/base/ip_address.h b/chromium/net/base/ip_address.h
index 72f9d75c210..32ac195d839 100644
--- a/chromium/net/base/ip_address.h
+++ b/chromium/net/base/ip_address.h
@@ -155,8 +155,14 @@ class NET_EXPORT IPAddress {
// Returns true if the IP is in a range reserved by the IANA.
// Works with both IPv4 and IPv6 addresses, and only compares against a given
// protocols's reserved ranges.
+ // DEPRECATED. Use !IsPubliclyRoutable(). https://crbug.com/755418
bool IsReserved() const;
+ // Returns true if the IP is not in a range reserved by the IANA for
+ // local networks. Works with both IPv4 and IPv6 addresses.
+ // IPv4-mapped-to-IPv6 addresses are considered publicly routable.
+ bool IsPubliclyRoutable() const;
+
// Returns true if the IP is "zero" (e.g. the 0.0.0.0 IPv4 address).
bool IsZero() const;
@@ -176,6 +182,9 @@ class NET_EXPORT IPAddress {
// Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
// Returns true on success and fills |ip_address_| with the numeric value.
+ //
+ // When parsing fails, the original value of |this| will be overwritten such
+ // that |this->empty()| and |!this->IsValid()|.
bool AssignFromIPLiteral(const base::StringPiece& ip_literal)
WARN_UNUSED_RESULT;
@@ -248,7 +257,8 @@ NET_EXPORT bool IPAddressMatchesPrefix(const IPAddress& ip_address,
// Parses an IP block specifier from CIDR notation to an
// (IP address, prefix length) pair. Returns true on success and fills
// |*ip_address| with the numeric value of the IP address and sets
-// |*prefix_length_in_bits| with the length of the prefix.
+// |*prefix_length_in_bits| with the length of the prefix. On failure,
+// |ip_address| will be cleared to an empty value.
//
// CIDR notation literals can use either IPv4 or IPv6 literals. Some examples:
//
@@ -262,7 +272,8 @@ NET_EXPORT bool ParseCIDRBlock(const std::string& cidr_literal,
// Parses a URL-safe IP literal (see RFC 3986, Sec 3.2.2) to its numeric value.
// Returns true on success, and fills |ip_address| with the numeric value.
// In other words, |hostname| must be an IPv4 literal, or an IPv6 literal
-// surrounded by brackets as in [::1].
+// surrounded by brackets as in [::1]. On failure |ip_address| may have been
+// overwritten and could contain an invalid IPAddress.
NET_EXPORT bool ParseURLHostnameToAddress(const base::StringPiece& hostname,
IPAddress* ip_address)
WARN_UNUSED_RESULT;
diff --git a/chromium/net/base/ip_address_unittest.cc b/chromium/net/base/ip_address_unittest.cc
index d8acf86b106..948e43e40df 100644
--- a/chromium/net/base/ip_address_unittest.cc
+++ b/chromium/net/base/ip_address_unittest.cc
@@ -107,7 +107,7 @@ enum IPAddressReservedResult : bool { NOT_RESERVED = false, RESERVED = true };
// Tests for the reserved IPv4 ranges and the (unreserved) blocks in between.
// The reserved ranges are tested by checking the first and last address of each
// range. The unreserved blocks are tested similarly. These tests cover the
-// entire IPv4 address range.
+// entire IPv4 address range, as well as this range mapped to IPv6.
TEST(IPAddressTest, IsReservedIPv4) {
struct {
const char* const address;
@@ -213,10 +213,18 @@ TEST(IPAddressTest, IsReservedIPv4) {
{"255.255.255.255", RESERVED}};
IPAddress address;
+ IPAddress mapped_address;
for (const auto& test : tests) {
EXPECT_TRUE(address.AssignFromIPLiteral(test.address));
ASSERT_TRUE(address.IsValid());
EXPECT_EQ(!!test.is_reserved, address.IsReserved());
+ EXPECT_EQ(!test.is_reserved, address.IsPubliclyRoutable());
+
+ // Check these IPv4 addresses when mapped to IPv6. This verifies we're
+ // properly unpacking mapped addresses.
+ IPAddress mapped_address = ConvertIPv4ToIPv4MappedIPv6(address);
+ EXPECT_TRUE(mapped_address.IsReserved());
+ EXPECT_EQ(!test.is_reserved, mapped_address.IsPubliclyRoutable());
}
}
@@ -228,7 +236,9 @@ TEST(IPAddressTest, IsReservedIPv6) {
struct {
const char* const address;
IPAddressReservedResult is_reserved;
- } tests[] = {// 0000::/8
+ } tests[] = {// 0000::/8.
+ // Skip testing ::ffff:/96 explicitly since it was tested
+ // in IsReservedIPv4
{"0:0:0:0:0:0:0:0", RESERVED},
{"ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
// 0100::/8
@@ -290,6 +300,7 @@ TEST(IPAddressTest, IsReservedIPv6) {
for (const auto& test : tests) {
EXPECT_TRUE(address.AssignFromIPLiteral(test.address));
EXPECT_EQ(!!test.is_reserved, address.IsReserved());
+ EXPECT_EQ(!test.is_reserved, address.IsPubliclyRoutable());
}
}
@@ -395,6 +406,20 @@ TEST(IPAddressTest, AssignFromIPLiteral_FailParse) {
EXPECT_FALSE(address.AssignFromIPLiteral("[::1]"));
}
+// Test that a failure calling AssignFromIPLiteral() has the sideffect of
+// clearing the current value.
+TEST(IPAddressTest, AssignFromIPLiteral_ResetOnFailure) {
+ IPAddress address = IPAddress::IPv6Localhost();
+
+ EXPECT_TRUE(address.IsValid());
+ EXPECT_FALSE(address.empty());
+
+ EXPECT_FALSE(address.AssignFromIPLiteral("bad value"));
+
+ EXPECT_FALSE(address.IsValid());
+ EXPECT_TRUE(address.empty());
+}
+
// Test parsing an IPv4 literal.
TEST(IPAddressTest, AssignFromIPLiteral_IPv4) {
IPAddress address;
diff --git a/chromium/net/base/load_flags_list.h b/chromium/net/base/load_flags_list.h
index 76ff4fecac5..a342d761580 100644
--- a/chromium/net/base/load_flags_list.h
+++ b/chromium/net/base/load_flags_list.h
@@ -2,6 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// This file intentionally does not have header guards, it's included
+// inside a macro to generate values. The following line silences a
+// presubmit warning that would otherwise be triggered by this:
+// no-include-guard-because-multiply-included
+
// This is the list of load flags and their values. For the enum values,
// include the file "net/base/load_flags.h".
//
@@ -11,10 +16,13 @@
LOAD_FLAG(NORMAL, 0)
-// This is "normal reload", meaning an if-none-match/if-modified-since query
+// This is "normal reload", meaning an if-none-match/if-modified-since query. It
+// has no effect on the host cache.
LOAD_FLAG(VALIDATE_CACHE, 1 << 0)
-// This is "shift-reload", meaning a "pragma: no-cache" end-to-end fetch
+// This is "shift-reload", meaning a "pragma: no-cache" end-to-end fetch. It
+// also disables use of the host cache for resolutions that go through the
+// socket pools.
LOAD_FLAG(BYPASS_CACHE, 1 << 1)
// This is a back/forward style navigation where the cached content should
@@ -26,7 +34,7 @@ LOAD_FLAG(SKIP_CACHE_VALIDATION, 1 << 2)
LOAD_FLAG(ONLY_FROM_CACHE, 1 << 3)
// This is a navigation that will not use the cache at all. It does not
-// impact the HTTP request headers.
+// impact the HTTP request headers or use of the host cache.
LOAD_FLAG(DISABLE_CACHE, 1 << 4)
// If present, causes certificate revocation checks to be skipped on secure
@@ -41,18 +49,15 @@ LOAD_FLAG(DO_NOT_SAVE_COOKIES, 1 << 6)
// to avoid having a circular dependency.
LOAD_FLAG(BYPASS_PROXY, 1 << 7)
-// Requires EV certificate verification.
-LOAD_FLAG(VERIFY_EV_CERT, 1 << 8)
-
// This load will not send any cookies.
-LOAD_FLAG(DO_NOT_SEND_COOKIES, 1 << 9)
+LOAD_FLAG(DO_NOT_SEND_COOKIES, 1 << 8)
// This load will not send authentication data (user name/password)
// to the server (as opposed to the proxy).
-LOAD_FLAG(DO_NOT_SEND_AUTH_DATA, 1 << 10)
+LOAD_FLAG(DO_NOT_SEND_AUTH_DATA, 1 << 9)
// This should only be used for testing (set by HttpNetworkTransaction).
-LOAD_FLAG(IGNORE_ALL_CERT_ERRORS, 1 << 11)
+LOAD_FLAG(IGNORE_ALL_CERT_ERRORS, 1 << 10)
// DO NOT USE THIS FLAG
// The network stack should not have frame level knowledge. Any pre-connect
@@ -61,29 +66,29 @@ LOAD_FLAG(IGNORE_ALL_CERT_ERRORS, 1 << 11)
// Indicate that this is a top level frame, so that we don't assume it is a
// subresource and speculatively pre-connect or pre-resolve when a referring
// page is loaded.
-LOAD_FLAG(MAIN_FRAME_DEPRECATED, 1 << 12)
+LOAD_FLAG(MAIN_FRAME_DEPRECATED, 1 << 11)
// Indicates that this load was motivated by the rel=prefetch feature,
// and is (in theory) not intended for the current frame.
-LOAD_FLAG(PREFETCH, 1 << 13)
+LOAD_FLAG(PREFETCH, 1 << 12)
// Indicates that this load could cause deadlock if it has to wait for another
// request. Overrides socket limits. Must always be used with MAXIMUM_PRIORITY.
-LOAD_FLAG(IGNORE_LIMITS, 1 << 14)
+LOAD_FLAG(IGNORE_LIMITS, 1 << 13)
// Indicates that the operation is somewhat likely to be due to an
// explicit user action. This can be used as a hint to treat the
// request with higher priority.
-LOAD_FLAG(MAYBE_USER_GESTURE, 1 << 15)
+LOAD_FLAG(MAYBE_USER_GESTURE, 1 << 14)
// Indicates that the username:password portion of the URL should not
// be honored, but that other forms of authority may be used.
-LOAD_FLAG(DO_NOT_USE_EMBEDDED_IDENTITY, 1 << 16)
+LOAD_FLAG(DO_NOT_USE_EMBEDDED_IDENTITY, 1 << 15)
// Indicates that this request is not to be migrated to a new network when QUIC
// connection migration is enabled.
-LOAD_FLAG(DISABLE_CONNECTION_MIGRATION, 1 << 17)
+LOAD_FLAG(DISABLE_CONNECTION_MIGRATION, 1 << 16)
// Indicates that the cache should not check that the request matches the
// response's vary header.
-LOAD_FLAG(SKIP_VARY_CHECK, 1 << 18)
+LOAD_FLAG(SKIP_VARY_CHECK, 1 << 17)
diff --git a/chromium/net/base/load_states_list.h b/chromium/net/base/load_states_list.h
index 5e850fb6222..4a88e0152a4 100644
--- a/chromium/net/base/load_states_list.h
+++ b/chromium/net/base/load_states_list.h
@@ -2,6 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// This file intentionally does not have header guards, it's included
+// inside a macro to generate values. The following line silences a
+// presubmit warning that would otherwise be triggered by this:
+// no-include-guard-because-multiply-included
+
// This is the list of load states and their values. For the enum values,
// include the file "net/base/load_states.h".
//
@@ -15,88 +20,84 @@
// called Read yet).
LOAD_STATE(IDLE, 0)
-// This state corresponds to a resource load that is throttled by the
-// network layer waiting for some other resource load or loads to complete.
-LOAD_STATE(THROTTLED, 1)
-
// When a socket pool group is below the maximum number of sockets allowed per
// group, but a new socket cannot be created due to the per-pool socket limit,
// this state is returned by all requests for the group waiting on an idle
// connection, except those that may be serviced by a pending new connection.
-LOAD_STATE(WAITING_FOR_STALLED_SOCKET_POOL, 2)
+LOAD_STATE(WAITING_FOR_STALLED_SOCKET_POOL, 1)
// When a socket pool group has reached the maximum number of sockets allowed
// per group, this state is returned for all requests that don't have a socket,
// except those that correspond to a pending new connection.
-LOAD_STATE(WAITING_FOR_AVAILABLE_SOCKET, 3)
+LOAD_STATE(WAITING_FOR_AVAILABLE_SOCKET, 2)
// This state indicates that the URLRequest delegate has chosen to block this
// request before it was sent over the network. When in this state, the
// delegate should set a load state parameter on the URLRequest describing
// the nature of the delay (i.e. "Waiting for <description given by
// delegate>").
-LOAD_STATE(WAITING_FOR_DELEGATE, 4)
+LOAD_STATE(WAITING_FOR_DELEGATE, 3)
// This state corresponds to a resource load that is blocked waiting for
// access to a resource in the cache. If multiple requests are made for the
// same resource, the first request will be responsible for writing (or
// updating) the cache entry and the second request will be deferred until
// the first completes. This may be done to optimize for cache reuse.
-LOAD_STATE(WAITING_FOR_CACHE, 5)
+LOAD_STATE(WAITING_FOR_CACHE, 4)
// This state corresponds to a resource load that is blocked waiting for
// access to a resource in the AppCache.
// Note: This is a layering violation, but being the only one it's not that
// bad. TODO(rvargas): Reconsider what to do if we need to add more.
-LOAD_STATE(WAITING_FOR_APPCACHE, 6)
+LOAD_STATE(WAITING_FOR_APPCACHE, 5)
// This state corresponds to a resource being blocked waiting for the
// PAC script to be downloaded.
-LOAD_STATE(DOWNLOADING_PROXY_SCRIPT, 7)
+LOAD_STATE(DOWNLOADING_PAC_FILE, 6)
// This state corresponds to a resource load that is blocked waiting for a
// proxy autoconfig script to return a proxy server to use.
-LOAD_STATE(RESOLVING_PROXY_FOR_URL, 8)
+LOAD_STATE(RESOLVING_PROXY_FOR_URL, 7)
// This state corresponds to a resource load that is blocked waiting for a
// proxy autoconfig script to return a proxy server to use, but that proxy
// script is busy resolving the IP address of a host.
-LOAD_STATE(RESOLVING_HOST_IN_PROXY_SCRIPT, 9)
+LOAD_STATE(RESOLVING_HOST_IN_PAC_FILE, 8)
// This state indicates that we're in the process of establishing a tunnel
// through the proxy server.
-LOAD_STATE(ESTABLISHING_PROXY_TUNNEL, 10)
+LOAD_STATE(ESTABLISHING_PROXY_TUNNEL, 9)
// This state corresponds to a resource load that is blocked waiting for a
// host name to be resolved. This could either indicate resolution of the
// origin server corresponding to the resource or to the host name of a proxy
// server used to fetch the resource.
-LOAD_STATE(RESOLVING_HOST, 11)
+LOAD_STATE(RESOLVING_HOST, 10)
// This state corresponds to a resource load that is blocked waiting for a
// TCP connection (or other network connection) to be established. HTTP
// requests that reuse a keep-alive connection skip this state.
-LOAD_STATE(CONNECTING, 12)
+LOAD_STATE(CONNECTING, 11)
// This state corresponds to a resource load that is blocked waiting for the
// SSL handshake to complete.
-LOAD_STATE(SSL_HANDSHAKE, 13)
+LOAD_STATE(SSL_HANDSHAKE, 12)
// This state corresponds to a resource load that is blocked waiting to
// completely upload a request to a server. In the case of a HTTP POST
// request, this state includes the period of time during which the message
// body is being uploaded.
-LOAD_STATE(SENDING_REQUEST, 14)
+LOAD_STATE(SENDING_REQUEST, 13)
// This state corresponds to a resource load that is blocked waiting for the
// response to a network request. In the case of a HTTP transaction, this
// corresponds to the period after the request is sent and before all of the
// response headers have been received.
-LOAD_STATE(WAITING_FOR_RESPONSE, 15)
+LOAD_STATE(WAITING_FOR_RESPONSE, 14)
// This state corresponds to a resource load that is blocked waiting for a
// read to complete. In the case of a HTTP transaction, this corresponds to
// the period after the response headers have been received and before all of
// the response body has been downloaded. (NOTE: This state only applies for
// an URLRequest while there is an outstanding Read operation.)
-LOAD_STATE(READING_RESPONSE, 16)
+LOAD_STATE(READING_RESPONSE, 15)
diff --git a/chromium/net/base/load_timing_info.h b/chromium/net/base/load_timing_info.h
index d397e07ea8c..af743523abf 100644
--- a/chromium/net/base/load_timing_info.h
+++ b/chromium/net/base/load_timing_info.h
@@ -73,6 +73,9 @@ struct NET_EXPORT LoadTimingInfo {
// established, which results in unexpected event ordering.
// TODO(mmenke): The SOCKS4 event ordering could be refactored to allow
// these times to be non-null.
+ // Corresponds to |domainLookupStart| and |domainLookupEnd| in
+ // ResourceTiming (http://www.w3.org/TR/resource-timing/) for Web-surfacing
+ // requests.
base::TimeTicks dns_start;
base::TimeTicks dns_end;
@@ -87,12 +90,16 @@ struct NET_EXPORT LoadTimingInfo {
// handled at different levels, this may not be worth
// worrying about - backup jobs, reused socket failure,
// multiple round authentication.
+ // Corresponds to |connectStart| and |connectEnd| in ResourceTiming
+ // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests.
base::TimeTicks connect_start;
base::TimeTicks connect_end;
// The time when the SSL handshake started / completed. For non-HTTPS
// requests these are null. These times are only for the SSL connection to
// the final destination server, not an SSL/SPDY proxy.
+ // |ssl_start| corresponds to |secureConnectionStart| in ResourceTiming
+ // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests.
base::TimeTicks ssl_start;
base::TimeTicks ssl_end;
};
@@ -127,6 +134,8 @@ struct NET_EXPORT LoadTimingInfo {
// changes.
base::Time request_start_time;
+ // Corresponds to |fetchStart| in ResourceTiming
+ // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests.
base::TimeTicks request_start;
// The time spent determing which proxy to use. Null when there is no PAC.
@@ -136,10 +145,14 @@ struct NET_EXPORT LoadTimingInfo {
ConnectTiming connect_timing;
// The time that sending HTTP request started / ended.
+ // |send_start| corresponds to |requestStart| in ResourceTiming
+ // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests.
base::TimeTicks send_start;
base::TimeTicks send_end;
// The time at which the end of the HTTP headers were received.
+ // Corresponds to |responseStart| in ResourceTiming
+ // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests.
base::TimeTicks receive_headers_end;
// In case the resource was proactively pushed by the server, these are
diff --git a/chromium/net/base/mime_sniffer.cc b/chromium/net/base/mime_sniffer.cc
index 65fe885d04b..39d25ab6d1a 100644
--- a/chromium/net/base/mime_sniffer.cc
+++ b/chromium/net/base/mime_sniffer.cc
@@ -687,8 +687,8 @@ static bool SniffCRX(const char* content,
// sniffing gives us less room for error. If the version number ever changes,
// we can just add an entry to this list.
static const struct MagicNumber kCRXMagicNumbers[] = {
- MAGIC_NUMBER("application/x-chrome-extension", "Cr24\x02\x00\x00\x00")
- };
+ MAGIC_NUMBER("application/x-chrome-extension", "Cr24\x02\x00\x00\x00"),
+ MAGIC_NUMBER("application/x-chrome-extension", "Cr24\x03\x00\x00\x00")};
// Only consider files that have the extension ".crx".
if (!base::EndsWith(url.path_piece(), ".crx", base::CompareCase::SENSITIVE))
diff --git a/chromium/net/base/mime_sniffer_unittest.cc b/chromium/net/base/mime_sniffer_unittest.cc
index d2f8c703aa4..1d3a8696f87 100644
--- a/chromium/net/base/mime_sniffer_unittest.cc
+++ b/chromium/net/base/mime_sniffer_unittest.cc
@@ -95,66 +95,55 @@ TEST(MimeSnifferTest, BasicSniffingTest) {
TEST(MimeSnifferTest, ChromeExtensionsTest) {
SnifferTest tests[] = {
- // schemes
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx",
- "", "application/x-chrome-extension" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "https://www.example.com/foo.crx",
- "", "application/x-chrome-extension" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "ftp://www.example.com/foo.crx",
- "", "application/x-chrome-extension" },
-
- // some other mimetypes that should get converted
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx",
- "text/plain", "application/x-chrome-extension" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx",
- "application/octet-stream", "application/x-chrome-extension" },
-
- // success edge cases
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx?query=string",
- "", "application/x-chrome-extension" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo..crx",
- "", "application/x-chrome-extension" },
-
- // wrong file extension
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.bin",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.bin?monkey",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "invalid-url",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foocrx",
- "", "application/octet-stream" },
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx.blech",
- "", "application/octet-stream" },
-
- // wrong magic
- { "Cr24\x02\x00\x00\x01", sizeof("Cr24\x02\x00\x00\x01")-1,
- "http://www.example.com/foo.crx?monkey",
- "", "application/octet-stream" },
- { "PADDING_Cr24\x02\x00\x00\x00", sizeof("PADDING_Cr24\x02\x00\x00\x00")-1,
- "http://www.example.com/foo.crx?monkey",
- "", "application/octet-stream" },
+ // schemes
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx", "", "application/x-chrome-extension"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "https://www.example.com/foo.crx", "", "application/x-chrome-extension"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "ftp://www.example.com/foo.crx", "", "application/x-chrome-extension"},
+
+ // some other mimetypes that should get converted
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx", "text/plain",
+ "application/x-chrome-extension"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx", "application/octet-stream",
+ "application/x-chrome-extension"},
+
+ // success edge cases
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx?query=string", "",
+ "application/x-chrome-extension"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo..crx", "", "application/x-chrome-extension"},
+ {"Cr24\x03\x00\x00\x00", sizeof("Cr24\x03\x00\x00\x00") - 1,
+ "http://www.example.com/foo..crx", "", "application/x-chrome-extension"},
+
+ // wrong file extension
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.bin", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.bin?monkey", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "invalid-url", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foocrx", "", "application/octet-stream"},
+ {"Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx.blech", "", "application/octet-stream"},
+
+ // wrong magic
+ {"Cr24\x02\x00\x00\x01", sizeof("Cr24\x02\x00\x00\x01") - 1,
+ "http://www.example.com/foo.crx?monkey", "", "application/octet-stream"},
+ {"PADDING_Cr24\x02\x00\x00\x00",
+ sizeof("PADDING_Cr24\x02\x00\x00\x00") - 1,
+ "http://www.example.com/foo.crx?monkey", "", "application/octet-stream"},
};
TestArray(tests, arraysize(tests));
diff --git a/chromium/net/base/mime_util.cc b/chromium/net/base/mime_util.cc
index d97f6cffb68..59cf91ddd92 100644
--- a/chromium/net/base/mime_util.cc
+++ b/chromium/net/base/mime_util.cc
@@ -92,6 +92,7 @@ static const MimeInfo kPrimaryMappings[] = {
{"image/gif", "gif"},
{"image/jpeg", "jpeg,jpg"},
{"image/png", "png"},
+ {"image/apng", "png"},
{"image/webp", "webp"},
{"multipart/related", "mht,mhtml"},
{"text/css", "css"},
diff --git a/chromium/net/base/net_error_list.h b/chromium/net/base/net_error_list.h
index e959b782bc7..c9626316bb8 100644
--- a/chromium/net/base/net_error_list.h
+++ b/chromium/net/base/net_error_list.h
@@ -3,7 +3,9 @@
// found in the LICENSE file.
// This file intentionally does not have header guards, it's included
-// inside a macro to generate enum values.
+// inside a macro to generate enum values. The following line silences a
+// presubmit warning that would otherwise be triggered by this:
+// no-include-guard-because-multiply-included
// This file contains the list of network errors.
@@ -409,7 +411,7 @@ NET_ERROR(NO_BUFFER_SPACE, -176)
// There were no common signature algorithms between our client certificate
// private key and the server's preferences.
-NET_ERROR(SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, -1478)
+NET_ERROR(SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, -177)
// Certificate error codes
//
diff --git a/chromium/net/base/net_errors.cc b/chromium/net/base/net_errors.cc
index e634d089c66..d35382f214b 100644
--- a/chromium/net/base/net_errors.cc
+++ b/chromium/net/base/net_errors.cc
@@ -4,6 +4,8 @@
#include "net/base/net_errors.h"
+#include "net/quic/core/quic_error_codes.h"
+
namespace net {
const char kErrorDomain[] = "net";
@@ -12,6 +14,15 @@ std::string ErrorToString(int error) {
return "net::" + ErrorToShortString(error);
}
+std::string ExtendedErrorToString(int error, int extended_error_code) {
+ if (error == ERR_QUIC_PROTOCOL_ERROR && extended_error_code != 0) {
+ return std::string("net::ERR_QUIC_PROTOCOL_ERROR.") +
+ QuicErrorCodeToString(
+ static_cast<QuicErrorCode>(extended_error_code));
+ }
+ return ErrorToString(error);
+}
+
std::string ErrorToShortString(int error) {
if (error == 0)
return "OK";
diff --git a/chromium/net/base/net_errors.h b/chromium/net/base/net_errors.h
index 8fe976d4648..9c527023cf4 100644
--- a/chromium/net/base/net_errors.h
+++ b/chromium/net/base/net_errors.h
@@ -36,6 +36,11 @@ NET_EXPORT std::string ErrorToString(int error);
// Same as above, but leaves off the leading "net::".
NET_EXPORT std::string ErrorToShortString(int error);
+// Returns a textual representation of the error code and the extended eror
+// code.
+NET_EXPORT std::string ExtendedErrorToString(int error,
+ int extended_error_code);
+
// Returns true if |error| is a certificate error code.
NET_EXPORT bool IsCertificateError(int error);
diff --git a/chromium/net/base/net_info_source_list.h b/chromium/net/base/net_info_source_list.h
index 4277aba58b6..14a6496c565 100644
--- a/chromium/net/base/net_info_source_list.h
+++ b/chromium/net/base/net_info_source_list.h
@@ -3,7 +3,9 @@
// found in the LICENSE file.
// This file intentionally does not have header guards, it's included
-// inside a macro to generate enum values.
+// inside a macro to generate enum values. The following line silences a
+// presubmit warning that would otherwise be triggered by this:
+// no-include-guard-because-multiply-included
// Flags used to request different types of information about the current state
// of a URLRequestContext.
diff --git a/chromium/net/base/network_config_watcher_mac.cc b/chromium/net/base/network_config_watcher_mac.cc
index bc46c120640..657d1ac33f1 100644
--- a/chromium/net/base/network_config_watcher_mac.cc
+++ b/chromium/net/base/network_config_watcher_mac.cc
@@ -11,15 +11,100 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
+#include "base/metrics/histogram_macros.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread.h"
#include "base/threading/thread_restrictions.h"
+#include "build/build_config.h"
namespace net {
namespace {
+// SCDynamicStore API does not exist on iOS.
#if !defined(OS_IOS)
+const base::TimeDelta kRetryInterval = base::TimeDelta::FromSeconds(1);
+const int kMaxRetry = 5;
+
+// Maps SCError to an enum for UMA logging. These values are persisted to logs,
+// and should not be renumbered. Added to investigate https://crbug.com/547877.
+enum class SCStatusCode {
+ // Unmapped error codes.
+ SC_UNKNOWN = 0,
+
+ // These map to the corresponding SCError.
+ SC_OK = 1,
+ SC_FAILED = 2,
+ SC_INVALID_ARGUMENT = 3,
+ SC_ACCESS_ERROR = 4,
+ SC_NO_KEY = 5,
+ SC_KEY_EXISTS = 6,
+ SC_LOCKED = 7,
+ SC_NEED_LOCK = 8,
+ SC_NO_STORE_SESSION = 9,
+ SC_NO_STORE_SERVER = 10,
+ SC_NOTIFIER_ACTIVE = 11,
+ SC_NO_PREFS_SESSION = 12,
+ SC_PREFS_BUSY = 13,
+ SC_NO_CONFIG_FILE = 14,
+ SC_NO_LINK = 15,
+ SC_STALE = 16,
+ SC_MAX_LINK = 17,
+ SC_REACHABILITY_UNKNOWN = 18,
+ SC_CONNECTION_NO_SERVICE = 19,
+ SC_CONNECTION_IGNORE = 20,
+
+ // Maximum value for histogram bucket.
+ SC_COUNT,
+};
+
+SCStatusCode ConvertToSCStatusCode(int sc_error) {
+ switch (sc_error) {
+ case kSCStatusOK:
+ return SCStatusCode::SC_OK;
+ case kSCStatusFailed:
+ return SCStatusCode::SC_FAILED;
+ case kSCStatusInvalidArgument:
+ return SCStatusCode::SC_INVALID_ARGUMENT;
+ case kSCStatusAccessError:
+ return SCStatusCode::SC_ACCESS_ERROR;
+ case kSCStatusNoKey:
+ return SCStatusCode::SC_NO_KEY;
+ case kSCStatusKeyExists:
+ return SCStatusCode::SC_KEY_EXISTS;
+ case kSCStatusLocked:
+ return SCStatusCode::SC_LOCKED;
+ case kSCStatusNeedLock:
+ return SCStatusCode::SC_NEED_LOCK;
+ case kSCStatusNoStoreSession:
+ return SCStatusCode::SC_NO_STORE_SESSION;
+ case kSCStatusNoStoreServer:
+ return SCStatusCode::SC_NO_STORE_SERVER;
+ case kSCStatusNotifierActive:
+ return SCStatusCode::SC_NOTIFIER_ACTIVE;
+ case kSCStatusNoPrefsSession:
+ return SCStatusCode::SC_NO_PREFS_SESSION;
+ case kSCStatusPrefsBusy:
+ return SCStatusCode::SC_PREFS_BUSY;
+ case kSCStatusNoConfigFile:
+ return SCStatusCode::SC_NO_CONFIG_FILE;
+ case kSCStatusNoLink:
+ return SCStatusCode::SC_NO_LINK;
+ case kSCStatusStale:
+ return SCStatusCode::SC_STALE;
+ case kSCStatusMaxLink:
+ return SCStatusCode::SC_MAX_LINK;
+ case kSCStatusReachabilityUnknown:
+ return SCStatusCode::SC_REACHABILITY_UNKNOWN;
+ case kSCStatusConnectionNoService:
+ return SCStatusCode::SC_CONNECTION_NO_SERVICE;
+ case kSCStatusConnectionIgnore:
+ return SCStatusCode::SC_CONNECTION_IGNORE;
+ default:
+ return SCStatusCode::SC_UNKNOWN;
+ }
+}
+
// Called back by OS. Calls OnNetworkConfigChange().
void DynamicStoreCallback(SCDynamicStoreRef /* store */,
CFArrayRef changed_keys,
@@ -45,8 +130,14 @@ class NetworkConfigWatcherMacThread : public base::Thread {
// on, so we invoke this function later on in startup to keep it fast.
void InitNotifications();
+ // Returns whether initializing notifications has succeeded.
+ bool InitNotificationsHelper();
+
base::ScopedCFTypeRef<CFRunLoopSourceRef> run_loop_source_;
NetworkConfigWatcherMac::Delegate* const delegate_;
+#if !defined(OS_IOS)
+ int num_retry_;
+#endif // !defined(OS_IOS)
base::WeakPtrFactory<NetworkConfigWatcherMacThread> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(NetworkConfigWatcherMacThread);
@@ -56,7 +147,11 @@ NetworkConfigWatcherMacThread::NetworkConfigWatcherMacThread(
NetworkConfigWatcherMac::Delegate* delegate)
: base::Thread("NetworkConfigWatcher"),
delegate_(delegate),
- weak_factory_(this) {}
+#if !defined(OS_IOS)
+ num_retry_(0),
+#endif // !defined(OS_IOS)
+ weak_factory_(this) {
+}
NetworkConfigWatcherMacThread::~NetworkConfigWatcherMacThread() {
// Allow IO because Stop() calls PlatformThread::Join(), which is a blocking
@@ -89,6 +184,37 @@ void NetworkConfigWatcherMacThread::CleanUp() {
}
void NetworkConfigWatcherMacThread::InitNotifications() {
+ // If initialization fails, retry after a 1s delay.
+ bool success = InitNotificationsHelper();
+
+#if !defined(OS_IOS)
+ if (!success && num_retry_ < kMaxRetry) {
+ LOG(ERROR) << "Retrying SystemConfiguration registration in 1 second.";
+ task_runner()->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&NetworkConfigWatcherMacThread::InitNotifications,
+ weak_factory_.GetWeakPtr()),
+ kRetryInterval);
+ num_retry_++;
+ return;
+ }
+
+ // There are kMaxRetry + 2 buckets. The 0 bucket is where no retry is
+ // performed. The kMaxRetry + 1 bucket is where all retries have failed.
+ int histogram_bucket = num_retry_;
+ if (!success) {
+ DCHECK_EQ(kMaxRetry, num_retry_);
+ histogram_bucket = kMaxRetry + 1;
+ }
+ UMA_HISTOGRAM_EXACT_LINEAR(
+ "Net.NetworkConfigWatcherMac.SCDynamicStore.NumRetry", histogram_bucket,
+ kMaxRetry + 2);
+#else
+ DCHECK(success);
+#endif // !defined(OS_IOS)
+}
+
+bool NetworkConfigWatcherMacThread::InitNotificationsHelper() {
#if !defined(OS_IOS)
// SCDynamicStore API does not exist on iOS.
// Add a run loop source for a dynamic store to the current run loop.
@@ -101,8 +227,26 @@ void NetworkConfigWatcherMacThread::InitNotifications() {
};
base::ScopedCFTypeRef<SCDynamicStoreRef> store(SCDynamicStoreCreate(
NULL, CFSTR("org.chromium"), DynamicStoreCallback, &context));
+ if (!store) {
+ int error = SCError();
+ LOG(ERROR) << "SCDynamicStoreCreate failed with Error: " << error << " - "
+ << SCErrorString(error);
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.NetworkConfigWatcherMac.SCDynamicStore.Create",
+ ConvertToSCStatusCode(error), SCStatusCode::SC_COUNT);
+ return false;
+ }
run_loop_source_.reset(SCDynamicStoreCreateRunLoopSource(
NULL, store.get(), 0));
+ if (!run_loop_source_) {
+ int error = SCError();
+ LOG(ERROR) << "SCDynamicStoreCreateRunLoopSource failed with Error: "
+ << error << " - " << SCErrorString(error);
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.NetworkConfigWatcherMac.SCDynamicStore.Create.RunLoopSource",
+ ConvertToSCStatusCode(error), SCStatusCode::SC_COUNT);
+ return false;
+ }
CFRunLoopAddSource(CFRunLoopGetCurrent(), run_loop_source_.get(),
kCFRunLoopCommonModes);
#endif // !defined(OS_IOS)
@@ -112,6 +256,7 @@ void NetworkConfigWatcherMacThread::InitNotifications() {
#if !defined(OS_IOS)
delegate_->SetDynamicStoreNotificationKeys(store.get());
#endif // !defined(OS_IOS)
+ return true;
}
} // namespace
diff --git a/chromium/net/base/network_config_watcher_mac.h b/chromium/net/base/network_config_watcher_mac.h
index 8157d476975..7e5ed593515 100644
--- a/chromium/net/base/network_config_watcher_mac.h
+++ b/chromium/net/base/network_config_watcher_mac.h
@@ -5,7 +5,7 @@
#ifndef NET_BASE_NETWORK_CONFIG_WATCHER_MAC_H_
#define NET_BASE_NETWORK_CONFIG_WATCHER_MAC_H_
-#include <SystemConfiguration/SCDynamicStore.h>
+#include <SystemConfiguration/SystemConfiguration.h>
#include <memory>
diff --git a/chromium/net/base/network_interfaces.h b/chromium/net/base/network_interfaces.h
index d3d9f4e03b5..538adb27e66 100644
--- a/chromium/net/base/network_interfaces.h
+++ b/chromium/net/base/network_interfaces.h
@@ -86,8 +86,11 @@ enum HostAddressSelectionPolicy {
NET_EXPORT bool GetNetworkList(NetworkInterfaceList* networks,
int policy);
-// Gets the SSID of the currently associated WiFi access point if there is one.
-// Otherwise, returns empty string.
+// Gets the SSID of the currently associated WiFi access point if there is one,
+// and it is available. SSID may not be available if the app does not have
+// permissions to access it. On Android M+, the app accessing SSID needs to have
+// ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. If there is no WiFi access
+// point or its SSID is unavailable, an empty string is returned.
// Currently only implemented on Linux, ChromeOS, Android and Windows.
NET_EXPORT std::string GetWifiSSID();
diff --git a/chromium/net/base/network_interfaces_fuchsia.cc b/chromium/net/base/network_interfaces_fuchsia.cc
index 61c9e806904..65ef4f84f2e 100644
--- a/chromium/net/base/network_interfaces_fuchsia.cc
+++ b/chromium/net/base/network_interfaces_fuchsia.cc
@@ -18,37 +18,38 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
return false;
}
- netc_get_if_info_t netconfig;
- int size = ioctl_netc_get_if_info(s, &netconfig);
- PCHECK(close(s) == 0);
-
- if (size < 0) {
- PLOG(ERROR) << "ioctl_netc_get_if_info";
+ uint32_t num_ifs = 0;
+ if (ioctl_netc_get_num_ifs(s, &num_ifs) < 0) {
+ PLOG(ERROR) << "ioctl_netc_get_num_ifs";
+ PCHECK(close(s) == 0);
return false;
}
- networks->clear();
+ for (uint32_t i = 0; i < num_ifs; ++i) {
+ netc_if_info_t interface;
- for (size_t i = 0; i < netconfig.n_info; ++i) {
- netc_if_info_t* interface = netconfig.info + i;
+ if (ioctl_netc_get_if_info_at(s, &i, &interface) < 0) {
+ PLOG(WARNING) << "ioctl_netc_get_if_info_at";
+ continue;
+ }
// Skip loopback addresses.
if (internal::IsLoopbackOrUnspecifiedAddress(
- reinterpret_cast<sockaddr*>(&(interface->addr)))) {
+ reinterpret_cast<sockaddr*>(&(interface.addr)))) {
continue;
}
IPEndPoint address;
- if (!address.FromSockAddr(reinterpret_cast<sockaddr*>(&(interface->addr)),
- sizeof(interface->addr))) {
+ if (!address.FromSockAddr(reinterpret_cast<sockaddr*>(&(interface.addr)),
+ sizeof(interface.addr))) {
DLOG(WARNING) << "ioctl_netc_get_if_info returned invalid address.";
continue;
}
int prefix_length = 0;
IPEndPoint netmask;
- if (netmask.FromSockAddr(reinterpret_cast<sockaddr*>(&(interface->netmask)),
- sizeof(interface->netmask))) {
+ if (netmask.FromSockAddr(reinterpret_cast<sockaddr*>(&(interface.netmask)),
+ sizeof(interface.netmask))) {
prefix_length = MaskPrefixLength(netmask.address());
}
@@ -58,11 +59,13 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
int attributes = 0;
networks->push_back(
- NetworkInterface(interface->name, interface->name, interface->index,
+ NetworkInterface(interface.name, interface.name, interface.index,
NetworkChangeNotifier::CONNECTION_UNKNOWN,
address.address(), prefix_length, attributes));
}
+ PCHECK(close(s) == 0);
+
return true;
}
diff --git a/chromium/net/base/network_throttle_manager.h b/chromium/net/base/network_throttle_manager.h
deleted file mode 100644
index 96a864e6784..00000000000
--- a/chromium/net/base/network_throttle_manager.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_BASE_NETWORK_THROTTLE_MANAGER_H_
-#define NET_BASE_NETWORK_THROTTLE_MANAGER_H_
-
-#include <memory>
-
-#include "base/memory/weak_ptr.h"
-#include "net/base/net_export.h"
-#include "net/base/request_priority.h"
-
-namespace net {
-
-// This class controls throttling based on priority level and number of
-// outstanding requests. It vends Throttle objects, and tracks
-// outstanding requests by the lifetime of those objects. Consumers
-// determine whether or not they are throttled by consulting those
-// Throttle objects.
-//
-// This class must outlive all Throttles created from it via CreateThrottle().
-//
-// Methods are virtual to allow for test mocks.
-class NET_EXPORT_PRIVATE NetworkThrottleManager {
- public:
- class Throttle;
-
- // Abstract base class other classes can inherit from to get
- // notifications from throttle state changes.
- class NET_EXPORT_PRIVATE ThrottleDelegate {
- public:
- // Called when a throttle is unblocked.
- //
- // Note that this call may occur as the result of either a call to
- // Throttle::SetPriority (on the throttle related to this delegate
- // or another throttle) or the destruction of a Throttle, and if
- // so will occur synchronously during those events. It will not
- // be called from the destructor of the Throttle associated with
- // the ThrottleDelegate.
- virtual void OnThrottleUnblocked(Throttle* throttle) = 0;
-
- protected:
- virtual ~ThrottleDelegate() {}
- };
-
- // Class owned by external stream representations that
- // routes notifications. It may be constructed in either the
- // blocked or unblocked state according to the state of the
- // NetworkThrottleManager; if it's constructed in the unblocked
- // state, it will only make a single transition to unblocked,
- // which will be signaled by delegate->OnThrottleUnblocked(this).
- // If it's constructed in the unblocked state, it will remain
- // there.
- class NET_EXPORT_PRIVATE Throttle {
- public:
- virtual ~Throttle() {}
-
- virtual bool IsBlocked() const = 0;
-
- virtual RequestPriority Priority() const = 0;
-
- // Note that this may result in a possibly reentrant call to
- // |ThrottleDelegate::OnThrottleUnblocked|, as well as the resumption
- // of this or other requests, which may result in request completion
- // and destruction before return. Any caller of this function
- // should not rely on this object or containing objects surviving
- // this call.
- //
- // This call is a no-op if the priority is set to its current value.
- virtual void SetPriority(RequestPriority priority) = 0;
-
- protected:
- Throttle() {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Throttle);
- };
-
- virtual ~NetworkThrottleManager() {}
-
- // Caller must ensure that |*delegate| outlives the returned
- // Throttle.
- virtual std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
- RequestPriority priority,
- bool ignore_limits) = 0;
-
- protected:
- NetworkThrottleManager() {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManager);
-};
-
-} // namespace net
-
-#endif // NET_BASE_NETWORK_THROTTLE_MANAGER_H_
diff --git a/chromium/net/base/network_throttle_manager_impl.cc b/chromium/net/base/network_throttle_manager_impl.cc
index 5e33729b8f7..cd62444c522 100644
--- a/chromium/net/base/network_throttle_manager_impl.cc
+++ b/chromium/net/base/network_throttle_manager_impl.cc
@@ -188,7 +188,7 @@ NetworkThrottleManagerImpl::CreateThrottle(
}
void NetworkThrottleManagerImpl::SetTickClockForTesting(
- base::TickClock* tick_clock) {
+ const base::TickClock* tick_clock) {
tick_clock_ = tick_clock;
DCHECK(!outstanding_recomputation_timer_->IsRunning());
outstanding_recomputation_timer_ = std::make_unique<base::Timer>(
diff --git a/chromium/net/base/network_throttle_manager_impl.h b/chromium/net/base/network_throttle_manager_impl.h
index 620da459931..cb1bfe4be7b 100644
--- a/chromium/net/base/network_throttle_manager_impl.h
+++ b/chromium/net/base/network_throttle_manager_impl.h
@@ -71,7 +71,7 @@ class NET_EXPORT NetworkThrottleManagerImpl : public NetworkThrottleManager {
RequestPriority priority,
bool ignore_limits) override;
- void SetTickClockForTesting(base::TickClock* tick_clock);
+ void SetTickClockForTesting(const base::TickClock* tick_clock);
// If the |NowTicks()| value of |tick_clock_| is greater than the
// time the outstanding_recomputation_timer_ has set to go off, Stop()
@@ -140,7 +140,7 @@ class NET_EXPORT NetworkThrottleManagerImpl : public NetworkThrottleManager {
ThrottleList blocked_throttles_;
// For testing.
- base::TickClock* tick_clock_;
+ const base::TickClock* tick_clock_;
base::WeakPtrFactory<NetworkThrottleManagerImpl> weak_ptr_factory_;
diff --git a/chromium/net/base/network_throttle_manager_impl_unittest.cc b/chromium/net/base/network_throttle_manager_impl_unittest.cc
deleted file mode 100644
index 713b2680d13..00000000000
--- a/chromium/net/base/network_throttle_manager_impl_unittest.cc
+++ /dev/null
@@ -1,564 +0,0 @@
-// Copyright 2016 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/network_throttle_manager_impl.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/run_loop.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "base/test/test_message_loop.h"
-#include "net/base/request_priority.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-const int kInitialAgeHorizonForUncountedRequests =
- (NetworkThrottleManagerImpl::kInitialMedianInMs *
- NetworkThrottleManagerImpl::kMedianLifetimeMultiple);
-
-// Must be greater than the corresponding fudge factor in
-// network_throttle_manager_impl.cc.
-const int kAgeHorizonFudgeFactor = 20;
-
-// Test fixture for throttle manager tests.
-
-// Note that the manager owned and managed by this fixture has a clock
-// that is set to base::TimeTicks::Now() (which value is also exposed
-// via an accessor) on creation but does not change without
-// intervention by tests (to make the tests more predictable).
-//
-// HOWEVER, also note that that manager uses the base::Timer class, which
-// uses the system clock, which isn't affected by the setting of the
-// test fixture clock. So test should be written to a) avoid situations
-// in which the manager's timer will actually go off based on the system
-// clock, and b) call ConditionallyTriggerTimerForTesting() (which does
-// evaluate the manager's clock) when timer based tests are necessary.
-class NetworkThrottleManagerTest : public testing::Test,
- NetworkThrottleManager::ThrottleDelegate {
- public:
- NetworkThrottleManagerTest()
- : now_(base::TimeTicks::Now()),
- throttle_state_change_count_(0),
- last_throttle_to_change_state_(nullptr),
- throttle_manager_(new NetworkThrottleManagerImpl) {
- clock_.SetNowTicks(now_);
- throttle_manager_->SetTickClockForTesting(&clock_);
- }
-
- protected:
- enum ExpectedThrottleBlockState { BLOCKED, UNBLOCKED };
-
- base::TimeTicks now() { return now_; }
- NetworkThrottleManagerImpl* throttle_manager() {
- return throttle_manager_.get();
- }
-
- // Set the offset of the test clock from now_.
- void SetClockDelta(base::TimeDelta time_delta) {
- clock_.SetNowTicks(now_ + time_delta);
- }
-
- // Throttle creation
- std::unique_ptr<NetworkThrottleManager::Throttle> CreateThrottle(
- net::RequestPriority priority,
- ExpectedThrottleBlockState throttle_state) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle(
- throttle_manager_->CreateThrottle(this, priority, false));
- EXPECT_EQ(throttle_state == BLOCKED, throttle->IsBlocked());
- return throttle;
- }
- std::unique_ptr<NetworkThrottleManager::Throttle>
- CreateThrottleIgnoringLimits(net::RequestPriority priority) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle(
- throttle_manager_->CreateThrottle(this, priority, true));
- EXPECT_FALSE(throttle->IsBlocked());
- return throttle;
- }
-
- // Throttle state change information.
- int throttle_state_change_count() { return throttle_state_change_count_; }
- NetworkThrottleManager::Throttle* last_throttle_to_change_state() {
- return last_throttle_to_change_state_;
- }
-
- // Setting a callback to be invoked when a throttle's state changes.
- void SetThrottleStateChangedCallback(const base::Closure& callback) {
- throttle_state_changed_callback_ = callback;
- }
-
- private:
- // NetworkThrottleManager::Delegate
- void OnThrottleUnblocked(
- NetworkThrottleManager::Throttle* throttle) override {
- ++throttle_state_change_count_;
- last_throttle_to_change_state_ = throttle;
- if (!throttle_state_changed_callback_.is_null())
- base::ResetAndReturn(&throttle_state_changed_callback_).Run();
- }
-
- base::SimpleTestTickClock clock_;
- base::TimeTicks now_;
- int throttle_state_change_count_;
- NetworkThrottleManager::Throttle* last_throttle_to_change_state_;
- std::unique_ptr<NetworkThrottleManagerImpl> throttle_manager_;
- base::Closure throttle_state_changed_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManagerTest);
-};
-
-// Check to confirm that all created throttles at priorities other than
-// THROTTLED start unblocked.
-TEST_F(NetworkThrottleManagerTest, AllUnthrottled) {
- for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
- if (i == THROTTLED)
- continue;
- CreateThrottle(static_cast<RequestPriority>(i), UNBLOCKED);
- }
-}
-
-// Check for basic semantics around the new THROTTLED level.
-TEST_F(NetworkThrottleManagerTest, ThrottledBlocking) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
-
- throttle1.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
-
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_TRUE(throttle4->IsBlocked());
- EXPECT_TRUE(throttle5->IsBlocked());
-
- throttle2.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(2, throttle_state_change_count());
- EXPECT_EQ(throttle4.get(), last_throttle_to_change_state());
-
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_FALSE(throttle4->IsBlocked());
- EXPECT_TRUE(throttle5->IsBlocked());
-}
-
-// Check that THROTTLED semantics are dependent on all outstanding requests.
-TEST_F(NetworkThrottleManagerTest, ThrottledBlockingMultiPriority) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(HIGHEST, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(LOW, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
-
- throttle1.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(0, throttle_state_change_count());
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_TRUE(throttle4->IsBlocked());
- EXPECT_TRUE(throttle5->IsBlocked());
-
- throttle2.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle4.get(), last_throttle_to_change_state());
-
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_FALSE(throttle4->IsBlocked());
- EXPECT_TRUE(throttle5->IsBlocked());
-
- throttle3.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(2, throttle_state_change_count());
- EXPECT_EQ(throttle5.get(), last_throttle_to_change_state());
-
- EXPECT_FALSE(throttle4->IsBlocked());
- EXPECT_FALSE(throttle5->IsBlocked());
-}
-
-// Check that a SetPriority() away from THROTTLED results in unblocking
-// and an upcall.
-TEST_F(NetworkThrottleManagerTest, ThrottledSetPriority) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
-
- throttle3->SetPriority(LOW);
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_TRUE(throttle4->IsBlocked());
-}
-
-void ResetThrottles(
- bool* function_called,
- std::vector<std::unique_ptr<NetworkThrottleManager::Throttle>> throttles) {
- *function_called = true;
- // All pointers in the vector should be deleted on exit.
-}
-
-// Check that tearing down all elements in the NTM on a SetPriority
-// upcall doesn't create any problems.
-TEST_F(NetworkThrottleManagerTest, ThrottleTeardown) {
- std::vector<std::unique_ptr<NetworkThrottleManager::Throttle>> throttles;
-
- throttles.push_back(CreateThrottle(THROTTLED, UNBLOCKED));
- throttles.push_back(CreateThrottle(THROTTLED, UNBLOCKED));
-
- // Note that if there is more than one throttle blocked, then the
- // number of throttle state changes is dependent on destruction order.
- // So only one blocked throttle is created.
- auto throttle_temporary = CreateThrottle(THROTTLED, BLOCKED);
- NetworkThrottleManager::Throttle* throttle3 = throttle_temporary.get();
- throttles.push_back(std::move(throttle_temporary));
-
- bool callback_called(false);
- SetThrottleStateChangedCallback(
- base::Bind(&ResetThrottles, &callback_called, base::Passed(&throttles)));
-
- EXPECT_EQ(0, throttle_state_change_count());
-
- throttle3->SetPriority(LOW);
-
- // If the test is functioning as expected, throttle3 now points to
- // a deleted object and can no longer be indirected through.
-
- EXPECT_TRUE(callback_called);
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle3, last_throttle_to_change_state());
-}
-
-// Note that this routine is dependent on priority setting *not* resulting in
-// destruction of any throttle and should only be used in tests where that is
-// true.
-void SetAllToPriority(
- RequestPriority priority,
- std::vector<NetworkThrottleManager::Throttle*> throttles) {
- for (size_t i = 0; i < throttles.size(); ++i)
- throttles[i]->SetPriority(priority);
-}
-
-// Check that modifying all the priorities of the allocated throttles in
-// the callback works properly.
-TEST_F(NetworkThrottleManagerTest, ThrottlePriorityReset) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
-
- std::vector<NetworkThrottleManager::Throttle*> throttles;
- throttles.push_back(throttle1.get());
- throttles.push_back(throttle2.get());
- throttles.push_back(throttle3.get());
-
- SetThrottleStateChangedCallback(
- base::Bind(&SetAllToPriority, MEDIUM, base::Passed(&throttles)));
-
- EXPECT_EQ(0, throttle_state_change_count());
- throttle3->SetPriority(HIGHEST);
-
- // Expected result: throttles 1-3 @ medium priority (the callback should
- // have overridden the priority setting above), only throttle 4 blocked
- // (throttle3 should have been unblocked by either of the priority changes),
- // and one state changes (the unblocking).
- EXPECT_EQ(MEDIUM, throttle1->Priority());
- EXPECT_EQ(MEDIUM, throttle2->Priority());
- EXPECT_EQ(MEDIUM, throttle3->Priority());
- EXPECT_EQ(THROTTLED, throttle4->Priority());
- EXPECT_FALSE(throttle1->IsBlocked());
- EXPECT_FALSE(throttle2->IsBlocked());
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_TRUE(throttle4->IsBlocked());
- EXPECT_EQ(1, throttle_state_change_count());
-}
-
-// Check that modifying the priority of a request from a non-THROTTLED
-// value to THROTTLED causes no change in behavior.
-TEST_F(NetworkThrottleManagerTest, ThrottlePriorityResetToThrottled) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(THROTTLED, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(LOW, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
- throttle3->SetPriority(THROTTLED);
- EXPECT_EQ(0, throttle_state_change_count());
-
- EXPECT_FALSE(throttle1->IsBlocked());
- EXPECT_FALSE(throttle2->IsBlocked());
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_TRUE(throttle4->IsBlocked());
-
- EXPECT_EQ(THROTTLED, throttle1->Priority());
- EXPECT_EQ(THROTTLED, throttle2->Priority());
- EXPECT_EQ(THROTTLED, throttle3->Priority());
- EXPECT_EQ(THROTTLED, throttle4->Priority());
-}
-
-// Confirm that old requests don't count against the limit.
-TEST_F(NetworkThrottleManagerTest, DontCountAgedRequests) {
- const int age_in_days_of_old_throttles = 4;
-
- // Confirm default median and timing means that 4 days is long enough ago
- // to be aged out.
- EXPECT_GT(age_in_days_of_old_throttles * 24 * 60 * 60 * 1000,
- kInitialAgeHorizonForUncountedRequests);
-
- SetClockDelta(-base::TimeDelta::FromDays(age_in_days_of_old_throttles));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
-
- SetClockDelta(base::TimeDelta());
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(LOW, UNBLOCKED));
-
- // First throttled request should not be blocked.
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, UNBLOCKED));
-
- // Second should be.
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(THROTTLED, BLOCKED));
-
- // Destroying the old requests should not result in any upcalls.
- EXPECT_EQ(0, throttle_state_change_count());
- throttle1.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(0, throttle_state_change_count());
- throttle2.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(0, throttle_state_change_count());
-
- // But destroying a new request should result in a state change.
- throttle3.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle5.get(), last_throttle_to_change_state());
-}
-
-// Confirm that a slew of throttles of a specific age will shift the
-// median for determining "aged requests" to that age.
-TEST_F(NetworkThrottleManagerTest, ShiftMedian) {
- // Setup two throttles of age *just short* of aging out; confirm
- // they result in blocked THROTTLED requests.
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests - 1));
- EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
-
- throttle1.reset();
- throttle2.reset();
- throttle3.reset();
- base::RunLoop().RunUntilIdle(); // Allow posttasks to run.
-
- // Create 100 throttles and destroy them, effectively with lifetime zero.
- // This should substantially decrease the median age estimate.
- SetClockDelta(base::TimeDelta());
- for (int i = 0; i < 100; ++i) {
- std::unique_ptr<NetworkThrottleManager::Throttle> tmp(
- CreateThrottle(IDLE, UNBLOCKED));
- }
-
- // Clear out any possible leftover timer by setting the clock to a point
- // in the future at which it will definitely go off, and triggering it.
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- 2 * kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
- throttle_manager()->ConditionallyTriggerTimerForTesting();
-
- // The identical test above should no longer result in blocked throttles.
- SetClockDelta(base::TimeDelta());
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle6(
- CreateThrottle(IDLE, UNBLOCKED));
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests - 1));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle7(
- CreateThrottle(THROTTLED, UNBLOCKED));
-}
-
-// Confirm that just "aging out" requests will result in unblocking
-// blocked requests.
-TEST_F(NetworkThrottleManagerTest, AgeInvalidThrottles) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
- EXPECT_FALSE(throttle3->IsBlocked());
-}
-
-// Confirm that if throttles are unblocked and made active by all
-// existing outstanding throttles aging out, they will also eventually
-// age out and let new throttles through.
-TEST_F(NetworkThrottleManagerTest, NewlyUnblockedThrottlesAlsoAge) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle6(
- CreateThrottle(THROTTLED, BLOCKED));
-
- // Age the first two throttles out of the outstanding, which should
- // result in the next two throttles becoming unblocked (and in the
- // oustanding list). (The internal implementation will zero out
- // the outstanding queue and then add in the two new unblocked throttles.)
- EXPECT_EQ(0, throttle_state_change_count());
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(2, throttle_state_change_count());
- EXPECT_FALSE(throttle3->IsBlocked());
- EXPECT_FALSE(throttle4->IsBlocked());
-
- // Age the next two throttles out of the outstanding queue, which
- // should result in the next two throttles becoming unblocked (and
- // in the oustanding list). This will only happen if a timer was properly
- // set in the above age process as the oustanding queue went through
- // the empty state.
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- 2 * (kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor)));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(4, throttle_state_change_count());
- EXPECT_FALSE(throttle5->IsBlocked());
- EXPECT_FALSE(throttle6->IsBlocked());
-}
-
-// Confirm that throttles that are blocked for a while and then
-// unblocked don't "age out".
-TEST_F(NetworkThrottleManagerTest, AgeBlockedThrottles) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(THROTTLED, BLOCKED));
-
- EXPECT_EQ(0, throttle_state_change_count());
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-
- // If blocked throttles aged out, all three throttles should have been
- // unblocked. If not, only the two replacing the IDLE throttles should
- // have.
- EXPECT_EQ(2, throttle_state_change_count());
-}
-
-// Confirm that deleting old throttles before they age out doesn't
-// interfere with the aging out of more recent throttles.
-TEST_F(NetworkThrottleManagerTest, DeletionAgingInterference) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(THROTTLED, BLOCKED));
- EXPECT_EQ(0, throttle_state_change_count());
-
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- kInitialAgeHorizonForUncountedRequests / 2));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottle(IDLE, UNBLOCKED));
- EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(0, throttle_state_change_count());
-
- throttle1.reset();
- throttle2.reset();
- EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(0, throttle_state_change_count());
-
- SetClockDelta(base::TimeDelta::FromMilliseconds(
- (3 * kInitialAgeHorizonForUncountedRequests / 2 +
- 2 * kAgeHorizonFudgeFactor)));
- EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
- EXPECT_EQ(1, throttle_state_change_count());
- EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
- EXPECT_FALSE(throttle3->IsBlocked());
-}
-
-// Confirm that "ignore_limits" boolean is respected.
-TEST_F(NetworkThrottleManagerTest, IgnoreLimits) {
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
- CreateThrottle(HIGHEST, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
- CreateThrottle(LOW, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
- CreateThrottle(IDLE, UNBLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
- CreateThrottle(THROTTLED, BLOCKED));
- std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
- CreateThrottleIgnoringLimits(THROTTLED));
-}
-
-} // namespace
-
-} // namespace net
diff --git a/chromium/net/base/percentile_estimator.cc b/chromium/net/base/percentile_estimator.cc
deleted file mode 100644
index 216d6e6ee60..00000000000
--- a/chromium/net/base/percentile_estimator.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2016 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 "percentile_estimator.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/rand_util.h"
-
-namespace {
-
-// Random number wrapper to allow substitutions for testing.
-int GenerateRand0To99() {
- return base::RandInt(0, 99);
-}
-
-} // namespace
-
-namespace net {
-
-// The algorithm used for percentile estimation is "Algorithm 3" from
-// https://arxiv.org/pdf/1407.1121v1.pdf. There are several parts to the
-// algorithm:
-// * The estimate is conditionally moved towards the sample by a step amount.
-// This means that if the samples are clustered around a value the estimates
-// will converge to that sample.
-// * The percentile requested (e.g. 90%l) is handled by the conditional move.
-// If the estimate is accurate, there is a chance equal to the percentile
-// value that a sample will be lower than it, and a chance equal to
-// 1-percentile that it will be higher. So the code balances those
-// probabilities by increasing the estimate in the percentile fraction
-// of the cases where the sample is over the estimate, and decreases the
-// estimate in (1-percentile) fraction of the cases where the sample is under
-// the estimate.
-// E.g. in the case of the 90%l estimation, the estimate would
-// move up in 90% of the cases in which the sample was above the
-// estimate (which would be 10% of the total samples, presuming the
-// estimate was accurate), and it would move down in 10% of the cases
-// in which the sample was below the estimate.
-// * Every time the estimate moves in the same direction, the step
-// amount is increased by one, and every time the estimate reverses
-// direction, the step amount is decreased (to 1, if greater than 1,
-// by one, if zero or negative). The effective step amount is
-// Max(step, 1).
-// * If the estimate
-// would be moved beyond the sample causing its move, it is moved to
-// be equal to the same (and the step amount set to the distance to
-// the sample). See the paper for further details.
-
-PercentileEstimator::PercentileEstimator(int percentile, int initial_estimate)
- : percentile_(percentile),
- sign_positive_(true),
- current_estimate_(initial_estimate),
- current_step_(1),
- generator_callback_(base::Bind(&GenerateRand0To99)) {}
-
-PercentileEstimator::~PercentileEstimator() = default;
-
-void PercentileEstimator::AddSample(int sample) {
- int rand100 = generator_callback_.Run();
- if (sample > current_estimate_ && rand100 > 1 - percentile_) {
- current_step_ += sign_positive_ ? 1 : -1;
- current_estimate_ += (current_step_ > 0) ? current_step_ : 1;
-
- // Clamp movement to distance to sample.
- if (current_estimate_ > sample) {
- current_step_ -= current_estimate_ - sample;
- current_estimate_ = sample;
- }
-
- // If we've reversed direction, reset the step down.
- if (!sign_positive_ && current_step_ > 1)
- current_step_ = 1;
-
- sign_positive_ = true;
- } else if (sample < current_estimate_ && rand100 > percentile_) {
- current_step_ += !sign_positive_ ? 1 : -1;
- current_estimate_ -= (current_step_ > 0) ? current_step_ : 1;
-
- // Clamp movement to distance to sample.
- if (current_estimate_ < sample) {
- current_step_ -= sample - current_estimate_;
- current_estimate_ = sample;
- }
-
- // If we've reversed direction, reset the step down.
- if (sign_positive_ && current_step_ > 1)
- current_step_ = 1;
-
- sign_positive_ = false;
- }
-}
-
-void PercentileEstimator::SetRandomNumberGeneratorForTesting(
- RandomNumberCallback generator_callback) {
- generator_callback_ = generator_callback;
-}
-
-} // namespace net
diff --git a/chromium/net/base/percentile_estimator.h b/chromium/net/base/percentile_estimator.h
deleted file mode 100644
index 0ff7b8176e2..00000000000
--- a/chromium/net/base/percentile_estimator.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_BASE_PERCENTILE_ESTIMATOR_H_
-#define NET_BASE_PERCENTILE_ESTIMATOR_H_
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "net/base/net_export.h"
-
-namespace net {
-
-// This class estimates statistical percentiles (e.g. 10%l, 50%l) for
-// integer distributions presented in stream form. These estimates
-// adjust automatically when the stream distribution changes.
-// TODO(rdsmith): Expand the class to maintain floating point
-// estimates rather than integer estimates, when there's a use case
-// for that that deserves the extra complexity and pitfalls of
-// floating point arithmetic.
-class NET_EXPORT PercentileEstimator {
- public:
- using RandomNumberCallback = base::Callback<int(void)>;
-
- static const int kMedianPercentile = 50;
-
- // |percentile| is a number between 0 and 100 indicating what percentile
- // should be estimated (e.g. 50 would be a median estimate).
- // |initial_estimate| is the value the class is seeded with; in other
- // words, if AddSample() is never called,
- // |CurrentEstimate() == initial_estimate|.
- PercentileEstimator(int percentile, int initial_estimate);
-
- ~PercentileEstimator();
-
- int current_estimate() const { return current_estimate_; }
- void AddSample(int sample);
-
- // Specify a callback that will generate a "random" number
- // in the range [0,99] on each call. Used so that tests can
- // rely on reproducible behavior.
- void SetRandomNumberGeneratorForTesting(
- RandomNumberCallback generator_callback);
-
- private:
- const int percentile_;
-
- bool sign_positive_;
- int current_estimate_;
- int current_step_;
-
- RandomNumberCallback generator_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(PercentileEstimator);
-};
-
-} // namespace net
-
-#endif // NET_BASE_PERCENTILE_ESTIMATOR_H_
diff --git a/chromium/net/base/percentile_estimator_unittest.cc b/chromium/net/base/percentile_estimator_unittest.cc
deleted file mode 100644
index 71d9c1d386b..00000000000
--- a/chromium/net/base/percentile_estimator_unittest.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2016 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/percentile_estimator.h"
-
-#include "base/bind.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// A number to turn sawtooth ramps from 0->100 into something that looks more
-// random to the algorithm.
-const int kPrimeMultipleToRandomizeRamps = 71;
-
-// Random numbers (fixed here for repeatability of tests). Generated originally
-// by using python's random module with randrange(0,100).
-int random_numbers[] = {
- 83, 11, 33, 98, 49, 54, 83, 19, 93, 37, 98, 39, 59, 13, 51, 39, 69, 18, 17,
- 17, 6, 85, 95, 51, 83, 39, 18, 82, 88, 47, 69, 27, 20, 82, 86, 38, 98, 65,
- 53, 13, 71, 66, 29, 40, 70, 28, 64, 35, 47, 50, 84, 90, 36, 54, 15, 93, 98,
- 51, 82, 50, 17, 46, 12, 18, 26, 39, 95, 61, 52, 63, 97, 92, 12, 71, 7, 15,
- 74, 10, 64, 57, 25, 82, 95, 40, 76, 8, 28, 83, 58, 1, 22, 58, 17, 33, 61,
- 94, 40, 50, 84, 47, 81, 9, 79, 16, 45, 78, 15, 3, 97, 60, 70, 25, 11, 11,
- 68, 64, 61, 84, 52, 64, 54, 72, 24, 46, 48, 4, 46, 34, 10, 97, 2, 42, 13,
- 9, 95, 75, 11, 99, 92, 33, 65, 48, 19, 72, 63, 39, 0, 10, 83, 62, 12, 99,
- 67, 98, 99, 83, 40, 45, 34, 80, 13, 94, 22, 74, 8, 11, 11, 98, 35, 86, 80,
- 94, 87, 60, 16, 46, 9, 25, 75, 50, 54, 23, 31, 63, 9, 50, 5, 18, 87, 16,
- 47, 72, 24, 93, 14, 1, 26, 41, 50, 49, 41, 77, 54, 48, 50, 3, 50, 16, 54,
- 97, 57, 63, 83, 33, 65, 90, 48, 55, 44, 11, 71, 6, 86, 29, 46, 61, 20, 8,
- 88, 3, 70, 76, 84, 59, 36, 50, 77, 63, 10, 55, 32, 82, 58, 19, 97, 8, 73,
- 47, 55, 74, 46, 52, 62, 19, 65, 75, 57, 23, 98, 39, 63, 19, 75, 48, 93, 58,
- 29, 96, 57, 31, 17, 33, 8, 69, 89, 90, 17, 79, 59, 67, 34, 20, 44, 80, 71,
- 79, 24, 63, 13, 27, 28, 61, 38, 67, 82, 46, 9, 4, 69, 41, 49, 49, 10, 3,
- 93, 46, 57, 96, 78, 51, 45, 37, 0, 6, 99, 93, 87, 18, 72, 83, 95, 39, 54,
- 84, 12, 47, 14, 55, 15, 27, 95, 6, 13, 80, 40, 8, 39, 18, 15, 52, 31, 66,
- 59, 67, 90, 12, 61, 77, 66, 61, 33, 89, 47, 40, 86, 34, 98, 13, 76, 30, 43,
- 56, 57, 88, 34, 48, 67, 6, 29, 92, 38, 11, 23, 74, 45, 38, 35, 94, 15, 72,
- 65, 20, 94, 72, 97, 78, 61, 79, 75, 0, 45, 38, 32, 94, 3, 5, 67, 91, 34,
- 37, 12, 11, 15, 75, 14, 73, 34, 55, 78, 64, 52, 29, 60, 62, 16, 51, 44, 78,
- 0, 15, 41, 5, 52, 4, 68, 53, 39, 39, 68, 71, 66, 68, 97, 65, 55, 39, 94,
- 57, 43, 81, 67, 22, 30, 64, 37, 42, 35, 60, 61, 2, 51, 49, 43, 82, 61, 70,
- 63, 47, 57, 8, 55, 96, 68, 7, 46, 69, 8, 43, 18, 9, 25, 8, 97, 98, 83,
- 79, 19, 92, 54, 90, 72, 80, 92, 94, 26, 48, 94, 74, 32, 29, 44, 34, 55, 56,
- 97, 40, 86, 35, 64, 25, 85, 13, 57, 2, 29, 77, 19, 94, 46, 85, 15, 71, 81,
- 25, 45, 2, 1, 62, 77, 28, 95, 72, 72, 28, 3, 36, 76, 81, 56, 52, 27, 62,
- 8, 5, 62, 1, 43, 68, 40, 68, 22, 65, 30, 50, 36, 89, 5, 71, 68, 99, 53,
- 22, 26, 0, 1, 72, 76, 79, 50, 2, 32, 39, 40, 6, 99, 60, 59, 55, 28, 17,
- 12, 94, 51, 3, 4, 71, 36, 88, 26, 99, 25, 13, 80, 53, 4, 57, 55, 44, 26,
- 82, 4, 53, 34, 47, 16, 97, 56, 30, 0, 73, 85, 59, 86, 24, 70, 73, 53, 68,
- 15, 91, 90, 74, 39, 61, 32, 98, 14, 82, 99, 31, 7, 99, 34, 6, 3, 30, 57,
- 44, 58, 86, 37, 12, 63, 82, 78, 94, 4, 93, 89, 92, 59, 40, 94, 88, 97, 95,
- 5, 88, 40, 80, 79, 0, 2, 46, 86, 46, 75, 87, 86, 8, 23, 35, 62, 79, 66,
- 16, 16, 45, 11, 78, 76, 40, 73, 85, 28, 44, 33, 34, 22, 11, 62, 8, 35, 88,
- 92, 35, 53, 50, 51, 54, 75, 41, 21, 83, 57, 82, 80, 84, 65, 19, 11, 85, 41,
- 80, 86, 62, 34, 54, 54, 79, 81, 52, 87, 54, 54, 43, 17, 44, 63, 54, 14, 88,
- 84, 86, 73, 58, 44, 2, 70, 86, 80, 94, 13, 85, 78, 6, 44, 11, 11, 97, 67,
- 65, 28, 42, 40, 84, 92, 66, 85, 75, 29, 84, 82, 54, 50, 26, 12, 83, 57, 90,
- 9, 40, 69, 38, 70, 65, 76, 85, 76, 4, 30, 86, 43, 79, 77, 69, 53, 35, 12,
- 98, 7, 47, 12, 63, 10, 81, 39, 88, 12, 16, 88, 22, 72, 25, 41, 22, 34, 87,
- 68, 51, 86, 45, 27, 51, 80, 69, 89, 64, 89, 68, 61, 80, 6, 83, 47, 18, 86,
- 73, 16, 61, 89, 47, 5, 33, 59, 47, 75, 15, 60, 28, 18, 59, 65, 51, 13, 28,
- 26, 84, 89, 80, 51, 15, 92, 36, 89, 83, 28, 56, 65, 25, 44, 84, 70, 26, 10,
- 74, 91, 55, 85, 73, 25, 24, 64, 11, 1, 55, 32, 45, 74, 4, 55, 98, 42, 91,
- 88, 18, 79, 37, 15, 5, 98, 63, 65, 77, 66, 18, 99, 1, 78, 96, 15, 16, 16,
- 51, 11, 47, 58, 1, 12, 46, 5, 56, 34, 40, 36, 20, 4, 89, 59, 4, 13, 3,
- 8, 74, 41, 21, 64, 88, 97, 42, 14, 29, 38, 53, 65, 55, 67, 33, 69, 17, 79,
- 45, 2, 63, 2, 97, 47, 73, 22, 86, 32, 31, 95, 90, 84, 25, 86, 91, 77, 1,
- 5, 6, 22, 91, 3, 94, 52, 2, 95, 17, 1, 19, 22, 34, 49, 96, 88, 63, 26,
- 5, 25, 75, 23, 25, 80, 21, 83, 86, 81, 11, 70, 67, 11, 95, 81, 57, 63, 8,
- 43, 60, 40, 42, 67, 50, 2, 51, 43, 34, 7, 1, 90, 59, 74, 87, 23, 23, 71,
- 20, 89, 2, 75, 21, 91, 32, 87, 67, 98, 99, 22, 31, 59, 50, 64, 55, 22, 84,
- 9, 31, 31, 84, 36, 92, 60, 37, 85, 18, 12, 38, 55, 55, 93, 36, 9, 46, 48,
- 24, 91, 60, 95, 55, 73, 63, 27, 55, 96, 79, 50, 41, 5, 67, 85, 99, 95, 3,
- 97, 28, 27, 78, 38, 11, 77, 11, 64, 25, 22, 88, 34, 86, 30, 78, 95, 17, 9,
- 29, 58, 35, 22, 99, 28, 66, 35, 60, 10, 7, 51, 64, 86, 30, 27, 97, 63, 0,
- 36, 87, 52, 16, 5, 90, 8, 66, 58, 91, 85, 3, 95, 31, 73, 87, 30, 78, 46,
- 30, 75, 36, 44, 52, 76, 24, 58, 8, 70, 58, 95, 88, 0, 35, 86, 21, 96, 90,
- 54, 85, 56, 30, 37, 30, 62, 56, 63, 91, 25, 56, 20, 56, 23, 12, 8, 70, 56,
- 83, 49, 70, 67, 61, 95, 50, 41, 88, 37, 89, 37, 21, 63, 25, 46, 16, 75, 73,
- 86, 39, 4, 55, 41, 39, 45, 31, 97, 6, 81, 68, 38, 49, 80, 9, 87, 22, 37,
- 41, 28, 47, 74, 76, 34, 72, 65, 34, 41, 59, 42, 73, 32, 75, 25, 18, 26, 71,
- 93, 92, 12, 76, 93, 84, 44, 43, 4, 9, 3, 90, 91, 45, 0, 10, 43, 45, 65,
- 34, 82, 54, 1, 78, 36, 74, 58, 3, 26, 89, 21, 57, 42, 37, 12, 90, 97, 48,
- 27, 75, 40, 69, 61, 56, 44, 75, 77, 55, 31, 0, 77, 12, 23, 16, 98, 77, 8,
- 96, 92, 91, 26, 50, 42, 65, 38, 58, 41, 45, 69, 42, 37, 89, 92, 40, 74, 68,
- 86, 80, 49, 16, 48, 74, 50, 92, 54, 6, 82, 21, 35, 57, 81, 29, 10, 60, 74,
- 41, 70, 18, 65, 44, 77, 64, 8, 87, 90, 24, 52, 67, 58, 56, 89, 47, 15, 20,
- 4, 87, 72, 87, 13, 79, 3, 26, 43, 52, 72, 83, 17, 99, 29, 10, 61, 62, 42,
- 35, 47, 42, 40, 17, 71, 54, 30, 99, 64, 78, 70, 75, 38, 32, 51, 2, 49, 47,
- 0, 41, 50, 41, 64, 57, 78, 22, 17, 94, 24, 65, 84, 38, 75, 3, 58, 18, 51,
- 91, 72, 91, 55, 6, 70, 76, 73, 30, 54, 73, 77, 45, 85, 88, 58, 25, 80, 35,
- 99, 57, 73, 15, 55, 71, 44, 44, 79, 20, 63, 29, 14, 51, 10, 46, 80, 36, 47,
- 80, 53, 15, 64, 42, 59, 94, 55, 99, 28, 76, 80, 51, 4, 98, 98, 38, 59, 71,
- 9, 93, 91, 46, 74, 63, 10, 39, 1, 43, 11, 64, 39, 59, 54, 9, 44, 78, 52,
- 98, 9, 73, 24, 15, 40, 5, 55, 23, 83, 67, 10, 58, 45, 64, 41, 92, 85, 72,
- 18, 67, 65, 30, 56, 84, 63, 96, 51, 55, 19, 70, 48, 81, 2, 37, 85, 77};
-
-class PercentileEstimatorTest : public testing::Test {
- public:
- PercentileEstimatorTest() : index_(0) {}
-
- // Create a new estimator with the given parameters.
- void SetUpEstimator(int percentile, int initial_estimate) {
- estimator_.reset(
- new net::PercentileEstimator(percentile, initial_estimate));
- estimator_->SetRandomNumberGeneratorForTesting(
- base::Bind(&PercentileEstimatorTest::GetRandomNumber,
- // Safe since |estimator_| is owned by and
- // will not survive destruction of |this|.
- base::Unretained(this)));
- }
-
- int CurrentEstimate() { return estimator_->current_estimate(); }
- void AddSample(int sample) { estimator_->AddSample(sample); }
-
- // Add the sample until there's a change in the estimate, then return the
- // new estimate. To get around the randomness of whether samples are
- // incorporated or not.
- int AddSampleUntilRegistered(int sample) {
- int old_estimate = estimator_->current_estimate();
- while (old_estimate == estimator_->current_estimate())
- estimator_->AddSample(sample);
-
- return estimator_->current_estimate();
- }
-
- int GetRandomNumber() {
- int result = random_numbers[index_];
- ++index_;
- if (static_cast<unsigned long>(index_) >=
- sizeof(random_numbers) / sizeof(int)) {
- index_ = 0;
- }
- return result;
- }
-
- private:
- int index_;
- std::unique_ptr<net::PercentileEstimator> estimator_;
-
- DISALLOW_COPY_AND_ASSIGN(PercentileEstimatorTest);
-};
-
-// Converges upwards fairly quickly.
-TEST_F(PercentileEstimatorTest, MedianConvergesUpwards) {
- SetUpEstimator(50, 100);
-
- for (int i = 0; i < 40; ++i)
- AddSample(150);
-
- EXPECT_EQ(150, CurrentEstimate());
-}
-
-// Converges downwards fairly quickly.
-TEST_F(PercentileEstimatorTest, MedianConvergesDownwards) {
- SetUpEstimator(50, 100);
-
- for (int i = 0; i < 40; ++i)
- AddSample(50);
-
- EXPECT_EQ(50, CurrentEstimate());
-}
-
-// Stable if the value is bouncing around.
-TEST_F(PercentileEstimatorTest, BounceStable) {
- SetUpEstimator(50, 100);
-
- for (int i = 0; i < 20; ++i)
- AddSample(50 + (i % 2) * 100);
-
- EXPECT_LE(97, CurrentEstimate());
- EXPECT_LE(CurrentEstimate(), 103);
-}
-
-// Correctly converges to a 90%l value upwards.
-TEST_F(PercentileEstimatorTest, NinetythConvergesUpwards) {
- SetUpEstimator(90, 50);
-
- for (int i = 0; i < 10000; ++i)
- AddSample((i * kPrimeMultipleToRandomizeRamps) % 100);
-
- EXPECT_LE(86, CurrentEstimate());
- EXPECT_LE(CurrentEstimate(), 94);
-}
-
-// Correctly converges to a 90%l value downwards.
-TEST_F(PercentileEstimatorTest, NinetythConvergesDownwards) {
- SetUpEstimator(90, 150);
-
- for (int i = 0; i < 1000; ++i)
- AddSample((i * kPrimeMultipleToRandomizeRamps) % 100);
-
- EXPECT_LT(86, CurrentEstimate());
- EXPECT_LT(CurrentEstimate(), 94);
-}
-
-// Doesn't overshoot sample heading upwards.
-TEST_F(PercentileEstimatorTest, NoUpwardsOvershoot) {
- SetUpEstimator(50, 100);
-
- // Crank up the step size
- for (int i = 0; i < 20; ++i)
- AddSample(1000);
-
- // Derive the step size.
- int e1 = CurrentEstimate();
- int e2 = AddSampleUntilRegistered(1000);
- int step_size = e2 - e1;
- ASSERT_GT(step_size, 1);
-
- // Increment by less than the current step size.
- int new_sample = e2 + step_size / 2;
- AddSampleUntilRegistered(new_sample);
- EXPECT_EQ(new_sample, CurrentEstimate());
- AddSampleUntilRegistered(1000);
- EXPECT_GT(new_sample + step_size, CurrentEstimate());
-}
-
-// Doesn't overshoot sample heading downwards
-TEST_F(PercentileEstimatorTest, NoDownwardsOvershoot) {
- SetUpEstimator(50, 1000);
-
- // Crank up the step size
- for (int i = 0; i < 20; ++i)
- AddSample(100);
-
- // Derive the step size.
- int e1 = CurrentEstimate();
- int e2 = AddSampleUntilRegistered(100);
- int step_size = e1 - e2;
- ASSERT_GT(step_size, 1);
-
- // Increment by less than the current step size.
- int new_sample = e2 - step_size / 2;
- AddSampleUntilRegistered(new_sample);
- EXPECT_EQ(new_sample, CurrentEstimate());
- AddSampleUntilRegistered(100);
- EXPECT_LT(new_sample - step_size, CurrentEstimate());
-}
-
-} // namespace
diff --git a/chromium/net/base/proxy_server.cc b/chromium/net/base/proxy_server.cc
index a6fb7788ea7..da31a40fbe8 100644
--- a/chromium/net/base/proxy_server.cc
+++ b/chromium/net/base/proxy_server.cc
@@ -96,33 +96,23 @@ const HostPortPair& ProxyServer::host_port_pair() const {
}
// static
-ProxyServer ProxyServer::FromURI(const std::string& uri,
- Scheme default_scheme) {
- return FromURI(uri.begin(), uri.end(), default_scheme);
-}
-
-// static
-ProxyServer ProxyServer::FromURI(std::string::const_iterator begin,
- std::string::const_iterator end,
- Scheme default_scheme) {
+ProxyServer ProxyServer::FromURI(base::StringPiece uri, Scheme default_scheme) {
// We will default to |default_scheme| if no scheme specifier was given.
Scheme scheme = default_scheme;
// Trim the leading/trailing whitespace.
- HttpUtil::TrimLWS(&begin, &end);
+ uri = HttpUtil::TrimLWS(uri);
// Check for [<scheme> "://"]
- std::string::const_iterator colon = std::find(begin, end, ':');
- if (colon != end &&
- (end - colon) >= 3 &&
- *(colon + 1) == '/' &&
- *(colon + 2) == '/') {
- scheme = GetSchemeFromURIInternal(base::StringPiece(begin, colon));
- begin = colon + 3; // Skip past the "://"
+ size_t colon = uri.find(':');
+ if (colon != base::StringPiece::npos && uri.size() - colon >= 3 &&
+ uri[colon + 1] == '/' && uri[colon + 2] == '/') {
+ scheme = GetSchemeFromURIInternal(uri.substr(0, colon));
+ uri = uri.substr(colon + 3); // Skip past the "://"
}
// Now parse the <host>[":"<port>].
- return FromSchemeHostAndPort(scheme, begin, end);
+ return FromSchemeHostAndPort(scheme, uri);
}
std::string ProxyServer::ToURI() const {
@@ -148,33 +138,27 @@ std::string ProxyServer::ToURI() const {
}
// static
-ProxyServer ProxyServer::FromPacString(const std::string& pac_string) {
- return FromPacString(pac_string.begin(), pac_string.end());
-}
-
-// static
-ProxyServer ProxyServer::FromPacString(std::string::const_iterator begin,
- std::string::const_iterator end) {
+ProxyServer ProxyServer::FromPacString(base::StringPiece pac_string) {
// Trim the leading/trailing whitespace.
- HttpUtil::TrimLWS(&begin, &end);
+ pac_string = HttpUtil::TrimLWS(pac_string);
// Input should match:
// "DIRECT" | ( <type> 1*(LWS) <host-and-port> )
// Start by finding the first space (if any).
- std::string::const_iterator space;
- for (space = begin; space != end; ++space) {
- if (HttpUtil::IsLWS(*space)) {
+ size_t space = 0;
+ for (; space < pac_string.size(); space++) {
+ if (HttpUtil::IsLWS(pac_string[space])) {
break;
}
}
// Everything to the left of the space is the scheme.
- Scheme scheme = GetSchemeFromPacTypeInternal(base::StringPiece(begin, space));
+ Scheme scheme = GetSchemeFromPacTypeInternal(pac_string.substr(0, space));
// And everything to the right of the space is the
// <host>[":" <port>].
- return FromSchemeHostAndPort(scheme, space, end);
+ return FromSchemeHostAndPort(scheme, pac_string.substr(space));
}
std::string ProxyServer::ToPacString() const {
@@ -229,13 +213,11 @@ size_t ProxyServer::EstimateMemoryUsage() const {
// static
ProxyServer ProxyServer::FromSchemeHostAndPort(
Scheme scheme,
- std::string::const_iterator begin,
- std::string::const_iterator end) {
-
+ base::StringPiece host_and_port) {
// Trim leading/trailing space.
- HttpUtil::TrimLWS(&begin, &end);
+ host_and_port = HttpUtil::TrimLWS(host_and_port);
- if (scheme == SCHEME_DIRECT && begin != end)
+ if (scheme == SCHEME_DIRECT && !host_and_port.empty())
return ProxyServer(); // Invalid -- DIRECT cannot have a host/port.
HostPortPair host_port_pair;
@@ -244,7 +226,7 @@ ProxyServer ProxyServer::FromSchemeHostAndPort(
std::string host;
int port = -1;
// If the scheme has a host/port, parse it.
- bool ok = ParseHostAndPort(begin, end, &host, &port);
+ bool ok = ParseHostAndPort(host_and_port, &host, &port);
if (!ok)
return ProxyServer(); // Invalid -- failed parsing <host>[":"<port>]
diff --git a/chromium/net/base/proxy_server.h b/chromium/net/base/proxy_server.h
index 0ce103bc9f0..43ad6da723b 100644
--- a/chromium/net/base/proxy_server.h
+++ b/chromium/net/base/proxy_server.h
@@ -14,6 +14,7 @@
#include <string>
#include <tuple>
+#include "base/strings/string_piece.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
@@ -95,10 +96,7 @@ class NET_EXPORT ProxyServer {
// "quic://foopy:17" {scheme=QUIC, host="foopy", port=17}
// "direct://" {scheme=DIRECT}
// "foopy:X" INVALID -- bad port.
- static ProxyServer FromURI(const std::string& uri, Scheme default_scheme);
- static ProxyServer FromURI(std::string::const_iterator uri_begin,
- std::string::const_iterator uri_end,
- Scheme default_scheme);
+ static ProxyServer FromURI(base::StringPiece uri, Scheme default_scheme);
// Formats as a URI string. This does the reverse of FromURI.
std::string ToURI() const;
@@ -117,9 +115,7 @@ class NET_EXPORT ProxyServer {
// "HTTPS foopy:123" {scheme=HTTPS, host="foopy", port=123}
// "QUIC foopy:123" {scheme=QUIC, host="foopy", port=123}
// "BLAH xxx:xx" INVALID
- static ProxyServer FromPacString(const std::string& pac_string);
- static ProxyServer FromPacString(std::string::const_iterator pac_string_begin,
- std::string::const_iterator pac_string_end);
+ static ProxyServer FromPacString(base::StringPiece pac_string);
// Returns a ProxyServer representing DIRECT connections.
static ProxyServer Direct() {
@@ -170,10 +166,8 @@ class NET_EXPORT ProxyServer {
private:
// Creates a ProxyServer given a scheme, and host/port string. If parsing the
// host/port string fails, the returned instance will be invalid.
- static ProxyServer FromSchemeHostAndPort(
- Scheme scheme,
- std::string::const_iterator host_and_port_begin,
- std::string::const_iterator host_and_port_end);
+ static ProxyServer FromSchemeHostAndPort(Scheme scheme,
+ base::StringPiece host_and_port);
Scheme scheme_ = SCHEME_INVALID;
HostPortPair host_port_pair_;
diff --git a/chromium/net/base/registry_controlled_domains/effective_tld_names.dat b/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
index efda68a1292..a210b9d6072 100644
--- a/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
+++ b/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
@@ -449,6 +449,7 @@ arq.br
art.br
ato.br
b.br
+barueri.br
belem.br
bhz.br
bio.br
@@ -1133,7 +1134,7 @@ gov.gy
net.gy
org.gy
-// hk : https://www.hkdnr.hk
+// hk : https://www.hkirc.hk
// Submitted by registry <hk.tech@hkirc.hk>
hk
com.hk
@@ -1344,10 +1345,8 @@ int.is
it
gov.it
edu.it
-// Reserved geo-names:
-// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
-// There is also a list of reserved geo-names corresponding to Italian municipalities
-// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
+// Reserved geo-names (regions and provinces):
+// http://www.nic.it/sites/default/files/docs/Regulation_assignation_v7.1.pdf
// Regions
abr.it
abruzzo.it
@@ -1401,6 +1400,12 @@ sicily.it
taa.it
tos.it
toscana.it
+trentin-sud-tirol.it
+trentin-süd-tirol.it
+trentin-sudtirol.it
+trentin-südtirol.it
+trentin-sued-tirol.it
+trentin-suedtirol.it
trentino-a-adige.it
trentino-aadige.it
trentino-alto-adige.it
@@ -1408,9 +1413,12 @@ trentino-altoadige.it
trentino-s-tirol.it
trentino-stirol.it
trentino-sud-tirol.it
+trentino-süd-tirol.it
trentino-sudtirol.it
+trentino-südtirol.it
trentino-sued-tirol.it
trentino-suedtirol.it
+trentino.it
trentinoa-adige.it
trentinoaadige.it
trentinoalto-adige.it
@@ -1418,9 +1426,17 @@ trentinoaltoadige.it
trentinos-tirol.it
trentinostirol.it
trentinosud-tirol.it
+trentinosüd-tirol.it
trentinosudtirol.it
+trentinosüdtirol.it
trentinosued-tirol.it
trentinosuedtirol.it
+trentinsud-tirol.it
+trentinsüd-tirol.it
+trentinsudtirol.it
+trentinsüdtirol.it
+trentinsued-tirol.it
+trentinsuedtirol.it
tuscany.it
umb.it
umbria.it
@@ -1435,7 +1451,13 @@ valleaosta.it
valled-aosta.it
valledaosta.it
vallee-aoste.it
+vallée-aoste.it
+vallee-d-aoste.it
+vallée-d-aoste.it
valleeaoste.it
+valléeaoste.it
+valleedaoste.it
+valléedaoste.it
vao.it
vda.it
ven.it
@@ -1468,6 +1490,9 @@ at.it
av.it
avellino.it
ba.it
+balsan-sudtirol.it
+balsan-südtirol.it
+balsan-suedtirol.it
balsan.it
bari.it
barletta-trani-andria.it
@@ -1482,13 +1507,21 @@ bl.it
bn.it
bo.it
bologna.it
+bolzano-altoadige.it
bolzano.it
+bozen-sudtirol.it
+bozen-südtirol.it
+bozen-suedtirol.it
bozen.it
br.it
brescia.it
brindisi.it
bs.it
bt.it
+bulsan-sudtirol.it
+bulsan-südtirol.it
+bulsan-suedtirol.it
+bulsan.it
bz.it
ca.it
cagliari.it
@@ -1506,7 +1539,9 @@ catanzaro.it
cb.it
ce.it
cesena-forli.it
+cesena-forlì.it
cesenaforli.it
+cesenaforlì.it
ch.it
chieti.it
ci.it
@@ -1537,7 +1572,9 @@ florence.it
fm.it
foggia.it
forli-cesena.it
+forlì-cesena.it
forlicesena.it
+forlìcesena.it
fr.it
frosinone.it
ge.it
@@ -1668,6 +1705,7 @@ sp.it
sr.it
ss.it
suedtirol.it
+südtirol.it
sv.it
ta.it
taranto.it
@@ -1686,7 +1724,6 @@ trani-barletta-andria.it
traniandriabarletta.it
tranibarlettaandria.it
trapani.it
-trentino.it
trento.it
treviso.it
trieste.it
@@ -6156,9 +6193,6 @@ nc.tr
// Used by government agencies of Northern Cyprus
gov.nc.tr
-// travel : https://en.wikipedia.org/wiki/.travel
-travel
-
// tt : http://www.nic.tt/
tt
co.tt
@@ -6733,8 +6767,16 @@ yt
ελ
// xn--j6w193g ("Hong Kong", Chinese) : HK
-// https://www2.hkirc.hk/register/rules.jsp
+// https://www.hkirc.hk
+// Submitted by registry <hk.tech@hkirc.hk>
+// https://www.hkirc.hk/content.jsp?id=30#!/34
香港
+公司.香港
+教育.香港
+政府.香港
+個人.香港
+網絡.香港
+組織.香港
// xn--2scrj9c ("Bharat", Kannada) : IN
// India
@@ -6768,6 +6810,10 @@ yt
// India
भारत
+// xn--mgbbh1a ("Bharat", Kashmiri) : IN
+// India
+بارت
+
// xn--mgbbh1a71e ("Bharat", Arabic) : IN
// India
بھارت
@@ -6982,7 +7028,10 @@ gov.zw
mil.zw
org.zw
-// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z
+
+// newGTLDs
+// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2018-05-08T19:40:37Z
+// This list is auto-generated, don't edit it manually.
// aaa : 2015-02-26 American Automobile Association, Inc.
aaa
@@ -7008,13 +7057,13 @@ abc
// able : 2015-06-25 Able Inc.
able
-// abogado : 2014-04-24 Top Level Domain Holdings Limited
+// abogado : 2014-04-24 Minds + Machines Group Limited
abogado
// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre
abudhabi
-// academy : 2013-11-07 Half Oaks, LLC
+// academy : 2013-11-07 Binky Moon, LLC
academy
// accenture : 2014-08-15 Accenture plc
@@ -7023,13 +7072,13 @@ accenture
// accountant : 2014-11-20 dot Accountant Limited
accountant
-// accountants : 2014-03-20 Knob Town, LLC
+// accountants : 2014-03-20 Binky Moon, LLC
accountants
// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG
aco
-// active : 2014-05-01 The Active Network, Inc
+// active : 2014-05-01 Active Network, LLC
active
// actor : 2013-12-12 United TLD Holdco Ltd.
@@ -7062,7 +7111,7 @@ africa
// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation)
agakhan
-// agency : 2013-11-14 Steel Falls, LLC
+// agency : 2013-11-14 Binky Moon, LLC
agency
// aig : 2014-12-18 American International Group, Inc.
@@ -7101,7 +7150,7 @@ allstate
// ally : 2015-06-18 Ally Financial Inc.
ally
-// alsace : 2014-07-02 REGION D ALSACE
+// alsace : 2014-07-02 Region Grand Est
alsace
// alstom : 2015-07-30 ALSTOM
@@ -7137,10 +7186,10 @@ anquan
// anz : 2015-07-31 Australia and New Zealand Banking Group Limited
anz
-// aol : 2015-09-17 AOL Inc.
+// aol : 2015-09-17 Oath Inc.
aol
-// apartments : 2014-12-11 June Maple, LLC
+// apartments : 2014-12-11 Binky Moon, LLC
apartments
// app : 2015-05-14 Charleston Road Registry Inc.
@@ -7158,7 +7207,7 @@ arab
// aramco : 2014-11-20 Aramco Services Company
aramco
-// archi : 2014-02-06 STARTING DOT LIMITED
+// archi : 2014-02-06 Afilias plc
archi
// army : 2014-03-06 United TLD Holdco Ltd.
@@ -7173,22 +7222,22 @@ arte
// asda : 2015-07-31 Wal-Mart Stores, Inc.
asda
-// associates : 2014-03-06 Baxter Hill, LLC
+// associates : 2014-03-06 Binky Moon, LLC
associates
// athleta : 2015-07-30 The Gap, Inc.
athleta
-// attorney : 2014-03-20
+// attorney : 2014-03-20 United TLD Holdco Ltd.
attorney
-// auction : 2014-03-20
+// auction : 2014-03-20 United TLD Holdco Ltd.
auction
// audi : 2015-05-21 AUDI Aktiengesellschaft
audi
-// audible : 2015-06-25 Amazon EU S.à r.l.
+// audible : 2015-06-25 Amazon Registry Services, Inc.
audible
// audio : 2014-03-20 Uniregistry, Corp.
@@ -7197,10 +7246,10 @@ audio
// auspost : 2015-08-13 Australian Postal Corporation
auspost
-// author : 2014-12-18 Amazon EU S.à r.l.
+// author : 2014-12-18 Amazon Registry Services, Inc.
author
-// auto : 2014-11-13
+// auto : 2014-11-13 Cars Registry Limited
auto
// autos : 2014-01-09 DERAutos, LLC
@@ -7209,7 +7258,7 @@ autos
// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca
avianca
-// aws : 2015-06-25 Amazon EU S.à r.l.
+// aws : 2015-06-25 Amazon Registry Services, Inc.
aws
// axa : 2013-12-19 AXA SA
@@ -7230,7 +7279,7 @@ banamex
// bananarepublic : 2015-07-31 The Gap, Inc.
bananarepublic
-// band : 2014-06-12
+// band : 2014-06-12 United TLD Holdco Ltd.
band
// bank : 2014-09-25 fTLD Registry Services LLC
@@ -7251,7 +7300,7 @@ barclays
// barefoot : 2015-06-11 Gallo Vineyards, Inc.
barefoot
-// bargains : 2013-11-14 Half Hallow, LLC
+// bargains : 2013-11-14 Binky Moon, LLC
bargains
// baseball : 2015-10-29 MLB Advanced Media DH, LLC
@@ -7287,7 +7336,7 @@ beats
// beauty : 2015-12-03 L'Oréal
beauty
-// beer : 2014-01-09 Top Level Domain Holdings Limited
+// beer : 2014-01-09 Minds + Machines Group Limited
beer
// bentley : 2014-12-18 Bentley Motors Limited
@@ -7314,19 +7363,19 @@ bible
// bid : 2013-12-19 dot Bid Limited
bid
-// bike : 2013-08-27 Grand Hollow, LLC
+// bike : 2013-08-27 Binky Moon, LLC
bike
// bing : 2014-12-18 Microsoft Corporation
bing
-// bingo : 2014-12-04 Sand Cedar, LLC
+// bingo : 2014-12-04 Binky Moon, LLC
bingo
-// bio : 2014-03-06 STARTING DOT LIMITED
+// bio : 2014-03-06 Afilias plc
bio
-// black : 2014-01-16 Afilias Limited
+// black : 2014-01-16 Afilias plc
black
// blackfriday : 2014-01-16 Uniregistry, Corp.
@@ -7338,13 +7387,13 @@ blanco
// blockbuster : 2015-07-30 Dish DBS Corporation
blockbuster
-// blog : 2015-05-14
+// blog : 2015-05-14 Knock Knock WHOIS There, LLC
blog
// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
bloomberg
-// blue : 2013-11-07 Afilias Limited
+// blue : 2013-11-07 Afilias plc
blue
// bms : 2014-10-30 Bristol-Myers Squibb Company
@@ -7365,7 +7414,7 @@ boats
// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH
boehringer
-// bofa : 2015-07-31 NMS Services, Inc.
+// bofa : 2015-07-31 Bank of America Corporation
bofa
// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
@@ -7377,28 +7426,25 @@ bond
// boo : 2014-01-30 Charleston Road Registry Inc.
boo
-// book : 2015-08-27 Amazon EU S.à r.l.
+// book : 2015-08-27 Amazon Registry Services, Inc.
book
// booking : 2015-07-16 Booking.com B.V.
booking
-// boots : 2015-01-08 THE BOOTS COMPANY PLC
-boots
-
// bosch : 2015-06-18 Robert Bosch GMBH
bosch
// bostik : 2015-05-28 Bostik SA
bostik
-// boston : 2015-12-10
+// boston : 2015-12-10 Boston TLD Management, LLC
boston
-// bot : 2014-12-18 Amazon EU S.à r.l.
+// bot : 2014-12-18 Amazon Registry Services, Inc.
bot
-// boutique : 2013-11-14 Over Galley, LLC
+// boutique : 2013-11-14 Binky Moon, LLC
boutique
// box : 2015-11-12 NS1 Limited
@@ -7413,7 +7459,7 @@ bridgestone
// broadway : 2014-12-22 Celebrate Broadway, Inc.
broadway
-// broker : 2014-12-11 IG Group Holdings PLC
+// broker : 2014-12-11 Dotbroker Registry Limited
broker
// brother : 2015-01-29 Brother Industries, Ltd.
@@ -7422,7 +7468,7 @@ brother
// brussels : 2014-02-06 DNS.be vzw
brussels
-// budapest : 2013-11-21 Top Level Domain Holdings Limited
+// budapest : 2013-11-21 Minds + Machines Group Limited
budapest
// bugatti : 2015-07-23 Bugatti International SA
@@ -7431,13 +7477,13 @@ bugatti
// build : 2013-11-07 Plan Bee LLC
build
-// builders : 2013-11-07 Atomic Madison, LLC
+// builders : 2013-11-07 Binky Moon, LLC
builders
-// business : 2013-11-07 Spring Cross, LLC
+// business : 2013-11-07 Binky Moon, LLC
business
-// buy : 2014-12-18 Amazon EU S.à r.l.
+// buy : 2014-12-18 Amazon Registry Services, Inc.
buy
// buzz : 2013-10-02 DOTSTRATEGY CO.
@@ -7446,16 +7492,16 @@ buzz
// bzh : 2014-02-27 Association www.bzh
bzh
-// cab : 2013-10-24 Half Sunset, LLC
+// cab : 2013-10-24 Binky Moon, LLC
cab
-// cafe : 2015-02-11 Pioneer Canyon, LLC
+// cafe : 2015-02-11 Binky Moon, LLC
cafe
// cal : 2014-07-24 Charleston Road Registry Inc.
cal
-// call : 2014-12-18 Amazon EU S.à r.l.
+// call : 2014-12-18 Amazon Registry Services, Inc.
call
// calvinklein : 2015-07-30 PVH gTLD Holdings LLC
@@ -7464,10 +7510,10 @@ calvinklein
// cam : 2016-04-21 AC Webconnecting Holding B.V.
cam
-// camera : 2013-08-27 Atomic Maple, LLC
+// camera : 2013-08-27 Binky Moon, LLC
camera
-// camp : 2013-11-07 Delta Dynamite, LLC
+// camp : 2013-11-07 Binky Moon, LLC
camp
// cancerresearch : 2014-05-15 Australian Cancer Research Foundation
@@ -7479,37 +7525,37 @@ canon
// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
capetown
-// capital : 2014-03-06 Delta Mill, LLC
+// capital : 2014-03-06 Binky Moon, LLC
capital
// capitalone : 2015-08-06 Capital One Financial Corporation
capitalone
-// car : 2015-01-22
+// car : 2015-01-22 Cars Registry Limited
car
// caravan : 2013-12-12 Caravan International, Inc.
caravan
-// cards : 2013-12-05 Foggy Hollow, LLC
+// cards : 2013-12-05 Binky Moon, LLC
cards
-// care : 2014-03-06 Goose Cross
+// care : 2014-03-06 Binky Moon, LLC
care
// career : 2013-10-09 dotCareer LLC
career
-// careers : 2013-10-02 Wild Corner, LLC
+// careers : 2013-10-02 Binky Moon, LLC
careers
-// cars : 2014-11-13
+// cars : 2014-11-13 Cars Registry Limited
cars
// cartier : 2014-06-23 Richemont DNS Inc.
cartier
-// casa : 2013-11-21 Top Level Domain Holdings Limited
+// casa : 2013-11-21 Minds + Machines Group Limited
casa
// case : 2015-09-03 CNH Industrial N.V.
@@ -7518,13 +7564,13 @@ case
// caseih : 2015-09-03 CNH Industrial N.V.
caseih
-// cash : 2014-03-06 Delta Lake, LLC
+// cash : 2014-03-06 Binky Moon, LLC
cash
-// casino : 2014-12-18 Binky Sky, LLC
+// casino : 2014-12-18 Binky Moon, LLC
casino
-// catering : 2013-12-05 New Falls. LLC
+// catering : 2013-12-05 Binky Moon, LLC
catering
// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
@@ -7545,7 +7591,7 @@ cbs
// ceb : 2015-04-09 The Corporate Executive Board Company
ceb
-// center : 2013-11-07 Tin Mill, LLC
+// center : 2013-11-07 Binky Moon, LLC
center
// ceo : 2013-11-07 CEOTLD Pty Ltd
@@ -7557,7 +7603,7 @@ cern
// cfa : 2014-08-28 CFA Institute
cfa
-// cfd : 2014-12-11 IG Group Holdings PLC
+// cfd : 2014-12-11 DotCFD Registry Limited
cfd
// chanel : 2015-04-09 Chanel International B.V.
@@ -7566,13 +7612,16 @@ chanel
// channel : 2014-05-08 Charleston Road Registry Inc.
channel
-// chase : 2015-04-30 JPMorgan Chase & Co.
+// charity : 2018-04-11 Corn Lake, LLC
+charity
+
+// chase : 2015-04-30 JPMorgan Chase Bank, National Association
chase
-// chat : 2014-12-04 Sand Fields, LLC
+// chat : 2014-12-04 Binky Moon, LLC
chat
-// cheap : 2013-11-14 Sand Cover, LLC
+// cheap : 2013-11-14 Binky Moon, LLC
cheap
// chintai : 2015-06-11 CHINTAI Corporation
@@ -7587,13 +7636,13 @@ chrome
// chrysler : 2015-07-30 FCA US LLC.
chrysler
-// church : 2014-02-06 Holly Fields, LLC
+// church : 2014-02-06 Binky Moon, LLC
church
// cipriani : 2015-02-19 Hotel Cipriani Srl
cipriani
-// circle : 2014-12-18 Amazon EU S.à r.l.
+// circle : 2014-12-18 Amazon Registry Services, Inc.
circle
// cisco : 2014-12-22 Cisco Technology, Inc.
@@ -7608,31 +7657,31 @@ citi
// citic : 2014-01-09 CITIC Group Corporation
citic
-// city : 2014-05-29 Snow Sky, LLC
+// city : 2014-05-29 Binky Moon, LLC
city
// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc.
cityeats
-// claims : 2014-03-20 Black Corner, LLC
+// claims : 2014-03-20 Binky Moon, LLC
claims
-// cleaning : 2013-12-05 Fox Shadow, LLC
+// cleaning : 2013-12-05 Binky Moon, LLC
cleaning
// click : 2014-06-05 Uniregistry, Corp.
click
-// clinic : 2014-03-20 Goose Park, LLC
+// clinic : 2014-03-20 Binky Moon, LLC
clinic
// clinique : 2015-10-01 The Estée Lauder Companies Inc.
clinique
-// clothing : 2013-08-27 Steel Lake, LLC
+// clothing : 2013-08-27 Binky Moon, LLC
clothing
-// cloud : 2015-04-16 ARUBA S.p.A.
+// cloud : 2015-04-16 Aruba PEC S.p.A.
cloud
// club : 2013-11-08 .CLUB DOMAINS, LLC
@@ -7641,19 +7690,19 @@ club
// clubmed : 2015-06-25 Club Méditerranée S.A.
clubmed
-// coach : 2014-10-09 Koko Island, LLC
+// coach : 2014-10-09 Binky Moon, LLC
coach
-// codes : 2013-10-31 Puff Willow, LLC
+// codes : 2013-10-31 Binky Moon, LLC
codes
-// coffee : 2013-10-17 Trixy Cover, LLC
+// coffee : 2013-10-17 Binky Moon, LLC
coffee
// college : 2014-01-16 XYZ.COM LLC
college
-// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH
+// cologne : 2014-02-05 punkt.wien GmbH
cologne
// comcast : 2015-07-23 Comcast IP Holdings I, LLC
@@ -7662,64 +7711,64 @@ comcast
// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
commbank
-// community : 2013-12-05 Fox Orchard, LLC
+// community : 2013-12-05 Binky Moon, LLC
community
-// company : 2013-11-07 Silver Avenue, LLC
+// company : 2013-11-07 Binky Moon, LLC
company
// compare : 2015-10-08 iSelect Ltd
compare
-// computer : 2013-10-24 Pine Mill, LLC
+// computer : 2013-10-24 Binky Moon, LLC
computer
// comsec : 2015-01-08 VeriSign, Inc.
comsec
-// condos : 2013-12-05 Pine House, LLC
+// condos : 2013-12-05 Binky Moon, LLC
condos
-// construction : 2013-09-16 Fox Dynamite, LLC
+// construction : 2013-09-16 Binky Moon, LLC
construction
-// consulting : 2013-12-05
+// consulting : 2013-12-05 United TLD Holdco Ltd.
consulting
// contact : 2015-01-08 Top Level Spectrum, Inc.
contact
-// contractors : 2013-09-10 Magic Woods, LLC
+// contractors : 2013-09-10 Binky Moon, LLC
contractors
-// cooking : 2013-11-21 Top Level Domain Holdings Limited
+// cooking : 2013-11-21 Minds + Machines Group Limited
cooking
// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
cookingchannel
-// cool : 2013-11-14 Koko Lake, LLC
+// cool : 2013-11-14 Binky Moon, LLC
cool
-// corsica : 2014-09-25 Collectivité Territoriale de Corse
+// corsica : 2014-09-25 Collectivité de Corse
corsica
-// country : 2013-12-19 Top Level Domain Holdings Limited
+// country : 2013-12-19 DotCountry LLC
country
-// coupon : 2015-02-26 Amazon EU S.à r.l.
+// coupon : 2015-02-26 Amazon Registry Services, Inc.
coupon
-// coupons : 2015-03-26 Black Island, LLC
+// coupons : 2015-03-26 Binky Moon, LLC
coupons
// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD
courses
-// credit : 2014-03-20 Snow Shadow, LLC
+// credit : 2014-03-20 Binky Moon, LLC
credit
-// creditcard : 2014-03-20 Binky Frostbite, LLC
+// creditcard : 2014-03-20 Binky Moon, LLC
creditcard
// creditunion : 2015-01-22 CUNA Performance Resources, LLC
@@ -7737,7 +7786,7 @@ crs
// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd.
cruise
-// cruises : 2013-12-05 Spring Way, LLC
+// cruises : 2013-12-05 Binky Moon, LLC
cruises
// csc : 2014-09-25 Alliance-One Services, Inc.
@@ -7767,7 +7816,7 @@ data
// date : 2014-11-20 dot Date Limited
date
-// dating : 2013-12-05 Pine Fest, LLC
+// dating : 2013-12-05 Binky Moon, LLC
dating
// datsun : 2014-03-27 NISSAN MOTOR CO., LTD.
@@ -7779,22 +7828,22 @@ day
// dclk : 2014-11-20 Charleston Road Registry Inc.
dclk
-// dds : 2015-05-07 Top Level Domain Holdings Limited
+// dds : 2015-05-07 Minds + Machines Group Limited
dds
-// deal : 2015-06-25 Amazon EU S.à r.l.
+// deal : 2015-06-25 Amazon Registry Services, Inc.
deal
// dealer : 2014-12-22 Dealer Dot Com, Inc.
dealer
-// deals : 2014-05-22 Sand Sunset, LLC
+// deals : 2014-05-22 Binky Moon, LLC
deals
-// degree : 2014-03-06
+// degree : 2014-03-06 United TLD Holdco Ltd.
degree
-// delivery : 2014-09-11 Steel Station, LLC
+// delivery : 2014-09-11 Binky Moon, LLC
delivery
// dell : 2014-10-24 Dell Inc.
@@ -7809,10 +7858,10 @@ delta
// democrat : 2013-10-24 United TLD Holdco Ltd.
democrat
-// dental : 2014-03-20 Tin Birch, LLC
+// dental : 2014-03-20 Binky Moon, LLC
dental
-// dentist : 2014-03-20
+// dentist : 2014-03-20 United TLD Holdco Ltd.
dentist
// desi : 2013-11-14 Desi Networks LLC
@@ -7827,22 +7876,22 @@ dev
// dhl : 2015-07-23 Deutsche Post AG
dhl
-// diamonds : 2013-09-22 John Edge, LLC
+// diamonds : 2013-09-22 Binky Moon, LLC
diamonds
// diet : 2014-06-26 Uniregistry, Corp.
diet
-// digital : 2014-03-06 Dash Park, LLC
+// digital : 2014-03-06 Binky Moon, LLC
digital
-// direct : 2014-04-10 Half Trail, LLC
+// direct : 2014-04-10 Binky Moon, LLC
direct
-// directory : 2013-09-20 Extra Madison, LLC
+// directory : 2013-09-20 Binky Moon, LLC
directory
-// discount : 2014-03-06 Holly Hill, LLC
+// discount : 2014-03-06 Binky Moon, LLC
discount
// discover : 2015-07-23 Discover Financial Services
@@ -7860,19 +7909,19 @@ dnp
// docs : 2014-10-16 Charleston Road Registry Inc.
docs
-// doctor : 2016-06-02 Brice Trail, LLC
+// doctor : 2016-06-02 Binky Moon, LLC
doctor
// dodge : 2015-07-30 FCA US LLC.
dodge
-// dog : 2014-12-04 Koko Mill, LLC
+// dog : 2014-12-04 Binky Moon, LLC
dog
// doha : 2014-09-18 Communications Regulatory Authority (CRA)
doha
-// domains : 2013-10-17 Sugar Cross, LLC
+// domains : 2013-10-17 Binky Moon, LLC
domains
// dot : 2015-05-21 Dish DBS Corporation
@@ -7923,25 +7972,25 @@ eco
// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V.
edeka
-// education : 2013-11-07 Brice Way, LLC
+// education : 2013-11-07 Binky Moon, LLC
education
-// email : 2013-10-31 Spring Madison, LLC
+// email : 2013-10-31 Binky Moon, LLC
email
// emerck : 2014-04-03 Merck KGaA
emerck
-// energy : 2014-09-11 Binky Birch, LLC
+// energy : 2014-09-11 Binky Moon, LLC
energy
// engineer : 2014-03-06 United TLD Holdco Ltd.
engineer
-// engineering : 2014-03-06 Romeo Canyon
+// engineering : 2014-03-06 Binky Moon, LLC
engineering
-// enterprises : 2013-09-20 Snow Oaks, LLC
+// enterprises : 2013-09-20 Binky Moon, LLC
enterprises
// epost : 2015-07-23 Deutsche Post AG
@@ -7950,7 +7999,7 @@ epost
// epson : 2014-12-04 Seiko Epson Corporation
epson
-// equipment : 2013-08-27 Corn Station, LLC
+// equipment : 2013-08-27 Binky Moon, LLC
equipment
// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson
@@ -7962,7 +8011,7 @@ erni
// esq : 2014-05-08 Charleston Road Registry Inc.
esq
-// estate : 2013-08-27 Trixy Park, LLC
+// estate : 2013-08-27 Binky Moon, LLC
estate
// esurance : 2015-07-23 Esurance Insurance Company
@@ -7977,22 +8026,22 @@ eurovision
// eus : 2013-12-12 Puntueus Fundazioa
eus
-// events : 2013-12-05 Pioneer Maple, LLC
+// events : 2013-12-05 Binky Moon, LLC
events
// everbank : 2014-05-15 EverBank
everbank
-// exchange : 2014-03-06 Spring Falls, LLC
+// exchange : 2014-03-06 Binky Moon, LLC
exchange
-// expert : 2013-11-21 Magic Pass, LLC
+// expert : 2013-11-21 Binky Moon, LLC
expert
-// exposed : 2013-12-05 Victor Beach, LLC
+// exposed : 2013-12-05 Binky Moon, LLC
exposed
-// express : 2015-02-11 Sea Sunset, LLC
+// express : 2015-02-11 Binky Moon, LLC
express
// extraspace : 2015-05-14 Extra Space Storage LLC
@@ -8001,7 +8050,7 @@ extraspace
// fage : 2014-12-18 Fage International S.A.
fage
-// fail : 2014-03-06 Atomic Pipe, LLC
+// fail : 2014-03-06 Binky Moon, LLC
fail
// fairwinds : 2014-11-13 FairWinds Partners, LLC
@@ -8010,25 +8059,25 @@ fairwinds
// faith : 2014-11-20 dot Faith Limited
faith
-// family : 2015-04-02
+// family : 2015-04-02 United TLD Holdco Ltd.
family
-// fan : 2014-03-06
+// fan : 2014-03-06 Asiamix Digital Limited
fan
// fans : 2014-11-07 Asiamix Digital Limited
fans
-// farm : 2013-11-07 Just Maple, LLC
+// farm : 2013-11-07 Binky Moon, LLC
farm
// farmers : 2015-07-09 Farmers Insurance Exchange
farmers
-// fashion : 2014-07-03 Top Level Domain Holdings Limited
+// fashion : 2014-07-03 Minds + Machines Group Limited
fashion
-// fast : 2014-12-18 Amazon EU S.à r.l.
+// fast : 2014-12-18 Amazon Registry Services, Inc.
fast
// fedex : 2015-08-06 Federal Express Corporation
@@ -8049,7 +8098,7 @@ fiat
// fidelity : 2015-07-30 Fidelity Brokerage Services LLC
fidelity
-// fido : 2015-08-06 Rogers Communications Partnership
+// fido : 2015-08-06 Rogers Communications Canada Inc.
fido
// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd
@@ -8058,43 +8107,43 @@ film
// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
final
-// finance : 2014-03-20 Cotton Cypress, LLC
+// finance : 2014-03-20 Binky Moon, LLC
finance
-// financial : 2014-03-06 Just Cover, LLC
+// financial : 2014-03-06 Binky Moon, LLC
financial
-// fire : 2015-06-25 Amazon EU S.à r.l.
+// fire : 2015-06-25 Amazon Registry Services, Inc.
fire
-// firestone : 2014-12-18 Bridgestone Corporation
+// firestone : 2014-12-18 Bridgestone Licensing Services, Inc
firestone
// firmdale : 2014-03-27 Firmdale Holdings Limited
firmdale
-// fish : 2013-12-12 Fox Woods, LLC
+// fish : 2013-12-12 Binky Moon, LLC
fish
-// fishing : 2013-11-21 Top Level Domain Holdings Limited
+// fishing : 2013-11-21 Minds + Machines Group Limited
fishing
-// fit : 2014-11-07 Top Level Domain Holdings Limited
+// fit : 2014-11-07 Minds + Machines Group Limited
fit
-// fitness : 2014-03-06 Brice Orchard, LLC
+// fitness : 2014-03-06 Binky Moon, LLC
fitness
// flickr : 2015-04-02 Yahoo! Domain Services Inc.
flickr
-// flights : 2013-12-05 Fox Station, LLC
+// flights : 2013-12-05 Binky Moon, LLC
flights
// flir : 2015-07-23 FLIR Systems, Inc.
flir
-// florist : 2013-11-07 Half Cypress, LLC
+// florist : 2013-11-07 Binky Moon, LLC
florist
// flowers : 2014-10-09 Uniregistry, Corp.
@@ -8112,28 +8161,28 @@ food
// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc.
foodnetwork
-// football : 2014-12-18 Foggy Farms, LLC
+// football : 2014-12-18 Binky Moon, LLC
football
// ford : 2014-11-13 Ford Motor Company
ford
-// forex : 2014-12-11 IG Group Holdings PLC
+// forex : 2014-12-11 Dotforex Registry Limited
forex
-// forsale : 2014-05-22
+// forsale : 2014-05-22 United TLD Holdco Ltd.
forsale
// forum : 2015-04-02 Fegistry, LLC
forum
-// foundation : 2013-12-05 John Dale, LLC
+// foundation : 2013-12-05 Binky Moon, LLC
foundation
// fox : 2015-09-11 FOX Registry, LLC
fox
-// free : 2015-12-10 Amazon EU S.à r.l.
+// free : 2015-12-10 Amazon Registry Services, Inc.
free
// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH
@@ -8160,25 +8209,25 @@ fujitsu
// fujixerox : 2015-07-23 Xerox DNHC LLC
fujixerox
-// fun : 2016-01-14
+// fun : 2016-01-14 DotSpace Inc.
fun
-// fund : 2014-03-20 John Castle, LLC
+// fund : 2014-03-20 Binky Moon, LLC
fund
-// furniture : 2014-03-20 Lone Fields, LLC
+// furniture : 2014-03-20 Binky Moon, LLC
furniture
-// futbol : 2013-09-20
+// futbol : 2013-09-20 United TLD Holdco Ltd.
futbol
-// fyi : 2015-04-02 Silver Tigers, LLC
+// fyi : 2015-04-02 Binky Moon, LLC
fyi
// gal : 2013-11-07 Asociación puntoGAL
gal
-// gallery : 2013-09-13 Sugar House, LLC
+// gallery : 2013-09-13 Binky Moon, LLC
gallery
// gallo : 2015-06-11 Gallo Vineyards, Inc.
@@ -8190,13 +8239,13 @@ gallup
// game : 2015-05-28 Uniregistry, Corp.
game
-// games : 2015-05-28
+// games : 2015-05-28 United TLD Holdco Ltd.
games
// gap : 2015-07-31 The Gap, Inc.
gap
-// garden : 2014-06-26 Top Level Domain Holdings Limited
+// garden : 2014-06-26 Minds + Machines Group Limited
garden
// gbiz : 2014-07-17 Charleston Road Registry Inc.
@@ -8208,7 +8257,7 @@ gdn
// gea : 2014-12-04 GEA Group Aktiengesellschaft
gea
-// gent : 2014-01-23 COMBELL GROUP NV/SA
+// gent : 2014-01-23 COMBELL NV
gent
// genting : 2015-03-12 Resorts World Inc Pte. Ltd.
@@ -8220,10 +8269,10 @@ george
// ggee : 2014-01-09 GMO Internet, Inc.
ggee
-// gift : 2013-10-17 Uniregistry, Corp.
+// gift : 2013-10-17 DotGift, LLC
gift
-// gifts : 2014-07-03 Goose Sky, LLC
+// gifts : 2014-07-03 Binky Moon, LLC
gifts
// gives : 2014-03-06 United TLD Holdco Ltd.
@@ -8235,13 +8284,13 @@ giving
// glade : 2015-07-23 Johnson Shareholdings, Inc.
glade
-// glass : 2013-11-07 Black Cover, LLC
+// glass : 2013-11-07 Binky Moon, LLC
glass
// gle : 2014-07-24 Charleston Road Registry Inc.
gle
-// global : 2014-04-17 Dot GLOBAL AS
+// global : 2014-04-17 Dot Global Domain Registry Limited
global
// globo : 2013-12-19 Globo Comunicação e Participações S.A
@@ -8250,10 +8299,10 @@ globo
// gmail : 2014-05-01 Charleston Road Registry Inc.
gmail
-// gmbh : 2016-01-29 Extra Dynamite, LLC
+// gmbh : 2016-01-29 Binky Moon, LLC
gmbh
-// gmo : 2014-01-09 GMO Internet, Inc.
+// gmo : 2014-01-09 GMO Internet Pte. Ltd.
gmo
// gmx : 2014-04-24 1&1 Mail & Media GmbH
@@ -8262,13 +8311,13 @@ gmx
// godaddy : 2015-07-23 Go Daddy East, LLC
godaddy
-// gold : 2015-01-22 June Edge, LLC
+// gold : 2015-01-22 Binky Moon, LLC
gold
// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
goldpoint
-// golf : 2014-12-18 Lone falls, LLC
+// golf : 2014-12-18 Binky Moon, LLC
golf
// goo : 2014-12-18 NTT Resonant Inc.
@@ -8289,28 +8338,28 @@ google
// gop : 2014-01-16 Republican State Leadership Committee, Inc.
gop
-// got : 2014-12-18 Amazon EU S.à r.l.
+// got : 2014-12-18 Amazon Registry Services, Inc.
got
// grainger : 2015-05-07 Grainger Registry Services, LLC
grainger
-// graphics : 2013-09-13 Over Madison, LLC
+// graphics : 2013-09-13 Binky Moon, LLC
graphics
-// gratis : 2014-03-20 Pioneer Tigers, LLC
+// gratis : 2014-03-20 Binky Moon, LLC
gratis
-// green : 2014-05-08 Afilias Limited
+// green : 2014-05-08 Afilias plc
green
-// gripe : 2014-03-06 Corn Sunset, LLC
+// gripe : 2014-03-06 Binky Moon, LLC
gripe
// grocery : 2016-06-16 Wal-Mart Stores, Inc.
grocery
-// group : 2014-08-15 Romeo Town, LLC
+// group : 2014-08-15 Binky Moon, LLC
group
// guardian : 2015-07-30 The Guardian Life Insurance Company of America
@@ -8322,13 +8371,13 @@ gucci
// guge : 2014-08-28 Charleston Road Registry Inc.
guge
-// guide : 2013-09-13 Snow Moon, LLC
+// guide : 2013-09-13 Binky Moon, LLC
guide
// guitars : 2013-11-14 Uniregistry, Corp.
guitars
-// guru : 2013-08-27 Pioneer Cypress, LLC
+// guru : 2013-08-27 Binky Moon, LLC
guru
// hair : 2015-12-03 L'Oréal
@@ -8340,7 +8389,7 @@ hamburg
// hangout : 2014-11-13 Charleston Road Registry Inc.
hangout
-// haus : 2013-12-05
+// haus : 2013-12-05 United TLD Holdco Ltd.
haus
// hbo : 2015-07-30 HBO Registry Services, Inc.
@@ -8355,7 +8404,7 @@ hdfcbank
// health : 2015-02-11 DotHealth, LLC
health
-// healthcare : 2014-06-12 Silver Glen, LLC
+// healthcare : 2014-06-12 Binky Moon, LLC
healthcare
// help : 2014-06-26 Uniregistry, Corp.
@@ -8382,22 +8431,22 @@ hisamitsu
// hitachi : 2014-10-31 Hitachi, Ltd.
hitachi
-// hiv : 2014-03-13
+// hiv : 2014-03-13 Uniregistry, Corp.
hiv
// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited
hkt
-// hockey : 2015-03-19 Half Willow, LLC
+// hockey : 2015-03-19 Binky Moon, LLC
hockey
-// holdings : 2013-08-27 John Madison, LLC
+// holdings : 2013-08-27 Binky Moon, LLC
holdings
-// holiday : 2013-11-07 Goose Woods, LLC
+// holiday : 2013-11-07 Binky Moon, LLC
holiday
-// homedepot : 2015-04-02 Homer TLC, Inc.
+// homedepot : 2015-04-02 Home Depot Product Authority, LLC
homedepot
// homegoods : 2015-07-16 The TJX Companies, Inc.
@@ -8415,10 +8464,10 @@ honda
// honeywell : 2015-07-23 Honeywell GTLD LLC
honeywell
-// horse : 2013-11-21 Top Level Domain Holdings Limited
+// horse : 2013-11-21 Minds + Machines Group Limited
horse
-// hospital : 2016-10-20 Ruby Pike, LLC
+// hospital : 2016-10-20 Binky Moon, LLC
hospital
// host : 2014-04-17 DotHost Inc.
@@ -8427,7 +8476,7 @@ host
// hosting : 2014-05-29 Uniregistry, Corp.
hosting
-// hot : 2015-08-27 Amazon EU S.à r.l.
+// hot : 2015-08-27 Amazon Registry Services, Inc.
hot
// hoteles : 2015-03-05 Travel Reservations SRL
@@ -8439,13 +8488,13 @@ hotels
// hotmail : 2014-12-18 Microsoft Corporation
hotmail
-// house : 2013-11-07 Sugar Park, LLC
+// house : 2013-11-07 Binky Moon, LLC
house
// how : 2014-01-23 Charleston Road Registry Inc.
how
-// hsbc : 2014-10-24 HSBC Holdings PLC
+// hsbc : 2014-10-24 HSBC Global Services (UK) Limited
hsbc
// hughes : 2015-07-30 Hughes Satellite Systems Corporation
@@ -8466,7 +8515,7 @@ icbc
// ice : 2014-10-30 IntercontinentalExchange, Inc.
ice
-// icu : 2015-01-08 One.com A/S
+// icu : 2015-01-08 ShortDot SA
icu
// ieee : 2015-07-23 IEEE Global LLC
@@ -8481,16 +8530,19 @@ ikano
// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation)
imamat
-// imdb : 2015-06-25 Amazon EU S.à r.l.
+// imdb : 2015-06-25 Amazon Registry Services, Inc.
imdb
-// immo : 2014-07-10 Auburn Bloom, LLC
+// immo : 2014-07-10 Binky Moon, LLC
immo
// immobilien : 2013-11-07 United TLD Holdco Ltd.
immobilien
-// industries : 2013-12-05 Outer House, LLC
+// inc : 2018-03-10 GTLD Limited
+inc
+
+// industries : 2013-12-05 Binky Moon, LLC
industries
// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD.
@@ -8502,31 +8554,31 @@ ing
// ink : 2013-12-05 Top Level Design, LLC
ink
-// institute : 2013-11-07 Outer Maple, LLC
+// institute : 2013-11-07 Binky Moon, LLC
institute
// insurance : 2015-02-19 fTLD Registry Services LLC
insurance
-// insure : 2014-03-20 Pioneer Willow, LLC
+// insure : 2014-03-20 Binky Moon, LLC
insure
// intel : 2015-08-06 Intel Corporation
intel
-// international : 2013-11-07 Wild Way, LLC
+// international : 2013-11-07 Binky Moon, LLC
international
// intuit : 2015-07-30 Intuit Administrative Services, Inc.
intuit
-// investments : 2014-03-20 Holly Glen, LLC
+// investments : 2014-03-20 Binky Moon, LLC
investments
// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A.
ipiranga
-// irish : 2014-08-07 Dot-Irish LLC
+// irish : 2014-08-07 Binky Moon, LLC
irish
// iselect : 2015-02-11 iSelect Ltd
@@ -8568,13 +8620,13 @@ jcp
// jeep : 2015-07-30 FCA US LLC.
jeep
-// jetzt : 2014-01-09
+// jetzt : 2014-01-09 Binky Moon, LLC
jetzt
-// jewelry : 2015-03-05 Wild Bloom, LLC
+// jewelry : 2015-03-05 Binky Moon, LLC
jewelry
-// jio : 2015-04-02 Affinity Names, Inc.
+// jio : 2015-04-02 Reliance Industries Limited
jio
// jlc : 2014-12-04 Richemont DNS Inc.
@@ -8592,13 +8644,13 @@ jnj
// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
joburg
-// jot : 2014-12-18 Amazon EU S.à r.l.
+// jot : 2014-12-18 Amazon Registry Services, Inc.
jot
-// joy : 2014-12-18 Amazon EU S.à r.l.
+// joy : 2014-12-18 Amazon Registry Services, Inc.
joy
-// jpmorgan : 2015-04-30 JPMorgan Chase & Co.
+// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association
jpmorgan
// jprs : 2014-09-18 Japan Registry Services Co., Ltd.
@@ -8631,22 +8683,22 @@ kfh
// kia : 2015-07-09 KIA MOTORS CORPORATION
kia
-// kim : 2013-09-23 Afilias Limited
+// kim : 2013-09-23 Afilias plc
kim
// kinder : 2014-11-07 Ferrero Trading Lux S.A.
kinder
-// kindle : 2015-06-25 Amazon EU S.à r.l.
+// kindle : 2015-06-25 Amazon Registry Services, Inc.
kindle
-// kitchen : 2013-09-20 Just Goodbye, LLC
+// kitchen : 2013-09-20 Binky Moon, LLC
kitchen
// kiwi : 2013-09-20 DOT KIWI LIMITED
kiwi
-// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH
+// koeln : 2014-01-09 punkt.wien GmbH
koeln
// komatsu : 2015-01-08 Komatsu Ltd.
@@ -8673,7 +8725,7 @@ kuokgroup
// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen
kyoto
-// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA
+// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa”
lacaixa
// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC
@@ -8694,7 +8746,7 @@ lancia
// lancome : 2015-07-23 L'Oréal
lancome
-// land : 2013-09-10 Pine Moon, LLC
+// land : 2013-09-10 Binky Moon, LLC
land
// landrover : 2014-11-13 Jaguar Land Rover Ltd
@@ -8718,13 +8770,13 @@ latrobe
// law : 2015-01-22 Minds + Machines Group Limited
law
-// lawyer : 2014-03-20
+// lawyer : 2014-03-20 United TLD Holdco Ltd.
lawyer
// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant")
lds
-// lease : 2014-03-06 Victor Trail, LLC
+// lease : 2014-03-06 Binky Moon, LLC
lease
// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
@@ -8733,7 +8785,7 @@ leclerc
// lefrak : 2015-07-16 LeFrak Organization, Inc.
lefrak
-// legal : 2014-10-16 Blue Falls, LLC
+// legal : 2014-10-16 Binky Moon, LLC
legal
// lego : 2015-07-16 LEGO Juris A/S
@@ -8742,7 +8794,7 @@ lego
// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION
lexus
-// lgbt : 2014-05-08 Afilias Limited
+// lgbt : 2014-05-08 Afilias plc
lgbt
// liaison : 2014-10-02 Liaison Technologies, Incorporated
@@ -8751,7 +8803,7 @@ liaison
// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
lidl
-// life : 2014-02-06 Trixy Oaks, LLC
+// life : 2014-02-06 Binky Moon, LLC
life
// lifeinsurance : 2015-01-15 American Council of Life Insurers
@@ -8760,19 +8812,19 @@ lifeinsurance
// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc.
lifestyle
-// lighting : 2013-08-27 John McCook, LLC
+// lighting : 2013-08-27 Binky Moon, LLC
lighting
-// like : 2014-12-18 Amazon EU S.à r.l.
+// like : 2014-12-18 Amazon Registry Services, Inc.
like
// lilly : 2015-07-31 Eli Lilly and Company
lilly
-// limited : 2014-03-06 Big Fest, LLC
+// limited : 2014-03-06 Binky Moon, LLC
limited
-// limo : 2013-10-17 Hidden Frostbite, LLC
+// limo : 2013-10-17 Binky Moon, LLC
limo
// lincoln : 2014-11-13 Ford Motor Company
@@ -8787,7 +8839,7 @@ link
// lipsy : 2015-06-25 Lipsy Ltd
lipsy
-// live : 2014-12-04
+// live : 2014-12-04 United TLD Holdco Ltd.
live
// living : 2015-07-30 Lifestyle Domain Holdings, Inc.
@@ -8796,10 +8848,13 @@ living
// lixil : 2015-03-19 LIXIL Group Corporation
lixil
+// llc : 2017-12-14 Afilias plc
+llc
+
// loan : 2014-11-20 dot Loan Limited
loan
-// loans : 2014-03-20 June Woods, LLC
+// loans : 2014-03-20 Binky Moon, LLC
loans
// locker : 2015-06-04 Dish DBS Corporation
@@ -8820,7 +8875,7 @@ london
// lotte : 2014-11-07 Lotte Holdings Co., Ltd.
lotte
-// lotto : 2014-04-10 Afilias Limited
+// lotto : 2014-04-10 Afilias plc
lotto
// love : 2014-12-22 Merchant Law Group LLP
@@ -8832,10 +8887,10 @@ lpl
// lplfinancial : 2015-07-30 LPL Holdings, Inc.
lplfinancial
-// ltd : 2014-09-25 Over Corner, LLC
+// ltd : 2014-09-25 Binky Moon, LLC
ltd
-// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA
+// ltda : 2014-04-17 InterNetX, Corp
ltda
// lundbeck : 2015-08-06 H. Lundbeck A/S
@@ -8844,7 +8899,7 @@ lundbeck
// lupin : 2014-11-07 LUPIN LIMITED
lupin
-// luxe : 2014-01-09 Top Level Domain Holdings Limited
+// luxe : 2014-01-09 Minds + Machines Group Limited
luxe
// luxury : 2013-10-17 Luxury Partners, LLC
@@ -8859,7 +8914,7 @@ madrid
// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF)
maif
-// maison : 2013-12-05 Victor Frostbite, LLC
+// maison : 2013-12-05 Binky Moon, LLC
maison
// makeup : 2015-01-15 L'Oréal
@@ -8868,7 +8923,7 @@ makeup
// man : 2014-12-04 MAN SE
man
-// management : 2013-11-07 John Goodbye, LLC
+// management : 2013-11-07 Binky Moon, LLC
management
// mango : 2013-10-24 PUNTO FA S.L.
@@ -8877,13 +8932,13 @@ mango
// map : 2016-06-09 Charleston Road Registry Inc.
map
-// market : 2014-03-06
+// market : 2014-03-06 United TLD Holdco Ltd.
market
-// marketing : 2013-11-07 Fern Pass, LLC
+// marketing : 2013-11-07 Binky Moon, LLC
marketing
-// markets : 2014-12-11 IG Group Holdings PLC
+// markets : 2014-12-11 Dotmarkets Registry Limited
markets
// marriott : 2014-10-09 Marriott Worldwide Corporation
@@ -8898,7 +8953,7 @@ maserati
// mattel : 2015-08-06 Mattel Sites, Inc.
mattel
-// mba : 2015-04-02 Lone Hollow, LLC
+// mba : 2015-04-02 Binky Moon, LLC
mba
// mckinsey : 2015-07-31 McKinsey Holdings, Inc.
@@ -8907,10 +8962,10 @@ mckinsey
// med : 2015-08-06 Medistry LLC
med
-// media : 2014-03-06 Grand Glen, LLC
+// media : 2014-03-06 Binky Moon, LLC
media
-// meet : 2014-01-16
+// meet : 2014-01-16 Charleston Road Registry Inc.
meet
// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation
@@ -8928,7 +8983,7 @@ men
// menu : 2013-09-11 Wedding TLD2, LLC
menu
-// meo : 2014-11-07 PT Comunicacoes S.A.
+// meo : 2014-11-07 MEO Servicos de Comunicacoes e Multimedia, S.A.
meo
// merckmsd : 2016-07-14 MSD Registry Holdings, Inc.
@@ -8937,7 +8992,7 @@ merckmsd
// metlife : 2015-05-07 MetLife Services and Solutions, LLC
metlife
-// miami : 2013-12-19 Top Level Domain Holdings Limited
+// miami : 2013-12-19 Minds + Machines Group Limited
miami
// microsoft : 2014-12-18 Microsoft Corporation
@@ -8976,7 +9031,7 @@ moda
// moe : 2013-11-13 Interlink Co., Ltd.
moe
-// moi : 2014-12-18 Amazon EU S.à r.l.
+// moi : 2014-12-18 Amazon Registry Services, Inc.
moi
// mom : 2015-04-16 Uniregistry, Corp.
@@ -8985,7 +9040,7 @@ mom
// monash : 2013-09-30 Monash University
monash
-// money : 2014-10-16 Outer McCook, LLC
+// money : 2014-10-16 Binky Moon, LLC
money
// monster : 2015-09-11 Monster Worldwide, Inc.
@@ -8997,13 +9052,13 @@ mopar
// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant")
mormon
-// mortgage : 2014-03-20
+// mortgage : 2014-03-20 United TLD Holdco Ltd.
mortgage
// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
moscow
-// moto : 2015-06-04
+// moto : 2015-06-04 Motorola Trademark Holdings, LLC
moto
// motorcycles : 2014-01-09 DERMotorcycles, LLC
@@ -9012,7 +9067,7 @@ motorcycles
// mov : 2014-01-30 Charleston Road Registry Inc.
mov
-// movie : 2015-02-05 New Frostbite, LLC
+// movie : 2015-02-05 Binky Moon, LLC
movie
// movistar : 2014-10-16 Telefónica S.A.
@@ -9024,9 +9079,6 @@ msd
// mtn : 2014-12-04 MTN Dubai Limited
mtn
-// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation
-mtpc
-
// mtr : 2015-03-12 MTR Corporation Limited
mtr
@@ -9036,7 +9088,7 @@ mutual
// nab : 2015-08-20 National Australia Bank Limited
nab
-// nadex : 2014-12-11 IG Group Holdings PLC
+// nadex : 2014-12-11 Nadex Domains, Inc.
nadex
// nagoya : 2013-10-24 GMO Registry, Inc.
@@ -9063,10 +9115,10 @@ netbank
// netflix : 2015-06-18 Netflix, Inc.
netflix
-// network : 2013-11-14 Trixy Manor, LLC
+// network : 2013-11-14 Binky Moon, LLC
network
-// neustar : 2013-12-05 NeuStar, Inc.
+// neustar : 2013-12-05 Registry Services, LLC
neustar
// new : 2014-01-30 Charleston Road Registry Inc.
@@ -9075,7 +9127,7 @@ new
// newholland : 2015-09-03 CNH Industrial N.V.
newholland
-// news : 2014-12-18
+// news : 2014-12-18 United TLD Holdco Ltd.
news
// next : 2015-06-18 Next plc
@@ -9123,7 +9175,7 @@ northwesternmutual
// norton : 2014-12-04 Symantec Corporation
norton
-// now : 2015-06-25 Amazon EU S.à r.l.
+// now : 2015-06-25 Amazon Registry Services, Inc.
now
// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
@@ -9147,7 +9199,7 @@ nyc
// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA
obi
-// observer : 2015-04-30
+// observer : 2015-04-30 Top Level Spectrum, Inc.
observer
// off : 2015-07-23 Johnson Shareholdings, Inc.
@@ -9156,7 +9208,7 @@ off
// office : 2015-03-12 Microsoft Corporation
office
-// okinawa : 2013-12-05 BusinessRalliart Inc.
+// okinawa : 2013-12-05 BRregistry, Inc.
okinawa
// olayan : 2015-05-14 Crescent Holding GmbH
@@ -9201,13 +9253,13 @@ oracle
// orange : 2015-03-12 Orange Brand Services Limited
orange
-// organic : 2014-03-27 Afilias Limited
+// organic : 2014-03-27 Afilias plc
organic
// origins : 2015-10-01 The Estée Lauder Companies Inc.
origins
-// osaka : 2014-09-04 Interlink Co., Ltd.
+// osaka : 2014-09-04 Osaka Registry Co., Ltd.
osaka
// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd.
@@ -9234,10 +9286,10 @@ paris
// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
pars
-// partners : 2013-12-05 Magic Glen, LLC
+// partners : 2013-12-05 Binky Moon, LLC
partners
-// parts : 2013-12-05 Sea Goodbye, LLC
+// parts : 2013-12-05 Binky Moon, LLC
parts
// party : 2014-09-11 Blue Sky Registry Limited
@@ -9246,7 +9298,7 @@ party
// passagens : 2015-03-05 Travel Reservations SRL
passagens
-// pay : 2015-08-27 Amazon EU S.à r.l.
+// pay : 2015-08-27 Amazon Registry Services, Inc.
pay
// pccw : 2015-05-14 PCCW Enterprises Limited
@@ -9273,10 +9325,10 @@ phone
// photo : 2013-11-14 Uniregistry, Corp.
photo
-// photography : 2013-09-20 Sugar Glen, LLC
+// photography : 2013-09-20 Binky Moon, LLC
photography
-// photos : 2013-10-17 Sea Corner, LLC
+// photos : 2013-10-17 Binky Moon, LLC
photos
// physio : 2014-05-01 PhysBiz Pty Ltd
@@ -9291,28 +9343,28 @@ pics
// pictet : 2014-06-26 Pictet Europe S.A.
pictet
-// pictures : 2014-03-06 Foggy Sky, LLC
+// pictures : 2014-03-06 Binky Moon, LLC
pictures
// pid : 2015-01-08 Top Level Spectrum, Inc.
pid
-// pin : 2014-12-18 Amazon EU S.à r.l.
+// pin : 2014-12-18 Amazon Registry Services, Inc.
pin
// ping : 2015-06-11 Ping Registry Provider, Inc.
ping
-// pink : 2013-10-01 Afilias Limited
+// pink : 2013-10-01 Afilias plc
pink
// pioneer : 2015-07-16 Pioneer Corporation
pioneer
-// pizza : 2014-06-26 Foggy Moon, LLC
+// pizza : 2014-06-26 Binky Moon, LLC
pizza
-// place : 2014-04-24 Snow Galley, LLC
+// place : 2014-04-24 Binky Moon, LLC
place
// play : 2015-03-05 Charleston Road Registry Inc.
@@ -9321,10 +9373,10 @@ play
// playstation : 2015-07-02 Sony Computer Entertainment Inc.
playstation
-// plumbing : 2013-09-10 Spring Tigers, LLC
+// plumbing : 2013-09-10 Binky Moon, LLC
plumbing
-// plus : 2015-02-05 Sugar Mill, LLC
+// plus : 2015-02-05 Binky Moon, LLC
plus
// pnc : 2015-07-02 PNC Domain Co., LLC
@@ -9333,7 +9385,7 @@ pnc
// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
pohl
-// poker : 2014-07-03 Afilias Domains No. 5 Limited
+// poker : 2014-07-03 Afilias plc
poker
// politie : 2015-08-20 Politie Nederland
@@ -9351,13 +9403,13 @@ praxi
// press : 2014-04-03 DotPress Inc.
press
-// prime : 2015-06-25 Amazon EU S.à r.l.
+// prime : 2015-06-25 Amazon Registry Services, Inc.
prime
// prod : 2014-01-23 Charleston Road Registry Inc.
prod
-// productions : 2013-12-05 Magic Birch, LLC
+// productions : 2013-12-05 Binky Moon, LLC
productions
// prof : 2014-07-24 Charleston Road Registry Inc.
@@ -9366,16 +9418,16 @@ prof
// progressive : 2015-07-23 Progressive Casualty Insurance Company
progressive
-// promo : 2014-12-18
+// promo : 2014-12-18 Afilias plc
promo
-// properties : 2013-12-05 Big Pass, LLC
+// properties : 2013-12-05 Binky Moon, LLC
properties
// property : 2014-05-22 Uniregistry, Corp.
property
-// protection : 2015-04-23
+// protection : 2015-04-23 XYZ.COM LLC
protection
// pru : 2015-07-30 Prudential Financial, Inc.
@@ -9411,7 +9463,7 @@ radio
// raid : 2015-07-23 Johnson Shareholdings, Inc.
raid
-// read : 2014-12-18 Amazon EU S.à r.l.
+// read : 2014-12-18 Amazon Registry Services, Inc.
read
// realestate : 2015-09-11 dotRealEstate LLC
@@ -9423,10 +9475,10 @@ realtor
// realty : 2015-03-19 Fegistry, LLC
realty
-// recipes : 2013-10-17 Grand Island, LLC
+// recipes : 2013-10-17 Binky Moon, LLC
recipes
-// red : 2013-11-07 Afilias Limited
+// red : 2013-11-07 Afilias plc
red
// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd.
@@ -9438,10 +9490,10 @@ redumbrella
// rehab : 2014-03-06 United TLD Holdco Ltd.
rehab
-// reise : 2014-03-13
+// reise : 2014-03-13 Binky Moon, LLC
reise
-// reisen : 2014-03-06 New Cypress, LLC
+// reisen : 2014-03-06 Binky Moon, LLC
reisen
// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc.
@@ -9453,16 +9505,16 @@ reliance
// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd.
ren
-// rent : 2014-12-04 DERRent, LLC
+// rent : 2014-12-04 XYZ.COM LLC
rent
-// rentals : 2013-12-05 Big Hollow,LLC
+// rentals : 2013-12-05 Binky Moon, LLC
rentals
-// repair : 2013-11-07 Lone Sunset, LLC
+// repair : 2013-11-07 Binky Moon, LLC
repair
-// report : 2013-12-05 Binky Glen, LLC
+// report : 2013-12-05 Binky Moon, LLC
report
// republican : 2014-03-20 United TLD Holdco Ltd.
@@ -9471,13 +9523,13 @@ republican
// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
rest
-// restaurant : 2014-07-03 Snow Avenue, LLC
+// restaurant : 2014-07-03 Binky Moon, LLC
restaurant
// review : 2014-11-20 dot Review Limited
review
-// reviews : 2013-09-13
+// reviews : 2013-09-13 United TLD Holdco Ltd.
reviews
// rexroth : 2015-06-18 Robert Bosch GMBH
@@ -9510,16 +9562,16 @@ rmit
// rocher : 2014-12-18 Ferrero Trading Lux S.A.
rocher
-// rocks : 2013-11-14
+// rocks : 2013-11-14 United TLD Holdco Ltd.
rocks
-// rodeo : 2013-12-19 Top Level Domain Holdings Limited
+// rodeo : 2013-12-19 Minds + Machines Group Limited
rodeo
-// rogers : 2015-08-06 Rogers Communications Partnership
+// rogers : 2015-08-06 Rogers Communications Canada Inc.
rogers
-// room : 2014-12-18 Amazon EU S.à r.l.
+// room : 2014-12-18 Amazon Registry Services, Inc.
room
// rsvp : 2014-05-08 Charleston Road Registry Inc.
@@ -9531,19 +9583,19 @@ rugby
// ruhr : 2013-10-02 regiodot GmbH & Co. KG
ruhr
-// run : 2015-03-19 Snow Park, LLC
+// run : 2015-03-19 Binky Moon, LLC
run
// rwe : 2015-04-02 RWE AG
rwe
-// ryukyu : 2014-01-09 BusinessRalliart Inc.
+// ryukyu : 2014-01-09 BRregistry, Inc.
ryukyu
// saarland : 2013-12-12 dotSaarland GmbH
saarland
-// safe : 2014-12-18 Amazon EU S.à r.l.
+// safe : 2014-12-18 Amazon Registry Services, Inc.
safe
// safety : 2015-01-08 Safety Registry Services, LLC.
@@ -9552,10 +9604,10 @@ safety
// sakura : 2014-12-18 SAKURA Internet Inc.
sakura
-// sale : 2014-10-16
+// sale : 2014-10-16 United TLD Holdco Ltd.
sale
-// salon : 2014-12-11 Outer Orchard, LLC
+// salon : 2014-12-11 Binky Moon, LLC
salon
// samsclub : 2015-07-31 Wal-Mart Stores, Inc.
@@ -9576,16 +9628,16 @@ sanofi
// sap : 2014-03-27 SAP AG
sap
-// sapo : 2014-11-07 PT Comunicacoes S.A.
+// sapo : 2014-11-07 MEO Servicos de Comunicacoes e Multimedia, S.A.
sapo
-// sarl : 2014-07-03 Delta Orchard, LLC
+// sarl : 2014-07-03 Binky Moon, LLC
sarl
// sas : 2015-04-02 Research IP LLC
sas
-// save : 2015-06-25 Amazon EU S.à r.l.
+// save : 2015-06-25 Amazon Registry Services, Inc.
save
// saxo : 2014-10-31 Saxo Bank A/S
@@ -9612,10 +9664,10 @@ schmidt
// scholarships : 2014-04-24 Scholarships.com, LLC
scholarships
-// school : 2014-12-18 Little Galley, LLC
+// school : 2014-12-18 Binky Moon, LLC
school
-// schule : 2014-03-06 Outer Moon, LLC
+// schule : 2014-03-06 Binky Moon, LLC
schule
// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
@@ -9639,10 +9691,10 @@ search
// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal)
seat
-// secure : 2015-08-27 Amazon EU S.à r.l.
+// secure : 2015-08-27 Amazon Registry Services, Inc.
secure
-// security : 2015-05-14
+// security : 2015-05-14 XYZ.COM LLC
security
// seek : 2014-12-04 Seek Limited
@@ -9654,7 +9706,7 @@ select
// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A.
sener
-// services : 2014-02-27 Fox Castle, LLC
+// services : 2014-02-27 Binky Moon, LLC
services
// ses : 2015-07-23 SES
@@ -9690,22 +9742,22 @@ shell
// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
shia
-// shiksha : 2013-11-14 Afilias Limited
+// shiksha : 2013-11-14 Afilias plc
shiksha
-// shoes : 2013-10-02 Binky Galley, LLC
+// shoes : 2013-10-02 Binky Moon, LLC
shoes
// shop : 2016-04-08 GMO Registry, Inc.
shop
-// shopping : 2016-03-31
+// shopping : 2016-03-31 Binky Moon, LLC
shopping
// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
shouji
-// show : 2015-03-05 Snow Beach, LLC
+// show : 2015-03-05 Binky Moon, LLC
show
// showtime : 2015-08-06 CBS Domains Inc.
@@ -9714,25 +9766,25 @@ showtime
// shriram : 2014-01-23 Shriram Capital Ltd.
shriram
-// silk : 2015-06-25 Amazon EU S.à r.l.
+// silk : 2015-06-25 Amazon Registry Services, Inc.
silk
// sina : 2015-03-12 Sina Corporation
sina
-// singles : 2013-08-27 Fern Madison, LLC
+// singles : 2013-08-27 Binky Moon, LLC
singles
// site : 2015-01-15 DotSite Inc.
site
-// ski : 2015-04-09 STARTING DOT LIMITED
+// ski : 2015-04-09 Afilias plc
ski
// skin : 2015-01-15 L'Oréal
skin
-// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
+// sky : 2014-06-19 Sky International AG
sky
// skype : 2014-12-18 Microsoft Corporation
@@ -9744,13 +9796,13 @@ sling
// smart : 2015-07-09 Smart Communications, Inc. (SMART)
smart
-// smile : 2014-12-18 Amazon EU S.à r.l.
+// smile : 2014-12-18 Amazon Registry Services, Inc.
smile
// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F
sncf
-// soccer : 2015-03-26 Foggy Shadow, LLC
+// soccer : 2015-03-26 Binky Moon, LLC
soccer
// social : 2013-11-07 United TLD Holdco Ltd.
@@ -9759,19 +9811,19 @@ social
// softbank : 2015-07-02 SoftBank Corp.
softbank
-// software : 2014-03-20
+// software : 2014-03-20 United TLD Holdco Ltd.
software
// sohu : 2013-12-19 Sohu.com Limited
sohu
-// solar : 2013-11-07 Ruby Town, LLC
+// solar : 2013-11-07 Binky Moon, LLC
solar
-// solutions : 2013-11-07 Silver Cover, LLC
+// solutions : 2013-11-07 Binky Moon, LLC
solutions
-// song : 2015-02-26 Amazon EU S.à r.l.
+// song : 2015-02-26 Amazon Registry Services, Inc.
song
// sony : 2015-01-08 Sony Corporation
@@ -9786,13 +9838,16 @@ space
// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG
spiegel
-// spot : 2015-02-26 Amazon EU S.à r.l.
+// sport : 2017-11-16 Global Association of International Sports Federations (GAISF)
+sport
+
+// spot : 2015-02-26 Amazon Registry Services, Inc.
spot
-// spreadbetting : 2014-12-11 IG Group Holdings PLC
+// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited
spreadbetting
-// srl : 2015-05-07 mySRL GmbH
+// srl : 2015-05-07 InterNetX, Corp
srl
// srt : 2015-07-30 FCA US LLC.
@@ -9828,7 +9883,7 @@ stcgroup
// stockholm : 2014-12-18 Stockholms kommun
stockholm
-// storage : 2014-12-22 Self Storage Company LLC
+// storage : 2014-12-22 XYZ.COM LLC
storage
// store : 2015-04-09 DotStore Inc.
@@ -9837,7 +9892,7 @@ store
// stream : 2016-01-08 dot Stream Limited
stream
-// studio : 2015-02-11
+// studio : 2015-02-11 United TLD Holdco Ltd.
studio
// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD
@@ -9846,22 +9901,22 @@ study
// style : 2014-12-04 Binky Moon, LLC
style
-// sucks : 2014-12-22 Vox Populi Registry Inc.
+// sucks : 2014-12-22 Vox Populi Registry Ltd.
sucks
-// supplies : 2013-12-19 Atomic Fields, LLC
+// supplies : 2013-12-19 Binky Moon, LLC
supplies
-// supply : 2013-12-19 Half Falls, LLC
+// supply : 2013-12-19 Binky Moon, LLC
supply
-// support : 2013-10-24 Grand Orchard, LLC
+// support : 2013-10-24 Binky Moon, LLC
support
-// surf : 2014-01-09 Top Level Domain Holdings Limited
+// surf : 2014-01-09 Minds + Machines Group Limited
surf
-// surgery : 2014-03-20 Tin Avenue, LLC
+// surgery : 2014-03-20 Binky Moon, LLC
surgery
// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION
@@ -9882,7 +9937,7 @@ sydney
// symantec : 2014-12-04 Symantec Corporation
symantec
-// systems : 2013-11-07 Dash Cypress, LLC
+// systems : 2013-11-07 Binky Moon, LLC
systems
// tab : 2014-12-04 Tabcorp Holdings Limited
@@ -9891,7 +9946,7 @@ tab
// taipei : 2014-07-10 Taipei City Government
taipei
-// talk : 2015-04-09 Amazon EU S.à r.l.
+// talk : 2015-04-09 Amazon Registry Services, Inc.
talk
// taobao : 2015-01-15 Alibaba Group Holding Limited
@@ -9909,10 +9964,10 @@ tatar
// tattoo : 2013-08-30 Uniregistry, Corp.
tattoo
-// tax : 2014-03-20 Storm Orchard, LLC
+// tax : 2014-03-20 Binky Moon, LLC
tax
-// taxi : 2015-03-19 Pine Falls, LLC
+// taxi : 2015-03-19 Binky Moon, LLC
taxi
// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
@@ -9921,13 +9976,13 @@ tci
// tdk : 2015-06-11 TDK Corporation
tdk
-// team : 2015-03-05 Atomic Lake, LLC
+// team : 2015-03-05 Binky Moon, LLC
team
-// tech : 2015-01-30 Dot Tech LLC
+// tech : 2015-01-30 Personals TLD Inc.
tech
-// technology : 2013-09-13 Auburn Falls
+// technology : 2013-09-13 Binky Moon, LLC
technology
// telecity : 2015-02-19 TelecityGroup International Limited
@@ -9939,19 +9994,19 @@ telefonica
// temasek : 2014-08-07 Temasek Holdings (Private) Limited
temasek
-// tennis : 2014-12-04 Cotton Bloom, LLC
+// tennis : 2014-12-04 Binky Moon, LLC
tennis
// teva : 2015-07-02 Teva Pharmaceutical Industries Limited
teva
-// thd : 2015-04-02 Homer TLC, Inc.
+// thd : 2015-04-02 Home Depot Product Authority, LLC
thd
-// theater : 2015-03-19 Blue Tigers, LLC
+// theater : 2015-03-19 Binky Moon, LLC
theater
-// theatre : 2015-05-07
+// theatre : 2015-05-07 XYZ.COM LLC
theatre
// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America
@@ -9960,16 +10015,16 @@ tiaa
// tickets : 2015-02-05 Accent Media Limited
tickets
-// tienda : 2013-11-14 Victor Manor, LLC
+// tienda : 2013-11-14 Binky Moon, LLC
tienda
// tiffany : 2015-01-30 Tiffany and Company
tiffany
-// tips : 2013-09-20 Corn Willow, LLC
+// tips : 2013-09-20 Binky Moon, LLC
tips
-// tires : 2014-11-07 Dog Edge, LLC
+// tires : 2014-11-07 Binky Moon, LLC
tires
// tirol : 2014-04-24 punkt Tirol GmbH
@@ -9987,16 +10042,16 @@ tkmaxx
// tmall : 2015-01-15 Alibaba Group Holding Limited
tmall
-// today : 2013-09-20 Pearl Woods, LLC
+// today : 2013-09-20 Binky Moon, LLC
today
// tokyo : 2013-11-13 GMO Registry, Inc.
tokyo
-// tools : 2013-11-21 Pioneer North, LLC
+// tools : 2013-11-21 Binky Moon, LLC
tools
-// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd.
+// top : 2014-03-20 .TOP Registry
top
// toray : 2014-12-18 Toray Industries, Inc.
@@ -10008,27 +10063,30 @@ toshiba
// total : 2015-08-06 Total SA
total
-// tours : 2015-01-22 Sugar Station, LLC
+// tours : 2015-01-22 Binky Moon, LLC
tours
-// town : 2014-03-06 Koko Moon, LLC
+// town : 2014-03-06 Binky Moon, LLC
town
// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION
toyota
-// toys : 2014-03-06 Pioneer Orchard, LLC
+// toys : 2014-03-06 Binky Moon, LLC
toys
// trade : 2014-01-23 Elite Registry Limited
trade
-// trading : 2014-12-11 IG Group Holdings PLC
+// trading : 2014-12-11 Dottrading Registry Limited
trading
-// training : 2013-11-07 Wild Willow, LLC
+// training : 2013-11-07 Binky Moon, LLC
training
+// travel : Dog Beach, LLC
+travel
+
// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
travelchannel
@@ -10038,7 +10096,7 @@ travelers
// travelersinsurance : 2015-03-26 Travelers TLD, LLC
travelersinsurance
-// trust : 2014-10-16
+// trust : 2014-10-16 NCC Group Inc.
trust
// trv : 2015-03-26 Travelers TLD, LLC
@@ -10050,10 +10108,10 @@ tube
// tui : 2014-07-03 TUI AG
tui
-// tunes : 2015-02-26 Amazon EU S.à r.l.
+// tunes : 2015-02-26 Amazon Registry Services, Inc.
tunes
-// tushu : 2014-12-18 Amazon EU S.à r.l.
+// tushu : 2014-12-18 Amazon Registry Services, Inc.
tushu
// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED
@@ -10071,7 +10129,7 @@ uconnect
// unicom : 2015-10-15 China United Network Communications Corporation Limited
unicom
-// university : 2014-03-06 Little Station, LLC
+// university : 2014-03-06 Binky Moon, LLC
university
// uno : 2013-09-11 Dot Latin LLC
@@ -10083,7 +10141,7 @@ uol
// ups : 2015-06-25 UPS Market Driver, Inc.
ups
-// vacations : 2013-12-05 Atomic Tigers, LLC
+// vacations : 2013-12-05 Binky Moon, LLC
vacations
// vana : 2014-12-11 Lifestyle Domain Holdings, Inc.
@@ -10095,22 +10153,22 @@ vanguard
// vegas : 2014-01-16 Dot Vegas, Inc.
vegas
-// ventures : 2013-08-27 Binky Lake, LLC
+// ventures : 2013-08-27 Binky Moon, LLC
ventures
// verisign : 2015-08-13 VeriSign, Inc.
verisign
-// versicherung : 2014-03-20
+// versicherung : 2014-03-20 TLD-BOX Registrydienstleistungen GmbH
versicherung
-// vet : 2014-03-06
+// vet : 2014-03-06 United TLD Holdco Ltd.
vet
-// viajes : 2013-10-17 Black Madison, LLC
+// viajes : 2013-10-17 Binky Moon, LLC
viajes
-// video : 2014-10-16
+// video : 2014-10-16 United TLD Holdco Ltd.
video
// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe
@@ -10119,10 +10177,10 @@ vig
// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd.
viking
-// villas : 2013-12-05 New Sky, LLC
+// villas : 2013-12-05 Binky Moon, LLC
villas
-// vin : 2015-06-18 Holly Shadow, LLC
+// vin : 2015-06-18 Binky Moon, LLC
vin
// vip : 2015-01-22 Minds + Machines Group Limited
@@ -10134,7 +10192,7 @@ virgin
// visa : 2015-07-30 Visa Worldwide Pte. Limited
visa
-// vision : 2013-12-05 Koko Station, LLC
+// vision : 2013-12-05 Binky Moon, LLC
vision
// vista : 2014-09-18 Vistaprint Limited
@@ -10152,7 +10210,7 @@ vivo
// vlaanderen : 2014-02-06 DNS.be vzw
vlaanderen
-// vodka : 2013-12-19 Top Level Domain Holdings Limited
+// vodka : 2013-12-19 Minds + Machines Group Limited
vodka
// volkswagen : 2015-05-14 Volkswagen Group of America Inc.
@@ -10170,7 +10228,7 @@ voting
// voto : 2013-11-21 Monolith Registry LLC
voto
-// voyage : 2013-08-27 Ruby House, LLC
+// voyage : 2013-08-27 Binky Moon, LLC
voyage
// vuelos : 2015-03-05 Travel Reservations SRL
@@ -10185,25 +10243,25 @@ walmart
// walter : 2014-11-13 Sandvik AB
walter
-// wang : 2013-10-24 Zodiac Leo Limited
+// wang : 2013-10-24 Zodiac Wang Limited
wang
-// wanggou : 2014-12-18 Amazon EU S.à r.l.
+// wanggou : 2014-12-18 Amazon Registry Services, Inc.
wanggou
// warman : 2015-06-18 Weir Group IP Limited
warman
-// watch : 2013-11-14 Sand Shadow, LLC
+// watch : 2013-11-14 Binky Moon, LLC
watch
// watches : 2014-12-22 Richemont DNS Inc.
watches
-// weather : 2015-01-08 The Weather Channel, LLC
+// weather : 2015-01-08 International Business Machines Corporation
weather
-// weatherchannel : 2015-03-12 The Weather Channel, LLC
+// weatherchannel : 2015-03-12 International Business Machines Corporation
weatherchannel
// webcam : 2014-01-23 dot Webcam Limited
@@ -10218,7 +10276,7 @@ website
// wed : 2013-10-01 Atgron, Inc.
wed
-// wedding : 2014-04-24 Top Level Domain Holdings Limited
+// wedding : 2014-04-24 Minds + Machines Group Limited
wedding
// weibo : 2015-03-05 Sina Corporation
@@ -10245,7 +10303,7 @@ win
// windows : 2014-12-18 Microsoft Corporation
windows
-// wine : 2015-06-18 June Station, LLC
+// wine : 2015-06-18 Binky Moon, LLC
wine
// winners : 2015-07-16 The TJX Companies, Inc.
@@ -10260,22 +10318,22 @@ wolterskluwer
// woodside : 2015-07-09 Woodside Petroleum Limited
woodside
-// work : 2013-12-19 Top Level Domain Holdings Limited
+// work : 2013-12-19 Minds + Machines Group Limited
work
-// works : 2013-11-14 Little Dynamite, LLC
+// works : 2013-11-14 Binky Moon, LLC
works
-// world : 2014-06-12 Bitter Fields, LLC
+// world : 2014-06-12 Binky Moon, LLC
world
-// wow : 2015-10-08 Amazon EU S.à r.l.
+// wow : 2015-10-08 Amazon Registry Services, Inc.
wow
// wtc : 2013-12-19 World Trade Centers Association, Inc.
wtc
-// wtf : 2014-03-06 Hidden Way, LLC
+// wtf : 2014-03-06 Binky Moon, LLC
wtf
// xbox : 2014-12-18 Microsoft Corporation
@@ -10296,7 +10354,7 @@ xin
// xn--11b4c3d : 2015-01-15 VeriSign Sarl
कॉम
-// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l.
+// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc.
セール
// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd.
@@ -10320,7 +10378,7 @@ xin
// xn--42c2d9a : 2015-01-15 VeriSign Sarl
คอม
-// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited
+// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd
八卦
// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment
@@ -10329,7 +10387,7 @@ xin
// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center
公益
-// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC)
公司
// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited
@@ -10338,7 +10396,7 @@ xin
// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited
网站
-// xn--6frz82g : 2013-09-23 Afilias Limited
+// xn--6frz82g : 2013-09-23 Afilias plc
移动
// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited
@@ -10371,7 +10429,7 @@ xin
// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited
淡马锡
-// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l.
+// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc.
ファッション
// xn--c1avg : 2013-11-14 Public Interest Registry
@@ -10380,7 +10438,7 @@ xin
// xn--c2br7g : 2015-01-15 VeriSign Sarl
नेट
-// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l.
+// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc.
ストア
// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD
@@ -10389,25 +10447,25 @@ xin
// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited
商标
-// xn--czrs0t : 2013-12-19 Wild Island, LLC
+// xn--czrs0t : 2013-12-19 Binky Moon, LLC
商店
-// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited
+// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited
商城
// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet”
дети
-// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l.
+// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc.
ポイント
-// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社
+// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd.
新闻
// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited
工行
-// xn--fct429k : 2015-04-09 Amazon EU S.à r.l.
+// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc.
家電
// xn--fhbei : 2015-01-15 VeriSign Sarl
@@ -10419,7 +10477,7 @@ xin
// xn--fiq64b : 2013-10-14 CITIC Group Corporation
中信
-// xn--fjq720a : 2014-05-22 Will Bloom, LLC
+// xn--fjq720a : 2014-05-22 Binky Moon, LLC
娱乐
// xn--flw351e : 2014-07-31 Charleston Road Registry Inc.
@@ -10431,13 +10489,13 @@ xin
// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited
购物
-// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l.
+// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc.
クラウド
-// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l.
+// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc.
通販
-// xn--hxt814e : 2014-05-15 Zodiac Libra Limited
+// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited
网店
// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry
@@ -10446,7 +10504,7 @@ xin
// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited
餐厅
-// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC)
网络
// xn--j1aef : 2015-01-15 VeriSign Sarl
@@ -10455,7 +10513,7 @@ xin
// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation
诺基亚
-// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l.
+// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc.
食品
// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V.
@@ -10515,6 +10573,9 @@ xin
// xn--nyqy26a : 2014-11-07 Stable Tone Limited
健康
+// xn--otu796d : 2017-08-06 Dot Trademark TLD Holding Company Limited
+招聘
+
// xn--p1acf : 2013-12-12 Rusnames Limited
рус
@@ -10533,10 +10594,10 @@ xin
// xn--rhqv96g : 2013-09-11 Stable Tone Limited
世界
-// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l.
+// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc.
書籍
-// xn--ses554g : 2014-01-16
+// xn--ses554g : 2014-01-16 KNET Co., Ltd.
网址
// xn--t60b56a : 2015-01-15 VeriSign Sarl
@@ -10548,7 +10609,7 @@ xin
// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
天主教
-// xn--unup4y : 2013-07-14 Spring Fields, LLC
+// xn--unup4y : 2013-07-14 Binky Moon, LLC
游戏
// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
@@ -10557,7 +10618,7 @@ vermögensberater
// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
vermögensberatung
-// xn--vhquv : 2013-08-27 Dash McCook, LLC
+// xn--vhquv : 2013-08-27 Binky Moon, LLC
企业
// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd.
@@ -10587,7 +10648,7 @@ yachts
// yahoo : 2015-04-02 Yahoo! Domain Services Inc.
yahoo
-// yamaxun : 2014-12-18 Amazon EU S.à r.l.
+// yamaxun : 2014-12-18 Amazon Registry Services, Inc.
yamaxun
// yandex : 2014-04-10 YANDEX, LLC
@@ -10596,13 +10657,13 @@ yandex
// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
yodobashi
-// yoga : 2014-05-29 Top Level Domain Holdings Limited
+// yoga : 2014-05-29 Minds + Machines Group Limited
yoga
// yokohama : 2013-12-12 GMO Registry, Inc.
yokohama
-// you : 2015-04-09 Amazon EU S.à r.l.
+// you : 2015-04-09 Amazon Registry Services, Inc.
you
// youtube : 2014-05-01 Charleston Road Registry Inc.
@@ -10611,13 +10672,13 @@ youtube
// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
yun
-// zappos : 2015-06-25 Amazon EU S.à r.l.
+// zappos : 2015-06-25 Amazon Registry Services, Inc.
zappos
// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.)
zara
-// zero : 2014-12-18 Amazon EU S.à r.l.
+// zero : 2014-12-18 Amazon Registry Services, Inc.
zero
// zip : 2014-05-08 Charleston Road Registry Inc.
@@ -10626,7 +10687,7 @@ zip
// zippo : 2015-07-02 Zadco Company
zippo
-// zone : 2013-11-14 Outer Falls, LLC
+// zone : 2013-11-14 Binky Moon, LLC
zone
// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich)
@@ -10643,12 +10704,6 @@ cc.ua
inf.ua
ltd.ua
-// AgileBits Inc : https://agilebits.com
-// Submitted by Roustem Karimov <roustem@agilebits.com>
-1password.ca
-1password.com
-1password.eu
-
// Agnat sp. z o.o. : https://domena.pl
// Submitted by Przemyslaw Plewa <it-admin@domena.pl>
beep.pl
@@ -10679,6 +10734,7 @@ cn-north-1.eb.amazonaws.com.cn
elasticbeanstalk.com
ap-northeast-1.elasticbeanstalk.com
ap-northeast-2.elasticbeanstalk.com
+ap-northeast-3.elasticbeanstalk.com
ap-south-1.elasticbeanstalk.com
ap-southeast-1.elasticbeanstalk.com
ap-southeast-2.elasticbeanstalk.com
@@ -10801,6 +10857,10 @@ betainabox.com
// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au>
bnr.la
+// Blackbaud, Inc. : https://www.blackbaud.com
+// Submitted by Paul Crowder <paul.crowder@blackbaud.com>
+blackbaudcdn.net
+
// Boomla : https://boomla.com
// Submitted by Tibor Halter <thalter@boomla.com>
boomla.net
@@ -10848,7 +10908,6 @@ no.com
qc.com
ru.com
sa.com
-se.com
se.net
uk.com
uk.net
@@ -10892,9 +10951,14 @@ xenapponazure.com
// Submitted by Leon Rowland <leon@clearvox.nl>
virtueeldomein.nl
+// Clever Cloud : https://www.clever-cloud.com/
+// Submitted by Quentin Adam <noc@clever-cloud.com>
+cleverapps.io
+
// Cloud66 : https://www.cloud66.com/
// Submitted by Khash Sajadi <khash@cloud66.com>
c66.me
+cloud66.ws
// CloudAccess.net : https://www.cloudaccess.net/
// Submitted by Pawel Panek <noc@cloudaccess.net>
@@ -10912,6 +10976,10 @@ cloudcontrolapp.com
// co.ca : http://registry.co.ca/
co.ca
+// Co & Co : https://co-co.nl/
+// Submitted by Govert Versluis <govert@co-co.nl>
+*.otap.co
+
// i-registry s.r.o. : http://www.i-registry.cz/
// Submitted by Martin Semrad <semrad@i-registry.cz>
co.cz
@@ -10938,6 +11006,10 @@ cloudns.pro
cloudns.pw
cloudns.us
+// Cloudeity Inc : https://cloudeity.com
+// Submitted by Stefan Dimitrov <contact@cloudeity.com>
+cloudeity.net
+
// CoDNS B.V.
co.nl
co.no
@@ -10981,6 +11053,15 @@ cyon.site
daplie.me
localhost.daplie.me
+// Datto, Inc. : https://www.datto.com/
+// Submitted by Philipp Heckel <ph@datto.com>
+dattolocal.com
+dattorelay.com
+dattoweb.com
+mydatto.com
+dattolocal.net
+mydatto.net
+
// Dansk.net : http://www.dansk.net/
// Submitted by Anani Voule <digital@digital.co.dk>
biz.dk
@@ -11325,6 +11406,10 @@ ddnss.org
definima.net
definima.io
+// dnstrace.pro : https://dnstrace.pro/
+// Submitted by Chris Partridge <chris@partridge.tech>
+bci.dnstrace.pro
+
// Dynu.com : https://www.dynu.com/
// Submitted by Sue Ye <sue@dynu.com>
ddnsfree.com
@@ -11536,6 +11621,11 @@ a.ssl.fastly.net
b.ssl.fastly.net
global.ssl.fastly.net
+// FASTVPS EESTI OU : https://fastvps.ru/
+// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>
+fastpanel.direct
+fastvps-server.com
+
// Featherhead : https://featherhead.xyz/
// Submitted by Simon Menke <simon@featherhead.xyz>
fhapp.xyz
@@ -11573,6 +11663,8 @@ freeboxos.fr
// Futureweb OG : http://www.futureweb.at
// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>
*.futurecms.at
+*.ex.futurecms.at
+*.in.futurecms.at
futurehosting.at
futuremailing.at
*.ex.ortsinfo.at
@@ -11709,6 +11801,14 @@ hepforge.org
herokuapp.com
herokussl.com
+// Hibernating Rhinos
+// Submitted by Oren Eini <oren@ravendb.net>
+myravendb.com
+ravendb.community
+ravendb.me
+development.run
+ravendb.run
+
// Ici la Lune : http://www.icilalune.com/
// Submitted by Simon Morvan <simon@icilalune.com>
moonscale.net
@@ -11763,6 +11863,19 @@ pixolino.com
// Submitted by Matthew Hardeman <mhardeman@ipifony.com>
ipifony.net
+// IServ GmbH : https://iserv.eu
+// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu>
+mein-iserv.de
+test-iserv.de
+
+// Jino : https://www.jino.ru
+// Submitted by Sergey Ulyashin <ulyashin@jino.ru>
+myjino.ru
+*.hosting.myjino.ru
+*.landing.myjino.ru
+*.spectrum.myjino.ru
+*.vps.myjino.ru
+
// Joyent : https://www.joyent.com/
// Submitted by Brian Bennett <brian.bennett@joyent.com>
*.triton.zone
@@ -11790,34 +11903,84 @@ git-repos.de
lcube-server.de
svn-repos.de
+// Lightmaker Property Manager, Inc. : https://app.lmpm.com/
+// Submitted by Greg Holland <greg.holland@lmpm.com>
+app.lmpm.com
+
+// Linki Tools UG : https://linki.tools
+// Submitted by Paulo Matos <pmatos@linki.tools>
+linkitools.space
+
+// linkyard ldt: https://www.linkyard.ch/
+// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch>
+linkyard.cloud
+linkyard-cloud.ch
+
// LiquidNet Ltd : http://www.liquidnetlimited.com/
// Submitted by Victor Velchev <admin@liquidnetlimited.com>
we.bs
+// Lug.org.uk : https://lug.org.uk
+// Submitted by Jon Spriggs <admin@lug.org.uk>
+uklugs.org
+glug.org.uk
+lug.org.uk
+lugs.org.uk
+
// Lukanet Ltd : https://lukanet.com
// Submitted by Anton Avramov <register@lukanet.com>
barsy.bg
+barsy.co.uk
+barsyonline.co.uk
+barsycenter.com
barsyonline.com
+barsy.club
barsy.de
barsy.eu
barsy.in
+barsy.info
+barsy.io
+barsy.me
+barsy.menu
+barsy.mobi
barsy.net
barsy.online
+barsy.org
+barsy.pro
+barsy.pub
+barsy.shop
+barsy.site
barsy.support
+barsy.uk
// Magento Commerce
// Submitted by Damien Tournoud <dtournoud@magento.cloud>
*.magentosite.cloud
+// May First - People Link : https://mayfirst.org/
+// Submitted by Jamie McClelland <info@mayfirst.org>
+mayfirst.info
+mayfirst.org
+
// Mail.Ru Group : https://hb.cldmail.ru
// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>
hb.cldmail.ru
+// Memset hosting : https://www.memset.com
+// Submitted by Tom Whitwell <domains@memset.com>
+miniserver.com
+memset.net
+
// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>
cloud.metacentrum.cz
custom.metacentrum.cz
+// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
+// Submitted by Radim Janča <janca@cesnet.cz>
+flt.cloud.muni.cz
+usr.cloud.muni.cz
+
// Meteor Development Group : https://www.meteor.com/hosting
// Submitted by Pierre Carrier <pierre@meteor.com>
meteorapp.com
@@ -11826,12 +11989,17 @@ eu.meteorapp.com
// Michau Enterprises Limited : http://www.co.pl/
co.pl
-// Microsoft : http://microsoft.com
-// Submitted by Barry Dorrans <bdorrans@microsoft.com>
+// Microsoft Corporation : http://microsoft.com
+// Submitted by Justin Luk <juluk@microsoft.com>
+azurecontainer.io
azurewebsites.net
azure-mobile.net
cloudapp.net
+// Mozilla Corporation : https://mozilla.com
+// Submitted by Ben Francis <bfrancis@mozilla.com>
+mozilla-iot.org
+
// Mozilla Foundation : https://mozilla.org/
// Submitted by glob <glob@mozilla.com>
bmoattachments.org
@@ -11863,6 +12031,34 @@ nh-serv.co.uk
// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>
nfshost.com
+// Now-DNS : https://now-dns.com
+// Submitted by Steve Russell <steve@now-dns.com>
+dnsking.ch
+mypi.co
+n4t.co
+001www.com
+ddnslive.com
+myiphost.com
+forumz.info
+16-b.it
+32-b.it
+64-b.it
+soundcast.me
+tcp4.me
+dnsup.net
+hicam.net
+now-dns.net
+ownip.net
+vpndns.net
+dynserv.org
+now-dns.org
+x443.pw
+now-dns.top
+ntdll.top
+freeddns.us
+crafting.xyz
+zapto.xyz
+
// nsupdate.info : https://www.nsupdate.info/
// Submitted by Thomas Waldmann <info@nsupdate.info>
nsupdate.info
@@ -11965,6 +12161,10 @@ stage.nodeart.io
nodum.co
nodum.io
+// Nucleos Inc. : https://nucleos.com
+// Submitted by Piotr Zduniak <piotr@nucleos.com>
+pcloud.host
+
// NYC.mn : http://www.information.nyc.mn
// Submitted by Matthew Brown <mattbrown@nyc.mn>
nyc.mn
@@ -11972,25 +12172,32 @@ nyc.mn
// NymNom : https://nymnom.com/
// Submitted by Dave McCormack <dave.mccormack@nymnom.com>
nom.ae
+nom.af
nom.ai
nom.al
nym.by
nym.bz
nom.cl
nom.gd
+nom.ge
nom.gl
nym.gr
nom.gt
+nym.gy
nom.hn
+nym.ie
nom.im
+nom.ke
nym.kz
nym.la
+nym.lc
nom.li
nym.li
nym.lt
nym.lu
nym.me
nom.mk
+nym.mn
nym.mx
nom.nu
nym.nz
@@ -11998,11 +12205,14 @@ nym.pe
nym.pt
nom.pw
nom.qa
+nym.ro
nom.rs
nom.si
nym.sk
+nom.st
nym.su
nym.sx
+nom.tj
nym.tw
nom.ug
nom.uy
@@ -12029,9 +12239,14 @@ operaunite.com
// Submitted by Duarte Santos <domain-admin@outsystemscloud.com>
outsystemscloud.com
-// OwnProvider : http://www.ownprovider.com
+// OwnProvider GmbH: http://www.ownprovider.com
// Submitted by Jan Moennich <jan.moennich@ownprovider.com>
ownprovider.com
+own.pm
+
+// OX : http://www.ox.rs
+// Submitted by Adam Grand <webmaster@mail.ox.rs>
+ox.rs
// oy.lc
// Submitted by Charly Coste <changaco@changaco.oy.lc>
@@ -12085,10 +12300,14 @@ priv.at
protonet.io
// Publication Presse Communication SARL : https://ppcom.fr
-// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr>
+// Submitted by Yaacov Akiba Slama <admin@chirurfgiens-dentistes-en-france.fr>
chirurgiens-dentistes-en-france.fr
byen.site
+// Russian Academy of Sciences
+// Submitted by Tech Support <support@rasnet.ru>
+ras.ru
+
// QA2
// Submitted by Daniel Dent (https://www.danieldent.com/)
qa2.com
@@ -12141,6 +12360,10 @@ sandcats.io
logoip.de
logoip.com
+// schokokeks.org GbR : https://schokokeks.org/
+// Submitted by Hanno Böck <hanno@schokokeks.org>
+schokokeks.net
+
// Scry Security : http://www.scrysec.com
// Submitted by Shante Adam <shante@skyhat.io>
scrysec.com
@@ -12206,6 +12429,10 @@ apps.lair.io
// Submitted by Reza Akhavan <spacekit.io@gmail.com>
spacekit.io
+// SpeedPartner GmbH: https://www.speedpartner.de/
+// Submitted by Stefan Neufeind <info@speedpartner.de>
+customer.speedpartner.de
+
// Stackspace : https://www.stackspace.io/
// Submitted by Lina He <info@stackspace.io>
stackspace.space
@@ -12214,6 +12441,10 @@ stackspace.space
// Submitted by Philip Hutchins <hostmaster@storj.io>
storj.farm
+// Studenten Net Twente : http://www.snt.utwente.nl/
+// Submitted by Silke Hofstra <syscom@snt.utwente.nl>
+utwente.io
+
// Sub 6 Limited: http://www.sub6.com
// Submitted by Dan Miller <dm@sub6.com>
temp-dns.com
@@ -12246,6 +12477,10 @@ gdynia.pl
med.pl
sopot.pl
+// The Gwiddle Foundation : https://gwiddlefoundation.org.uk
+// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk>
+gwiddle.co.uk
+
// Thingdust AG : https://thingdust.com/
// Submitted by Adrian Imboden <adi@thingdust.com>
cust.dev.thingdust.io
@@ -12309,6 +12544,7 @@ synology-ds.de
// Uberspace : https://uberspace.de
// Submitted by Moritz Werner <mwerner@jonaspasche.com>
uber.space
+*.uberspace.de
// UDR Limited : http://www.udr.hk.com
// Submitted by registry <hostmaster@udr.hk.com>
@@ -12317,10 +12553,19 @@ hk.org
ltd.hk
inc.hk
+// United Gameserver GmbH : https://united-gameserver.de
+// Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
+virtualuser.de
+virtual-user.de
+
// .US
// Submitted by Ed Moore <Ed.Moore@lib.de.us>
lib.de.us
+// VeryPositive SIA : http://very.lv
+// Submitted by Danko Aleksejevs <danko@very.lv>
+2038.io
+
// Viprinet Europe GmbH : http://www.viprinet.com
// Submitted by Simon Kissel <hostmaster@viprinet.com>
router.management
@@ -12343,12 +12588,26 @@ remotewd.com
// Submitted by Yuvi Panda <yuvipanda@wikimedia.org>
wmflabs.org
+// XenonCloud GbR: https://xenoncloud.net
+// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net>
+half.host
+
+// XnBay Technology : http://www.xnbay.com/
+// Submitted by XnBay Developer <developer.xncloud@gmail.com>
+xnbay.com
+u2.xnbay.com
+u2-local.xnbay.com
+
// XS4ALL Internet bv : https://www.xs4all.nl/
// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>
cistron.nl
demon.nl
xs4all.space
+// YesCourse Pty Ltd : https://yescourse.com
+// Submitted by Atul Bhouraskar <atul@yescourse.com>
+official.academy
+
// Yola : https://www.yola.com/
// Submitted by Stefano Rivera <stefano@yola.com>
yolasite.com
@@ -12363,6 +12622,11 @@ ybo.review
ybo.science
ybo.trade
+// Yunohost : https://yunohost.org
+// Submitted by Valentin Grimaud <security@yunohost.org>
+nohost.me
+noho.st
+
// ZaNiC : http://www.za.net/
// Submitted by registry <hostmaster@nic.za.net>
za.net
@@ -12372,4 +12636,8 @@ za.org
// Submitted by Olli Vanhoja <olli@zeit.co>
now.sh
+// Zone.id : https://zone.id/
+// Submitted by Su Hendro <admin@zone.id>
+zone.id
+
// ===END PRIVATE DOMAINS===
diff --git a/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf b/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
index c8a96e03502..f1a5a5bf613 100644
--- a/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
+++ b/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
@@ -12,22 +12,23 @@ struct DomainRule {
};
%%
0.bg, 0
+001www.com, 4
0emm.com, 6
1.bg, 0
12hp.at, 4
12hp.ch, 4
12hp.de, 4
1337.pictures, 4
+16-b.it, 4
1kapp.com, 4
-1password.ca, 4
-1password.com, 4
-1password.eu, 4
2.bg, 0
2000.hu, 0
+2038.io, 4
2ix.at, 4
2ix.ch, 4
2ix.de, 4
3.bg, 0
+32-b.it, 4
3utilities.com, 4
4.bg, 0
4lima.at, 4
@@ -36,6 +37,7 @@ struct DomainRule {
4u.com, 4
5.bg, 0
6.bg, 0
+64-b.it, 4
7.bg, 0
8.bg, 0
9.bg, 0
@@ -324,6 +326,7 @@ aostavalley.it, 0
aoste.it, 0
ap-northeast-1.elasticbeanstalk.com, 4
ap-northeast-2.elasticbeanstalk.com, 4
+ap-northeast-3.elasticbeanstalk.com, 4
ap-south-1.elasticbeanstalk.com, 4
ap-southeast-1.elasticbeanstalk.com, 4
ap-southeast-2.elasticbeanstalk.com, 4
@@ -334,6 +337,7 @@ ap.leg.br, 4
aparecida.br, 0
apartments, 0
app, 0
+app.lmpm.com, 4
app.os.fedoraproject.org, 4
app.os.stg.fedoraproject.org, 4
appchizi.com, 4
@@ -516,6 +520,7 @@ azerbaijan.su, 4
azumino.nagano.jp, 0
azure, 0
azure-mobile.net, 4
+azurecontainer.io, 4
azurewebsites.net, 4
b.bg, 0
b.br, 0
@@ -543,6 +548,8 @@ bale.museum, 0
balestrand.no, 0
ballangen.no, 0
ballooning.aero, 0
+balsan-sudtirol.it, 0
+balsan-suedtirol.it, 0
balsan.it, 0
balsfjord.no, 0
baltimore.museum, 0
@@ -569,13 +576,29 @@ barreau.bj, 0
barrel-of-knowledge.info, 4
barrell-of-knowledge.info, 4
barsy.bg, 4
+barsy.club, 4
+barsy.co.uk, 4
barsy.de, 4
barsy.eu, 4
barsy.in, 4
+barsy.info, 4
+barsy.io, 4
+barsy.me, 4
+barsy.menu, 4
+barsy.mobi, 4
barsy.net, 4
barsy.online, 4
+barsy.org, 4
+barsy.pro, 4
+barsy.pub, 4
+barsy.shop, 4
+barsy.site, 4
barsy.support, 4
+barsy.uk, 4
+barsycenter.com, 4
+barsyonline.co.uk, 4
barsyonline.com, 4
+barueri.br, 0
barum.no, 0
bas.it, 0
baseball, 0
@@ -598,6 +621,7 @@ bbt, 0
bbva, 0
bc.ca, 0
bcg, 0
+bci.dnstrace.pro, 4
bcn, 0
bd, 2
bd.se, 0
@@ -703,6 +727,7 @@ bjerkreim.no, 0
bjugn.no, 0
bl.it, 0
black, 0
+blackbaudcdn.net, 4
blackfriday, 0
blanco, 0
blockbuster, 0
@@ -817,6 +842,7 @@ boleslawiec.pl, 0
bolivia.bo, 0
bologna.it, 0
bolt.hu, 0
+bolzano-altoadige.it, 0
bolzano.it, 0
bom, 0
bomlo.no, 0
@@ -826,7 +852,6 @@ boo, 0
book, 0
booking, 0
boomla.net, 4
-boots, 0
bosch, 0
bostik, 0
boston, 0
@@ -841,6 +866,8 @@ bounty-full.com, 4
boutique, 0
box, 0
boxfuse.io, 4
+bozen-sudtirol.it, 0
+bozen-suedtirol.it, 0
bozen.it, 0
bplaced.com, 4
bplaced.de, 4
@@ -890,6 +917,9 @@ build, 0
builders, 0
building.museum, 0
bukhara.su, 4
+bulsan-sudtirol.it, 0
+bulsan-suedtirol.it, 0
+bulsan.it, 0
bungoono.oita.jp, 0
bungotakada.oita.jp, 0
bunkyo.tokyo.jp, 0
@@ -1086,6 +1116,7 @@ championship.aero, 0
chanel, 0
channel, 0
channelsdvr.net, 4
+charity, 0
charter.aero, 0
chase, 0
chat, 0
@@ -1186,6 +1217,7 @@ cl.it, 0
claims, 0
clan.rip, 4
cleaning, 0
+cleverapps.io, 4
click, 0
clinic, 0
clinique, 0
@@ -1196,11 +1228,13 @@ cloud, 0
cloud.fedoraproject.org, 4
cloud.goog, 4
cloud.metacentrum.cz, 4
+cloud66.ws, 4
cloudaccess.host, 4
cloudaccess.net, 4
cloudapp.net, 4
cloudcontrolapp.com, 4
cloudcontrolled.com, 4
+cloudeity.net, 4
cloudfront.net, 4
cloudfunctions.net, 4
cloudns.asia, 4
@@ -1508,6 +1542,7 @@ cq.cn, 0
cr, 0
cr.it, 0
cr.ua, 0
+crafting.xyz, 4
crafts.museum, 0
cranbrook.museum, 0
creation.museum, 0
@@ -1545,6 +1580,7 @@ cust.prod.thingdust.io, 4
cust.testing.thingdust.io, 4
custom.metacentrum.cz, 4
customer.enonic.io, 4
+customer.speedpartner.de, 4
cv, 0
cv.ua, 0
cw, 0
@@ -1587,6 +1623,10 @@ date.fukushima.jp, 0
date.hokkaido.jp, 0
dating, 0
datsun, 0
+dattolocal.com, 4
+dattolocal.net, 4
+dattorelay.com, 4
+dattoweb.com, 4
davvenjarga.no, 0
davvesiida.no, 0
day, 0
@@ -1599,6 +1639,7 @@ ddns.net, 4
ddnsfree.com, 4
ddnsgeek.com, 4
ddnsking.com, 4
+ddnslive.com, 4
ddnss.de, 4
ddnss.org, 4
ddr.museum, 0
@@ -1646,6 +1687,7 @@ detroit.museum, 0
dev, 0
dev-myqnapcloud.com, 4
dev.static.land, 4
+development.run, 4
devices.resinstaging.io, 4
df.gov.br, 0
df.leg.br, 4
@@ -1688,6 +1730,8 @@ dnsdojo.org, 4
dnsfor.me, 4
dnshome.de, 4
dnsiskinky.com, 4
+dnsking.ch, 4
+dnsup.net, 4
dnsupdater.de, 4
do, 0
docs, 0
@@ -1781,6 +1825,7 @@ dyndns.tv, 4
dyndns.ws, 4
dyndns1.de, 4
dynns.com, 4
+dynserv.org, 4
dynu.net, 4
dynv6.net, 4
dynvpn.de, 4
@@ -2058,6 +2103,7 @@ evenes.no, 0
events, 0
everbank, 0
evje-og-hornnes.no, 0
+ex.futurecms.at, 6
ex.ortsinfo.at, 6
exchange, 0
exchange.aero, 0
@@ -2096,6 +2142,8 @@ farsund.no, 0
fashion, 0
fast, 0
fastlylb.net, 4
+fastpanel.direct, 4
+fastvps-server.com, 4
fauske.no, 0
fbx-os.fr, 4
fbxos.fr, 4
@@ -2190,6 +2238,7 @@ floripa.br, 0
florist, 0
floro.no, 0
flowers, 0
+flt.cloud.muni.cz, 4
fly, 0
flynnhosting.net, 4
flynnhub.com, 4
@@ -2226,6 +2275,7 @@ fortmissoula.museum, 0
fortworth.museum, 0
forum, 0
forum.hu, 0
+forumz.info, 4
fosnes.no, 0
fot.br, 0
foundation, 0
@@ -2246,6 +2296,7 @@ freebox-os.fr, 4
freeboxos.com, 4
freeboxos.fr, 4
freeddns.org, 4
+freeddns.us, 4
freemasonry.museum, 0
freesite.host, 4
freetls.fastly.net, 4
@@ -2508,6 +2559,7 @@ global.ssl.fastly.net, 4
globo, 0
glogow.pl, 0
gloppen.no, 0
+glug.org.uk, 4
gm, 0
gmail, 0
gmbh, 0
@@ -2796,6 +2848,7 @@ gv.ao, 0
gv.at, 0
gw, 0
gwangju.kr, 0
+gwiddle.co.uk, 4
gx.cn, 0
gy, 0
gyeongbuk.kr, 0
@@ -2829,6 +2882,7 @@ hakuba.nagano.jp, 0
hakui.ishikawa.jp, 0
hakusan.ishikawa.jp, 0
halden.no, 0
+half.host, 4
halloffame.museum, 0
halsa.no, 0
ham-radio-op.net, 4
@@ -2916,6 +2970,7 @@ heroy.nordland.no, 0
hgtv, 0
hi.cn, 0
hi.us, 0
+hicam.net, 4
hichiso.gifu.jp, 0
hida.gifu.jp, 0
hidaka.hokkaido.jp, 0
@@ -3069,6 +3124,7 @@ hospital, 0
host, 0
hosting, 0
hosting-cluster.nl, 4
+hosting.myjino.ru, 6
hot, 0
hotel.hu, 0
hotel.lk, 0
@@ -3192,6 +3248,7 @@ in, 0
in-addr.arpa, 0
in-the-band.net, 4
in.eu.org, 4
+in.futurecms.at, 6
in.na, 0
in.net, 4
in.ni, 0
@@ -3211,6 +3268,7 @@ inashiki.ibaraki.jp, 0
inatsuki.fukuoka.jp, 0
inawashiro.fukushima.jp, 0
inazawa.aichi.jp, 0
+inc, 0
inc.hk, 4
incheon.kr, 0
ind.br, 0
@@ -4040,6 +4098,7 @@ lancome, 0
land, 0
land-4-sale.us, 4
landes.museum, 0
+landing.myjino.ru, 6
landrover, 0
langevag.no, 0
lans.museum, 0
@@ -4188,6 +4247,9 @@ lindas.no, 0
linde, 0
lindesnes.no, 0
link, 0
+linkitools.space, 4
+linkyard-cloud.ch, 4
+linkyard.cloud, 4
linz.museum, 0
lipsy, 0
live, 0
@@ -4197,6 +4259,7 @@ livinghistory.museum, 0
livorno.it, 0
lixil, 0
lk, 0
+llc, 0
ln.cn, 0
lo.it, 0
loabat.no, 0
@@ -4257,7 +4320,9 @@ lubin.pl, 0
lucania.it, 0
lucca.it, 0
lucerne.museum, 0
+lug.org.uk, 4
lugansk.ua, 0
+lugs.org.uk, 4
lukow.pl, 0
lund.no, 0
lundbeck, 0
@@ -4375,6 +4440,8 @@ matsuyama.ehime.jp, 0
matsuzaki.shizuoka.jp, 0
matta-varjjat.no, 0
mattel, 0
+mayfirst.info, 4
+mayfirst.org, 4
mazowsze.pl, 0
mazury.pl, 0
mb.ca, 0
@@ -4421,6 +4488,7 @@ medizinhistorisches.museum, 0
meeres.museum, 0
meet, 0
meguro.tokyo.jp, 0
+mein-iserv.de, 4
mein-vigor.de, 4
meiwa.gunma.jp, 0
meiwa.mie.jp, 0
@@ -4432,6 +4500,7 @@ meloy.no, 0
meme, 0
memorial, 0
memorial.museum, 0
+memset.net, 4
men, 0
menu, 0
meo, 0
@@ -4573,6 +4642,7 @@ mine.nu, 4
miners.museum, 0
mini, 0
mining.museum, 0
+miniserver.com, 4
minnesota.museum, 0
mino.gifu.jp, 0
minobu.yamanashi.jp, 0
@@ -4721,6 +4791,7 @@ mov, 0
movie, 0
movimiento.bo, 0
movistar, 0
+mozilla-iot.org, 4
mp, 0
mp.br, 0
mq, 0
@@ -4743,7 +4814,6 @@ mt.it, 0
mt.leg.br, 4
mt.us, 0
mtn, 0
-mtpc, 0
mtr, 0
mu, 0
muenchen.museum, 0
@@ -4799,6 +4869,8 @@ my.id, 0
myactivedirectory.com, 4
myasustor.com, 4
mycd.eu, 4
+mydatto.com, 4
+mydatto.net, 4
myddns.rocks, 4
mydissent.net, 4
mydrobo.com, 4
@@ -4809,6 +4881,8 @@ myfritz.net, 4
myftp.biz, 4
myftp.org, 4
myhome-server.de, 4
+myiphost.com, 4
+myjino.ru, 4
mykolaiv.ua, 0
mymailer.com.tw, 4
mymediapc.net, 4
@@ -4816,8 +4890,10 @@ myoko.niigata.jp, 0
mypep.link, 4
mypets.ws, 4
myphotos.cc, 4
+mypi.co, 4
mypsx.net, 4
myqnapcloud.com, 4
+myravendb.com, 4
mysecuritycamera.com, 4
mysecuritycamera.net, 4
mysecuritycamera.org, 4
@@ -4829,6 +4905,7 @@ mywire.org, 4
mz, 0
n.bg, 0
n.se, 0
+n4t.co, 4
na, 0
na.it, 0
naamesjevuemie.no, 0
@@ -5237,11 +5314,14 @@ nodum.io, 4
nogata.fukuoka.jp, 0
nogi.tochigi.jp, 0
noheji.aomori.jp, 0
+noho.st, 4
+nohost.me, 4
noip.me, 4
noip.us, 4
nokia, 0
nom.ad, 0
nom.ae, 4
+nom.af, 4
nom.ag, 0
nom.ai, 4
nom.al, 4
@@ -5251,10 +5331,12 @@ nom.co, 0
nom.es, 0
nom.fr, 0
nom.gd, 4
+nom.ge, 4
nom.gl, 4
nom.gt, 4
nom.hn, 4
nom.im, 4
+nom.ke, 4
nom.km, 0
nom.li, 4
nom.mg, 0
@@ -5271,6 +5353,8 @@ nom.re, 0
nom.ro, 0
nom.rs, 4
nom.si, 4
+nom.st, 4
+nom.tj, 4
nom.tm, 0
nom.ug, 4
nom.uy, 4
@@ -5309,6 +5393,9 @@ nov.ru, 4
nov.su, 4
novara.it, 0
now, 0
+now-dns.net, 4
+now-dns.org, 4
+now-dns.top, 4
now.sh, 4
nowaruda.pl, 0
nowruz, 0
@@ -5329,6 +5416,7 @@ nt.ca, 0
nt.edu.au, 0
nt.no, 0
nt.ro, 0
+ntdll.top, 4
ntr.br, 0
ntt, 0
nu, 0
@@ -5349,16 +5437,21 @@ nyc.museum, 0
nym.by, 4
nym.bz, 4
nym.gr, 4
+nym.gy, 4
+nym.ie, 4
nym.kz, 4
nym.la, 4
+nym.lc, 4
nym.li, 4
nym.lt, 4
nym.lu, 4
nym.me, 4
+nym.mn, 4
nym.mx, 4
nym.nz, 4
nym.pe, 4
nym.pt, 4
+nym.ro, 4
nym.sk, 4
nym.su, 4
nym.sx, 4
@@ -5399,6 +5492,7 @@ off, 0
off.ai, 0
office, 0
office-on-the.net, 4
+official.academy, 4
ofunato.iwate.jp, 0
og.ao, 0
og.it, 0
@@ -5722,6 +5816,7 @@ otaki.chiba.jp, 0
otaki.nagano.jp, 0
otaki.saitama.jp, 0
otama.fukushima.jp, 0
+otap.co, 6
otari.nagano.jp, 0
otaru.hokkaido.jp, 0
other.nf, 0
@@ -5746,7 +5841,10 @@ ovh, 0
ovre-eiker.no, 0
owani.aomori.jp, 0
owariasahi.aichi.jp, 0
+own.pm, 4
+ownip.net, 4
ownprovider.com, 4
+ox.rs, 4
oxford.museum, 0
oy.lc, 4
oyabe.toyama.jp, 0
@@ -5810,6 +5908,7 @@ pb.leg.br, 4
pc.it, 0
pc.pl, 0
pccw, 0
+pcloud.host, 4
pd.it, 0
pe, 0
pe.ca, 0
@@ -6082,7 +6181,11 @@ rana.no, 0
randaberg.no, 0
rankoshi.hokkaido.jp, 0
ranzan.saitama.jp, 0
+ras.ru, 4
rauma.no, 0
+ravendb.community, 4
+ravendb.me, 4
+ravendb.run, 4
ravenna.it, 0
rawa-maz.pl, 0
rc.it, 0
@@ -6461,6 +6564,7 @@ schaeffler, 0
schlesisches.museum, 0
schmidt, 0
schoenbrunn.museum, 0
+schokokeks.net, 4
schokoladen.museum, 0
scholarships, 0
school, 0
@@ -6495,7 +6599,6 @@ sd.cn, 0
sd.us, 0
sdn.gov.pl, 0
se, 0
-se.com, 4
se.eu.org, 4
se.gov.br, 0
se.leg.br, 4
@@ -6817,6 +6920,7 @@ sos.pl, 0
sosa.chiba.jp, 0
sosnowiec.pl, 0
soundandvision.museum, 0
+soundcast.me, 4
southcarolina.museum, 0
southwest.museum, 0
sowa.ibaraki.jp, 0
@@ -6833,8 +6937,10 @@ spb.su, 4
spdns.de, 4
spdns.eu, 4
spdns.org, 4
+spectrum.myjino.ru, 6
spiegel, 0
spjelkavik.no, 0
+sport, 0
sport.hu, 0
spot, 0
spreadbetting, 0
@@ -7105,6 +7211,7 @@ taxi.br, 0
tc, 0
tci, 0
tcm.museum, 0
+tcp4.me, 4
td, 0
tdk, 0
te.it, 0
@@ -7139,6 +7246,7 @@ termez.su, 4
terni.it, 0
ternopil.ua, 0
teshikaga.hokkaido.jp, 0
+test-iserv.de, 4
test.ru, 0
test.tj, 0
teva, 0
@@ -7335,6 +7443,10 @@ travelers, 0
travelersinsurance, 0
trd.br, 0
tree.museum, 0
+trentin-sud-tirol.it, 0
+trentin-sudtirol.it, 0
+trentin-sued-tirol.it, 0
+trentin-suedtirol.it, 0
trentino-a-adige.it, 0
trentino-aadige.it, 0
trentino-alto-adige.it, 0
@@ -7356,6 +7468,10 @@ trentinosud-tirol.it, 0
trentinosudtirol.it, 0
trentinosued-tirol.it, 0
trentinosuedtirol.it, 0
+trentinsud-tirol.it, 0
+trentinsudtirol.it, 0
+trentinsued-tirol.it, 0
+trentinsuedtirol.it, 0
trento.it, 0
treviso.it, 0
trieste.it, 0
@@ -7445,10 +7561,13 @@ tysvar.no, 0
tz, 0
u.bg, 0
u.se, 0
+u2-local.xnbay.com, 4
+u2.xnbay.com, 4
ua, 0
ubank, 0
ube.yamaguchi.jp, 0
uber.space, 4
+uberspace.de, 6
ubs, 0
uchihara.ibaraki.jp, 0
uchiko.ehime.jp, 0
@@ -7477,6 +7596,7 @@ uk.eu.org, 4
uk.net, 4
uki.kumamoto.jp, 0
ukiha.fukuoka.jp, 0
+uklugs.org, 4
ullensaker.no, 0
ullensvang.no, 0
ulm.museum, 0
@@ -7548,6 +7668,7 @@ ushiku.ibaraki.jp, 0
ushistory.museum, 0
ushuaia.museum, 0
uslivinghistory.museum, 0
+usr.cloud.muni.cz, 4
ustka.pl, 0
usui.fukuoka.jp, 0
usuki.oita.jp, 0
@@ -7559,6 +7680,7 @@ utazu.kagawa.jp, 0
uto.kumamoto.jp, 0
utsira.no, 0
utsunomiya.tochigi.jp, 0
+utwente.io, 4
uvic.museum, 0
uw.gov.pl, 0
uwajima.ehime.jp, 0
@@ -7595,7 +7717,9 @@ valleaosta.it, 0
valled-aosta.it, 0
valledaosta.it, 0
vallee-aoste.it, 0
+vallee-d-aoste.it, 0
valleeaoste.it, 0
+valleedaoste.it, 0
valley.museum, 0
vana, 0
vang.no, 0
@@ -7673,7 +7797,9 @@ vip, 0
vipsinaapp.com, 4
virgin, 0
virginia.museum, 0
+virtual-user.de, 4
virtual.museum, 0
+virtualuser.de, 4
virtueeldomein.nl, 4
virtuel.museum, 0
visa, 0
@@ -7707,7 +7833,9 @@ vote, 0
voting, 0
voto, 0
voyage, 0
+vpndns.net, 4
vpnplus.to, 4
+vps.myjino.ru, 6
vr.it, 0
vs.it, 0
vt.it, 0
@@ -7854,6 +7982,7 @@ wy.us, 0
wzmiuw.gov.pl, 0
x.bg, 0
x.se, 0
+x443.pw, 4
xbox, 0
xen.prgmr.com, 4
xenapponazure.com, 4
@@ -7895,6 +8024,7 @@ xn--55qw42g, 0
xn--55qx5d, 0
xn--55qx5d.cn, 0
xn--55qx5d.hk, 0
+xn--55qx5d.xn--j6w193g, 0
xn--5js045d.jp, 0
xn--5rtp49c.jp, 0
xn--5rtq34k.jp, 0
@@ -7930,6 +8060,7 @@ xn--avery-yua.no, 0
xn--b-5ga.nordland.no, 0
xn--b-5ga.telemark.no, 0
xn--b4w605ferd, 0
+xn--balsan-sdtirol-nsb.it, 0
xn--bck1b9a5dre4c, 0
xn--bdddj-mrabd.no, 0
xn--bearalvhki-y4a.no, 0
@@ -7943,15 +8074,19 @@ xn--bjddar-pta.no, 0
xn--blt-elab.no, 0
xn--bmlo-gra.no, 0
xn--bod-2na.no, 0
+xn--bozen-sdtirol-2ob.it, 0
xn--brnny-wuac.no, 0
xn--brnnysund-m8ac.no, 0
xn--brum-voa.no, 0
xn--btsfjord-9za.no, 0
+xn--bulsan-sdtirol-nsb.it, 0
xn--c1avg, 0
xn--c1avg.xn--90a3ac, 0
xn--c2br7g, 0
xn--c3s14m.jp, 0
xn--cck2b3b, 0
+xn--cesena-forl-mcb.it, 0
+xn--cesenaforl-i8a.it, 0
xn--cg4bki, 0
xn--ciqpn.hk, 0
xn--clchc0ea0b2g2a9gcd, 0
@@ -7992,6 +8127,8 @@ xn--fjq720a, 0
xn--fl-zia.no, 0
xn--flor-jra.no, 0
xn--flw351e, 0
+xn--forl-cesena-fcb.it, 0
+xn--forlcesena-c8a.it, 0
xn--fpcrj9c3d, 0
xn--frde-gra.no, 0
xn--frna-woa.no, 0
@@ -8009,6 +8146,7 @@ xn--gk3at1e, 0
xn--gls-elac.no, 0
xn--gmq050i.hk, 0
xn--gmqw5a.hk, 0
+xn--gmqw5a.xn--j6w193g, 0
xn--h-2fa.no, 0
xn--h1aegh.museum, 0
xn--h2breg3eve, 0
@@ -8102,6 +8240,7 @@ xn--mgbai9a5eva00b, 0
xn--mgbai9azgqp6j, 0
xn--mgbayh7gpa, 0
xn--mgbb9fbpob, 0
+xn--mgbbh1a, 0
xn--mgbbh1a71e, 0
xn--mgbc0a9azcg, 0
xn--mgbca7dzdo, 0
@@ -8134,6 +8273,7 @@ xn--mtta-vrjjat-k7af.no, 0
xn--muost-0qa.no, 0
xn--mxtq1m, 0
xn--mxtq1m.hk, 0
+xn--mxtq1m.xn--j6w193g, 0
xn--ngbc5azd, 0
xn--ngbe9e0a, 0
xn--ngbrx, 0
@@ -8155,11 +8295,13 @@ xn--o3cw4h, 0
xn--o3cyx2a.xn--o3cw4h, 0
xn--od0alg.cn, 0
xn--od0alg.hk, 0
+xn--od0alg.xn--j6w193g, 0
xn--od0aq3b.hk, 0
xn--ogbpf8fl, 0
xn--oppegrd-ixa.no, 0
xn--ostery-fya.no, 0
xn--osyro-wua.no, 0
+xn--otu796d, 0
xn--p1acf, 0
xn--p1ai, 0
xn--pbt977c, 0
@@ -8200,6 +8342,7 @@ xn--s-1fa.no, 0
xn--s9brj9c, 0
xn--sandnessjen-ogb.no, 0
xn--sandy-yua.no, 0
+xn--sdtirol-n2a.it, 0
xn--seral-lra.no, 0
xn--ses554g, 0
xn--sgne-gra.no, 0
@@ -8234,12 +8377,21 @@ xn--tn0ag.hk, 0
xn--tnsberg-q1a.no, 0
xn--tor131o.jp, 0
xn--trany-yua.no, 0
+xn--trentin-sd-tirol-rzb.it, 0
+xn--trentin-sdtirol-7vb.it, 0
+xn--trentino-sd-tirol-c3b.it, 0
+xn--trentino-sdtirol-szb.it, 0
+xn--trentinosd-tirol-rzb.it, 0
+xn--trentinosdtirol-7vb.it, 0
+xn--trentinsd-tirol-6vb.it, 0
+xn--trentinsdtirol-nsb.it, 0
xn--trgstad-r1a.no, 0
xn--trna-woa.no, 0
xn--troms-zua.no, 0
xn--tysvr-vra.no, 0
xn--uc0atv.hk, 0
xn--uc0atv.tw, 0
+xn--uc0atv.xn--j6w193g, 0
xn--uc0ay4a.hk, 0
xn--uist22h.jp, 0
xn--uisz3g.jp, 0
@@ -8247,6 +8399,10 @@ xn--unjrga-rta.no, 0
xn--unup4y, 0
xn--uuwu58a.jp, 0
xn--vads-jra.no, 0
+xn--valle-aoste-ebb.it, 0
+xn--valle-d-aoste-ehb.it, 0
+xn--valleaoste-e7a.it, 0
+xn--valledaoste-ebb.it, 0
xn--vard-jra.no, 0
xn--vegrshei-c0a.no, 0
xn--vermgensberater-ctb, 0
@@ -8266,6 +8422,7 @@ xn--vuq861b, 0
xn--w4r85el8fhu5dnra, 0
xn--w4rs40l, 0
xn--wcvs22d.hk, 0
+xn--wcvs22d.xn--j6w193g, 0
xn--wgbh1c, 0
xn--wgbl6a, 0
xn--xhq521b, 0
@@ -8281,6 +8438,7 @@ xn--zbx025d.jp, 0
xn--zf0ao64a.tw, 0
xn--zf0avx.hk, 0
xn--zfr164b, 0
+xnbay.com, 4
xperia, 0
xs4all.space, 4
xxx, 0
@@ -8428,6 +8586,7 @@ zaporizhzhe.ua, 0
zaporizhzhia.ua, 0
zappos, 0
zapto.org, 4
+zapto.xyz, 4
zara, 0
zarow.pl, 0
zentsuji.kagawa.jp, 0
@@ -8442,6 +8601,7 @@ zj.cn, 0
zlg.br, 0
zm, 0
zone, 0
+zone.id, 4
zoological.museum, 0
zoology.museum, 0
zp.gov.pl, 0
diff --git a/chromium/net/base/test_proxy_delegate.cc b/chromium/net/base/test_proxy_delegate.cc
index 633687b4ddb..5ac1dbea263 100644
--- a/chromium/net/base/test_proxy_delegate.cc
+++ b/chromium/net/base/test_proxy_delegate.cc
@@ -5,6 +5,7 @@
#include "net/base/test_proxy_delegate.h"
#include "net/proxy_resolution/proxy_info.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -29,6 +30,8 @@ void TestProxyDelegate::OnResolveProxy(
}
}
result->UseProxyList(new_proxy_list);
+ result->set_traffic_annotation(
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
}
// Only set |alternative_proxy_server_| as the alternative proxy if the
@@ -38,6 +41,8 @@ void TestProxyDelegate::OnResolveProxy(
alternative_proxy_info.DeprioritizeBadProxies(proxy_retry_info);
if (!alternative_proxy_info.is_empty())
result->SetAlternativeProxy(alternative_proxy_info.proxy_server());
+ result->set_traffic_annotation(
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
}
void TestProxyDelegate::OnFallback(const ProxyServer& bad_proxy,
diff --git a/chromium/net/base/unescape_url_component_fuzzer.cc b/chromium/net/base/unescape_url_component_fuzzer.cc
index 0053011c1f5..2a4575c4789 100644
--- a/chromium/net/base/unescape_url_component_fuzzer.cc
+++ b/chromium/net/base/unescape_url_component_fuzzer.cc
@@ -13,10 +13,10 @@ static const int kMaxUnescapeRule = 31;
// Entry point for LibFuzzer.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- std::string path(reinterpret_cast<const char*>(data), size);
+ base::StringPiece path(reinterpret_cast<const char*>(data), size);
for (int i = 0; i <= kMaxUnescapeRule; i++) {
- (void)net::UnescapeURLComponent(path,
- static_cast<net::UnescapeRule::Type>(i));
+ net::UnescapeURLComponent(path, static_cast<net::UnescapeRule::Type>(i));
}
+
return 0;
}
diff --git a/chromium/net/base/upload_data_stream.h b/chromium/net/base/upload_data_stream.h
index 1c6e554b0df..b9645ec5a09 100644
--- a/chromium/net/base/upload_data_stream.h
+++ b/chromium/net/base/upload_data_stream.h
@@ -124,7 +124,7 @@ class NET_EXPORT UploadDataStream {
virtual int ReadInternal(IOBuffer* buf, int buf_len) = 0;
// Resets state and cancels any pending callbacks. Guaranteed to be called
- // before all but the first call to InitInternal.
+ // at least once before every call to InitInternal.
virtual void ResetInternal() = 0;
uint64_t total_size_;
diff --git a/chromium/net/base/url_util.cc b/chromium/net/base/url_util.cc
index 3bd93aa4006..57d180e870e 100644
--- a/chromium/net/base/url_util.cc
+++ b/chromium/net/base/url_util.cc
@@ -154,25 +154,19 @@ bool GetValueForKeyInQuery(const GURL& url,
return false;
}
-bool ParseHostAndPort(std::string::const_iterator host_and_port_begin,
- std::string::const_iterator host_and_port_end,
- std::string* host,
- int* port) {
- if (host_and_port_begin >= host_and_port_end)
+bool ParseHostAndPort(base::StringPiece input, std::string* host, int* port) {
+ if (input.empty())
return false;
- // When using url, we use char*.
- const char* auth_begin = &(*host_and_port_begin);
- int auth_len = host_and_port_end - host_and_port_begin;
-
- url::Component auth_component(0, auth_len);
+ url::Component auth_component(0, input.size());
url::Component username_component;
url::Component password_component;
url::Component hostname_component;
url::Component port_component;
- url::ParseAuthority(auth_begin, auth_component, &username_component,
- &password_component, &hostname_component, &port_component);
+ url::ParseAuthority(input.data(), auth_component, &username_component,
+ &password_component, &hostname_component,
+ &port_component);
// There shouldn't be a username/password.
if (username_component.is_valid() || password_component.is_valid())
@@ -183,7 +177,7 @@ bool ParseHostAndPort(std::string::const_iterator host_and_port_begin,
int parsed_port_number = -1;
if (port_component.is_nonempty()) {
- parsed_port_number = url::ParsePort(auth_begin, port_component);
+ parsed_port_number = url::ParsePort(input.data(), port_component);
// If parsing failed, port_number will be either PORT_INVALID or
// PORT_UNSPECIFIED, both of which are negative.
@@ -198,11 +192,10 @@ bool ParseHostAndPort(std::string::const_iterator host_and_port_begin,
// If the hostname starts with a bracket, it is either an IPv6 literal or
// invalid. If it is an IPv6 literal then strip the brackets.
- if (hostname_component.len > 0 &&
- auth_begin[hostname_component.begin] == '[') {
- if (auth_begin[hostname_component.end() - 1] == ']' &&
- url::IPv6AddressToNumber(
- auth_begin, hostname_component, tmp_ipv6_addr)) {
+ if (hostname_component.len > 0 && input[hostname_component.begin] == '[') {
+ if (input[hostname_component.end() - 1] == ']' &&
+ url::IPv6AddressToNumber(input.data(), hostname_component,
+ tmp_ipv6_addr)) {
// Strip the brackets.
hostname_component.begin++;
hostname_component.len -= 2;
@@ -212,19 +205,12 @@ bool ParseHostAndPort(std::string::const_iterator host_and_port_begin,
}
// Pass results back to caller.
- host->assign(auth_begin + hostname_component.begin, hostname_component.len);
+ host->assign(input.data() + hostname_component.begin, hostname_component.len);
*port = parsed_port_number;
return true; // Success.
}
-bool ParseHostAndPort(const std::string& host_and_port,
- std::string* host,
- int* port) {
- return ParseHostAndPort(
- host_and_port.begin(), host_and_port.end(), host, port);
-}
-
std::string GetHostAndPort(const GURL& url) {
// For IPv6 literals, GURL::host() already includes the brackets so it is
@@ -315,7 +301,7 @@ bool IsHostnameNonUnique(const std::string& hostname) {
return false;
// If |hostname| is an IP address, check to see if it's in an IANA-reserved
- // range.
+ // range reserved for non-publicly routable networks.
if (host_info.IsIPAddress()) {
IPAddress host_addr;
if (!host_addr.AssignFromIPLiteral(hostname.substr(
@@ -325,7 +311,7 @@ bool IsHostnameNonUnique(const std::string& hostname) {
switch (host_info.family) {
case url::CanonHostInfo::IPV4:
case url::CanonHostInfo::IPV6:
- return host_addr.IsReserved();
+ return !host_addr.IsPubliclyRoutable();
case url::CanonHostInfo::NEUTRAL:
case url::CanonHostInfo::BROKEN:
return false;
diff --git a/chromium/net/base/url_util.h b/chromium/net/base/url_util.h
index 97e7724cfd3..0b820a70557 100644
--- a/chromium/net/base/url_util.h
+++ b/chromium/net/base/url_util.h
@@ -98,12 +98,7 @@ NET_EXPORT bool GetValueForKeyInQuery(const GURL& url,
// [::1]:90 and [::1]
//
// The resultant |*host| in both cases will be "::1" (not bracketed).
-NET_EXPORT bool ParseHostAndPort(
- std::string::const_iterator host_and_port_begin,
- std::string::const_iterator host_and_port_end,
- std::string* host,
- int* port);
-NET_EXPORT bool ParseHostAndPort(const std::string& host_and_port,
+NET_EXPORT bool ParseHostAndPort(base::StringPiece input,
std::string* host,
int* port);
@@ -139,7 +134,7 @@ NET_EXPORT bool IsCanonicalizedHostCompliant(const std::string& host);
// Returns true if |hostname| contains a non-registerable or non-assignable
// domain name (eg: a gTLD that has not been assigned by IANA) or an IP address
-// that falls in an IANA-reserved range.
+// that falls in an range reserved for non-publicly routable networks.
NET_EXPORT bool IsHostnameNonUnique(const std::string& hostname);
// Returns true if the host part of |url| is a local host name according to