diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:20:33 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:28:57 +0000 |
commit | d17ea114e5ef69ad5d5d7413280a13e6428098aa (patch) | |
tree | 2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/net/base | |
parent | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff) | |
download | qtwebengine-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')
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 |