diff --git a/AUTHORS b/AUTHORS index 5265a6c..dc45a9a 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -290,6 +290,7 @@ Jack Bates <jack@nottheoilrig.com> Jacob Mandelson <jacob@mandelson.org> Jaehun Lim <ljaehun.lim@samsung.com> +Jaehyun Lee <j-hyun.lee@samsung.com> Jaekyeom Kim <btapiz@gmail.com> Jaemin Seo <jaemin86.seo@samsung.com> Jaeseok Yoon <yjaeseok@gmail.com>
diff --git a/DEPS b/DEPS index 14d02c933..8c16f4797 100644 --- a/DEPS +++ b/DEPS
@@ -40,7 +40,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '671e442fccaacf57b6922324e8160173a2919608', + 'skia_revision': 'edbeb8b842aa86d18388f75a1dbf1e470a565680', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'ce32acfa15071e6cd5bcce73280857014e396dd2', + 'pdfium_revision': 'a99de0ec3cda8ff5b0d6383a059dd39c8626e504', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -96,7 +96,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '0545e35027803e19c550bad013d86b2d42f02114', + 'catapult_revision': '4f3d6da8af75d0aa3b0aa535319c13393269512f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn index b0128049..b84f896b 100644 --- a/ash/public/interfaces/BUILD.gn +++ b/ash/public/interfaces/BUILD.gn
@@ -7,7 +7,6 @@ mojom("interfaces") { sources = [ "accelerator_controller.mojom", - "ash_window_type.mojom", "cast_config.mojom", "constants.mojom", "locale.mojom",
diff --git a/ash/public/interfaces/ash_window_type.mojom b/ash/public/interfaces/ash_window_type.mojom deleted file mode 100644 index 61f2c4d..0000000 --- a/ash/public/interfaces/ash_window_type.mojom +++ /dev/null
@@ -1,13 +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. - -module ash.mojom; - -enum AshWindowType { - SHELF = 0, - STATUS_AREA, - COUNT -}; - -const string kAshWindowType_Property = "ash:window-type";
diff --git a/base/logging.h b/base/logging.h index c969f3d..c67b937 100644 --- a/base/logging.h +++ b/base/logging.h
@@ -289,45 +289,6 @@ BASE_EXPORT void SetLogMessageHandler(LogMessageHandlerFunction handler); BASE_EXPORT LogMessageHandlerFunction GetLogMessageHandler(); -// ANALYZER_ASSUME_TRUE(...) generates compiler-specific annotations which -// prevent the static analyzer from analyzing the code using hypothetical -// values that are asserted to be impossible. -// The value of the condition passed to ANALYZER_ASSUME_TRUE() is returned -// directly. -#if defined(__clang_analyzer__) - -inline void AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {} - -// |arg| is a universal reference for compatibility with lvalue and rvalue -// arguments. -template <typename TVal> -inline constexpr TVal&& AnalysisAssumeTrue(TVal&& arg) { - if (!arg) { - AnalyzerNoReturn(); - } - return std::forward<TVal>(arg); -} - -#define ANALYZER_ASSUME_TRUE(val) ::logging::AnalysisAssumeTrue(val) - -#elif defined(_PREFAST_) && defined(OS_WIN) - -// |arg| is a universal reference for compatibility with lvalue and rvalue -// arguments. -template <typename TVal> -inline constexpr TVal&& AnalysisAssumeTrue(TVal&& arg) { - __analysis_assume(!!arg); - return std::forward<TVal>(arg); -} - -#define ANALYZER_ASSUME_TRUE(val) ::logging::AnalysisAssumeTrue(val) - -#else // !_PREFAST_ & !__clang_analyzer__ - -#define ANALYZER_ASSUME_TRUE(val) (val) - -#endif // !_PREFAST_ & !__clang_analyzer__ - typedef int LogSeverity; const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity // Note: the log severities are used to index into the array of names, @@ -447,9 +408,8 @@ // TODO(akalin): Add more VLOG variants, e.g. VPLOG. -#define LOG_ASSERT(condition) \ - LOG_IF(FATAL, !ANALYZER_ASSUME_TRUE(condition)) \ - << "Assert failed: " #condition ". " +#define LOG_ASSERT(condition) \ + LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". " #if defined(OS_WIN) #define PLOG_STREAM(severity) \ @@ -602,15 +562,37 @@ #else // !(OFFICIAL_BUILD && NDEBUG) +#if defined(_PREFAST_) && defined(OS_WIN) +// Use __analysis_assume to tell the VC++ static analysis engine that +// assert conditions are true, to suppress warnings. The LAZY_STREAM +// parameter doesn't reference 'condition' in /analyze builds because +// this evaluation confuses /analyze. The !! before condition is because +// __analysis_assume gets confused on some conditions: +// http://randomascii.wordpress.com/2011/09/13/analyze-for-visual-studio-the-ugly-part-5/ + +#define CHECK(condition) \ + __analysis_assume(!!(condition)), \ + LAZY_STREAM(LOG_STREAM(FATAL), false) \ + << "Check failed: " #condition ". " + +#define PCHECK(condition) \ + __analysis_assume(!!(condition)), \ + LAZY_STREAM(PLOG_STREAM(FATAL), false) \ + << "Check failed: " #condition ". " + +#else // _PREFAST_ + // Do as much work as possible out of line to reduce inline code size. #define CHECK(condition) \ LAZY_STREAM(::logging::LogMessage(__FILE__, __LINE__, #condition).stream(), \ - !ANALYZER_ASSUME_TRUE(condition)) + !(condition)) -#define PCHECK(condition) \ - LAZY_STREAM(PLOG_STREAM(FATAL), !ANALYZER_ASSUME_TRUE(condition)) \ +#define PCHECK(condition) \ + LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \ << "Check failed: " #condition ". " +#endif // _PREFAST_ + // Helper macro for binary operators. // Don't use this macro directly in your code, use CHECK_EQ et al below. // The 'switch' is used to prevent the 'else' from being ambiguous when the @@ -707,13 +689,13 @@ template <class t1, class t2> \ inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \ const char* names) { \ - if (ANALYZER_ASSUME_TRUE(v1 op v2)) \ + if (v1 op v2) \ return NULL; \ else \ return ::logging::MakeCheckOpString(v1, v2, names); \ } \ inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \ - if (ANALYZER_ASSUME_TRUE(v1 op v2)) \ + if (v1 op v2) \ return NULL; \ else \ return ::logging::MakeCheckOpString(v1, v2, names); \ @@ -810,24 +792,58 @@ // DCHECK_IS_ON() is true. When DCHECK_IS_ON() is false, the macros use // EAT_STREAM_PARAMETERS to avoid expressions that would create temporaries. +#if defined(_PREFAST_) && defined(OS_WIN) +// See comments on the previous use of __analysis_assume. + +#define DCHECK(condition) \ + __analysis_assume(!!(condition)), \ + LAZY_STREAM(LOG_STREAM(DCHECK), false) \ + << "Check failed: " #condition ". " + +#define DPCHECK(condition) \ + __analysis_assume(!!(condition)), \ + LAZY_STREAM(PLOG_STREAM(DCHECK), false) \ + << "Check failed: " #condition ". " + +#elif defined(__clang_analyzer__) + +// Keeps the static analyzer from proceeding along the current codepath, +// otherwise false positive errors may be generated by null pointer checks. +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +#define DCHECK(condition) \ + LAZY_STREAM( \ + LOG_STREAM(DCHECK), \ + DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \ + << "Check failed: " #condition ". " + +#define DPCHECK(condition) \ + LAZY_STREAM( \ + PLOG_STREAM(DCHECK), \ + DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \ + << "Check failed: " #condition ". " + +#else + #if DCHECK_IS_ON() -#define DCHECK(condition) \ - LAZY_STREAM(LOG_STREAM(DCHECK), !ANALYZER_ASSUME_TRUE(condition)) \ +#define DCHECK(condition) \ + LAZY_STREAM(LOG_STREAM(DCHECK), !(condition)) \ << "Check failed: " #condition ". " -#define DPCHECK(condition) \ - LAZY_STREAM(PLOG_STREAM(DCHECK), !ANALYZER_ASSUME_TRUE(condition)) \ +#define DPCHECK(condition) \ + LAZY_STREAM(PLOG_STREAM(DCHECK), !(condition)) \ << "Check failed: " #condition ". " #else // DCHECK_IS_ON() -#define DCHECK(condition) \ - EAT_STREAM_PARAMETERS << !ANALYZER_ASSUME_TRUE(condition) -#define DPCHECK(condition) \ - EAT_STREAM_PARAMETERS << !ANALYZER_ASSUME_TRUE(condition) +#define DCHECK(condition) EAT_STREAM_PARAMETERS << !(condition) +#define DPCHECK(condition) EAT_STREAM_PARAMETERS << !(condition) #endif // DCHECK_IS_ON() +#endif // Helper macro for binary operators. // Don't use this macro directly in your code, use DCHECK_EQ et al below. @@ -863,7 +879,7 @@ ::logging::g_swallow_stream, val1), \ ::logging::MakeCheckOpValueString( \ ::logging::g_swallow_stream, val2), \ - ANALYZER_ASSUME_TRUE((val1)op(val2))) + (val1)op(val2)) #endif // DCHECK_IS_ON() @@ -1052,7 +1068,7 @@ #define RAW_CHECK(condition) \ do { \ - if (!ANALYZER_ASSUME_TRUE(condition)) \ + if (!(condition)) \ ::logging::RawLog(::logging::LOG_FATAL, \ "Check failed: " #condition "\n"); \ } while (0)
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index d2b5c39..396cda8 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h
@@ -394,6 +394,10 @@ return is_drawn_render_surface_layer_list_member_; } + bool IsDrawnScrollbar() { + return ToScrollbarLayer() && is_drawn_render_surface_layer_list_member_; + } + void set_may_contain_video(bool yes) { may_contain_video_ = yes; } bool may_contain_video() const { return may_contain_video_; }
diff --git a/cc/tiles/decoded_image_tracker_unittest.cc b/cc/tiles/decoded_image_tracker_unittest.cc index 54a08ba..6b8b25ab0 100644 --- a/cc/tiles/decoded_image_tracker_unittest.cc +++ b/cc/tiles/decoded_image_tracker_unittest.cc
@@ -56,9 +56,8 @@ TEST_F(DecodedImageTrackerTest, QueueImageLocksImages) { bool locked = false; decoded_image_tracker()->QueueImageDecode( - nullptr, - base::Bind([](bool* locked, bool success) { *locked = true; }, - base::Unretained(&locked))); + nullptr, base::Bind([](bool* locked, bool success) { *locked = true; }, + base::Unretained(&locked))); EXPECT_TRUE(locked); EXPECT_EQ(1u, image_controller()->num_locked_images()); } @@ -66,9 +65,8 @@ TEST_F(DecodedImageTrackerTest, NotifyFrameFinishedUnlocksImages) { bool locked = false; decoded_image_tracker()->QueueImageDecode( - nullptr, - base::Bind([](bool* locked, bool success) { *locked = true; }, - base::Unretained(&locked))); + nullptr, base::Bind([](bool* locked, bool success) { *locked = true; }, + base::Unretained(&locked))); EXPECT_TRUE(locked); EXPECT_EQ(1u, image_controller()->num_locked_images()); @@ -77,9 +75,8 @@ locked = false; decoded_image_tracker()->QueueImageDecode( - nullptr, - base::Bind([](bool* locked, bool success) { *locked = true; }, - base::Unretained(&locked))); + nullptr, base::Bind([](bool* locked, bool success) { *locked = true; }, + base::Unretained(&locked))); EXPECT_TRUE(locked); EXPECT_EQ(2u, image_controller()->num_locked_images());
diff --git a/cc/tiles/image_controller.cc b/cc/tiles/image_controller.cc index 2fe901d..ce6968b 100644 --- a/cc/tiles/image_controller.cc +++ b/cc/tiles/image_controller.cc
@@ -26,6 +26,8 @@ ImageController::~ImageController() { StopWorkerTasks(); + for (auto& request : orphaned_decode_requests_) + request.callback.Run(request.id, ImageDecodeResult::FAILURE); } void ImageController::StopWorkerTasks() { @@ -74,7 +76,6 @@ // be posted in the run loop, but since we invalidated the weak ptrs, we need // to run everything manually. for (auto& request_to_complete : requests_needing_completion_) { - ImageDecodeRequestId id = request_to_complete.first; ImageDecodeRequest& request = request_to_complete.second; // The task (if one exists) would have run already, we just need to make @@ -83,17 +84,13 @@ if (request.task && !request.task->HasCompleted()) request.task->DidComplete(); - // Issue the callback, and unref the image immediately. This is so that any - // code waiting on the callback can proceed, although we're breaking the - // promise of having this image decoded. This is unfortunate, but it seems - // like the least complexity to process an image decode controller becoming - // nullptr. - // TODO(vmpstr): We can move these back to |image_decode_queue_| instead - // and defer completion until we get a new cache and process the request - // again. crbug.com/693692. - request.callback.Run(id, ImageDecodeResult::FAILURE); if (request.need_unref) cache_->UnrefImage(request.draw_image); + + // Orphan the request so that we can still run it when a new cache is set. + request.task = nullptr; + request.need_unref = false; + orphaned_decode_requests_.push_back(std::move(request)); } requests_needing_completion_.clear(); @@ -101,7 +98,6 @@ // similar to the |requests_needing_completion_|, but happens at a different // stage in the pipeline. for (auto& request_pair : image_decode_queue_) { - ImageDecodeRequestId id = request_pair.first; ImageDecodeRequest& request = request_pair.second; if (request.task) { @@ -114,11 +110,12 @@ if (!request.task->HasCompleted()) request.task->DidComplete(); } - // Run the callback and unref the image. - // TODO(vmpstr): We can regenerate the tasks for the new cache if we get - // one. crbug.com/693692. - request.callback.Run(id, ImageDecodeResult::FAILURE); cache_->UnrefImage(request.draw_image); + + // Orphan the request so that we can still run it when a new cache is set. + request.task = nullptr; + request.need_unref = false; + orphaned_decode_requests_.push_back(std::move(request)); } image_decode_queue_.clear(); } @@ -133,6 +130,9 @@ } cache_ = cache; + + if (cache_) + GenerateTasksForOrphanedRequests(); } void ImageController::GetTasksForImagesAndRef( @@ -321,6 +321,33 @@ callback.Run(id, result); } +void ImageController::GenerateTasksForOrphanedRequests() { + base::AutoLock hold(lock_); + DCHECK_EQ(0u, image_decode_queue_.size()); + DCHECK_EQ(0u, requests_needing_completion_.size()); + DCHECK(cache_); + + for (auto& request : orphaned_decode_requests_) { + DCHECK(!request.task); + DCHECK(!request.need_unref); + if (request.draw_image.image()->isLazyGenerated()) { + // Get the task for this decode. + request.need_unref = cache_->GetOutOfRasterDecodeTaskForImageAndRef( + request.draw_image, &request.task); + } + image_decode_queue_[request.id] = std::move(request); + } + + orphaned_decode_requests_.clear(); + if (!image_decode_queue_.empty()) { + // Post a worker task. + worker_task_runner_->PostTask( + FROM_HERE, + base::Bind(&ImageController::ProcessNextImageDecodeOnWorkerThread, + base::Unretained(this))); + } +} + ImageController::ImageDecodeRequest::ImageDecodeRequest() = default; ImageController::ImageDecodeRequest::ImageDecodeRequest( ImageDecodeRequestId id,
diff --git a/cc/tiles/image_controller.h b/cc/tiles/image_controller.h index 4e8a572..f62638a 100644 --- a/cc/tiles/image_controller.h +++ b/cc/tiles/image_controller.h
@@ -86,6 +86,7 @@ void ProcessNextImageDecodeOnWorkerThread(); void ImageDecodeCompleted(ImageDecodeRequestId id); + void GenerateTasksForOrphanedRequests(); ImageDecodeCache* cache_ = nullptr; std::vector<DrawImage> predecode_locked_images_; @@ -102,6 +103,12 @@ std::map<ImageDecodeRequestId, ImageDecodeRequest> requests_needing_completion_; bool abort_tasks_ = false; + // Orphaned requests are requests that were either in queue or needed a + // completion callback when we set the decode cache to be nullptr. When a new + // decode cache is set, these requests are re-enqueued again with tasks + // generated by the new cache. Note that when the cache is set, then aside + // from generating new tasks, this vector should be empty. + std::vector<ImageDecodeRequest> orphaned_decode_requests_; base::WeakPtrFactory<ImageController> weak_ptr_factory_;
diff --git a/cc/tiles/image_controller_unittest.cc b/cc/tiles/image_controller_unittest.cc index 89fc160..90b708f 100644 --- a/cc/tiles/image_controller_unittest.cc +++ b/cc/tiles/image_controller_unittest.cc
@@ -266,6 +266,8 @@ run_loop->Run(); } + void ResetController() { controller_.reset(); } + private: scoped_refptr<base::SequencedTaskRunner> task_runner_; scoped_refptr<WorkerTaskRunner> worker_task_runner_; @@ -449,6 +451,7 @@ task_one->AllowToRun(); task_two->AllowToRun(); controller()->SetImageDecodeCache(nullptr); + ResetController(); RunOrTimeout(&run_loop); @@ -507,7 +510,7 @@ EXPECT_EQ(0, cache()->number_of_refs()); } -TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) { +TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheReset) { scoped_refptr<SimpleTask> task(new SimpleTask); cache()->SetTaskToUse(task); @@ -529,8 +532,59 @@ // the compositor thread. Ensure that the completion callbacks for the decode // is still run. controller()->SetImageDecodeCache(nullptr); + ResetController(); + RunOrTimeout(&run_loop1); RunOrTimeout(&run_loop2); + + EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE, + decode_client1.result()); + EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE, + decode_client2.result()); +} + +TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) { + scoped_refptr<SimpleTask> task(new SimpleTask); + cache()->SetTaskToUse(task); + + base::RunLoop run_loop1; + DecodeClient decode_client1; + base::RunLoop run_loop2; + DecodeClient decode_client2; + + controller()->QueueImageDecode( + image(), + base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), + run_loop1.QuitClosure())); + controller()->QueueImageDecode( + image(), + base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), + run_loop2.QuitClosure())); + + // Now reset the image cache before decode completed callbacks are posted to + // the compositor thread. This should orphan the requests. + controller()->SetImageDecodeCache(nullptr); + + EXPECT_EQ(0, cache()->number_of_refs()); + + TestableCache other_cache; + other_cache.SetTaskToUse(task); + + controller()->SetImageDecodeCache(&other_cache); + + RunOrTimeout(&run_loop1); + RunOrTimeout(&run_loop2); + + EXPECT_EQ(2, other_cache.number_of_refs()); + EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, + decode_client1.result()); + EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, + decode_client2.result()); + + // Reset the controller since the order of destruction is wrong in this test + // (|other_cache| should outlive the controller. This is normally done via + // SetImageDecodeCache(nullptr) or it can be done in the dtor of the cache.) + ResetController(); } } // namespace
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 132616e..f99af61 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -162,15 +162,10 @@ return false; auto* property_trees = child->layer_tree_impl()->property_trees(); - auto ancestor_scroll_id = - property_trees->layer_id_to_scroll_node_index.find(ancestor->id()); - if (ancestor_scroll_id == property_trees->layer_id_to_scroll_node_index.end()) - return false; - ScrollTree& scroll_tree = property_trees->scroll_tree; for (ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index()); scroll_node; scroll_node = scroll_tree.parent(scroll_node)) { - if (scroll_node->id == ancestor_scroll_id->second) + if (scroll_node->id == ancestor->scroll_tree_index()) return true; } return false; @@ -2629,28 +2624,6 @@ return active_tree_->LayerById(impl_scroll_node->owning_layer_id); } -static bool IsClosestScrollAncestor(LayerImpl* child, - LayerImpl* scroll_ancestor) { - DCHECK(scroll_ancestor); - if (!child) - return false; - - auto* property_trees = child->layer_tree_impl()->property_trees(); - auto ancestor_scroll_id = - property_trees->layer_id_to_scroll_node_index.find(scroll_ancestor->id()); - if (ancestor_scroll_id == property_trees->layer_id_to_scroll_node_index.end()) - return false; - - ScrollTree& scroll_tree = property_trees->scroll_tree; - ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index()); - for (; scroll_tree.parent(scroll_node); - scroll_node = scroll_tree.parent(scroll_node)) { - if (scroll_node->scrollable) - return scroll_node->id == ancestor_scroll_id->second; - } - return false; -} - InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl( ScrollState* scroll_state, LayerImpl* scrolling_layer_impl, @@ -2724,11 +2697,7 @@ active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); if (layer_impl) { - LayerImpl* scroll_layer_impl = - active_tree_->FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint( - device_viewport_point); - if (scroll_layer_impl && - !IsClosestScrollAncestor(layer_impl, scroll_layer_impl)) { + if (!IsInitialScrollHitTestReliable(layer_impl, device_viewport_point)) { scroll_status.thread = SCROLL_UNKNOWN; scroll_status.main_thread_scrolling_reasons = MainThreadScrollingReason::kFailedHitTest; @@ -2754,6 +2723,46 @@ return ScrollBeginImpl(scroll_state, scrolling_layer_impl, type); } +// Some initial scroll tests are known to be unreliable and require falling +// back to main thread scrolling. +bool LayerTreeHostImpl::IsInitialScrollHitTestReliable( + LayerImpl* layer_impl, + const gfx::PointF& device_viewport_point) { + LayerImpl* first_scrolling_layer_or_drawn_scrollbar = + active_tree_->FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint( + device_viewport_point); + if (!first_scrolling_layer_or_drawn_scrollbar) + return true; + + ScrollNode* closest_scroll_node = nullptr; + auto& scroll_tree = active_tree_->property_trees()->scroll_tree; + ScrollNode* scroll_node = scroll_tree.Node(layer_impl->scroll_tree_index()); + for (; scroll_tree.parent(scroll_node); + scroll_node = scroll_tree.parent(scroll_node)) { + if (scroll_node->scrollable) { + closest_scroll_node = scroll_node; + break; + } + } + if (!closest_scroll_node) + return false; + + // If |first_scrolling_layer_or_drawn_scrollbar| is scrollable, it will + // create a scroll node. If this scroll node corresponds to first scrollable + // ancestor along the scroll tree for |layer_impl|, the hit test has not + // escaped to other areas of the scroll tree and is reliable. + if (first_scrolling_layer_or_drawn_scrollbar->scrollable()) { + return closest_scroll_node->id == + first_scrolling_layer_or_drawn_scrollbar->scroll_tree_index(); + } + + // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must + // be a drawn scrollbar. These hit tests require falling back to main-thread + // scrolling. + DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar()); + return false; +} + InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin( const gfx::Point& viewport_point) { InputHandler::ScrollStatus scroll_status;
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 37f13061..0787f7f4 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -651,6 +651,7 @@ ScrollState* scroll_state, LayerImpl* scrolling_layer_impl, InputHandler::ScrollInputType type); + bool IsInitialScrollHitTestReliable(LayerImpl* layer, const gfx::PointF&); void DistributeScrollDelta(ScrollState* scroll_state); bool AnimatePageScale(base::TimeTicks monotonic_time);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index a82de3169..4f9c6ee 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1018,6 +1018,66 @@ EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); } +TEST_F(LayerTreeHostImplTest, ScrolledOverlappingDrawnScrollbarLayer) { + LayerTreeImpl* layer_tree_impl = host_impl_->active_tree(); + gfx::Size content_size = gfx::Size(360, 600); + gfx::Size scroll_content_size = gfx::Size(345, 3800); + gfx::Size scrollbar_size = gfx::Size(15, 600); + + host_impl_->SetViewportSize(content_size); + std::unique_ptr<LayerImpl> root = LayerImpl::Create(layer_tree_impl, 1); + root->SetBounds(content_size); + root->SetPosition(gfx::PointF()); + + std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2); + clip->SetBounds(content_size); + clip->SetPosition(gfx::PointF()); + + std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3); + scroll->SetBounds(scroll_content_size); + scroll->SetScrollClipLayer(clip->id()); + scroll->SetDrawsContent(true); + + std::unique_ptr<SolidColorScrollbarLayerImpl> drawn_scrollbar = + SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0, + false, true); + drawn_scrollbar->SetBounds(scrollbar_size); + drawn_scrollbar->SetPosition(gfx::PointF(345, 0)); + drawn_scrollbar->SetScrollLayerId(scroll->id()); + drawn_scrollbar->SetDrawsContent(true); + drawn_scrollbar->test_properties()->opacity = 1.f; + + std::unique_ptr<LayerImpl> squash = LayerImpl::Create(layer_tree_impl, 5); + squash->SetBounds(gfx::Size(140, 300)); + squash->SetPosition(gfx::PointF(220, 0)); + squash->SetDrawsContent(true); + + scroll->test_properties()->AddChild(std::move(drawn_scrollbar)); + scroll->test_properties()->AddChild(std::move(squash)); + clip->test_properties()->AddChild(std::move(scroll)); + root->test_properties()->AddChild(std::move(clip)); + + layer_tree_impl->SetRootLayerForTesting(std::move(root)); + layer_tree_impl->BuildPropertyTreesForTesting(); + layer_tree_impl->DidBecomeActive(); + + // The point hits squash layer and also scrollbar layer, but because the + // scrollbar layer is a drawn scrollbar, we cannot scroll on the impl thread. + auto status = host_impl_->ScrollBegin(BeginState(gfx::Point(350, 150)).get(), + InputHandler::WHEEL); + EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); + EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest, + status.main_thread_scrolling_reasons); + + // The point hits the drawn scrollbar layer completely and should not scroll + // on the impl thread. + status = host_impl_->ScrollBegin(BeginState(gfx::Point(350, 500)).get(), + InputHandler::WHEEL); + EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); + EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest, + status.main_thread_scrolling_reasons); +} + TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionBasic) { SetupScrollAndContentsLayers(gfx::Size(200, 200)); host_impl_->SetViewportSize(gfx::Size(100, 100));
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 5d91fc7..fae5f7c 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -1929,32 +1929,26 @@ } } -static bool IsScrollableOrDrawnScrollbarLayer(LayerImpl* layer) { - return layer->scrollable() || - (layer->ToScrollbarLayer() && - layer->is_drawn_render_surface_layer_list_member()); -} - -struct FindScrollingLayerOrScrollbarLayerFunctor { +struct FindScrollingLayerOrDrawnScrollbarFunctor { bool operator()(LayerImpl* layer) const { - return IsScrollableOrDrawnScrollbarLayer(layer); + return layer->scrollable() || layer->IsDrawnScrollbar(); } }; LayerImpl* -LayerTreeImpl::FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint( +LayerTreeImpl::FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint( const gfx::PointF& screen_space_point) { FindClosestMatchingLayerState state; LayerImpl* root_layer = layer_list_.empty() ? nullptr : layer_list_[0]; FindClosestMatchingLayer(screen_space_point, root_layer, - FindScrollingLayerOrScrollbarLayerFunctor(), &state); + FindScrollingLayerOrDrawnScrollbarFunctor(), &state); return state.closest_match; } struct HitTestVisibleScrollableOrTouchableFunctor { bool operator()(LayerImpl* layer) const { - return layer->is_drawn_render_surface_layer_list_member() || - IsScrollableOrDrawnScrollbarLayer(layer) || + return layer->scrollable() || + layer->is_drawn_render_surface_layer_list_member() || !layer->touch_event_handler_region().IsEmpty(); } };
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index a12b6b56..df46775 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -392,7 +392,7 @@ void RemoveSurfaceLayer(LayerImpl* layer); const LayerImplList& SurfaceLayers() const { return surface_layers_; } - LayerImpl* FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint( + LayerImpl* FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint( const gfx::PointF& screen_space_point); LayerImpl* FindLayerThatIsHitByPoint(const gfx::PointF& screen_space_point);
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS index c6ec049d..8c434f9 100644 --- a/chrome/android/java/DEPS +++ b/chrome/android/java/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+components/autofill/android/java/src/org/chromium/components/autofill", + "+components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler", "+components/bookmarks/common/android/java/src/org/chromium/components/bookmarks", "+components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content", "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java index 10bb8872..cf8de4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java
@@ -20,10 +20,6 @@ */ @TargetApi(Build.VERSION_CODES.N) public class NotificationJobService extends JobService { - // We don't need to distinguish between jobs sent to this service, so we can reuse one job id. - // But it ought to be distinct from job ids used with other JobService classes in our code. - static final int JOB_ID = 21; - static PersistableBundle getJobExtrasFromIntent(Intent intent) { PersistableBundle bundle = new PersistableBundle(); bundle.putString(NotificationConstants.EXTRA_NOTIFICATION_ID,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java index 15f833e..08ae69a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java
@@ -21,6 +21,7 @@ import org.chromium.base.library_loader.ProcessInitException; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.webapps.WebappRegistry; +import org.chromium.components.background_task_scheduler.TaskIds; /** * The Notification service receives intents fired as responses to user actions issued on Android @@ -48,7 +49,7 @@ PersistableBundle extras = NotificationJobService.getJobExtrasFromIntent(intent); JobInfo job = new JobInfo - .Builder(NotificationJobService.JOB_ID, + .Builder(TaskIds.NOTIFICATION_SERVICE_JOB_ID, new ComponentName(context, NotificationJobService.class)) .setExtras(extras) .setOverrideDeadline(0)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java index d1a1660be..54f0ded 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.services.gcm; +import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -16,7 +18,11 @@ import org.chromium.base.library_loader.ProcessInitException; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.init.ProcessInitializationHandler; +import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; +import org.chromium.components.background_task_scheduler.TaskIds; +import org.chromium.components.background_task_scheduler.TaskInfo; import org.chromium.components.gcm_driver.GCMDriver; +import org.chromium.components.gcm_driver.GCMMessage; /** * Receives Downstream messages and status of upstream messages from GCM. @@ -31,7 +37,7 @@ } @Override - public void onMessageReceived(String from, Bundle data) { + public void onMessageReceived(final String from, final Bundle data) { boolean hasCollapseKey = !TextUtils.isEmpty(data.getString("collapse_key")); GcmUma.recordDataMessageReceived(getApplicationContext(), hasCollapseKey); @@ -40,7 +46,24 @@ AndroidGcmController.get(this).onMessageReceived(data); return; } - pushMessageReceived(from, data); + + final Context applicationContext = getApplicationContext(); + + // Dispatch the message to the GCM Driver for native features. + ThreadUtils.runOnUiThread(new Runnable() { + @Override + public void run() { + GCMMessage message = null; + try { + message = new GCMMessage(from, data); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Received an invalid GCM Message", e); + return; + } + + scheduleOrDispatchMessageToDriver(applicationContext, message); + } + }); } @Override @@ -63,28 +86,50 @@ GcmUma.recordDeletedMessages(getApplicationContext()); } - private void pushMessageReceived(final String from, final Bundle data) { - final String bundleSubtype = "subtype"; - if (!data.containsKey(bundleSubtype)) { - Log.w(TAG, "Received push message with no subtype"); - return; + /** + * Either schedules |message| to be dispatched through the Job Scheduler, which we use on + * Android N and beyond, or immediately dispatches the message on other versions of Android. + * Must be called on the UI thread both for the BackgroundTaskScheduler and for dispatching + * the |message| to the GCMDriver. + */ + static void scheduleOrDispatchMessageToDriver(Context context, GCMMessage message) { + ThreadUtils.assertOnUiThread(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Bundle extras = message.toBundle(); + + // TODO(peter): Add UMA for measuring latency introduced by the BackgroundTaskScheduler. + TaskInfo backgroundTask = TaskInfo.createOneOffTask(TaskIds.GCM_BACKGROUND_TASK_JOB_ID, + GCMBackgroundTask.class, 0 /* immediately */) + .setExtras(extras) + .build(); + + BackgroundTaskSchedulerFactory.getScheduler().schedule(context, backgroundTask); + + } else { + dispatchMessageToDriver(context, message); } - final String appId = data.getString(bundleSubtype); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - @SuppressFBWarnings("DM_EXIT") - public void run() { - try { - ChromeBrowserInitializer.getInstance(getApplicationContext()) - .handleSynchronousStartup(); - GCMDriver.onMessageReceived(appId, from, data); - } catch (ProcessInitException e) { - Log.e(TAG, "ProcessInitException while starting the browser process"); - // Since the library failed to initialize nothing in the application - // can work, so kill the whole application not just the activity. - System.exit(-1); - } - } - }); + } + + /** + * To be called when a GCM message is ready to be dispatched. Will initialise the native code + * of the browser process, and forward the message to the GCM Driver. Must be called on the UI + * thread. + */ + @SuppressFBWarnings("DM_EXIT") + static void dispatchMessageToDriver(Context applicationContext, GCMMessage message) { + ThreadUtils.assertOnUiThread(); + + try { + ChromeBrowserInitializer.getInstance(applicationContext).handleSynchronousStartup(); + GCMDriver.dispatchMessage(message); + + } catch (ProcessInitException e) { + Log.e(TAG, "ProcessInitException while starting the browser process"); + + // Since the library failed to initialize nothing in the application can work, so kill + // the whole application as opposed to just this service. + System.exit(-1); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java new file mode 100644 index 0000000..db2533b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java
@@ -0,0 +1,58 @@ +// Copyright 2017 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. + +package org.chromium.chrome.browser.services.gcm; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.MainThread; + +import org.chromium.base.Log; +import org.chromium.components.background_task_scheduler.BackgroundTask; +import org.chromium.components.background_task_scheduler.TaskParameters; +import org.chromium.components.gcm_driver.GCMMessage; + +/** + * Processes jobs that have been scheduled for delivering GCM messages to the native GCM Driver, + * processing for which may exceed the lifetime of the GcmListenerService. + */ +@TargetApi(Build.VERSION_CODES.N) +public class GCMBackgroundTask implements BackgroundTask { + private static final String TAG = "GCMBackgroundTask"; + + /** + * Called when a GCM message is ready to be delivered to the GCM Driver consumer. Because we + * don't yet know when a message has been fully processed, the task returns that processing has + * been completed, and we hope that the system keeps us alive long enough to finish processing. + * + * @return Boolean indicating whether the WakeLock for this task must be maintained. + */ + @MainThread + @Override + public boolean onStartTask( + Context context, TaskParameters taskParameters, TaskFinishedCallback callback) { + Bundle extras = taskParameters.getExtras(); + if (!GCMMessage.validateBundle(extras)) { + Log.e(TAG, "The received bundle containing message data could not be validated."); + return false; + } + + ChromeGcmListenerService.dispatchMessageToDriver(context, new GCMMessage(extras)); + return false; + } + + /** + * Called when the system has determined that processing the GCM message must be stopped. + * + * @return Boolean indicating whether the task has to be rescheduled. + */ + @MainThread + @Override + public boolean onStopTask(Context context, TaskParameters taskParameters) { + // The GCM Driver has no mechanism for aborting previously dispatched messages. + return false; + } +}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 19f24575..6ec6b3a 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -886,6 +886,7 @@ "java/src/org/chromium/chrome/browser/services/AndroidEduOwnerCheckCallback.java", "java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java", "java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java", + "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java", "java/src/org/chromium/chrome/browser/services/gcm/GcmUma.java", "java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java", "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java index 67f7371..15db01f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
@@ -30,6 +30,7 @@ import org.chromium.chrome.test.util.browser.TabTitleObserver; import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy.NotificationEntry; import org.chromium.components.gcm_driver.GCMDriver; +import org.chromium.components.gcm_driver.GCMMessage; import org.chromium.components.gcm_driver.instance_id.FakeInstanceIDWithSubtype; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -293,10 +294,14 @@ @Override public void run() { Context context = getInstrumentation().getTargetContext().getApplicationContext(); + Bundle extras = new Bundle(); + extras.putString("subtype", appId); + + GCMMessage message = new GCMMessage(senderId, extras); try { ChromeBrowserInitializer.getInstance(context).handleSynchronousStartup(); - GCMDriver.onMessageReceived(appId, senderId, extras); + GCMDriver.dispatchMessage(message); } catch (ProcessInitException e) { fail("Chrome browser failed to initialize."); }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index e73e74a..96e6fe9 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1641,7 +1641,7 @@ Search engine </message> <message name="IDS_SETTINGS_SEARCH_EXPLANATION" desc="Explanation for the search engine dropdown setting."> - Search engine used when searching from the <ph name="BEGIN_LINK"><a target="_blank" href="$1"></ph>omnibox<ph name="END_LINK"></a></ph> + Search engine used when searching from the <ph name="BEGIN_LINK"><a target="_blank" href="$1"></ph>address bar<ph name="END_LINK"></a></ph> </message> <message name="IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES" desc="Label for the Manage Search Engines button."> Manage search engines
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc index 468547b..ff7226a 100644 --- a/chrome/browser/android/offline_pages/background_loader_offliner.cc +++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc
@@ -268,7 +268,9 @@ // Pass in the original URL if it's different from last committed // when redirects occur. - if (params.url != request.url()) + if (!request.original_url().is_empty()) + params.original_url = request.original_url(); + else if (params.url != request.url()) params.original_url = request.url(); offline_page_model_->SavePage(
diff --git a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc index 09b3350..f3d5f2f 100644 --- a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc +++ b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc
@@ -85,7 +85,8 @@ return tab->web_contents(); } -void SavePageIfNotNavigatedAway(const GURL& original_url, +void SavePageIfNotNavigatedAway(const GURL& url, + const GURL& original_url, const ScopedJavaGlobalRef<jobject>& j_tab_ref) { content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref); if (!web_contents) @@ -93,8 +94,8 @@ // This ignores fragment differences in URLs, bails out only if tab has // navigated away and not just scrolled to a fragment. - GURL url = web_contents->GetLastCommittedURL(); - if (!OfflinePageUtils::EqualsIgnoringFragment(url, original_url)) + GURL current_url = web_contents->GetLastCommittedURL(); + if (!OfflinePageUtils::EqualsIgnoringFragment(current_url, url)) return; offline_pages::ClientId client_id; @@ -112,9 +113,13 @@ offline_pages::RequestCoordinatorFactory::GetForBrowserContext( web_contents->GetBrowserContext()); if (request_coordinator) { - request_id = request_coordinator->SavePageLater( - url, client_id, true, - RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER); + offline_pages::RequestCoordinator::SavePageLaterParams params; + params.url = current_url; + params.client_id = client_id; + params.availability = + RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER; + params.original_url = original_url; + request_id = request_coordinator->SavePageLater(params); } else { DVLOG(1) << "SavePageIfNotNavigatedAway has no valid coordinator."; } @@ -145,6 +150,7 @@ } void RequestQueueDuplicateCheckDone( + const GURL& url, const GURL& original_url, const ScopedJavaGlobalRef<jobject>& j_tab_ref, bool has_duplicates, @@ -170,10 +176,11 @@ return; } - SavePageIfNotNavigatedAway(original_url, j_tab_ref); + SavePageIfNotNavigatedAway(url, original_url, j_tab_ref); } -void ModelDuplicateCheckDone(const GURL& original_url, +void ModelDuplicateCheckDone(const GURL& url, + const GURL& original_url, const ScopedJavaGlobalRef<jobject>& j_tab_ref, bool has_duplicates, const base::Time& latest_saved_time) { @@ -193,16 +200,16 @@ base::TimeDelta::FromDays(7).InSeconds(), 50); OfflinePageInfoBarDelegate::Create( - base::Bind(&SavePageIfNotNavigatedAway, original_url, j_tab_ref), - original_url, web_contents); + base::Bind(&SavePageIfNotNavigatedAway, url, original_url, j_tab_ref), + url, web_contents); return; } OfflinePageUtils::CheckExistenceOfRequestsWithURL( Profile::FromBrowserContext(web_contents->GetBrowserContext()) ->GetOriginalProfile(), - kDownloadNamespace, original_url, - base::Bind(&RequestQueueDuplicateCheckDone, original_url, j_tab_ref)); + kDownloadNamespace, url, base::Bind(&RequestQueueDuplicateCheckDone, url, + original_url, j_tab_ref)); } void ToJavaOfflinePageDownloadItemList( @@ -371,12 +378,15 @@ return; GURL url = web_contents->GetLastCommittedURL(); + GURL original_url = + offline_pages::OfflinePageUtils::GetOriginalURLFromWebContents( + web_contents); ScopedJavaGlobalRef<jobject> j_tab_ref(env, j_tab); OfflinePageUtils::CheckExistenceOfPagesWithURL( tab->GetProfile()->GetOriginalProfile(), kDownloadNamespace, url, - base::Bind(&ModelDuplicateCheckDone, url, j_tab_ref)); + base::Bind(&ModelDuplicateCheckDone, url, original_url, j_tab_ref)); } void OfflinePageDownloadBridge::CancelDownload(
diff --git a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc index 81af5aed..db1d635 100644 --- a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc +++ b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
@@ -349,10 +349,11 @@ client_id.name_space = ConvertJavaStringToUTF8(env, j_namespace); client_id.id = ConvertJavaStringToUTF8(env, j_client_id); - request_coordinator_->SavePageLater( - GURL(ConvertJavaStringToUTF8(env, j_url)), client_id, - static_cast<bool>(user_requested), - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); + RequestCoordinator::SavePageLaterParams params; + params.url = GURL(ConvertJavaStringToUTF8(env, j_url)); + params.client_id = client_id; + params.user_requested = static_cast<bool>(user_requested); + request_coordinator_->SavePageLater(params); } void OfflinePageEvaluationBridge::GetRequestsInQueue(
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc index 2661b85..126025e 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.cc +++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -466,10 +466,13 @@ offline_pages::RequestCoordinatorFactory::GetInstance()-> GetForBrowserContext(browser_context_); - coordinator->SavePageLater( - GURL(ConvertJavaStringToUTF8(env, j_url)), client_id, - static_cast<bool>(user_requested), - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); + RequestCoordinator::SavePageLaterParams params; + params.url = GURL(ConvertJavaStringToUTF8(env, j_url)); + params.client_id = client_id; + params.user_requested = static_cast<bool>(user_requested); + params.availability = + RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER; + coordinator->SavePageLater(params); } ScopedJavaLocalRef<jstring> OfflinePageBridge::GetOfflinePageHeaderForReload(
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.cc b/chrome/browser/android/offline_pages/offline_page_utils.cc index a640ab4..1d304f2 100644 --- a/chrome/browser/android/offline_pages/offline_page_utils.cc +++ b/chrome/browser/android/offline_pages/offline_page_utils.cc
@@ -28,8 +28,8 @@ #include "components/offline_pages/core/offline_page_model.h" #include "components/offline_pages/core/request_header/offline_page_header.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" -#include "url/gurl.h" namespace offline_pages { namespace { @@ -243,13 +243,23 @@ if (!request_coordinator) return; - ClientId client_id(kDownloadNamespace, base::GenerateGUID()); - request_coordinator->SavePageLater( - url, client_id, true, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); + RequestCoordinator::SavePageLaterParams params; + params.url = url; + params.client_id = ClientId(kDownloadNamespace, base::GenerateGUID()); + request_coordinator->SavePageLater(params); android::OfflinePageNotificationBridge notification_bridge; notification_bridge.ShowDownloadingToast(); } +// static +GURL OfflinePageUtils::GetOriginalURLFromWebContents( + content::WebContents* web_contents) { + content::NavigationEntry* entry = + web_contents->GetController().GetLastCommittedEntry(); + if (!entry || entry->GetRedirectChain().size() <= 1) + return GURL(); + return entry->GetRedirectChain().front(); +} + } // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.h b/chrome/browser/android/offline_pages/offline_page_utils.h index 85f61b60..f223195 100644 --- a/chrome/browser/android/offline_pages/offline_page_utils.h +++ b/chrome/browser/android/offline_pages/offline_page_utils.h
@@ -9,8 +9,7 @@ #include "base/callback.h" #include "components/offline_pages/core/offline_page_model.h" - -class GURL; +#include "url/gurl.h" namespace base { class Time; @@ -95,6 +94,10 @@ static void StartOfflinePageDownload(content::BrowserContext* context, const GURL& url); + + // Returns original URL of the given web contents. Empty URL is returned if + // no redirect occurred. + static GURL GetOriginalURLFromWebContents(content::WebContents* web_contents); }; } // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc index 2be4550e..8f55101 100644 --- a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc +++ b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
@@ -186,12 +186,11 @@ RequestCoordinator* request_coordinator = RequestCoordinatorFactory::GetForBrowserContext(profile()); - offline_pages::ClientId client_id; - client_id.name_space = kDownloadNamespace; - client_id.id = kTestPage3ClientId; - request_coordinator->SavePageLater( - kTestPage3Url, client_id, true, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); + RequestCoordinator::SavePageLaterParams params; + params.url = kTestPage3Url; + params.client_id = + offline_pages::ClientId(kDownloadNamespace, kTestPage3ClientId); + request_coordinator->SavePageLater(params); RunUntilIdle(); }
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner.cc b/chrome/browser/android/offline_pages/prerendering_offliner.cc index 5554393f..d85f3cbf 100644 --- a/chrome/browser/android/offline_pages/prerendering_offliner.cc +++ b/chrome/browser/android/offline_pages/prerendering_offliner.cc
@@ -82,7 +82,9 @@ save_page_params.is_background = true; // Pass in the original URL if it is different from the last committed URL // when redirects occur. - if (save_page_params.url != request.url()) + if (!request.original_url().is_empty()) + save_page_params.original_url = request.original_url(); + else if (save_page_params.url != request.url()) save_page_params.original_url = request.url(); SavePage(save_page_params, std::move(archiver),
diff --git a/chrome/browser/android/offline_pages/recent_tab_helper.cc b/chrome/browser/android/offline_pages/recent_tab_helper.cc index 064036a..a4afe42 100644 --- a/chrome/browser/android/offline_pages/recent_tab_helper.cc +++ b/chrome/browser/android/offline_pages/recent_tab_helper.cc
@@ -392,6 +392,8 @@ save_page_params.client_id = snapshot_info->client_id; save_page_params.proposed_offline_id = snapshot_info->request_id; save_page_params.is_background = false; + save_page_params.original_url = + OfflinePageUtils::GetOriginalURLFromWebContents(web_contents()); page_model_->SavePage( save_page_params, delegate_->CreatePageArchiver(web_contents()), base::Bind(&RecentTabHelper::SavePageCallback,
diff --git a/chrome/browser/banners/app_banner_manager_browsertest.cc b/chrome/browser/banners/app_banner_manager_browsertest.cc index dda2b5d..d61d0b17 100644 --- a/chrome/browser/banners/app_banner_manager_browsertest.cc +++ b/chrome/browser/banners/app_banner_manager_browsertest.cc
@@ -136,7 +136,7 @@ if (iterations > 0) { ui_test_utils::NavigateToURL(browser, test_url); - EXPECT_EQ(false, manager->will_show()); + EXPECT_FALSE(manager->will_show()); EXPECT_FALSE(manager->is_active()); histograms.ExpectTotalCount(banners::kMinutesHistogram, 0);
diff --git a/chrome/browser/chromeos/input_method/input_method_syncer.cc b/chrome/browser/chromeos/input_method/input_method_syncer.cc index d27002a..12ce3b7 100644 --- a/chrome/browser/chromeos/input_method/input_method_syncer.cc +++ b/chrome/browser/chromeos/input_method/input_method_syncer.cc
@@ -12,8 +12,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/task_runner.h" -#include "base/task_runner_util.h" -#include "base/threading/sequenced_worker_pool.h" +#include "base/task_scheduler/post_task.h" #include "chrome/browser/browser_process.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -56,7 +55,6 @@ // Checks whether each language is supported, replacing locales with variants // if they are available. Must be called on a thread that allows IO. std::string CheckAndResolveLocales(const std::string& languages) { - DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); if (languages.empty()) return languages; std::vector<std::string> values = base::SplitString( @@ -237,12 +235,11 @@ AddSupportedInputMethodValues(preferred_languages_.GetValue(), preferred_languages_syncable, prefs::kLanguagePreferredLanguages)); - base::PostTaskAndReplyWithResult( - content::BrowserThread::GetBlockingPool(), - FROM_HERE, + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, base::TaskTraits().MayBlock().WithPriority( + base::TaskPriority::BACKGROUND), base::Bind(&CheckAndResolveLocales, languages), - base::Bind(&InputMethodSyncer::FinishMerge, - weak_factory_.GetWeakPtr())); + base::Bind(&InputMethodSyncer::FinishMerge, weak_factory_.GetWeakPtr())); } std::string InputMethodSyncer::AddSupportedInputMethodValues(
diff --git a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc index d64c1751..7174c202 100644 --- a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc +++ b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
@@ -12,7 +12,7 @@ #include "base/bind_helpers.h" #include "base/callback.h" #include "base/location.h" -#include "base/task_scheduler/post_task.h" +#include "base/threading/worker_pool.h" #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" #include "crypto/nss_crypto_module_delegate.h" #include "net/ssl/ssl_cert_request_info.h" @@ -81,13 +81,18 @@ password_delegate.reset( password_delegate_factory_.Run(request->host_and_port)); } - base::PostTaskWithTraitsAndReply( - FROM_HERE, base::TaskTraits().MayBlock().WithShutdownBehavior( - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN), - base::Bind(&ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread, - base::Unretained(this), base::Passed(&password_delegate), - request, additional_certs, selected_certs), - callback); + if (base::WorkerPool::PostTaskAndReply( + FROM_HERE, + base::Bind(&ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread, + base::Unretained(this), base::Passed(&password_delegate), + request, additional_certs, selected_certs), + callback, true)) { + return; + } + // If the task could not be posted, behave as if there were no certificates + // which requires to clear |selected_certs|. + selected_certs->clear(); + callback.Run(); } void ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread(
diff --git a/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc b/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc index 3621e9e..c3c63f9 100644 --- a/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc +++ b/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/chromeos/net/client_cert_store_chromeos.h" +#include <memory> #include <string> #include "base/callback.h" @@ -13,7 +14,6 @@ #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" #include "crypto/scoped_test_nss_db.h" @@ -77,7 +77,7 @@ class ClientCertStoreChromeOSTest : public ::testing::Test { public: - ClientCertStoreChromeOSTest() {} + ClientCertStoreChromeOSTest() : message_loop_(new base::MessageLoopForIO()) {} scoped_refptr<net::X509Certificate> ImportCertToSlot( const std::string& cert_filename, @@ -88,7 +88,7 @@ } private: - base::test::ScopedTaskScheduler scoped_task_scheduler_; + std::unique_ptr<base::MessageLoop> message_loop_; }; // Ensure that cert requests, that are started before the filter is initialized,
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc index 7bc699a..13763da 100644 --- a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc +++ b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" +#include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/chromeos/net/cert_verify_proc_chromeos.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -44,6 +45,8 @@ crypto::GetPrivateSlotForChromeOSUser( test_nss_user_.username_hash(), base::Callback<void(crypto::ScopedPK11Slot)>()))); + test_cert_db_->SetSlowTaskRunnerForTest( + base::ThreadTaskRunnerHandle::Get()); cert_verifier_.reset(new PolicyCertVerifier(base::Bind( &PolicyCertVerifierTest::OnTrustAnchorUsed, base::Unretained(this))));
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc index f472a2e4..fce6ed1 100644 --- a/chrome/browser/chromeos/policy/system_log_uploader.cc +++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -9,11 +9,11 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/memory/ptr_util.h" +#include "base/sequenced_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/syslog_logging.h" -#include "base/task_runner_util.h" -#include "base/threading/sequenced_worker_pool.h" +#include "base/task_scheduler/post_task.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/policy/upload_job_impl.h" #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" @@ -21,7 +21,6 @@ #include "chrome/common/chrome_switches.h" #include "components/feedback/anonymizer_tool.h" #include "components/policy/core/browser/browser_policy_connector.h" -#include "content/public/browser/browser_thread.h" #include "net/http/http_request_headers.h" #include "system_log_uploader.h" @@ -94,9 +93,10 @@ const LogUploadCallback& upload_callback) { // Run ReadFiles() in the thread that interacts with the file system and // return system logs to |upload_callback| on the current thread. - base::PostTaskAndReplyWithResult(content::BrowserThread::GetBlockingPool(), - FROM_HERE, base::Bind(&ReadFiles), - upload_callback); + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, base::TaskTraits().MayBlock().WithPriority( + base::TaskPriority::BACKGROUND), + base::Bind(&ReadFiles), upload_callback); } std::unique_ptr<policy::UploadJob> SystemLogDelegate::CreateUploadJob(
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc index 106ff22e..9a9de0d 100644 --- a/chrome/browser/devtools/devtools_sanity_browsertest.cc +++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -64,8 +64,10 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_registry_observer.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/notification_types.h" +#include "extensions/browser/test_extension_registry_observer.h" #include "extensions/common/switches.h" #include "extensions/common/value_builder.h" #include "net/dns/mock_host_resolver.h" @@ -489,23 +491,9 @@ browser()->profile())->extension_service(); extensions::ExtensionRegistry* registry = extensions::ExtensionRegistry::Get(browser()->profile()); - size_t num_before = registry->enabled_extensions().size(); - { - content::NotificationRegistrar registrar; - registrar.Add(this, - extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, - content::NotificationService::AllSources()); - base::CancelableClosure timeout( - base::Bind(&TimeoutCallback, "Extension load timed out.")); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, timeout.callback(), TestTimeouts::action_timeout()); - extensions::UnpackedInstaller::Create(service)->Load(path); - content::RunMessageLoop(); - timeout.Cancel(); - } - size_t num_after = registry->enabled_extensions().size(); - if (num_after != (num_before + 1)) - return nullptr; + extensions::TestExtensionRegistryObserver observer(registry); + extensions::UnpackedInstaller::Create(service)->Load(path); + observer.WaitForExtensionLoaded(); if (!WaitForExtensionViewsToLoad()) return nullptr; @@ -560,15 +548,9 @@ void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) override { - switch (type) { - case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: - case extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD: - base::MessageLoopForUI::current()->QuitWhenIdle(); - break; - default: - NOTREACHED(); - break; - } + DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD, + type); + base::MessageLoopForUI::current()->QuitWhenIdle(); } base::FilePath test_extensions_dir_;
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc index 11caece..1f44504 100644 --- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc +++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "base/memory/linked_ptr.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/profiles/profile.h" @@ -31,10 +30,11 @@ class ExtensionIndicatorIcon : public StatusIconObserver, public ExtensionActionIconFactory::Observer { public: - static ExtensionIndicatorIcon* Create(const Extension* extension, - ExtensionAction* action, - Profile* profile, - StatusTray* status_tray); + static std::unique_ptr<ExtensionIndicatorIcon> Create( + const Extension* extension, + ExtensionAction* action, + Profile* profile, + StatusTray* status_tray); ~ExtensionIndicatorIcon() override; // StatusIconObserver implementation. @@ -56,7 +56,7 @@ ExtensionActionIconFactory icon_factory_; }; -ExtensionIndicatorIcon* ExtensionIndicatorIcon::Create( +std::unique_ptr<ExtensionIndicatorIcon> ExtensionIndicatorIcon::Create( const Extension* extension, ExtensionAction* action, Profile* profile, @@ -66,10 +66,10 @@ // Check if a status icon was successfully created. if (extension_icon->icon_) - return extension_icon.release(); + return extension_icon; // We could not create a status icon. - return NULL; + return std::unique_ptr<ExtensionIndicatorIcon>(); } ExtensionIndicatorIcon::~ExtensionIndicatorIcon() { @@ -183,10 +183,11 @@ return; } - ExtensionIndicatorIcon* extension_icon = ExtensionIndicatorIcon::Create( - extension, extension_action, profile_, status_tray_); + std::unique_ptr<ExtensionIndicatorIcon> extension_icon = + ExtensionIndicatorIcon::Create(extension, extension_action, profile_, + status_tray_); if (extension_icon) - system_indicators_[extension->id()] = make_linked_ptr(extension_icon); + system_indicators_[extension->id()] = std::move(extension_icon); } void SystemIndicatorManager::RemoveIndicator(const std::string& extension_id) {
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h index 58b0e6b7..fe024985 100644 --- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h +++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
@@ -10,7 +10,6 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/scoped_observer.h" #include "base/threading/thread_checker.h" #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" @@ -68,8 +67,8 @@ // Causes the indicator for the given extension to be hidden. void RemoveIndicator(const std::string& extension_id); - typedef std::map<const std::string, linked_ptr<ExtensionIndicatorIcon> > - SystemIndicatorMap; + using SystemIndicatorMap = + std::map<const std::string, std::unique_ptr<ExtensionIndicatorIcon>>; Profile* profile_; StatusTray* status_tray_;
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc index aaa3df60..be07e4d 100644 --- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -129,7 +129,7 @@ auto throttle = base::MakeUnique<Throttle>(); throttle->set_url(url); throttles_.push_back(throttle->AsWeakPtr()); - return throttle; + return std::move(throttle); } private:
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc index 0126832d..c74a5711 100644 --- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -1776,15 +1776,18 @@ linked_ptr<EventResponseDelta> d0( new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); deltas.push_back(d0); + bool request_headers_modified0; net::HttpRequestHeaders headers0; headers0.MergeFrom(base_headers); - MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log); + MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log, + &request_headers_modified0); ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); EXPECT_EQ("value 1", header_value); ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); EXPECT_EQ("value 2", header_value); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(0u, capturing_net_log.GetSize()); + EXPECT_FALSE(request_headers_modified0); // Delete, modify and add a header. linked_ptr<EventResponseDelta> d1( @@ -1796,9 +1799,11 @@ deltas.sort(&InDecreasingExtensionInstallationTimeOrder); warning_set.clear(); capturing_net_log.Clear(); + bool request_headers_modified1; net::HttpRequestHeaders headers1; headers1.MergeFrom(base_headers); - MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); + MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log, + &request_headers_modified1); EXPECT_FALSE(headers1.HasHeader("key1")); ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); EXPECT_EQ("value 3", header_value); @@ -1806,6 +1811,7 @@ EXPECT_EQ("value 3", header_value); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(1u, capturing_net_log.GetSize()); + EXPECT_TRUE(request_headers_modified1); // Check that conflicts are atomic, i.e. if one header modification // collides all other conflicts of the same extension are declined as well. @@ -1818,9 +1824,11 @@ deltas.sort(&InDecreasingExtensionInstallationTimeOrder); warning_set.clear(); capturing_net_log.Clear(); + bool request_headers_modified2; net::HttpRequestHeaders headers2; headers2.MergeFrom(base_headers); - MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log); + MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log, + &request_headers_modified2); EXPECT_FALSE(headers2.HasHeader("key1")); ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); EXPECT_EQ("value 3", header_value); @@ -1830,6 +1838,7 @@ EXPECT_EQ(1u, warning_set.size()); EXPECT_TRUE(HasWarning(warning_set, "extid2")); EXPECT_EQ(2u, capturing_net_log.GetSize()); + EXPECT_TRUE(request_headers_modified2); // Check that identical modifications don't conflict and operations // can be merged. @@ -1842,9 +1851,11 @@ deltas.sort(&InDecreasingExtensionInstallationTimeOrder); warning_set.clear(); capturing_net_log.Clear(); + bool request_headers_modified3; net::HttpRequestHeaders headers3; headers3.MergeFrom(base_headers); - MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log); + MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log, + &request_headers_modified3); EXPECT_FALSE(headers3.HasHeader("key1")); ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); EXPECT_EQ("value 3", header_value); @@ -1855,6 +1866,7 @@ EXPECT_EQ(1u, warning_set.size()); EXPECT_TRUE(HasWarning(warning_set, "extid2")); EXPECT_EQ(3u, capturing_net_log.GetSize()); + EXPECT_TRUE(request_headers_modified3); } TEST(ExtensionWebRequestHelpersTest, @@ -1907,15 +1919,18 @@ deltas.push_back(delta); } deltas.sort(&InDecreasingExtensionInstallationTimeOrder); + bool request_headers_modified1; net::HttpRequestHeaders headers1; headers1.MergeFrom(base_headers); warning_set.clear(); - MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); + MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log, + &request_headers_modified1); EXPECT_TRUE(headers1.HasHeader("Cookie")); ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(0u, capturing_net_log.GetSize()); + EXPECT_FALSE(request_headers_modified1); } namespace { @@ -2201,15 +2216,18 @@ linked_ptr<EventResponseDelta> d0( new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); deltas.push_back(d0); + bool response_headers_modified0; scoped_refptr<net::HttpResponseHeaders> new_headers0; GURL allowed_unsafe_redirect_url0; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified0); EXPECT_FALSE(new_headers0.get()); EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(0u, capturing_net_log.GetSize()); + EXPECT_FALSE(response_headers_modified0); linked_ptr<EventResponseDelta> d1( new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); @@ -2220,11 +2238,13 @@ deltas.sort(&InDecreasingExtensionInstallationTimeOrder); warning_set.clear(); capturing_net_log.Clear(); + bool response_headers_modified1; scoped_refptr<net::HttpResponseHeaders> new_headers1; GURL allowed_unsafe_redirect_url1; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified1); ASSERT_TRUE(new_headers1.get()); EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); std::multimap<std::string, std::string> expected1; @@ -2239,6 +2259,7 @@ EXPECT_EQ(expected1, actual1); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(1u, capturing_net_log.GetSize()); + EXPECT_TRUE(response_headers_modified1); // Check that we replace response headers only once. linked_ptr<EventResponseDelta> d2( @@ -2251,11 +2272,13 @@ deltas.sort(&InDecreasingExtensionInstallationTimeOrder); warning_set.clear(); capturing_net_log.Clear(); + bool response_headers_modified2; scoped_refptr<net::HttpResponseHeaders> new_headers2; GURL allowed_unsafe_redirect_url2; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers2, &allowed_unsafe_redirect_url2, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified2); ASSERT_TRUE(new_headers2.get()); EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty()); iter = 0; @@ -2267,6 +2290,7 @@ EXPECT_EQ(1u, warning_set.size()); EXPECT_TRUE(HasWarning(warning_set, "extid2")); EXPECT_EQ(2u, capturing_net_log.GetSize()); + EXPECT_TRUE(response_headers_modified2); } // Check that we do not delete too much @@ -2294,11 +2318,13 @@ new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); deltas.push_back(d1); + bool response_headers_modified1; scoped_refptr<net::HttpResponseHeaders> new_headers1; GURL allowed_unsafe_redirect_url1; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified1); ASSERT_TRUE(new_headers1.get()); EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); std::multimap<std::string, std::string> expected1; @@ -2315,6 +2341,7 @@ EXPECT_EQ(expected1, actual1); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(1u, capturing_net_log.GetSize()); + EXPECT_TRUE(response_headers_modified1); } // Tests whether onHeadersReceived can initiate a redirect. @@ -2338,15 +2365,18 @@ linked_ptr<EventResponseDelta> d0( new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); deltas.push_back(d0); + bool response_headers_modified0; scoped_refptr<net::HttpResponseHeaders> new_headers0; GURL allowed_unsafe_redirect_url0; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified0); EXPECT_FALSE(new_headers0.get()); EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); EXPECT_EQ(0u, warning_set.size()); EXPECT_EQ(0u, capturing_net_log.GetSize()); + EXPECT_FALSE(response_headers_modified0); // Single redirect. GURL new_url_1("http://foo.com"); @@ -2356,17 +2386,20 @@ deltas.push_back(d1); deltas.sort(&InDecreasingExtensionInstallationTimeOrder); capturing_net_log.Clear(); + bool response_headers_modified1; scoped_refptr<net::HttpResponseHeaders> new_headers1; GURL allowed_unsafe_redirect_url1; MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, - &warning_set, &net_log); + &warning_set, &net_log, + &response_headers_modified1); EXPECT_TRUE(new_headers1.get()); EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec())); EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1); EXPECT_TRUE(warning_set.empty()); EXPECT_EQ(1u, capturing_net_log.GetSize()); + EXPECT_FALSE(response_headers_modified1); } TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
diff --git a/chrome/browser/media/cast_remoting_connector_fuzzertest.cc b/chrome/browser/media/cast_remoting_connector_fuzzertest.cc index 8719100..d43cf95c 100644 --- a/chrome/browser/media/cast_remoting_connector_fuzzertest.cc +++ b/chrome/browser/media/cast_remoting_connector_fuzzertest.cc
@@ -15,6 +15,7 @@ // Make sure the compiler does not try to optimize-away calls by storing their // results in a volatile variable. volatile unsigned int ignored_result; + (void)ignored_result; using Messaging = CastRemotingConnectorMessaging;
diff --git a/chrome/browser/net/net_error_tab_helper.cc b/chrome/browser/net/net_error_tab_helper.cc index 2cac81c..7453d790 100644 --- a/chrome/browser/net/net_error_tab_helper.cc +++ b/chrome/browser/net/net_error_tab_helper.cc
@@ -296,12 +296,11 @@ offline_pages::RequestCoordinatorFactory::GetForBrowserContext( web_contents()->GetBrowserContext()); DCHECK(request_coordinator) << "No RequestCoordinator for SavePageLater"; - offline_pages::ClientId client_id( - offline_pages::kAsyncNamespace, base::GenerateGUID()); - request_coordinator->SavePageLater( - page_url, client_id, true /*user_requested*/, - offline_pages::RequestCoordinator::RequestAvailability:: - ENABLED_FOR_OFFLINER); + offline_pages::RequestCoordinator::SavePageLaterParams params; + params.url = page_url; + params.client_id = offline_pages::ClientId(offline_pages::kAsyncNamespace, + base::GenerateGUID()); + request_coordinator->SavePageLater(params); } #endif // defined(OS_ANDROID)
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc index ae9f773..bfc31ea 100644 --- a/chrome/browser/previews/previews_service.cc +++ b/chrome/browser/previews/previews_service.cc
@@ -29,10 +29,11 @@ const base::FilePath& profile_path) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + base::SequencedWorkerPool* blocking_pool = + content::BrowserThread::GetBlockingPool(); // Get the background thread to run SQLite on. scoped_refptr<base::SequencedTaskRunner> background_task_runner = - content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - content::BrowserThread::GetBlockingPool()->GetSequenceToken()); + blocking_pool->GetSequencedTaskRunner(blocking_pool->GetSequenceToken()); previews_ui_service_ = base::MakeUnique<previews::PreviewsUIService>( previews_io_data, io_task_runner,
diff --git a/chrome/browser/resources/md_history/app.js b/chrome/browser/resources/md_history/app.js index e13e57a3..058bd546 100644 --- a/chrome/browser/resources/md_history/app.js +++ b/chrome/browser/resources/md_history/app.js
@@ -88,7 +88,6 @@ 'history-checkbox-select': 'checkboxSelected', 'history-close-drawer': 'closeDrawer_', 'history-view-changed': 'historyViewChanged_', - 'opened-changed': 'onOpenedChanged_', 'unselect-all': 'unselectAll', }, @@ -158,15 +157,7 @@ var drawer = /** @type {!CrDrawerElement} */ (this.$.drawer.get()); drawer.align = document.documentElement.dir == 'ltr' ? 'left' : 'right'; drawer.toggle(); - }, - - /** - * @param {!CustomEvent} e - * @private - */ - onOpenedChanged_: function(e) { - if (e.detail.value) - this.showMenuPromo_ = false; + this.showMenuPromo_ = false; }, /**
diff --git a/chrome/browser/resources/welcome/win10/inline.css b/chrome/browser/resources/welcome/win10/inline.css index ac9ce13..1b4ad1d 100644 --- a/chrome/browser/resources/welcome/win10/inline.css +++ b/chrome/browser/resources/welcome/win10/inline.css
@@ -15,6 +15,7 @@ a { color: var(--google-blue-500); + cursor: pointer; text-decoration: none; }
diff --git a/chrome/browser/resources/welcome/win10/inline.html b/chrome/browser/resources/welcome/win10/inline.html index eec0458d9..dd31a554 100644 --- a/chrome/browser/resources/welcome/win10/inline.html +++ b/chrome/browser/resources/welcome/win10/inline.html
@@ -20,6 +20,8 @@ <script src="/welcome.js"></script> </head> <body> + <!-- TODO(tmartino): Create a dom-module and transfer contents of inline.css + inside.--> <template is="dom-bind" id="inline-app"> <div class="content"> <div class="header-logo"></div>
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc index 04b77aa..38c6a7f 100644 --- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -423,8 +423,8 @@ base::HistogramTester tester; ui_test_utils::NavigateToURL(browser(), url); - const auto kSubframeNames = {"one", "two", "three"}; - const auto kExpectScriptInFrameToLoad = {false, true, false}; + const std::vector<const char*> kSubframeNames{"one", "two", "three"}; + const std::vector<bool> kExpectScriptInFrameToLoad{false, true, false}; ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames( kSubframeNames, kExpectScriptInFrameToLoad)); @@ -440,9 +440,11 @@ ASSERT_NO_FATAL_FAILURE( SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); - const auto kSubframeNames = {"one", "two", "three"}; - const auto kExpectScriptInFrameToLoadWithoutActivation = {true, true, true}; - const auto kExpectScriptInFrameToLoadWithActivation = {false, true, false}; + const std::vector<const char*> kSubframeNames{"one", "two", "three"}; + const std::vector<bool> kExpectScriptInFrameToLoadWithoutActivation{ + true, true, true}; + const std::vector<bool> kExpectScriptInFrameToLoadWithActivation{false, true, + false}; ui_test_utils::NavigateToURL(browser(), url_without_activation); ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames( @@ -489,8 +491,8 @@ ASSERT_NO_FATAL_FAILURE( SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); - const auto kSubframeNames = {"one", "two", "three"}; - const auto kExpectScriptInFrameToLoad = {true, true, true}; + const std::vector<const char*> kSubframeNames{"one", "two", "three"}; + const std::vector<bool> kExpectScriptInFrameToLoad{true, true, true}; for (const auto& url_with_activation : {url_with_activation_but_dns_error, @@ -627,8 +629,8 @@ ASSERT_NO_FATAL_FAILURE( SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); ui_test_utils::NavigateToURL(browser(), a_url); - ExpectParsedScriptElementLoadedStatusInFrames({"b", "c", "d"}, - {false, false, false}); + ExpectParsedScriptElementLoadedStatusInFrames( + std::vector<const char*>{"b", "c", "d"}, {false, false, false}); } IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, @@ -640,7 +642,8 @@ SetRulesetWithRules({testing::CreateSuffixRule("included_script.js"), testing::CreateWhitelistRuleForDocument("c.com")})); ui_test_utils::NavigateToURL(browser(), a_url); - ExpectParsedScriptElementLoadedStatusInFrames({"b", "d"}, {false, true}); + ExpectParsedScriptElementLoadedStatusInFrames( + std::vector<const char*>{"b", "d"}, {false, true}); } // Tests checking how histograms are recorded. ---------------------------------
diff --git a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc index 5e043d92..4efb236 100644 --- a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc +++ b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
@@ -66,7 +66,17 @@ : LauncherItemController(extension_misc::kChromeAppId, std::string(), launcher_controller), - shelf_model_(shelf_model) {} + shelf_model_(shelf_model) { + // Tag all open browser windows with the appropriate shelf id property. This + // associates each window with the shelf item for the active web contents. + for (auto* browser : *BrowserList::GetInstance()) { + if (IsBrowserRepresentedInBrowserList(browser) && + browser->tab_strip_model()->GetActiveWebContents()) { + SetShelfIDForBrowserWindowContents( + browser, browser->tab_strip_model()->GetActiveWebContents()); + } + } +} BrowserShortcutLauncherItemController:: ~BrowserShortcutLauncherItemController() {} @@ -279,10 +289,12 @@ return false; // v1 App popup windows with a valid app id have their own icon. - if (browser->is_app() && browser->is_type_popup() && - ash::WmShell::Get()->shelf_delegate()->GetShelfIDForAppID( - web_app::GetExtensionIdFromApplicationName(browser->app_name())) > 0) + ash::ShelfDelegate* delegate = ash::WmShell::Get()->shelf_delegate(); + if (browser->is_app() && browser->is_type_popup() && delegate && + delegate->GetShelfIDForAppID(web_app::GetExtensionIdFromApplicationName( + browser->app_name())) > 0) { return false; + } // Settings browsers have their own icon. if (IsSettingsBrowser(browser))
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc index b204f527..8f7d0e4 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -2151,9 +2151,7 @@ } // Check that the window's ShelfID property matches that of the active tab. -// TODO(https://crbug.com/694941): Disabled due to flakiness. -IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, - DISABLED_MatchingShelfIDandActiveTab) { +IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, MatchingShelfIDandActiveTab) { EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); EXPECT_EQ(1, browser()->tab_strip_model()->count()); EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
diff --git a/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm b/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm index 8b451e59..e3d7b8f 100644 --- a/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm +++ b/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm
@@ -97,22 +97,26 @@ content::WebContents* web_contents = tab_util::GetWebContentsByID(render_process_host_id_, routing_id_); - Profile* profile = - Profile::FromBrowserContext(web_contents->GetBrowserContext()); - bool isChecked = [[alert_ suppressionButton] state] == NSOnState; - // Set the "don't warn me again" info. - if (isChecked) - ExternalProtocolHandler::SetBlockState(url_.scheme(), blockState, profile); + if (web_contents) { + Profile* profile = + Profile::FromBrowserContext(web_contents->GetBrowserContext()); + bool isChecked = [[alert_ suppressionButton] state] == NSOnState; + // Set the "don't warn me again" info. + if (isChecked) + ExternalProtocolHandler::SetBlockState(url_.scheme(), blockState, + profile); - ExternalProtocolHandler::RecordCheckboxStateMetrics(isChecked); - ExternalProtocolHandler::RecordHandleStateMetrics(isChecked, blockState); + ExternalProtocolHandler::RecordCheckboxStateMetrics(isChecked); + ExternalProtocolHandler::RecordHandleStateMetrics(isChecked, blockState); - if (blockState == ExternalProtocolHandler::DONT_BLOCK) { - UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url", - base::Time::Now() - creation_time_); + if (blockState == ExternalProtocolHandler::DONT_BLOCK) { + UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url", + base::Time::Now() - creation_time_); - ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_, web_contents); + ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_, + web_contents); + } } [self autorelease];
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc index 9bdb18c..c1c6be7 100644 --- a/chrome/browser/ui/libgtkui/gtk_ui.cc +++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -657,7 +657,7 @@ : nullptr); } - return gtk_border; + return std::move(gtk_border); } void GtkUi::AddWindowButtonOrderObserver(
diff --git a/chrome/browser/ui/test/test_browser_dialog.h b/chrome/browser/ui/test/test_browser_dialog.h index d071a80..0e9daa2 100644 --- a/chrome/browser/ui/test/test_browser_dialog.h +++ b/chrome/browser/ui/test/test_browser_dialog.h
@@ -52,7 +52,7 @@ // // Dialogs listed can be shown interactively using the --dialog argument. E.g. // -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive \ +// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive // --dialog=FooDialogTest.InvokeDialog_name class TestBrowserDialog { protected:
diff --git a/chrome/browser/ui/views/webshare/webshare_target_picker_view.h b/chrome/browser/ui/views/webshare/webshare_target_picker_view.h index 18464cf3..6e4db2e 100644 --- a/chrome/browser/ui/views/webshare/webshare_target_picker_view.h +++ b/chrome/browser/ui/views/webshare/webshare_target_picker_view.h
@@ -17,15 +17,12 @@ class GURL; class TargetPickerTableModel; +class WebShareTargetPickerViewTest; namespace views { class TableView; } -namespace { -class WebShareTargetPickerViewTest; -} - // Dialog that presents the user with a list of share target apps. Allows the // user to pick one target to be opened and have data passed to it. //
diff --git a/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc b/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc index a8d04789..130f70f 100644 --- a/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc +++ b/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc
@@ -24,8 +24,6 @@ #include "ui/views/window/dialog_delegate.h" #include "url/gurl.h" -namespace { - class WebShareTargetPickerViewTest : public views::ViewsTestBase { public: WebShareTargetPickerViewTest() {} @@ -169,5 +167,3 @@ EXPECT_EQ(base::Optional<std::string>("https://appone.com/path/bits"), result()); } - -} // namespace
diff --git a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc index 7d6a0b8..3a1bee5 100644 --- a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc +++ b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
@@ -167,6 +167,8 @@ save_page_request->SetDouble("lastAttempt", request->last_attempt_time().ToJsTime()); save_page_request->SetString("id", std::to_string(request->request_id())); + save_page_request->SetString("originalUrl", + request->original_url().spec()); } } ResolveJavascriptCallback(base::StringValue(callback_id), save_page_requests); @@ -282,13 +284,13 @@ std::ostringstream id_stream; id_stream << base::GenerateGUID(); + offline_pages::RequestCoordinator::SavePageLaterParams params; + params.url = GURL(url); + params.client_id = offline_pages::ClientId(offline_pages::kAsyncNamespace, + id_stream.str()); ResolveJavascriptCallback( - *callback_id, - base::FundamentalValue(request_coordinator_->SavePageLater( - GURL(url), offline_pages::ClientId( - offline_pages::kAsyncNamespace, id_stream.str()), - true, offline_pages::RequestCoordinator::RequestAvailability:: - ENABLED_FOR_OFFLINER) > 0)); + *callback_id, base::FundamentalValue( + request_coordinator_->SavePageLater(params) > 0)); } else { ResolveJavascriptCallback(*callback_id, base::FundamentalValue(false)); }
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 1d33be5d..fd07196c 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -662,6 +662,28 @@ return; } + // Early exit if there is already a preferences push pending sync startup. + if (sync_startup_tracker_) + return; + + if (!service->IsEngineInitialized()) { + // Requesting the sync service to start may trigger call to PushSyncPrefs. + // Setting up the startup tracker beforehand correctly signals the + // re-entrant call to early exit. + sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this)); + service->RequestStart(); + + // See if it's even possible to bring up the sync engine - if not + // (unrecoverable error?), don't bother displaying a spinner that will be + // immediately closed because this leads to some ugly infinite UI loop (see + // http://crbug.com/244769). + if (SyncStartupTracker::GetSyncServiceState(profile_) != + SyncStartupTracker::SYNC_STARTUP_ERROR) { + DisplaySpinner(); + } + return; + } + // User is already logged in. They must have brought up the config wizard // via the "Advanced..." button or through One-Click signin (cases 4-6), or // they are re-enabling sync after having disabled it (case 7). @@ -770,30 +792,9 @@ } #endif - // Early exit if there is already a preferences push pending sync startup. - if (sync_startup_tracker_) - return; - ProfileSyncService* service = GetSyncService(); // The sync service may be nullptr if it has been just disabled by policy. - if (!service) - return; - - if (!service->IsEngineInitialized()) { - // Requesting the sync service to start may trigger another reentrant call - // to PushSyncPrefs. Setting up the startup tracker beforehand correctly - // signals the re-entrant call to early exit. - sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this)); - service->RequestStart(); - - // See if it's even possible to bring up the sync engine - if not - // (unrecoverable error?), don't bother displaying a spinner that will be - // immediately closed because this leads to some ugly infinite UI loop (see - // http://crbug.com/244769). - if (SyncStartupTracker::GetSyncServiceState(profile_) != - SyncStartupTracker::SYNC_STARTUP_ERROR) { - DisplaySpinner(); - } + if (!service || !service->IsEngineInitialized()) { return; }
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc index c99641ff..45c7fc1 100644 --- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -291,6 +291,8 @@ handler_->sync_startup_tracker_->OnStateChanged(mock_pss_); } + void NotifySyncStateChanged() { handler_->OnStateChanged(mock_pss_); } + virtual std::string GetTestUser() { return std::string(kTestUser); } @@ -370,6 +372,7 @@ EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, RequestStart()); // We're simulating a user setting up sync, which would cause the engine to // kick off initialization, but not download user data types. The sync @@ -394,6 +397,7 @@ error_ = GoogleServiceAuthError::AuthErrorNone(); // Sync engine is stopped initially, and will start up. EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, RequestStart()); SetDefaultExpectationsForConfigPage(); handler_->OpenSyncSetup(); @@ -431,6 +435,7 @@ EXPECT_CALL(*mock_pss_, IsEngineInitialized()) .WillOnce(Return(false)) .WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, RequestStart()); SetDefaultExpectationsForConfigPage(); handler_->OpenSyncSetup(); @@ -451,6 +456,7 @@ EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, RequestStart()); handler_->OpenSyncSetup(); ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); @@ -466,6 +472,14 @@ profile_)->current_login_ui()); } +// Tests that signals not related to user intention to configure sync don't +// trigger sync engine start. +TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) { + EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, RequestStart()).Times(0); + NotifySyncStateChanged(); +} + #if !defined(OS_CHROMEOS) class PeopleHandlerNonCrosTest : public PeopleHandlerTest {
diff --git a/chrome/browser/ui/webui/welcome_win10_handler.cc b/chrome/browser/ui/webui/welcome_win10_handler.cc index a72f45c5..e57e746 100644 --- a/chrome/browser/ui/webui/welcome_win10_handler.cc +++ b/chrome/browser/ui/webui/welcome_win10_handler.cc
@@ -104,14 +104,14 @@ } // Only wait for a small amount of time for the result. If the timer fires, - // it will be assumed that Chrome is pinned to the taskbar. This is to make - // sure the instructions are never displayed in case it was impossible to - // determine the pinned state. + // it will be assumed that Chrome isn't pinned to the taskbar. This is to make + // sure the instructions are displayed in case it was impossible to determine + // the pinned state. constexpr base::TimeDelta kPinnedToTaskbarTimeout = base::TimeDelta::FromMilliseconds(200); timer_.Start(FROM_HERE, kPinnedToTaskbarTimeout, base::Bind(&WelcomeWin10Handler::OnIsPinnedToTaskbarDetermined, - base::Unretained(this), true, true)); + base::Unretained(this), true, false)); } void WelcomeWin10Handler::HandleSetDefaultBrowser(const base::ListValue* args) {
diff --git a/chrome/test/data/webui/md_history/history_toolbar_test.js b/chrome/test/data/webui/md_history/history_toolbar_test.js index 1d971d71..f2dfa7ef 100644 --- a/chrome/test/data/webui/md_history/history_toolbar_test.js +++ b/chrome/test/data/webui/md_history/history_toolbar_test.js
@@ -101,6 +101,14 @@ assertTrue(notice.hidden); }); + test('menu promo hides when drawer is opened', function() { + app.showMenuPromo_ = true; + app.hasDrawer_ = true; + Polymer.dom.flush(); + MockInteractions.tap(toolbar.$['main-toolbar'].$$('#menuButton')); + assertFalse(app.showMenuPromo_); + }); + teardown(function() { registerMessageCallback('queryHistory', this, function() {}); });
diff --git a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc index 7418f1f..ab40288 100644 --- a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc +++ b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc
@@ -21,6 +21,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" #include "base/threading/thread_task_runner_handle.h" @@ -232,6 +233,7 @@ void OnPauseCompleted(); + base::test::ScopedTaskScheduler task_scheduler_; MediaPipelineDeviceParams::MediaSyncType sync_type_; MediaPipelineDeviceParams::AudioStreamType audio_type_; std::unique_ptr<TaskRunnerImpl> task_runner_; @@ -903,8 +905,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, Mp3Playback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("sfx.mp3"); PauseBeforeEos(); @@ -913,8 +913,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, AacPlayback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("sfx.m4a"); PauseBeforeEos(); @@ -923,8 +921,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, VorbisPlayback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts); ConfigureForAudioOnly("sfx.ogg"); Start(); @@ -934,8 +930,6 @@ // TODO(kmackay) FFmpegDemuxForTest can't handle AC3 or EAC3. TEST_F(AudioVideoPipelineDeviceTest, OpusPlayback_Optional) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("bear-opus.ogg"); PauseBeforeEos(); @@ -944,8 +938,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, FlacPlayback_Optional) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("bear.flac"); PauseBeforeEos(); @@ -954,8 +946,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, H264Playback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForVideoOnly("bear.h264", true /* raw_h264 */); PauseBeforeEos(); @@ -964,8 +954,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, WebmPlaybackWithPause) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); // Setup to pause for 100ms every 500ms AddPause(base::TimeDelta::FromMilliseconds(500), @@ -977,8 +965,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, Vp8Playback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForVideoOnly("bear-vp8a.webm", false /* raw_h264 */); Start(); @@ -986,8 +972,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForFile("bear-640x360.webm"); PauseBeforeEos(); @@ -998,7 +982,6 @@ // TODO(kmackay) FFmpegDemuxForTest can't handle HEVC or VP9. TEST_F(AudioVideoPipelineDeviceTest, AudioBackendStates) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); Initialize(); MediaPipelineBackend::AudioDecoder* audio_decoder = backend()->CreateAudioDecoder(); @@ -1015,7 +998,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, AudioEffectsBackendStates) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); set_audio_type(MediaPipelineDeviceParams::kAudioStreamSoundEffects); set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts); Initialize(); @@ -1033,7 +1015,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, VideoBackendStates) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); Initialize(); MediaPipelineBackend::VideoDecoder* video_decoder = backend()->CreateVideoDecoder(); @@ -1050,7 +1031,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, AudioImmediateEos) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); Initialize(); MediaPipelineBackend::AudioDecoder* audio_decoder = backend()->CreateAudioDecoder(); @@ -1063,10 +1043,10 @@ SetAudioFeeder(std::move(feeder)); StartImmediateEosTest(); + base::RunLoop().RunUntilIdle(); } TEST_F(AudioVideoPipelineDeviceTest, VideoImmediateEos) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); Initialize(); MediaPipelineBackend::VideoDecoder* video_decoder = backend()->CreateVideoDecoder(); @@ -1079,11 +1059,10 @@ SetVideoFeeder(std::move(feeder)); StartImmediateEosTest(); + base::RunLoop().RunUntilIdle(); } TEST_F(AudioVideoPipelineDeviceTest, Mp3Playback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("sfx.mp3"); PauseBeforeEos(); @@ -1093,8 +1072,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, AacPlayback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("sfx.m4a"); PauseBeforeEos(); @@ -1104,8 +1081,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, VorbisPlayback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts); ConfigureForAudioOnly("sfx.ogg"); AddEffectsStreams(); @@ -1116,8 +1091,6 @@ // TODO(kmackay) FFmpegDemuxForTest can't handle AC3 or EAC3. TEST_F(AudioVideoPipelineDeviceTest, OpusPlayback_WithEffectsStreams_Optional) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("bear-opus.ogg"); PauseBeforeEos(); @@ -1127,8 +1100,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, FlacPlayback_WithEffectsStreams_Optional) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForAudioOnly("bear.flac"); PauseBeforeEos(); @@ -1138,8 +1109,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, H264Playback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForVideoOnly("bear.h264", true /* raw_h264 */); PauseBeforeEos(); @@ -1149,8 +1118,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, WebmPlaybackWithPause_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); // Setup to pause for 100ms every 500ms AddPause(base::TimeDelta::FromMilliseconds(500), @@ -1163,8 +1130,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, Vp8Playback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForVideoOnly("bear-vp8a.webm", false /* raw_h264 */); AddEffectsStreams(); @@ -1173,8 +1138,6 @@ } TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback_WithEffectsStreams) { - std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); - set_sync_type(MediaPipelineDeviceParams::kModeSyncPts); ConfigureForFile("bear-640x360.webm"); PauseBeforeEos();
diff --git a/chromeos/cert_loader_unittest.cc b/chromeos/cert_loader_unittest.cc index c42722b6..6056f76 100644 --- a/chromeos/cert_loader_unittest.cc +++ b/chromeos/cert_loader_unittest.cc
@@ -11,8 +11,8 @@ #include "base/bind.h" #include "base/files/file_util.h" +#include "base/message_loop/message_loop.h" #include "base/run_loop.h" -#include "base/test/scoped_task_scheduler.h" #include "crypto/scoped_nss_types.h" #include "crypto/scoped_test_nss_db.h" #include "net/cert/nss_cert_database_chromeos.h" @@ -103,6 +103,7 @@ certdb->reset(new TestNSSCertDatabase( crypto::ScopedPK11Slot(PK11_ReferenceSlot(db->slot())), crypto::ScopedPK11Slot(PK11_ReferenceSlot(db->slot())))); + (*certdb)->SetSlowTaskRunnerForTest(message_loop_.task_runner()); } void ImportCACert(const std::string& cert_file, @@ -143,7 +144,7 @@ crypto::ScopedTestNSSDB primary_db_; std::unique_ptr<TestNSSCertDatabase> primary_certdb_; - base::test::ScopedTaskScheduler scoped_task_scheduler_; + base::MessageLoop message_loop_; private: size_t certificates_loaded_events_count_;
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc index 515ef5b..4491a2ff6 100644 --- a/chromeos/network/auto_connect_handler_unittest.cc +++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -12,6 +12,7 @@ #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/macros.h" +#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/scoped_task_scheduler.h" @@ -77,7 +78,9 @@ class AutoConnectHandlerTest : public testing::Test { public: AutoConnectHandlerTest() - : test_manager_client_(nullptr), test_service_client_(nullptr) {} + : test_manager_client_(nullptr), + test_service_client_(nullptr), + scoped_task_scheduler_(&message_loop_) {} void SetUp() override { ASSERT_TRUE(test_nssdb_.is_open()); @@ -86,6 +89,7 @@ test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS( crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())), crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())))); + test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner()); CertLoader::Initialize(); CertLoader::ForceHardwareBackedForTesting(); @@ -248,6 +252,7 @@ ShillServiceClient::TestInterface* test_service_client_; crypto::ScopedTestNSSDB test_nssdb_; std::unique_ptr<net::NSSCertDatabaseChromeOS> test_nsscertdb_; + base::MessageLoopForUI message_loop_; private: base::test::ScopedTaskScheduler scoped_task_scheduler_;
diff --git a/chromeos/network/client_cert_resolver_unittest.cc b/chromeos/network/client_cert_resolver_unittest.cc index be02db03..0fe79c15 100644 --- a/chromeos/network/client_cert_resolver_unittest.cc +++ b/chromeos/network/client_cert_resolver_unittest.cc
@@ -57,7 +57,8 @@ : network_properties_changed_count_(0), service_test_(nullptr), profile_test_(nullptr), - cert_loader_(nullptr) {} + cert_loader_(nullptr), + scoped_task_scheduler_(&message_loop_) {} ~ClientCertResolverTest() override {} void SetUp() override { @@ -67,6 +68,7 @@ test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS( crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())), crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())))); + test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner()); DBusThreadManager::Initialize(); service_test_ = @@ -291,6 +293,7 @@ std::unique_ptr<NetworkConfigurationHandler> network_config_handler_; std::unique_ptr<ManagedNetworkConfigurationHandlerImpl> managed_config_handler_; + base::MessageLoop message_loop_; base::test::ScopedTaskScheduler scoped_task_scheduler_; scoped_refptr<net::X509Certificate> test_client_cert_; std::string test_ca_cert_pem_;
diff --git a/chromeos/network/network_cert_migrator_unittest.cc b/chromeos/network/network_cert_migrator_unittest.cc index 489cb68..006027b0 100644 --- a/chromeos/network/network_cert_migrator_unittest.cc +++ b/chromeos/network/network_cert_migrator_unittest.cc
@@ -12,7 +12,6 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" -#include "base/test/scoped_task_scheduler.h" #include "chromeos/cert_loader.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/shill_profile_client.h" @@ -49,6 +48,7 @@ test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS( crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())), crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())))); + test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner()); DBusThreadManager::Initialize(); service_test_ = @@ -189,7 +189,7 @@ scoped_refptr<net::X509Certificate> test_client_cert_; std::string test_client_cert_pkcs11_id_; std::string test_client_cert_slot_id_; - base::test::ScopedTaskScheduler scoped_task_scheduler_; + base::MessageLoop message_loop_; private: std::unique_ptr<NetworkStateHandler> network_state_handler_;
diff --git a/chromeos/network/network_connection_handler_unittest.cc b/chromeos/network/network_connection_handler_unittest.cc index 9ea2356..8224c02 100644 --- a/chromeos/network/network_connection_handler_unittest.cc +++ b/chromeos/network/network_connection_handler_unittest.cc
@@ -13,9 +13,9 @@ #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/macros.h" +#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_task_scheduler.h" #include "chromeos/cert_loader.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/shill_device_client.h" @@ -110,6 +110,7 @@ test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS( crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())), crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())))); + test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner()); CertLoader::Initialize(); CertLoader::ForceHardwareBackedForTesting(); @@ -309,7 +310,7 @@ ShillServiceClient::TestInterface* test_service_client_; crypto::ScopedTestNSSDB test_nssdb_; std::unique_ptr<net::NSSCertDatabaseChromeOS> test_nsscertdb_; - base::test::ScopedTaskScheduler scoped_task_scheduler_; + base::MessageLoopForUI message_loop_; std::string result_; private:
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java index 72540e5..0654004d 100644 --- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java +++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java
@@ -11,5 +11,8 @@ public final class TaskIds { public static final int TEST = 0x00008378; + public static final int GCM_BACKGROUND_TASK_JOB_ID = 1; + public static final int NOTIFICATION_SERVICE_JOB_ID = 21; + private TaskIds() {} }
diff --git a/components/certificate_transparency/ct_policy_manager_unittest.cc b/components/certificate_transparency/ct_policy_manager_unittest.cc index 51fe6db..6abc261 100644 --- a/components/certificate_transparency/ct_policy_manager_unittest.cc +++ b/components/certificate_transparency/ct_policy_manager_unittest.cc
@@ -20,10 +20,9 @@ namespace { -template <size_t N> -base::ListValue* ListValueFromStrings(const char* const (&strings)[N]) { +base::ListValue* ListValueFromStrings(const std::vector<const char*>& strings) { std::unique_ptr<base::ListValue> result(new base::ListValue); - for (const auto& str : strings) { + for (auto* const str : strings) { result->AppendString(str); } return result.release(); @@ -67,8 +66,9 @@ // Now set a preference, pump the message loop, and ensure things are now // reflected. - pref_service_.SetManagedPref(prefs::kCTRequiredHosts, - ListValueFromStrings({"google.com"})); + pref_service_.SetManagedPref( + prefs::kCTRequiredHosts, + ListValueFromStrings(std::vector<const char*>{"google.com"})); base::RunLoop().RunUntilIdle(); // The new preferences should take effect. @@ -94,8 +94,9 @@ // Now set a preference, pump the message loop, and ensure things are now // reflected. - pref_service_.SetManagedPref(prefs::kCTExcludedHosts, - ListValueFromStrings({"google.com"})); + pref_service_.SetManagedPref( + prefs::kCTExcludedHosts, + ListValueFromStrings(std::vector<const char*>{"google.com"})); base::RunLoop().RunUntilIdle(); // The new preferences should take effect. @@ -123,7 +124,7 @@ // URLs). pref_service_.SetManagedPref( prefs::kCTRequiredHosts, - ListValueFromStrings({ + ListValueFromStrings(std::vector<const char*>{ "file:///etc/fstab", "file://withahost/etc/fstab", "file:///c|/Windows", "*", "https://*", "example.com", "https://example.test:invalid_port", @@ -180,12 +181,13 @@ // but then require it for a specific host. pref_service_.SetManagedPref( prefs::kCTExcludedHosts, - ListValueFromStrings({"example.com", ".sub.example.com", - ".sub.accounts.example.com", "test.example.com"})); + ListValueFromStrings(std::vector<const char*>{ + "example.com", ".sub.example.com", ".sub.accounts.example.com", + "test.example.com"})); pref_service_.SetManagedPref( prefs::kCTRequiredHosts, - ListValueFromStrings( - {"sub.example.com", "accounts.example.com", "test.example.com"})); + ListValueFromStrings(std::vector<const char*>{ + "sub.example.com", "accounts.example.com", "test.example.com"})); base::RunLoop().RunUntilIdle(); EXPECT_EQ(CTRequirementLevel::NOT_REQUIRED, @@ -231,8 +233,9 @@ // Now set a preference, pump the message loop, and ensure things are now // reflected. - pref_service_.SetManagedPref(prefs::kCTRequiredHosts, - ListValueFromStrings({"google.com"})); + pref_service_.SetManagedPref( + prefs::kCTRequiredHosts, + ListValueFromStrings(std::vector<const char*>{"google.com"})); base::RunLoop().RunUntilIdle(); // The new preferences should take effect. @@ -251,8 +254,9 @@ delegate->IsCTRequiredForHost("example.com")); EXPECT_EQ(CTRequirementLevel::DEFAULT, delegate->IsCTRequiredForHost("sub.example.com")); - pref_service_.SetManagedPref(prefs::kCTRequiredHosts, - ListValueFromStrings({"sub.example.com"})); + pref_service_.SetManagedPref( + prefs::kCTRequiredHosts, + ListValueFromStrings(std::vector<const char*>{"sub.example.com"})); base::RunLoop().RunUntilIdle(); EXPECT_EQ(CTRequirementLevel::REQUIRED, delegate->IsCTRequiredForHost("google.com"));
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc index 459c3d3..1e6c834e 100644 --- a/components/dom_distiller/standalone/content_extractor_browsertest.cc +++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -125,9 +125,10 @@ content::BrowserContext* context, const base::FilePath& db_path, const FileToUrlMap& file_to_url_map) { + base::SequencedWorkerPool* blocking_pool = + content::BrowserThread::GetBlockingPool(); scoped_refptr<base::SequencedTaskRunner> background_task_runner = - content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - content::BrowserThread::GetBlockingPool()->GetSequenceToken()); + blocking_pool->GetSequencedTaskRunner(blocking_pool->GetSequenceToken()); // TODO(cjhopman): use an in-memory database instead of an on-disk one with // temporary directory.
diff --git a/components/gcm_driver/android/BUILD.gn b/components/gcm_driver/android/BUILD.gn index c1f6374..5909fd4 100644 --- a/components/gcm_driver/android/BUILD.gn +++ b/components/gcm_driver/android/BUILD.gn
@@ -21,7 +21,19 @@ java_files = [ "java/src/org/chromium/components/gcm_driver/GCMDriver.java", + "java/src/org/chromium/components/gcm_driver/GCMMessage.java", "java/src/org/chromium/components/gcm_driver/GoogleCloudMessagingSubscriber.java", "java/src/org/chromium/components/gcm_driver/GoogleCloudMessagingV2.java", ] } + +junit_binary("components_gcm_driver_junit_tests") { + java_files = + [ "junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java" ] + deps = [ + ":gcm_driver_java", + "//base:base_java", + "//base:base_java_test_support", + "//third_party/hamcrest:hamcrest_java", + ] +}
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java index 5d11c73..b914c9b 100644 --- a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java +++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
@@ -6,7 +6,6 @@ import android.content.Context; import android.os.AsyncTask; -import android.os.Bundle; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; @@ -15,8 +14,6 @@ import org.chromium.base.annotations.JNINamespace; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; /** * This class is the Java counterpart to the C++ GCMDriverAndroid class. @@ -115,41 +112,16 @@ } // The caller of this function is responsible for ensuring the browser process is initialized. - public static void onMessageReceived(String appId, String senderId, Bundle extras) { - // TODO(johnme): Store message and redeliver later if Chrome is killed before delivery. + public static void dispatchMessage(GCMMessage message) { ThreadUtils.assertOnUiThread(); + if (sInstance == null) { - // Change of behaviour, throw exception instead of failing silently with Log.e. throw new RuntimeException("Failed to instantiate GCMDriver."); } - final String bundleSubtype = "subtype"; - final String bundleSenderId = "from"; - final String bundleCollapseKey = "collapse_key"; - final String bundleRawData = "rawData"; - final String bundleGcmplex = "com.google.ipc.invalidation.gcmmplex."; - String collapseKey = extras.getString(bundleCollapseKey); // May be null. - byte[] rawData = extras.getByteArray(bundleRawData); // May be null. - - List<String> dataKeysAndValues = new ArrayList<String>(); - for (String key : extras.keySet()) { - // TODO(johnme): Check there aren't other keys that we need to exclude. - if (key.equals(bundleSubtype) || key.equals(bundleSenderId) - || key.equals(bundleCollapseKey) || key.equals(bundleRawData) - || key.startsWith(bundleGcmplex)) { - continue; - } - Object value = extras.get(key); - if (!(value instanceof String)) { - continue; - } - dataKeysAndValues.add(key); - dataKeysAndValues.add((String) value); - } - - sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid, - appId, senderId, collapseKey, rawData, - dataKeysAndValues.toArray(new String[dataKeysAndValues.size()])); + sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid, message.getAppId(), + message.getSenderId(), message.getCollapseKey(), message.getRawData(), + message.getDataKeysAndValuesArray()); } @VisibleForTesting
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java new file mode 100644 index 0000000..e5d3559 --- /dev/null +++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java
@@ -0,0 +1,177 @@ +// Copyright 2017 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. + +package org.chromium.components.gcm_driver; + +import android.annotation.TargetApi; +import android.os.Build; +import android.os.Bundle; + +import org.chromium.base.annotations.SuppressFBWarnings; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + +/** + * Represents the contents of a GCM Message that is to be handled by the GCM Driver. Can be created + * based on data received from GCM, or serialized and deserialized to and from a Bundle. + */ +public class GCMMessage { + /** + * Keys used to store information in the bundle for serialization purposes. + */ + private static final String BUNDLE_KEY_APP_ID = "appId"; + private static final String BUNDLE_KEY_COLLAPSE_KEY = "collapseKey"; + private static final String BUNDLE_KEY_DATA = "data"; + private static final String BUNDLE_KEY_RAW_DATA = "rawData"; + private static final String BUNDLE_KEY_SENDER_ID = "senderId"; + + private final String mSenderId; + private final String mAppId; + + @Nullable + private final String mCollapseKey; + @Nullable + private final byte[] mRawData; + + /** + * Array that contains pairs of entries in the format of {key, value}. + */ + private final String[] mDataKeysAndValuesArray; + + /** + * Validates that all required fields have been set in the given bundle. + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public static boolean validateBundle(Bundle bundle) { + return bundle.containsKey(BUNDLE_KEY_APP_ID) && bundle.containsKey(BUNDLE_KEY_COLLAPSE_KEY) + && bundle.containsKey(BUNDLE_KEY_DATA) && bundle.containsKey(BUNDLE_KEY_RAW_DATA) + && bundle.containsKey(BUNDLE_KEY_SENDER_ID); + } + + /** + * Creates a GCMMessage object based on data received from GCM. The extras will be filtered. + */ + public GCMMessage(String senderId, Bundle extras) { + String bundleCollapseKey = "collapse_key"; + String bundleGcmplex = "com.google.ipc.invalidation.gcmmplex."; + String bundleRawData = "rawData"; + String bundleSenderId = "from"; + String bundleSubtype = "subtype"; + + if (!extras.containsKey(bundleSubtype)) { + throw new IllegalArgumentException("Received push message with no subtype"); + } + + mSenderId = senderId; + mAppId = extras.getString(bundleSubtype); + + mCollapseKey = extras.getString(bundleCollapseKey); // May be null. + mRawData = extras.getByteArray(bundleRawData); // May be null. + + List<String> dataKeysAndValues = new ArrayList<String>(); + for (String key : extras.keySet()) { + if (key.equals(bundleSubtype) || key.equals(bundleSenderId) + || key.equals(bundleCollapseKey) || key.equals(bundleRawData) + || key.startsWith(bundleGcmplex)) { + continue; + } + + Object value = extras.get(key); + if (!(value instanceof String)) { + continue; + } + + dataKeysAndValues.add(key); + dataKeysAndValues.add((String) value); + } + + mDataKeysAndValuesArray = dataKeysAndValues.toArray(new String[dataKeysAndValues.size()]); + } + + /** + * Creates a GCMMessage object based on the given bundle. Assumes that the bundle has previously + * been created through {@link #toBundle}. + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public GCMMessage(Bundle bundle) { + mSenderId = bundle.getString(BUNDLE_KEY_SENDER_ID); + mAppId = bundle.getString(BUNDLE_KEY_APP_ID); + mCollapseKey = bundle.getString(BUNDLE_KEY_COLLAPSE_KEY); + // The rawData field needs to distinguish between {not set, set but empty, set with data}. + String rawDataString = bundle.getString(BUNDLE_KEY_RAW_DATA); + if (rawDataString != null) { + if (rawDataString.length() > 0) { + mRawData = rawDataString.getBytes(StandardCharsets.ISO_8859_1); + } else { + mRawData = new byte[0]; + } + } else { + mRawData = null; + } + + mDataKeysAndValuesArray = bundle.getStringArray(BUNDLE_KEY_DATA); + } + + public String getSenderId() { + return mSenderId; + } + + public String getAppId() { + return mAppId; + } + + @Nullable + public String getCollapseKey() { + return mCollapseKey; + } + + /** + * Callers are expected to not modify values in the returned byte array. + */ + @Nullable + @SuppressFBWarnings("EI_EXPOSE_REP") + public byte[] getRawData() { + return mRawData; + } + + /** + * Callers are expected to not modify values in the returned byte array. + */ + @SuppressFBWarnings("EI_EXPOSE_REP") + public String[] getDataKeysAndValuesArray() { + return mDataKeysAndValuesArray; + } + + /** + * Serializes the contents of this GCM Message to a new bundle that can be stored, for example + * for purposes of scheduling a job. Only methods available in BaseBundle may be used here, + * as it may have to be converted to a PersistableBundle. + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putString(BUNDLE_KEY_SENDER_ID, mSenderId); + bundle.putString(BUNDLE_KEY_APP_ID, mAppId); + bundle.putString(BUNDLE_KEY_COLLAPSE_KEY, mCollapseKey); + + // The rawData field needs to distinguish between {not set, set but empty, set with data}. + if (mRawData != null) { + if (mRawData.length > 0) { + bundle.putString( + BUNDLE_KEY_RAW_DATA, new String(mRawData, StandardCharsets.ISO_8859_1)); + } else { + bundle.putString(BUNDLE_KEY_RAW_DATA, ""); + } + } else { + bundle.putString(BUNDLE_KEY_RAW_DATA, null); + } + + bundle.putStringArray(BUNDLE_KEY_DATA, mDataKeysAndValuesArray); + return bundle; + } +}
diff --git a/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java b/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java new file mode 100644 index 0000000..44040ac --- /dev/null +++ b/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java
@@ -0,0 +1,178 @@ +// Copyright 2017 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. + +package org.chromium.components.gcm_driver; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.os.Build; +import android.os.Bundle; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.robolectric.annotation.Config; + +import org.chromium.base.test.util.MinAndroidSdkLevel; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +/** + * Unit tests for GCMMessage. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class GCMMessageTest { + /** + * Tests that a message object can be created based on data received from GCM. Note that the raw + * data field is tested separately. + */ + @Test + public void testCreateMessageFromGCM() { + Bundle extras = new Bundle(); + + // Compose a simple message that lacks all optional fields. + extras.putString("subtype", "MyAppId"); + + { + GCMMessage message = new GCMMessage("MySenderId", extras); + + assertEquals("MySenderId", message.getSenderId()); + assertEquals("MyAppId", message.getAppId()); + assertEquals(null, message.getCollapseKey()); + assertArrayEquals(new String[] {}, message.getDataKeysAndValuesArray()); + } + + // Add the optional fields: collapse key, raw binary data and a custom property. + extras.putString("collapse_key", "MyCollapseKey"); + extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45}); + extras.putString("property", "value"); + + { + GCMMessage message = new GCMMessage("MySenderId", extras); + + assertEquals("MySenderId", message.getSenderId()); + assertEquals("MyAppId", message.getAppId()); + assertEquals("MyCollapseKey", message.getCollapseKey()); + assertArrayEquals( + new String[] {"property", "value"}, message.getDataKeysAndValuesArray()); + } + } + + /** + * Tests that the bundle containing extras from GCM will be filtered for values that we either + * pass through by other means, or that we know to be irrelevant to regular GCM messages. + */ + @Test + public void testFiltersExtraBundle() { + Bundle extras = new Bundle(); + + // These should be filtered by full key. + extras.putString("collapse_key", "collapseKey"); + extras.putString("rawData", "rawData"); + extras.putString("from", "from"); + extras.putString("subtype", "subtype"); + + // These should be filtered by prefix matching. + extras.putString("com.google.ipc.invalidation.gcmmplex.foo", "bar"); + extras.putString("com.google.ipc.invalidation.gcmmplex.bar", "baz"); + + // These should be filtered because they're not strings. + extras.putBoolean("myBoolean", true); + extras.putInt("myInteger", 42); + + // These should not be filtered. + extras.putString("collapse_key2", "secondCollapseKey"); + extras.putString("myString", "foobar"); + + GCMMessage message = new GCMMessage("senderId", extras); + + assertArrayEquals(new String[] {"collapse_key2", "secondCollapseKey", "myString", "foobar"}, + message.getDataKeysAndValuesArray()); + } + + /** + * Tests that a GCMMessage object can be serialized to and deserialized from a persistable + * bundle. Note that the raw data field is tested separately. Only run on Android L and beyond + * because it depends on PersistableBundle. + */ + @Test + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) + public void testSerializationToPersistableBundle() { + Bundle extras = new Bundle(); + + // Compose a simple message that lacks all optional fields. + extras.putString("subtype", "MyAppId"); + + { + GCMMessage message = new GCMMessage("MySenderId", extras); + GCMMessage copiedMessage = new GCMMessage(message.toBundle()); + + assertEquals(message.getSenderId(), copiedMessage.getSenderId()); + assertEquals(message.getAppId(), copiedMessage.getAppId()); + assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey()); + assertArrayEquals( + message.getDataKeysAndValuesArray(), copiedMessage.getDataKeysAndValuesArray()); + } + + // Add the optional fields: collapse key, raw binary data and a custom property. + extras.putString("collapse_key", "MyCollapseKey"); + extras.putString("property", "value"); + + { + GCMMessage message = new GCMMessage("MySenderId", extras); + GCMMessage copiedMessage = new GCMMessage(message.toBundle()); + + assertEquals(message.getSenderId(), copiedMessage.getSenderId()); + assertEquals(message.getAppId(), copiedMessage.getAppId()); + assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey()); + assertArrayEquals( + message.getDataKeysAndValuesArray(), copiedMessage.getDataKeysAndValuesArray()); + } + } + + /** + * Tests that the raw data field can be serialized and deserialized as expected. It should be + * NULL when undefined, an empty byte array when defined but empty, and a regular, filled + * byte array when data has been provided. Only run on Android L and beyond because it depends + * on PersistableBundle. + */ + @Test + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) + public void testRawDataSerializationBehaviour() { + Bundle extras = new Bundle(); + extras.putString("subtype", "MyAppId"); + + // Case 1: No raw data supplied. Should be NULL. + { + GCMMessage message = new GCMMessage("MySenderId", extras); + GCMMessage copiedMessage = new GCMMessage(message.toBundle()); + + assertArrayEquals(null, message.getRawData()); + assertArrayEquals(null, copiedMessage.getRawData()); + } + + extras.putByteArray("rawData", new byte[] {}); + + // Case 2: Empty byte array of raw data supplied. Should be just that. + { + GCMMessage message = new GCMMessage("MySenderId", extras); + GCMMessage copiedMessage = new GCMMessage(message.toBundle()); + + assertArrayEquals(new byte[] {}, message.getRawData()); + assertArrayEquals(new byte[] {}, copiedMessage.getRawData()); + } + + extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45}); + + // Case 3: Byte array with data supplied. + { + GCMMessage message = new GCMMessage("MySenderId", extras); + GCMMessage copiedMessage = new GCMMessage(message.toBundle()); + + assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, message.getRawData()); + assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, copiedMessage.getRawData()); + } + } +}
diff --git a/components/offline_pages/core/background/BUILD.gn b/components/offline_pages/core/background/BUILD.gn index 2ee9a96..639715606 100644 --- a/components/offline_pages/core/background/BUILD.gn +++ b/components/offline_pages/core/background/BUILD.gn
@@ -118,6 +118,7 @@ "//base/test:test_support", "//components/offline_pages/core", "//components/offline_pages/core:switches", + "//sql:sql", "//testing/gtest", "//url", ]
diff --git a/components/offline_pages/core/background/request_coordinator.cc b/components/offline_pages/core/background/request_coordinator.cc index aaa2821..661445a 100644 --- a/components/offline_pages/core/background/request_coordinator.cc +++ b/components/offline_pages/core/background/request_coordinator.cc
@@ -155,6 +155,19 @@ } // namespace +RequestCoordinator::SavePageLaterParams::SavePageLaterParams() + : user_requested(true), + availability(RequestAvailability::ENABLED_FOR_OFFLINER) {} + +RequestCoordinator::SavePageLaterParams::SavePageLaterParams( + const SavePageLaterParams& other) { + url = other.url; + client_id = other.client_id; + user_requested = other.user_requested; + availability = other.availability; + original_url = other.original_url; +} + RequestCoordinator::RequestCoordinator( std::unique_ptr<OfflinerPolicy> policy, std::unique_ptr<Offliner> offliner, @@ -194,41 +207,47 @@ RequestCoordinator::~RequestCoordinator() {} -int64_t RequestCoordinator::SavePageLater(const GURL& url, - const ClientId& client_id, - bool user_requested, - RequestAvailability availability) { - DVLOG(2) << "URL is " << url << " " << __func__; +int64_t RequestCoordinator::SavePageLater( + const SavePageLaterParams& save_page_later_params) { + DVLOG(2) << "URL is " << save_page_later_params.url << " " << __func__; - if (!OfflinePageModel::CanSaveURL(url)) { - DVLOG(1) << "Not able to save page for requested url: " << url; + if (!OfflinePageModel::CanSaveURL(save_page_later_params.url)) { + DVLOG(1) << "Not able to save page for requested url: " + << save_page_later_params.url; return 0L; } int64_t id = GenerateOfflineId(); // Build a SavePageRequest. - offline_pages::SavePageRequest request(id, url, client_id, base::Time::Now(), - user_requested); + offline_pages::SavePageRequest request( + id, save_page_later_params.url, save_page_later_params.client_id, + base::Time::Now(), save_page_later_params.user_requested); + request.set_original_url(save_page_later_params.original_url); // If the download manager is not done with the request, put it on the // disabled list. - if (availability == RequestAvailability::DISABLED_FOR_OFFLINER) + if (save_page_later_params.availability == + RequestAvailability::DISABLED_FOR_OFFLINER) { disabled_requests_.insert(id); + } // Put the request on the request queue. queue_->AddRequest(request, base::Bind(&RequestCoordinator::AddRequestResultCallback, - weak_ptr_factory_.GetWeakPtr(), availability)); + weak_ptr_factory_.GetWeakPtr(), + save_page_later_params.availability)); // Record the network quality when this request is made. if (network_quality_estimator_) { RecordSavePageLaterNetworkQuality( - client_id, network_quality_estimator_->GetEffectiveConnectionType()); + save_page_later_params.client_id, + network_quality_estimator_->GetEffectiveConnectionType()); } return id; } + void RequestCoordinator::GetAllRequests(const GetRequestsCallback& callback) { // Get all matching requests from the request queue, send them to our // callback. We bind the namespace and callback to the front of the callback
diff --git a/components/offline_pages/core/background/request_coordinator.h b/components/offline_pages/core/background/request_coordinator.h index 09606f2e..b9d3fae9 100644 --- a/components/offline_pages/core/background/request_coordinator.h +++ b/components/offline_pages/core/background/request_coordinator.h
@@ -60,6 +60,28 @@ DISABLED_FOR_OFFLINER, }; + // Describes the parameters to control how to save a page when system + // conditions allow. + struct SavePageLaterParams { + SavePageLaterParams(); + SavePageLaterParams(const SavePageLaterParams& other); + + // The last committed URL of the page to save. + GURL url; + + // The identification used by the client. + ClientId client_id; + + // Whether the user requests the save action. Defaults to true. + bool user_requested; + + // Request availability. Defaults to ENABLED_FOR_OFFLINER. + RequestAvailability availability; + + // The original URL of the page to save. Empty if no redirect occurs. + GURL original_url; + }; + // Callback specifying which request IDs were actually removed. typedef base::Callback<void(const MultipleItemStatuses&)> RemoveRequestsCallback; @@ -79,10 +101,7 @@ // Queues |request| to later load and save when system conditions allow. // Returns an id if the page could be queued successfully, 0L otherwise. - int64_t SavePageLater(const GURL& url, - const ClientId& client_id, - bool user_requested, - RequestAvailability availability); + int64_t SavePageLater(const SavePageLaterParams& save_page_later_params); // Remove a list of requests by |request_id|. This removes requests from the // request queue, and cancels an in-progress prerender.
diff --git a/components/offline_pages/core/background/request_coordinator_unittest.cc b/components/offline_pages/core/background/request_coordinator_unittest.cc index 8fc4f2a7d..753dd883 100644 --- a/components/offline_pages/core/background/request_coordinator_unittest.cc +++ b/components/offline_pages/core/background/request_coordinator_unittest.cc
@@ -247,6 +247,24 @@ SavePageRequest AddRequest2(); + int64_t SavePageLater() { + RequestCoordinator::SavePageLaterParams params; + params.url = kUrl1; + params.client_id = kClientId1; + params.user_requested = kUserRequested; + return coordinator()->SavePageLater(params); + } + + int64_t SavePageLaterWithAvailability( + RequestCoordinator::RequestAvailability availability) { + RequestCoordinator::SavePageLaterParams params; + params.url = kUrl1; + params.client_id = kClientId1; + params.user_requested = kUserRequested; + params.availability = availability; + return coordinator()->SavePageLater(params); + } + Offliner::RequestStatus last_offlining_status() const { return coordinator()->last_offlining_status_; } @@ -274,6 +292,10 @@ const base::HistogramTester& histograms() const { return histogram_tester_; } + const std::set<int64_t>& disabled_requests() { + return coordinator()->disabled_requests_; + } + private: GetRequestsResult last_get_requests_result_; MultipleItemStatuses last_remove_results_; @@ -435,10 +457,7 @@ TEST_F(RequestCoordinatorTest, StartScheduledProcessingWithRequestInProgress) { // Start processing for this request. - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); // Ensure that the forthcoming request does not finish - we simulate it being // in progress by asking it to skip making the completion callback. @@ -489,10 +508,7 @@ TEST_F(RequestCoordinatorTest, StartImmediateProcessingWithRequestInProgress) { // Start processing for this request. - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); // Disable the automatic offliner callback. EnableOfflinerCallback(false); @@ -518,23 +534,30 @@ coordinator()->SetInternalStartProcessingCallbackForTest( processing_callback()); - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + // Use default values for |user_requested| and |availability|. + RequestCoordinator::SavePageLaterParams params; + params.url = kUrl1; + params.client_id = kClientId1; + params.original_url = kUrl2; + EXPECT_NE(0, coordinator()->SavePageLater(params)); // Expect that a request got placed on the queue. coordinator()->queue()->GetRequests(base::Bind( &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this))); + // Expect that the request is not added to the disabled list by default. + EXPECT_TRUE(disabled_requests().empty()); + // Wait for callbacks to finish, both request queue and offliner. PumpLoop(); EXPECT_TRUE(processing_callback_called()); // Check the request queue is as expected. - EXPECT_EQ(1UL, last_requests().size()); + ASSERT_EQ(1UL, last_requests().size()); EXPECT_EQ(kUrl1, last_requests().at(0)->url()); EXPECT_EQ(kClientId1, last_requests().at(0)->client_id()); + EXPECT_TRUE(last_requests().at(0)->user_requested()); + EXPECT_EQ(kUrl2, last_requests().at(0)->original_url()); // Expect that the scheduler got notified. SchedulerStub* scheduler_stub = @@ -562,10 +585,7 @@ coordinator()->SetInternalStartProcessingCallbackForTest( processing_callback()); - EXPECT_TRUE( - coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER) != 0); + EXPECT_NE(0, SavePageLater()); // Expect that a request got placed on the queue. coordinator()->queue()->GetRequests(base::Bind( @@ -1031,9 +1051,12 @@ } TEST_F(RequestCoordinatorTest, MarkRequestCompleted) { - int64_t request_id = coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, + int64_t request_id = SavePageLaterWithAvailability( RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER); + + // Verify that the request is added to the disabled list. + EXPECT_FALSE(disabled_requests().empty()); + PumpLoop(); EXPECT_NE(request_id, 0l); @@ -1055,9 +1078,12 @@ // Pretend we are on low-end device so immediate start won't happen. SetIsLowEndDeviceForTest(true); - int64_t request_id = coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, + int64_t request_id = SavePageLaterWithAvailability( RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER); + + // Verify that the request is added to the disabled list. + EXPECT_FALSE(disabled_requests().empty()); + PumpLoop(); EXPECT_NE(request_id, 0l); @@ -1125,10 +1151,7 @@ // in progress by asking it to skip making the completion callback. EnableOfflinerCallback(false); - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); PumpLoop(); // Verify that immediate start from adding the request did happen. @@ -1316,10 +1339,7 @@ // Turn off the callback so that the request stops before processing in // PumpLoop. EnableOfflinerCallback(false); - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); PumpLoop(); EXPECT_TRUE(is_busy()); @@ -1332,10 +1352,7 @@ EXPECT_FALSE(offline_pages::IsOfflinePagesSvelteConcurrentLoadingEnabled()); // Make a request. - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); PumpLoop(); // Verify not immediately busy (since low-end device). @@ -1352,10 +1369,11 @@ EnableOfflinerCallback(false); // Make another request. - EXPECT_NE(coordinator()->SavePageLater( - kUrl2, kClientId2, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + RequestCoordinator::SavePageLaterParams params; + params.url = kUrl2; + params.client_id = kClientId2; + params.user_requested = kUserRequested; + EXPECT_NE(0, coordinator()->SavePageLater(params)); PumpLoop(); // Verify immediate processing did start this time. @@ -1365,10 +1383,7 @@ TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) { SetNetworkConnected(false); EnableOfflinerCallback(false); - EXPECT_NE( - coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), 0); + EXPECT_NE(0, SavePageLater()); PumpLoop(); EXPECT_FALSE(is_busy()); @@ -1392,10 +1407,7 @@ // PumpLoop. EnableOfflinerCallback(false); - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); PumpLoop(); EXPECT_TRUE(is_busy()); } @@ -1491,10 +1503,7 @@ // in progress by asking it to skip making the completion callback. EnableOfflinerCallback(false); - EXPECT_NE(coordinator()->SavePageLater( - kUrl1, kClientId1, kUserRequested, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), - 0); + EXPECT_NE(0, SavePageLater()); // Repeat the timeout for MaxCompleteTries - 1 times in order to increase the // completed tries on this request.
diff --git a/components/offline_pages/core/background/request_queue_store_sql.cc b/components/offline_pages/core/background/request_queue_store_sql.cc index 5e5672a..099f774 100644 --- a/components/offline_pages/core/background/request_queue_store_sql.cc +++ b/components/offline_pages/core/background/request_queue_store_sql.cc
@@ -42,26 +42,63 @@ " state INTEGER NOT NULL DEFAULT 0," " url VARCHAR NOT NULL," " client_namespace VARCHAR NOT NULL," - " client_id VARCHAR NOT NULL" + " client_id VARCHAR NOT NULL," + " original_url VARCHAR NOT NULL DEFAULT ''" ")"; return db->Execute(kSql); } +bool UpgradeWithQuery(sql::Connection* db, const char* upgrade_sql) { + if (!db->Execute("ALTER TABLE " REQUEST_QUEUE_TABLE_NAME + " RENAME TO temp_" REQUEST_QUEUE_TABLE_NAME)) { + return false; + } + if (!CreateRequestQueueTable(db)) + return false; + if (!db->Execute(upgrade_sql)) + return false; + return db->Execute("DROP TABLE IF EXISTS temp_" REQUEST_QUEUE_TABLE_NAME); +} + +bool UpgradeFrom57(sql::Connection* db) { + const char kSql[] = + "INSERT INTO " REQUEST_QUEUE_TABLE_NAME + " (request_id, creation_time, activation_time, last_attempt_time, " + "started_attempt_count, completed_attempt_count, state, url, " + "client_namespace, client_id) " + "SELECT " + "request_id, creation_time, activation_time, last_attempt_time, " + "started_attempt_count, completed_attempt_count, state, url, " + "client_namespace, client_id " + "FROM temp_" REQUEST_QUEUE_TABLE_NAME; + return UpgradeWithQuery(db, kSql); +} + bool CreateSchema(sql::Connection* db) { + sql::Transaction transaction(db); + if (!transaction.Begin()) + return false; + + if (!db->DoesTableExist(REQUEST_QUEUE_TABLE_NAME)) { + if (!CreateRequestQueueTable(db)) + return false; + } + // If there is not already a state column, we need to drop the old table. We // are choosing to drop instead of upgrade since the feature is not yet - // released, so we don't use a transaction to protect existing data, or try to - // migrate it. + // released, so we don't try to migrate it. if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "state")) { if (!db->Execute("DROP TABLE IF EXISTS " REQUEST_QUEUE_TABLE_NAME)) return false; } - if (!CreateRequestQueueTable(db)) - return false; + if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "original_url")) { + if (!UpgradeFrom57(db)) + return false; + } // TODO(fgorski): Add indices here. - return true; + return transaction.Commit(); } // Create a save page request from a SQL result. Expects complete rows with @@ -83,11 +120,12 @@ const GURL url(statement.ColumnString(7)); const ClientId client_id(statement.ColumnString(8), statement.ColumnString(9)); + const GURL original_url(statement.ColumnString(10)); DVLOG(2) << "making save page request - id " << id << " url " << url << " client_id " << client_id.name_space << "-" << client_id.id << " creation time " << creation_time << " user requested " - << kUserRequested; + << kUserRequested << " original_url " << original_url; std::unique_ptr<SavePageRequest> request(new SavePageRequest( id, url, client_id, creation_time, activation_time, kUserRequested)); @@ -95,6 +133,7 @@ request->set_started_attempt_count(started_attempt_count); request->set_completed_attempt_count(completed_attempt_count); request->set_request_state(state); + request->set_original_url(original_url); return request; } @@ -104,7 +143,7 @@ const char kSql[] = "SELECT request_id, creation_time, activation_time," " last_attempt_time, started_attempt_count, completed_attempt_count," - " state, url, client_namespace, client_id" + " state, url, client_namespace, client_id, original_url" " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?"; sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); @@ -132,9 +171,9 @@ "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME " (request_id, creation_time, activation_time," " last_attempt_time, started_attempt_count, completed_attempt_count," - " state, url, client_namespace, client_id)" + " state, url, client_namespace, client_id, original_url)" " VALUES " - " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); statement.BindInt64(0, request.request_id()); @@ -147,6 +186,7 @@ statement.BindString(7, request.url().spec()); statement.BindString(8, request.client_id().name_space); statement.BindString(9, request.client_id().id); + statement.BindString(10, request.original_url().spec()); if (!statement.Run()) return ItemActionStatus::STORE_ERROR; @@ -160,7 +200,7 @@ "UPDATE OR IGNORE " REQUEST_QUEUE_TABLE_NAME " SET creation_time = ?, activation_time = ?, last_attempt_time = ?," " started_attempt_count = ?, completed_attempt_count = ?, state = ?," - " url = ?, client_namespace = ?, client_id = ?" + " url = ?, client_namespace = ?, client_id = ?, original_url = ?" " WHERE request_id = ?"; sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); @@ -173,7 +213,8 @@ statement.BindString(6, request.url().spec()); statement.BindString(7, request.client_id().name_space); statement.BindString(8, request.client_id().id); - statement.BindInt64(9, request.request_id()); + statement.BindString(9, request.original_url().spec()); + statement.BindInt64(10, request.request_id()); if (!statement.Run()) return ItemActionStatus::STORE_ERROR; @@ -236,7 +277,7 @@ const char kSql[] = "SELECT request_id, creation_time, activation_time," " last_attempt_time, started_attempt_count, completed_attempt_count," - " state, url, client_namespace, client_id" + " state, url, client_namespace, client_id, original_url" " FROM " REQUEST_QUEUE_TABLE_NAME; sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
diff --git a/components/offline_pages/core/background/request_queue_store_unittest.cc b/components/offline_pages/core/background/request_queue_store_unittest.cc index 7d697c6..bf78969 100644 --- a/components/offline_pages/core/background/request_queue_store_unittest.cc +++ b/components/offline_pages/core/background/request_queue_store_unittest.cc
@@ -15,10 +15,14 @@ #include "components/offline_pages/core/background/request_queue_in_memory_store.h" #include "components/offline_pages/core/background/request_queue_store_sql.h" #include "components/offline_pages/core/background/save_page_request.h" +#include "sql/connection.h" +#include "sql/statement.h" #include "testing/gtest/include/gtest/gtest.h" namespace offline_pages { +#define REQUEST_QUEUE_TABLE_NAME "request_queue_v1" + using UpdateStatus = RequestQueueStore::UpdateStatus; namespace { @@ -37,6 +41,51 @@ RESULT_TRUE, }; +void BuildTestStoreWithSchemaFromM57(const base::FilePath& file) { + sql::Connection connection; + ASSERT_TRUE( + connection.Open(file.Append(FILE_PATH_LITERAL("RequestQueue.db")))); + ASSERT_TRUE(connection.is_open()); + ASSERT_TRUE(connection.BeginTransaction()); + ASSERT_TRUE(connection.Execute( + "CREATE TABLE " REQUEST_QUEUE_TABLE_NAME + " (request_id INTEGER PRIMARY KEY NOT NULL," + " creation_time INTEGER NOT NULL," + " activation_time INTEGER NOT NULL DEFAULT 0," + " last_attempt_time INTEGER NOT NULL DEFAULT 0," + " started_attempt_count INTEGER NOT NULL," + " completed_attempt_count INTEGER NOT NULL," + " state INTEGER NOT NULL DEFAULT 0," + " url VARCHAR NOT NULL," + " client_namespace VARCHAR NOT NULL," + " client_id VARCHAR NOT NULL" + ")")); + + ASSERT_TRUE(connection.CommitTransaction()); + sql::Statement statement(connection.GetUniqueStatement( + "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME + " (request_id, creation_time, activation_time," + " last_attempt_time, started_attempt_count, completed_attempt_count," + " state, url, client_namespace, client_id)" + " VALUES " + " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); + + statement.BindInt64(0, kRequestId); + statement.BindInt64(1, 0); + statement.BindInt64(2, 0); + statement.BindInt64(3, 0); + statement.BindInt64(4, 0); + statement.BindInt64(5, 0); + statement.BindInt64(6, 0); + statement.BindString(7, kUrl.spec()); + statement.BindString(8, kClientId.name_space); + statement.BindString(9, kClientId.id); + ASSERT_TRUE(statement.Run()); + ASSERT_TRUE(connection.DoesTableExist(REQUEST_QUEUE_TABLE_NAME)); + ASSERT_FALSE( + connection.DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "original_url")); +} + } // namespace // Class that serves as a base for testing different implementations of the @@ -155,6 +204,8 @@ class RequestQueueStoreFactory { public: virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0; + virtual RequestQueueStore* BuildStoreWithOldSchema( + const base::FilePath& path, int version) = 0; }; // Implements a store factory for in memory store. @@ -164,6 +215,11 @@ RequestQueueStore* store = new RequestQueueInMemoryStore(); return store; } + + RequestQueueStore* BuildStoreWithOldSchema(const base::FilePath& path, + int version) override { + return nullptr; + } }; // Implements a store factory for SQLite based implementation of the store. @@ -174,6 +230,16 @@ new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path); return store; } + + RequestQueueStore* BuildStoreWithOldSchema(const base::FilePath& path, + int version) override { + EXPECT_EQ(57, version); + BuildTestStoreWithSchemaFromM57(path); + + RequestQueueStore* store = + new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path); + return store; + } }; // Defines a store test fixture templatized by the store factory. @@ -181,6 +247,7 @@ class RequestQueueStoreTest : public RequestQueueStoreTestBase { public: std::unique_ptr<RequestQueueStore> BuildStore(); + std::unique_ptr<RequestQueueStore> BuildStoreWithOldSchema(int version); protected: T factory_; @@ -193,6 +260,14 @@ return store; } +template <typename T> +std::unique_ptr<RequestQueueStore> +RequestQueueStoreTest<T>::BuildStoreWithOldSchema(int version) { + std::unique_ptr<RequestQueueStore> store( + factory_.BuildStoreWithOldSchema(temp_directory_.GetPath(), version)); + return store; +} + // |StoreTypes| lists all factories, based on which the tests will be created. typedef testing::Types<RequestQueueInMemoryStoreFactory, RequestQueueStoreSQLFactory> @@ -203,6 +278,23 @@ // defined on the |RequestQuieueStoreBaseTest| class. That's by design. TYPED_TEST_CASE(RequestQueueStoreTest, StoreTypes); +TYPED_TEST(RequestQueueStoreTest, UpgradeFromVersion57Store) { + std::unique_ptr<RequestQueueStore> store(this->BuildStoreWithOldSchema(57)); + // In-memory store does not support upgrading. + if (!store) + return; + this->InitializeStore(store.get()); + + store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, + base::Unretained(this))); + this->PumpLoop(); + ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); + ASSERT_EQ(1u, this->last_requests().size()); + EXPECT_EQ(kRequestId, this->last_requests()[0]->request_id()); + EXPECT_EQ(kUrl, this->last_requests()[0]->url()); + EXPECT_EQ(GURL(), this->last_requests()[0]->original_url()); +} + TYPED_TEST(RequestQueueStoreTest, GetRequestsEmpty) { std::unique_ptr<RequestQueueStore> store(this->BuildStore()); this->InitializeStore(store.get()); @@ -283,6 +375,7 @@ base::Time creation_time = base::Time::Now(); SavePageRequest request(kRequestId, kUrl, kClientId, creation_time, kUserRequested); + request.set_original_url(kUrl2); store->AddRequest(request, base::Bind(&RequestQueueStoreTestBase::AddRequestDone, @@ -340,6 +433,7 @@ SavePageRequest updated_request(kRequestId, kUrl, kClientId, new_creation_time, activation_time, kUserRequested); + updated_request.set_original_url(kUrl2); // Try to update a non-existing request. SavePageRequest updated_request2(kRequestId2, kUrl, kClientId, new_creation_time, activation_time,
diff --git a/components/offline_pages/core/background/save_page_request.cc b/components/offline_pages/core/background/save_page_request.cc index 02019de..9b19dc4 100644 --- a/components/offline_pages/core/background/save_page_request.cc +++ b/components/offline_pages/core/background/save_page_request.cc
@@ -47,7 +47,8 @@ completed_attempt_count_(other.completed_attempt_count_), last_attempt_time_(other.last_attempt_time_), user_requested_(other.user_requested_), - state_(other.state_) {} + state_(other.state_), + original_url_(other.original_url_) {} SavePageRequest::~SavePageRequest() {} @@ -59,7 +60,7 @@ started_attempt_count_ == other.started_attempt_count_ && completed_attempt_count_ == other.completed_attempt_count_ && last_attempt_time_ == other.last_attempt_time_ && - state_ == other.state_; + state_ == other.state_ && original_url_ == other.original_url_; } void SavePageRequest::MarkAttemptStarted(const base::Time& start_time) {
diff --git a/components/offline_pages/core/background/save_page_request.h b/components/offline_pages/core/background/save_page_request.h index 9f9e9ed..b1bd54e 100644 --- a/components/offline_pages/core/background/save_page_request.h +++ b/components/offline_pages/core/background/save_page_request.h
@@ -87,6 +87,11 @@ user_requested_ = user_requested; } + const GURL& original_url() const { return original_url_; } + void set_original_url(const GURL& original_url) { + original_url_ = original_url; + } + private: // ID of this request. int64_t request_id_; @@ -120,6 +125,9 @@ // The current state of this request RequestState state_; + + // The original URL of the page to be offlined. Empty if no redirect occurs. + GURL original_url_; }; } // namespace offline_pages
diff --git a/components/offline_pages/core/background/save_page_request_unittest.cc b/components/offline_pages/core/background/save_page_request_unittest.cc index 7fc2dcd..ddfc2b9 100644 --- a/components/offline_pages/core/background/save_page_request_unittest.cc +++ b/components/offline_pages/core/background/save_page_request_unittest.cc
@@ -11,6 +11,7 @@ namespace { const int64_t kRequestId = 42; const GURL kUrl("http://example.com"); +const GURL kUrl2("http://example.com/test"); const ClientId kClientId("bookmark", "1234"); const bool kUserRequested = true; } // namespace @@ -26,16 +27,18 @@ base::Time creation_time = base::Time::Now(); SavePageRequest request(kRequestId, kUrl, kClientId, creation_time, kUserRequested); - ASSERT_EQ(kRequestId, request.request_id()); - ASSERT_EQ(kUrl, request.url()); - ASSERT_EQ(kClientId, request.client_id()); - ASSERT_EQ(creation_time, request.creation_time()); - ASSERT_EQ(creation_time, request.activation_time()); - ASSERT_EQ(base::Time(), request.last_attempt_time()); - ASSERT_EQ(0, request.completed_attempt_count()); - ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); - ASSERT_EQ(0, request.started_attempt_count()); - ASSERT_EQ(0, request.completed_attempt_count()); + request.set_original_url(kUrl2); + EXPECT_EQ(kRequestId, request.request_id()); + EXPECT_EQ(kUrl, request.url()); + EXPECT_EQ(kClientId, request.client_id()); + EXPECT_EQ(creation_time, request.creation_time()); + EXPECT_EQ(creation_time, request.activation_time()); + EXPECT_EQ(base::Time(), request.last_attempt_time()); + EXPECT_EQ(0, request.completed_attempt_count()); + EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); + EXPECT_EQ(0, request.started_attempt_count()); + EXPECT_EQ(0, request.completed_attempt_count()); + EXPECT_EQ(kUrl2, request.original_url()); } TEST_F(SavePageRequestTest, StartAndCompleteRequest) { @@ -48,29 +51,29 @@ request.MarkAttemptStarted(start_time); // Most things don't change about the request. - ASSERT_EQ(kRequestId, request.request_id()); - ASSERT_EQ(kUrl, request.url()); - ASSERT_EQ(kClientId, request.client_id()); - ASSERT_EQ(creation_time, request.creation_time()); - ASSERT_EQ(activation_time, request.activation_time()); + EXPECT_EQ(kRequestId, request.request_id()); + EXPECT_EQ(kUrl, request.url()); + EXPECT_EQ(kClientId, request.client_id()); + EXPECT_EQ(creation_time, request.creation_time()); + EXPECT_EQ(activation_time, request.activation_time()); // Attempt time, attempt count and status will though. - ASSERT_EQ(start_time, request.last_attempt_time()); - ASSERT_EQ(1, request.started_attempt_count()); - ASSERT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state()); + EXPECT_EQ(start_time, request.last_attempt_time()); + EXPECT_EQ(1, request.started_attempt_count()); + EXPECT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state()); request.MarkAttemptCompleted(); // Again, most things don't change about the request. - ASSERT_EQ(kRequestId, request.request_id()); - ASSERT_EQ(kUrl, request.url()); - ASSERT_EQ(kClientId, request.client_id()); - ASSERT_EQ(creation_time, request.creation_time()); - ASSERT_EQ(activation_time, request.activation_time()); + EXPECT_EQ(kRequestId, request.request_id()); + EXPECT_EQ(kUrl, request.url()); + EXPECT_EQ(kClientId, request.client_id()); + EXPECT_EQ(creation_time, request.creation_time()); + EXPECT_EQ(activation_time, request.activation_time()); // Last attempt time and status are updated. - ASSERT_EQ(1, request.completed_attempt_count()); - ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); + EXPECT_EQ(1, request.completed_attempt_count()); + EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); } TEST_F(SavePageRequestTest, StartAndAbortRequest) { @@ -82,27 +85,27 @@ request.MarkAttemptStarted(start_time); // Most things don't change about the request. - ASSERT_EQ(kRequestId, request.request_id()); - ASSERT_EQ(kUrl, request.url()); - ASSERT_EQ(kClientId, request.client_id()); - ASSERT_EQ(creation_time, request.creation_time()); + EXPECT_EQ(kRequestId, request.request_id()); + EXPECT_EQ(kUrl, request.url()); + EXPECT_EQ(kClientId, request.client_id()); + EXPECT_EQ(creation_time, request.creation_time()); // Attempt time and attempt count will though. - ASSERT_EQ(start_time, request.last_attempt_time()); - ASSERT_EQ(1, request.started_attempt_count()); - ASSERT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state()); + EXPECT_EQ(start_time, request.last_attempt_time()); + EXPECT_EQ(1, request.started_attempt_count()); + EXPECT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state()); request.MarkAttemptAborted(); // Again, most things don't change about the request. - ASSERT_EQ(kRequestId, request.request_id()); - ASSERT_EQ(kUrl, request.url()); - ASSERT_EQ(kClientId, request.client_id()); - ASSERT_EQ(creation_time, request.creation_time()); + EXPECT_EQ(kRequestId, request.request_id()); + EXPECT_EQ(kUrl, request.url()); + EXPECT_EQ(kClientId, request.client_id()); + EXPECT_EQ(creation_time, request.creation_time()); // Last attempt time is updated and completed attempt count did not rise. - ASSERT_EQ(0, request.completed_attempt_count()); - ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); + EXPECT_EQ(0, request.completed_attempt_count()); + EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state()); } } // namespace offline_pages
diff --git a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc index aed1609..12db77e 100644 --- a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc +++ b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
@@ -231,9 +231,10 @@ int64_t DownloadUIAdapterTest::AddRequest(const GURL& url, const ClientId& client_id) { - return request_coordinator()->SavePageLater( - url, client_id, /* user_requested */ true, - RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); + RequestCoordinator::SavePageLaterParams params; + params.url = url; + params.client_id = client_id; + return request_coordinator()->SavePageLater(params); } TEST_F(DownloadUIAdapterTest, InitialLoad) {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index ef3ab69..b4335de 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -561,6 +561,10 @@ "download/download_item_impl_delegate.h", "download/download_job.cc", "download/download_job.h", + "download/download_job_factory.cc", + "download/download_job_factory.h", + "download/download_job_impl.cc", + "download/download_job_impl.h", "download/download_manager_impl.cc", "download/download_manager_impl.h", "download/download_net_log_parameters.cc", @@ -573,12 +577,16 @@ "download/download_resource_handler.h", "download/download_stats.cc", "download/download_stats.h", + "download/download_worker.cc", + "download/download_worker.h", "download/drag_download_file.cc", "download/drag_download_file.h", "download/drag_download_util.cc", "download/drag_download_util.h", "download/mhtml_generation_manager.cc", "download/mhtml_generation_manager.h", + "download/parallel_download_job.cc", + "download/parallel_download_job.h", "download/rate_estimator.cc", "download/rate_estimator.h", "download/save_file.cc",
diff --git a/content/browser/download/download_create_info.cc b/content/browser/download/download_create_info.cc index 244c7d2..4fe7be5d 100644 --- a/content/browser/download/download_create_info.cc +++ b/content/browser/download/download_create_info.cc
@@ -22,7 +22,8 @@ has_user_gesture(false), result(DOWNLOAD_INTERRUPT_REASON_NONE), save_info(std::move(save_info)), - request_net_log(net_log) {} + request_net_log(net_log), + accept_range(false) {} DownloadCreateInfo::DownloadCreateInfo() : DownloadCreateInfo(base::Time(),
diff --git a/content/browser/download/download_create_info.h b/content/browser/download/download_create_info.h index c0c7f17..174fded 100644 --- a/content/browser/download/download_create_info.h +++ b/content/browser/download/download_create_info.h
@@ -110,6 +110,9 @@ // For continuing a download, the ETag of the file. std::string etag; + // If "Accept-Ranges:bytes" header presents in the response header. + bool accept_range; + private: DISALLOW_COPY_AND_ASSIGN(DownloadCreateInfo); };
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc index b1957ab6..34571f59 100644 --- a/content/browser/download/download_item_impl.cc +++ b/content/browser/download/download_item_impl.cc
@@ -40,6 +40,8 @@ #include "content/browser/download/download_file.h" #include "content/browser/download/download_interrupt_reasons_impl.h" #include "content/browser/download/download_item_impl_delegate.h" +#include "content/browser/download/download_job_factory.h" +#include "content/browser/download/download_job_impl.h" #include "content/browser/download/download_net_log_parameters.h" #include "content/browser/download/download_request_handle.h" #include "content/browser/download/download_stats.h" @@ -240,7 +242,6 @@ std::unique_ptr<DownloadRequestHandleInterface> request_handle, const net::NetLogWithSource& net_log) : is_save_package_download_(true), - request_handle_(std::move(request_handle)), guid_(base::ToUpperASCII(base::GenerateGUID())), download_id_(download_id), target_path_(path), @@ -254,6 +255,7 @@ current_path_(path), net_log_(net_log), weak_ptr_factory_(this) { + job_ = base::MakeUnique<DownloadJobImpl>(this, std::move(request_handle)); delegate_->Attach(); Init(true /* actively downloading */, SRC_SAVE_PAGE_AS); } @@ -350,7 +352,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); // Ignore irrelevant states. - if (is_paused_) + if (IsPaused()) return; switch (state_) { @@ -363,15 +365,15 @@ case RESUMING_INTERNAL: // No active request. // TODO(asanka): In the case of RESUMING_INTERNAL, consider setting - // is_paused_ even if there's no request currently associated with this - // DII. When a request is assigned (due to a resumption, for example) we - // can honor the is_paused_ setting. + // |DownloadJob::is_paused_| even if there's no request currently + // associated with this DII. When a request is assigned (due to a + // resumption, for example) we can honor the |DownloadJob::is_paused_| + // setting. return; case IN_PROGRESS_INTERNAL: case TARGET_PENDING_INTERNAL: - request_handle_->PauseRequest(); - is_paused_ = true; + job_->Pause(); UpdateObservers(); return; @@ -395,10 +397,10 @@ case TARGET_PENDING_INTERNAL: case IN_PROGRESS_INTERNAL: - if (!is_paused_) + if (!IsPaused()) return; - request_handle_->ResumeRequest(); - is_paused_ = false; + if (job_) + job_->Resume(true); UpdateObservers(); return; @@ -486,7 +488,7 @@ } bool DownloadItemImpl::IsPaused() const { - return is_paused_; + return job_ ? job_->is_paused() : false; } bool DownloadItemImpl::IsTemporary() const { @@ -507,7 +509,7 @@ case TARGET_PENDING_INTERNAL: case TARGET_RESOLVED_INTERNAL: case IN_PROGRESS_INTERNAL: - return is_paused_; + return IsPaused(); case INTERRUPTED_INTERNAL: { ResumeMode resume_mode = GetResumeMode(); @@ -701,7 +703,7 @@ } int64_t DownloadItemImpl::CurrentSpeed() const { - if (is_paused_) + if (IsPaused()) return 0; return bytes_per_sec_; } @@ -780,9 +782,9 @@ // paths that might be used by DownloadItems created from history import. // Currently such items have null request_handle_s, where other items // (regular and SavePackage downloads) have actual objects off the pointer. - if (request_handle_) - return request_handle_->GetWebContents(); - return NULL; + if (job_) + return job_->GetWebContents(); + return nullptr; } void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) { @@ -887,7 +889,7 @@ // We won't auto-restart if we've used up our attempts or the // download has been paused by user action. bool user_action_required = - (auto_resume_count_ >= kMaxAutoResumeAttempts || is_paused_); + (auto_resume_count_ >= kMaxAutoResumeAttempts || IsPaused()); switch(last_reason_) { case DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR: @@ -1180,15 +1182,15 @@ DVLOG(20) << __func__ << "() this=" << DebugString(true); download_file_ = std::move(file); - request_handle_ = std::move(req_handle); + job_ = DownloadJobFactory::CreateJob(this, std::move(req_handle), + new_create_info); destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE; if (state_ == CANCELLED_INTERNAL) { // The download was in the process of resuming when it was cancelled. Don't // proceed. ReleaseDownloadFile(true); - if (request_handle_) - request_handle_->CancelRequest(); + job_->Cancel(true); return; } @@ -1239,14 +1241,18 @@ } // Successful download start. - DCHECK(download_file_.get()); - DCHECK(request_handle_.get()); + DCHECK(download_file_); + DCHECK(job_); if (state_ == RESUMING_INTERNAL) UpdateValidatorsOnResumption(new_create_info); TransitionTo(TARGET_PENDING_INTERNAL); + job_->Start(); +} + +void DownloadItemImpl::StartDownload() { BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, base::Bind(&DownloadFile::Initialize, @@ -1643,8 +1649,8 @@ SetHashState(std::move(hash_state)); } - if (request_handle_) - request_handle_->CancelRequest(); + if (job_) + job_->Cancel(false); if (reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED || reason == DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) { @@ -1784,9 +1790,10 @@ DCHECK(current_path_.DirName() == target_path_.DirName()) << "Current output directory must match target directory."; DCHECK(download_file_) << "Output file must be owned by download item."; - DCHECK(request_handle_) << "Download source must be active."; - DCHECK(!is_paused_) << "At the time a download enters IN_PROGRESS state, " - "it must not be paused."; + DCHECK(job_) << "Must have active download job."; + DCHECK(!job_->is_paused()) + << "At the time a download enters IN_PROGRESS state, " + "it must not be paused."; break; case COMPLETING_INTERNAL: @@ -1954,8 +1961,9 @@ ? INITIATED_BY_MANUAL_RESUMPTION : INITIATED_BY_AUTOMATIC_RESUMPTION); delegate_->ResumeInterruptedDownload(std::move(download_params), GetId()); - // Just in case we were interrupted while paused. - is_paused_ = false; + + if (job_) + job_->Resume(false); } // static
diff --git a/content/browser/download/download_item_impl.h b/content/browser/download/download_item_impl.h index 47a0b0b6..6980498 100644 --- a/content/browser/download/download_item_impl.h +++ b/content/browser/download/download_item_impl.h
@@ -28,6 +28,7 @@ namespace content { class DownloadFile; class DownloadItemImplDelegate; +class DownloadJob; // See download_item.h for usage. class CONTENT_EXPORT DownloadItemImpl @@ -232,6 +233,8 @@ std::unique_ptr<crypto::SecureHash> hash_state) override; private: + friend class DownloadJob; + // Fine grained states of a download. // // New downloads can be created in the following states: @@ -395,6 +398,9 @@ // this is. void Init(bool active, DownloadType download_type); + // Start a series of events that result in the file being downloaded. + void StartDownload(); + // Callback from file thread when we initialize the DownloadFile. void OnDownloadFileInitialized(DownloadInterruptReason result); @@ -505,10 +511,6 @@ // TODO(rdsmith): Replace with a generalized enum for "download source". const bool is_save_package_download_ = false; - // The handle to the request information. Used for operations outside the - // download system. - std::unique_ptr<DownloadRequestHandleInterface> request_handle_; - std::string guid_; uint32_t download_id_ = kInvalidId; @@ -598,9 +600,6 @@ // Our delegate. DownloadItemImplDelegate* delegate_ = nullptr; - // In progress downloads may be paused by the user, we note it here. - bool is_paused_ = false; - // A flag for indicating if the download should be opened at completion. bool open_when_complete_ = false; @@ -684,6 +683,8 @@ // Net log to use for this download. const net::NetLogWithSource net_log_; + std::unique_ptr<DownloadJob> job_; + base::WeakPtrFactory<DownloadItemImpl> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(DownloadItemImpl);
diff --git a/content/browser/download/download_job.cc b/content/browser/download/download_job.cc index c54428d1..4da7eb4 100644 --- a/content/browser/download/download_job.cc +++ b/content/browser/download/download_job.cc
@@ -4,40 +4,25 @@ #include "content/browser/download/download_job.h" +#include "content/browser/download/download_item_impl.h" + namespace content { -// Unknown download progress. -const int kDownloadProgressUnknown = -1; - -// Unknown download speed. -const int kDownloadSpeedUnknown = -1; - -DownloadJob::DownloadJob() : manager_(nullptr) {} +DownloadJob::DownloadJob(DownloadItemImpl* download_item) + : download_item_(download_item), is_paused_(false) {} DownloadJob::~DownloadJob() = default; -void DownloadJob::OnAttached(DownloadJob::Manager* manager) { - DCHECK(!manager_) << "DownloadJob::Manager has already been attached."; - manager_ = manager; +void DownloadJob::Pause() { + is_paused_ = true; } -void DownloadJob::OnBeforeDetach() { - manager_ = nullptr; +void DownloadJob::Resume(bool resume_request) { + is_paused_ = false; } -void DownloadJob::StartedSavingResponse() { - if (manager_) - manager_->OnSavingStarted(this); -} - -void DownloadJob::Interrupt(DownloadInterruptReason reason) { - if (manager_) - manager_->OnDownloadInterrupted(this, reason); -} - -void DownloadJob::Complete() { - if (manager_) - manager_->OnDownloadComplete(this); +void DownloadJob::StartDownload() const { + download_item_->StartDownload(); } } // namespace content
diff --git a/content/browser/download/download_job.h b/content/browser/download/download_job.h index 2192d410..836cfdaa 100644 --- a/content/browser/download/download_job.h +++ b/content/browser/download/download_job.h
@@ -12,82 +12,25 @@ #include "content/public/browser/download_interrupt_reasons.h" namespace content { + +class DownloadItemImpl; class WebContents; -// Unknown download progress. -extern const int kDownloadProgressUnknown; - -// Unknown download speed. -extern const int kDownloadSpeedUnknown; - -// DownloadJob contains internal download logic. -// The owner of DownloadJob(e.g DownloadItemImpl) should implement -// DownloadJob::Manager to be informed with important changes from -// DownloadJob and modify its states accordingly. +// DownloadJob lives on UI thread and subclasses implement actual download logic +// and interact with DownloadItemImpl. +// The base class is a friend class of DownloadItemImpl. class CONTENT_EXPORT DownloadJob { public: - // The interface used to interact with the owner of the download job. - class CONTENT_EXPORT Manager { - public: - // Called when |download_job| becomes actively download data. - virtual void OnSavingStarted(DownloadJob* download_job) = 0; - - // Called when |download_job| is interrupted. - virtual void OnDownloadInterrupted(DownloadJob* download_job, - DownloadInterruptReason reason) = 0; - - // Called when |download_job| is completed and inform the manager. - virtual void OnDownloadComplete(DownloadJob* download_job) = 0; - - // Sets the download danger type. - virtual void SetDangerType(DownloadDangerType danger_type) = 0; - }; - - DownloadJob(); + explicit DownloadJob(DownloadItemImpl* download_item); virtual ~DownloadJob(); - DownloadJob::Manager* manager() { return manager_; } - - // Called when DownloadJob is attached to DownloadJob::Manager. - // |manager| can be nullptr. - virtual void OnAttached(DownloadJob::Manager* manager); - - // Called before DownloadJob is detached from its manager. - virtual void OnBeforeDetach(); - // Download operations. + virtual void Start() = 0; virtual void Cancel(bool user_cancel) = 0; - virtual void Pause() = 0; - virtual void Resume() = 0; + virtual void Pause(); + virtual void Resume(bool resume_request); - // Return if the download file can be opened. - // See |DownloadItem::CanOpenDownload|. - virtual bool CanOpen() const = 0; - - // Return if the download job can be resumed. - virtual bool CanResume() const = 0; - - // See |DownloadItem::CanShowInFolder|. - virtual bool CanShowInFolder() const = 0; - - // Return if the download job is actively downloading. - virtual bool IsActive() const = 0; - - // Return if the download job is paused. - virtual bool IsPaused() const = 0; - - // Return a number between 0 and 100 to represent the percentage progress of - // the download. Return |kDownloadProgressUnknown| if the progress is - // indeterminate. - virtual int PercentComplete() const = 0; - - // Return the estimated current download speed in bytes per second. - // Or return kDownloadSpeedUnknown if the download speed is not measurable. - virtual int64_t CurrentSpeed() const = 0; - - // Set the estimated remaining time of the download to |remaining| and return - // true if time remaining is available, otherwise return false. - virtual bool TimeRemaining(base::TimeDelta* remaining) const = 0; + bool is_paused() const { return is_paused_; } // Return the WebContents associated with the download. Usually used to // associate a browser window for any UI that needs to be displayed to the @@ -96,24 +39,15 @@ // WebContents. virtual WebContents* GetWebContents() const = 0; - // Print the debug string including internal states of the download job. - virtual std::string DebugString(bool verbose) const = 0; - protected: - // Mark the download as being active. - void StartedSavingResponse(); + void StartDownload() const; - // Mark the download as interrupted. - void Interrupt(DownloadInterruptReason reason); - - // Mark the download job as completed. - void Complete(); - - // Owner of this DownloadJob, Only valid between OnAttached() and - // OnBeforeDetach(), inclusive. Otherwise set to nullptr. - DownloadJob::Manager* manager_; + DownloadItemImpl* download_item_; private: + // If the download progress is paused by the user. + bool is_paused_; + DISALLOW_COPY_AND_ASSIGN(DownloadJob); };
diff --git a/content/browser/download/download_job_factory.cc b/content/browser/download/download_job_factory.cc new file mode 100644 index 0000000..3123aef --- /dev/null +++ b/content/browser/download/download_job_factory.cc
@@ -0,0 +1,59 @@ +// Copyright 2017 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 "content/browser/download/download_job_factory.h" + +#include <memory> + +#include "base/memory/ptr_util.h" +#include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_job.h" +#include "content/browser/download/download_job_impl.h" +#include "content/browser/download/parallel_download_job.h" +#include "content/public/common/content_features.h" + +namespace content { + +namespace { + +// Default minimum file size in bytes to enable a parallel download, 2048KB. +// TODO(xingliu): Use finch parameters to configure minimum file size. +const int64_t kMinFileSizeParallelDownload = 2097152; + +bool ShouldUseParallelDownload(const DownloadCreateInfo& create_info) { + // 1. Accept-Ranges, Content-Length and strong validators response headers. + // 2. Feature |kParallelDownloading| enabled. + // 3. Content-Length is no less than |kMinFileSizeParallelDownload|. + // 3. (Undetermined) Http/1.1 protocol. + // 4. (Undetermined) Not under http proxy, e.g. data saver. + + // Etag and last modified are stored into DownloadCreateInfo in + // DownloadRequestCore only if the response header complies to the strong + // validator rule. + bool has_strong_validator = + !create_info.etag.empty() || !create_info.last_modified.empty(); + + return has_strong_validator && create_info.accept_range && + create_info.total_bytes >= kMinFileSizeParallelDownload && + base::FeatureList::IsEnabled(features::kParallelDownloading); +} + +} // namespace + +std::unique_ptr<DownloadJob> DownloadJobFactory::CreateJob( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> req_handle, + const DownloadCreateInfo& create_info) { + // Build parallel download job. + if (ShouldUseParallelDownload(create_info)) { + return base::MakeUnique<ParallelDownloadJob>(download_item, + std::move(req_handle)); + } + + // An ordinary download job. + return base::MakeUnique<DownloadJobImpl>(download_item, + std::move(req_handle)); +} + +} // namespace
diff --git a/content/browser/download/download_job_factory.h b/content/browser/download/download_job_factory.h new file mode 100644 index 0000000..10eaa21a --- /dev/null +++ b/content/browser/download/download_job_factory.h
@@ -0,0 +1,33 @@ +// Copyright 2017 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 CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_ +#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "content/browser/download/download_create_info.h" + +namespace content { + +class DownloadItemImpl; +class DownloadJob; +class DownloadRequestHandleInterface; + +// Factory class to create different kinds of DownloadJob. +class DownloadJobFactory { + public: + static std::unique_ptr<DownloadJob> CreateJob( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> req_handle, + const DownloadCreateInfo& create_info); + + private: + DISALLOW_COPY_AND_ASSIGN(DownloadJobFactory); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_
diff --git a/content/browser/download/download_job_impl.cc b/content/browser/download/download_job_impl.cc new file mode 100644 index 0000000..c5239e8 --- /dev/null +++ b/content/browser/download/download_job_impl.cc
@@ -0,0 +1,46 @@ +// Copyright 2017 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 "content/browser/download/download_job_impl.h" + +#include "content/public/browser/web_contents.h" + +namespace content { + +DownloadJobImpl::DownloadJobImpl( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> request_handle) + : DownloadJob(download_item), request_handle_(std::move(request_handle)) {} + +DownloadJobImpl::~DownloadJobImpl() = default; + +void DownloadJobImpl::Start() { + DownloadJob::StartDownload(); +} + +void DownloadJobImpl::Cancel(bool user_cancel) { + if (request_handle_) + request_handle_->CancelRequest(); +} + +void DownloadJobImpl::Pause() { + DownloadJob::Pause(); + if (request_handle_) + request_handle_->PauseRequest(); +} + +void DownloadJobImpl::Resume(bool resume_request) { + DownloadJob::Resume(resume_request); + if (!resume_request) + return; + + if (request_handle_) + request_handle_->ResumeRequest(); +} + +WebContents* DownloadJobImpl::GetWebContents() const { + return request_handle_ ? request_handle_->GetWebContents() : nullptr; +} + +} // namespace content
diff --git a/content/browser/download/download_job_impl.h b/content/browser/download/download_job_impl.h new file mode 100644 index 0000000..c24f92d --- /dev/null +++ b/content/browser/download/download_job_impl.h
@@ -0,0 +1,40 @@ +// Copyright 2017 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 CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_ +#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_ + +#include "base/macros.h" +#include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_job.h" +#include "content/browser/download/download_request_handle.h" +#include "content/common/content_export.h" + +namespace content { + +class CONTENT_EXPORT DownloadJobImpl : public DownloadJob { + public: + DownloadJobImpl( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> request_handle); + ~DownloadJobImpl() override; + + // DownloadJob implementation. + void Start() override; + void Cancel(bool user_cancel) override; + void Pause() override; + void Resume(bool resume_request) override; + WebContents* GetWebContents() const override; + + private: + // Used to perform operations on network request. + // Can be null on interrupted download. + std::unique_ptr<DownloadRequestHandleInterface> request_handle_; + + DISALLOW_COPY_AND_ASSIGN(DownloadJobImpl); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_
diff --git a/content/browser/download/download_job_unittest.cc b/content/browser/download/download_job_unittest.cc index acdc5f1..ee758ad 100644 --- a/content/browser/download/download_job_unittest.cc +++ b/content/browser/download/download_job_unittest.cc
@@ -5,25 +5,18 @@ #include <memory> #include "base/memory/ptr_util.h" +#include "content/browser/download/download_item_impl_delegate.h" #include "content/browser/download/download_job.h" +#include "content/browser/download/mock_download_item_impl.h" #include "content/browser/download/mock_download_job.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using ::testing::NiceMock; + namespace content { -class MockDownloadJobManager : public DownloadJob::Manager { - public: - MockDownloadJobManager() = default; - ~MockDownloadJobManager() = default; - - MOCK_METHOD1(OnSavingStarted, void(DownloadJob* download_job)); - MOCK_METHOD1(SetDangerType, void(DownloadDangerType)); - MOCK_METHOD2(OnDownloadInterrupted, - void(DownloadJob* download_job, DownloadInterruptReason reason)); - MOCK_METHOD1(OnDownloadComplete, void(DownloadJob* download_job)); -}; - // Test for DownloadJob base class functionalities. class DownloadJobTest : public testing::Test { public: @@ -31,22 +24,20 @@ ~DownloadJobTest() override = default; void SetUp() override { - download_job_manager_ = base::MakeUnique<MockDownloadJobManager>(); - EXPECT_TRUE(download_job_manager_.get()); - download_job_ = base::MakeUnique<MockDownloadJob>(); + item_delegate_ = base::MakeUnique<DownloadItemImplDelegate>(); + download_item_ = + base::MakeUnique<NiceMock<MockDownloadItemImpl>>(item_delegate_.get()); + download_job_ = base::MakeUnique<MockDownloadJob>(download_item_.get()); } - std::unique_ptr<MockDownloadJobManager> download_job_manager_; + content::TestBrowserThreadBundle browser_threads_; + std::unique_ptr<DownloadItemImplDelegate> item_delegate_; + std::unique_ptr<MockDownloadItemImpl> download_item_; std::unique_ptr<MockDownloadJob> download_job_; }; -TEST_F(DownloadJobTest, AttachAndDetach) { - // Ensure the manager should be valid only between attach and detach call. - EXPECT_FALSE(download_job_->manager()); - download_job_->OnAttached(download_job_manager_.get()); - EXPECT_TRUE(download_job_->manager()); - download_job_->OnBeforeDetach(); - EXPECT_FALSE(download_job_->manager()); +TEST_F(DownloadJobTest, Pause) { + DCHECK(download_job_->download_item()); } } // namespace content
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 983e26ae..ae778d2 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -520,16 +520,6 @@ url_downloaders_.push_back(std::move(downloader)); } -void DownloadManagerImpl::RemoveUrlDownloader(UrlDownloader* downloader) { - for (auto ptr = url_downloaders_.begin(); ptr != url_downloaders_.end(); - ++ptr) { - if (ptr->get() == downloader) { - url_downloaders_.erase(ptr); - return; - } - } -} - // static DownloadInterruptReason DownloadManagerImpl::BeginDownloadRequest( std::unique_ptr<net::URLRequest> url_request, @@ -716,6 +706,24 @@ : nullptr; } +void DownloadManagerImpl::OnUrlDownloaderStarted( + std::unique_ptr<DownloadCreateInfo> download_create_info, + std::unique_ptr<ByteStreamReader> stream_reader, + const DownloadUrlParameters::OnStartedCallback& callback) { + StartDownload(std::move(download_create_info), std::move(stream_reader), + callback); +} + +void DownloadManagerImpl::OnUrlDownloaderStopped(UrlDownloader* downloader) { + for (auto ptr = url_downloaders_.begin(); ptr != url_downloaders_.end(); + ++ptr) { + if (ptr->get() == downloader) { + url_downloaders_.erase(ptr); + return; + } + } +} + void DownloadManagerImpl::GetAllDownloads(DownloadVector* downloads) { for (const auto& it : downloads_) { downloads->push_back(it.second.get());
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h index edf17777..b035d90 100644 --- a/content/browser/download/download_manager_impl.h +++ b/content/browser/download/download_manager_impl.h
@@ -40,6 +40,7 @@ class ResourceContext; class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager, + public UrlDownloader::Delegate, private DownloadItemImplDelegate { public: using DownloadItemImplCreated = base::Callback<void(DownloadItemImpl*)>; @@ -112,6 +113,13 @@ DownloadItem* GetDownload(uint32_t id) override; DownloadItem* GetDownloadByGuid(const std::string& guid) override; + // UrlDownloader::Delegate implementation. + void OnUrlDownloaderStarted( + std::unique_ptr<DownloadCreateInfo> download_create_info, + std::unique_ptr<ByteStreamReader> stream_reader, + const DownloadUrlParameters::OnStartedCallback& callback) override; + void OnUrlDownloaderStopped(UrlDownloader* downloader) override; + // For testing; specifically, accessed from TestFileErrorInjector. void SetDownloadItemFactoryForTesting( std::unique_ptr<DownloadItemFactory> item_factory); @@ -119,8 +127,6 @@ std::unique_ptr<DownloadFileFactory> file_factory); virtual DownloadFileFactory* GetDownloadFileFactoryForTesting(); - void RemoveUrlDownloader(UrlDownloader* downloader); - // Helper function to initiate a download request. This function initiates // the download using functionality provided by the // ResourceDispatcherHostImpl::BeginURLRequest function. The function returns
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index c9a225cf..d13298f 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -32,6 +32,7 @@ #include "content/browser/download/download_item_impl_delegate.h" #include "content/browser/download/download_request_handle.h" #include "content/browser/download/mock_download_file.h" +#include "content/browser/download/mock_download_item_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/download_interrupt_reasons.h" #include "content/public/browser/download_item.h" @@ -75,126 +76,6 @@ arg->default_download_directory == download_directory; } -class MockDownloadItemImpl : public DownloadItemImpl { - public: - // Use history constructor for minimal base object. - explicit MockDownloadItemImpl(DownloadItemImplDelegate* delegate) - : DownloadItemImpl(delegate, - std::string("7d122682-55b5-4a47-a253-36cadc3e5bee"), - content::DownloadItem::kInvalidId, - base::FilePath(), - base::FilePath(), - std::vector<GURL>(), - GURL(), - GURL(), - GURL(), - GURL(), - "application/octet-stream", - "application/octet-stream", - base::Time(), - base::Time(), - std::string(), - std::string(), - 0, - 0, - std::string(), - DownloadItem::COMPLETE, - DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - DOWNLOAD_INTERRUPT_REASON_NONE, - false, - std::vector<DownloadItem::ReceivedSlice>(), - net::NetLogWithSource()) {} - virtual ~MockDownloadItemImpl() {} - - MOCK_METHOD4(OnDownloadTargetDetermined, - void(const base::FilePath&, TargetDisposition, - DownloadDangerType, const base::FilePath&)); - MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*)); - MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*)); - MOCK_METHOD0(UpdateObservers, void()); - MOCK_METHOD0(CanShowInFolder, bool()); - MOCK_METHOD0(CanOpenDownload, bool()); - MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool()); - MOCK_METHOD0(OpenDownload, void()); - MOCK_METHOD0(ShowDownloadInShell, void()); - MOCK_METHOD0(ValidateDangerousDownload, void()); - MOCK_METHOD2(StealDangerousDownload, void(bool, const AcquireFileCallback&)); - MOCK_METHOD3(UpdateProgress, void(int64_t, int64_t, const std::string&)); - MOCK_METHOD1(Cancel, void(bool)); - MOCK_METHOD0(MarkAsComplete, void()); - void OnAllDataSaved(int64_t, std::unique_ptr<crypto::SecureHash>) override { - NOTREACHED(); - } - MOCK_METHOD0(OnDownloadedFileRemoved, void()); - void Start(std::unique_ptr<DownloadFile> download_file, - std::unique_ptr<DownloadRequestHandleInterface> req_handle, - const DownloadCreateInfo& create_info) override { - MockStart(download_file.get(), req_handle.get()); - } - - MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*)); - - MOCK_METHOD0(Remove, void()); - MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*)); - MOCK_CONST_METHOD0(CurrentSpeed, int64_t()); - MOCK_CONST_METHOD0(PercentComplete, int()); - MOCK_CONST_METHOD0(AllDataSaved, bool()); - MOCK_CONST_METHOD1(MatchesQuery, bool(const base::string16& query)); - MOCK_CONST_METHOD0(IsDone, bool()); - MOCK_CONST_METHOD0(GetFullPath, const base::FilePath&()); - MOCK_CONST_METHOD0(GetTargetFilePath, const base::FilePath&()); - MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition()); - MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType)); - MOCK_CONST_METHOD0(GetState, DownloadState()); - MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&()); - MOCK_METHOD1(SetTotalBytes, void(int64_t)); - MOCK_CONST_METHOD0(GetURL, const GURL&()); - MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&()); - MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&()); - MOCK_CONST_METHOD0(GetTabUrl, const GURL&()); - MOCK_CONST_METHOD0(GetTabReferrerUrl, const GURL&()); - MOCK_CONST_METHOD0(GetSuggestedFilename, std::string()); - MOCK_CONST_METHOD0(GetContentDisposition, std::string()); - MOCK_CONST_METHOD0(GetMimeType, std::string()); - MOCK_CONST_METHOD0(GetOriginalMimeType, std::string()); - MOCK_CONST_METHOD0(GetReferrerCharset, std::string()); - MOCK_CONST_METHOD0(GetRemoteAddress, std::string()); - MOCK_CONST_METHOD0(GetTotalBytes, int64_t()); - MOCK_CONST_METHOD0(GetReceivedBytes, int64_t()); - MOCK_CONST_METHOD0(GetHashState, const std::string&()); - MOCK_CONST_METHOD0(GetHash, const std::string&()); - MOCK_CONST_METHOD0(GetId, uint32_t()); - MOCK_CONST_METHOD0(GetGuid, const std::string&()); - MOCK_CONST_METHOD0(GetStartTime, base::Time()); - MOCK_CONST_METHOD0(GetEndTime, base::Time()); - MOCK_METHOD0(GetDownloadManager, DownloadManager*()); - MOCK_CONST_METHOD0(IsPaused, bool()); - MOCK_CONST_METHOD0(GetOpenWhenComplete, bool()); - MOCK_METHOD1(SetOpenWhenComplete, void(bool)); - MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool()); - MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType()); - MOCK_CONST_METHOD0(IsDangerous, bool()); - MOCK_METHOD0(GetAutoOpened, bool()); - MOCK_CONST_METHOD0(GetForcedFilePath, const base::FilePath&()); - MOCK_CONST_METHOD0(HasUserGesture, bool()); - MOCK_CONST_METHOD0(GetTransitionType, ui::PageTransition()); - MOCK_CONST_METHOD0(IsTemporary, bool()); - MOCK_METHOD1(SetOpened, void(bool)); - MOCK_CONST_METHOD0(GetOpened, bool()); - MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&()); - MOCK_CONST_METHOD0(GetETag, const std::string&()); - MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason()); - MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); - MOCK_CONST_METHOD0(GetWebContents, WebContents*()); - MOCK_CONST_METHOD0(GetFileNameToReportUser, base::FilePath()); - MOCK_METHOD1(SetDisplayName, void(const base::FilePath&)); - MOCK_METHOD0(NotifyRemoved, void()); - // May be called when vlog is on. - std::string DebugString(bool verbose) const override { - return std::string(); - } -}; - class MockDownloadManagerDelegate : public DownloadManagerDelegate { public: MockDownloadManagerDelegate();
diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc index 699f771d..a99127c 100644 --- a/content/browser/download/download_request_core.cc +++ b/content/browser/download/download_request_core.cc
@@ -351,6 +351,9 @@ if (!headers->GetMimeType(&create_info->original_mime_type)) create_info->original_mime_type.clear(); + + create_info->accept_range = + headers->HasHeaderValue("Accept-Ranges", "bytes"); } // Blink verifies that the requester of this download is allowed to set a
diff --git a/content/browser/download/download_worker.cc b/content/browser/download/download_worker.cc new file mode 100644 index 0000000..d537b1d --- /dev/null +++ b/content/browser/download/download_worker.cc
@@ -0,0 +1,93 @@ +// Copyright 2017 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 "content/browser/download/download_worker.h" + +#include "content/browser/download/download_create_info.h" +#include "content/public/browser/download_interrupt_reasons.h" +#include "content/public/browser/web_contents.h" + +namespace content { +namespace { + +const int kVerboseLevel = 1; + +std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> +CreateUrlDownloader(std::unique_ptr<DownloadUrlParameters> params, + base::WeakPtr<UrlDownloader::Delegate> delegate) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + // Build the URLRequest, BlobDataHandle is hold in original request for image + // download. + std::unique_ptr<net::URLRequest> url_request = + DownloadRequestCore::CreateRequestOnIOThread(DownloadItem::kInvalidId, + params.get()); + + return std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>( + UrlDownloader::BeginDownload(delegate, std::move(url_request), + params->referrer()) + .release()); +} + +} // namespace + +DownloadWorker::DownloadWorker() : weak_factory_(this) {} + +DownloadWorker::~DownloadWorker() = default; + +void DownloadWorker::SendRequest( + std::unique_ptr<DownloadUrlParameters> params) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + BrowserThread::PostTaskAndReplyWithResult( + BrowserThread::IO, FROM_HERE, + base::Bind(&CreateUrlDownloader, base::Passed(¶ms), + weak_factory_.GetWeakPtr()), + base::Bind(&DownloadWorker::AddUrlDownloader, + weak_factory_.GetWeakPtr())); +} + +void DownloadWorker::Pause() { + request_handle_->PauseRequest(); +} + +void DownloadWorker::Resume() { + request_handle_->ResumeRequest(); +} + +void DownloadWorker::Cancel() { + request_handle_->CancelRequest(); +} + +void DownloadWorker::OnUrlDownloaderStarted( + std::unique_ptr<DownloadCreateInfo> create_info, + std::unique_ptr<ByteStreamReader> stream_reader, + const DownloadUrlParameters::OnStartedCallback& callback) { + // |callback| is not used in subsequent requests. + DCHECK(callback.is_null()); + + // TODO(xingliu): Pass the |stream_reader| to parallel job and handle failed + // request. + if (create_info->result != + DownloadInterruptReason::DOWNLOAD_INTERRUPT_REASON_NONE) { + VLOG(kVerboseLevel) << "Parallel download sub request failed. reason = " + << create_info->result; + NOTIMPLEMENTED(); + return; + } + + request_handle_ = std::move(create_info->request_handle); +} + +void DownloadWorker::OnUrlDownloaderStopped(UrlDownloader* downloader) { + // Release the |url_downloader_|, the object will be deleted on IO thread. + url_downloader_.reset(); +} + +void DownloadWorker::AddUrlDownloader( + std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> + downloader) { + url_downloader_ = std::move(downloader); +} + +} // namespace content
diff --git a/content/browser/download/download_worker.h b/content/browser/download/download_worker.h new file mode 100644 index 0000000..75a7f96c --- /dev/null +++ b/content/browser/download/download_worker.h
@@ -0,0 +1,63 @@ +// Copyright 2017 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 CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_ +#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_ + +#include <memory> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "content/browser/byte_stream.h" +#include "content/browser/download/download_request_handle.h" +#include "content/browser/download/url_downloader.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/download_url_parameters.h" + +namespace content { + +// Helper class used to send subsequent range requests to fetch slices of the +// file after handling response of the original non-range request. +// TODO(xingliu): we should consider to reuse this class for single connection +// download. +class DownloadWorker : public UrlDownloader::Delegate { + public: + DownloadWorker(); + virtual ~DownloadWorker(); + + // Send network request to ask for a download. + void SendRequest(std::unique_ptr<DownloadUrlParameters> params); + + // Download operations. + void Pause(); + void Resume(); + void Cancel(); + + private: + // UrlDownloader::Delegate implementation. + void OnUrlDownloaderStarted( + std::unique_ptr<DownloadCreateInfo> create_info, + std::unique_ptr<ByteStreamReader> stream_reader, + const DownloadUrlParameters::OnStartedCallback& callback) override; + void OnUrlDownloaderStopped(UrlDownloader* downloader) override; + + void AddUrlDownloader( + std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> + downloader); + + // Used to control the network request. Live on UI thread. + std::unique_ptr<DownloadRequestHandleInterface> request_handle_; + + // Used to handle the url request. Live and die on IO thread. + std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> + url_downloader_; + + base::WeakPtrFactory<DownloadWorker> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(DownloadWorker); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_
diff --git a/content/browser/download/mock_download_item_impl.cc b/content/browser/download/mock_download_item_impl.cc new file mode 100644 index 0000000..92795c0 --- /dev/null +++ b/content/browser/download/mock_download_item_impl.cc
@@ -0,0 +1,38 @@ +// Copyright 2017 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 "content/browser/download/mock_download_item_impl.h" + +namespace content { + +MockDownloadItemImpl::MockDownloadItemImpl(DownloadItemImplDelegate* delegate) + : DownloadItemImpl(delegate, + std::string("7d122682-55b5-4a47-a253-36cadc3e5bee"), + content::DownloadItem::kInvalidId, + base::FilePath(), + base::FilePath(), + std::vector<GURL>(), + GURL(), + GURL(), + GURL(), + GURL(), + "application/octet-stream", + "application/octet-stream", + base::Time(), + base::Time(), + std::string(), + std::string(), + 0, + 0, + std::string(), + DownloadItem::COMPLETE, + DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DOWNLOAD_INTERRUPT_REASON_NONE, + false, + std::vector<DownloadItem::ReceivedSlice>(), + net::NetLogWithSource()) {} + +MockDownloadItemImpl::~MockDownloadItemImpl() = default; + +} // namespace content
diff --git a/content/browser/download/mock_download_item_impl.h b/content/browser/download/mock_download_item_impl.h new file mode 100644 index 0000000..205d84a9 --- /dev/null +++ b/content/browser/download/mock_download_item_impl.h
@@ -0,0 +1,117 @@ +// Copyright 2017 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 CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_ +#define CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_ + +#include "base/macros.h" +#include "content/browser/download/download_create_info.h" +#include "content/browser/download/download_file.h" +#include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_request_handle.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace content { + +class BrowserContext; +class DownloadManager; +class WebContents; + +class MockDownloadItemImpl : public DownloadItemImpl { + public: + // Use history constructor for minimal base object. + explicit MockDownloadItemImpl(DownloadItemImplDelegate* delegate); + ~MockDownloadItemImpl() override; + + MOCK_METHOD4(OnDownloadTargetDetermined, + void(const base::FilePath&, + TargetDisposition, + DownloadDangerType, + const base::FilePath&)); + MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*)); + MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*)); + MOCK_METHOD0(UpdateObservers, void()); + MOCK_METHOD0(CanShowInFolder, bool()); + MOCK_METHOD0(CanOpenDownload, bool()); + MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool()); + MOCK_METHOD0(OpenDownload, void()); + MOCK_METHOD0(ShowDownloadInShell, void()); + MOCK_METHOD0(ValidateDangerousDownload, void()); + MOCK_METHOD2(StealDangerousDownload, void(bool, const AcquireFileCallback&)); + MOCK_METHOD3(UpdateProgress, void(int64_t, int64_t, const std::string&)); + MOCK_METHOD1(Cancel, void(bool)); + MOCK_METHOD0(MarkAsComplete, void()); + void OnAllDataSaved(int64_t, std::unique_ptr<crypto::SecureHash>) override { + NOTREACHED(); + } + MOCK_METHOD0(OnDownloadedFileRemoved, void()); + void Start(std::unique_ptr<DownloadFile> download_file, + std::unique_ptr<DownloadRequestHandleInterface> req_handle, + const DownloadCreateInfo& create_info) override { + MockStart(download_file.get(), req_handle.get()); + } + + MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*)); + + MOCK_METHOD0(Remove, void()); + MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*)); + MOCK_CONST_METHOD0(CurrentSpeed, int64_t()); + MOCK_CONST_METHOD0(PercentComplete, int()); + MOCK_CONST_METHOD0(AllDataSaved, bool()); + MOCK_CONST_METHOD1(MatchesQuery, bool(const base::string16& query)); + MOCK_CONST_METHOD0(IsDone, bool()); + MOCK_CONST_METHOD0(GetFullPath, const base::FilePath&()); + MOCK_CONST_METHOD0(GetTargetFilePath, const base::FilePath&()); + MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition()); + MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType)); + MOCK_CONST_METHOD0(GetState, DownloadState()); + MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&()); + MOCK_METHOD1(SetTotalBytes, void(int64_t)); + MOCK_CONST_METHOD0(GetURL, const GURL&()); + MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&()); + MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&()); + MOCK_CONST_METHOD0(GetTabUrl, const GURL&()); + MOCK_CONST_METHOD0(GetTabReferrerUrl, const GURL&()); + MOCK_CONST_METHOD0(GetSuggestedFilename, std::string()); + MOCK_CONST_METHOD0(GetContentDisposition, std::string()); + MOCK_CONST_METHOD0(GetMimeType, std::string()); + MOCK_CONST_METHOD0(GetOriginalMimeType, std::string()); + MOCK_CONST_METHOD0(GetReferrerCharset, std::string()); + MOCK_CONST_METHOD0(GetRemoteAddress, std::string()); + MOCK_CONST_METHOD0(GetTotalBytes, int64_t()); + MOCK_CONST_METHOD0(GetReceivedBytes, int64_t()); + MOCK_CONST_METHOD0(GetHashState, const std::string&()); + MOCK_CONST_METHOD0(GetHash, const std::string&()); + MOCK_CONST_METHOD0(GetId, uint32_t()); + MOCK_CONST_METHOD0(GetGuid, const std::string&()); + MOCK_CONST_METHOD0(GetStartTime, base::Time()); + MOCK_CONST_METHOD0(GetEndTime, base::Time()); + MOCK_METHOD0(GetDownloadManager, DownloadManager*()); + MOCK_CONST_METHOD0(IsPaused, bool()); + MOCK_CONST_METHOD0(GetOpenWhenComplete, bool()); + MOCK_METHOD1(SetOpenWhenComplete, void(bool)); + MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool()); + MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType()); + MOCK_CONST_METHOD0(IsDangerous, bool()); + MOCK_METHOD0(GetAutoOpened, bool()); + MOCK_CONST_METHOD0(GetForcedFilePath, const base::FilePath&()); + MOCK_CONST_METHOD0(HasUserGesture, bool()); + MOCK_CONST_METHOD0(GetTransitionType, ui::PageTransition()); + MOCK_CONST_METHOD0(IsTemporary, bool()); + MOCK_METHOD1(SetOpened, void(bool)); + MOCK_CONST_METHOD0(GetOpened, bool()); + MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&()); + MOCK_CONST_METHOD0(GetETag, const std::string&()); + MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason()); + MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); + MOCK_CONST_METHOD0(GetWebContents, WebContents*()); + MOCK_CONST_METHOD0(GetFileNameToReportUser, base::FilePath()); + MOCK_METHOD1(SetDisplayName, void(const base::FilePath&)); + MOCK_METHOD0(NotifyRemoved, void()); + // May be called when vlog is on. + std::string DebugString(bool verbose) const override { return std::string(); } +}; +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_
diff --git a/content/browser/download/mock_download_job.cc b/content/browser/download/mock_download_job.cc index 9108e61..fd94c33 100644 --- a/content/browser/download/mock_download_job.cc +++ b/content/browser/download/mock_download_job.cc
@@ -6,7 +6,8 @@ namespace content { -MockDownloadJob::MockDownloadJob() = default; +MockDownloadJob::MockDownloadJob(DownloadItemImpl* download_item) + : DownloadJob(download_item) {} MockDownloadJob::~MockDownloadJob() = default;
diff --git a/content/browser/download/mock_download_job.h b/content/browser/download/mock_download_job.h index 39ea72e..25a4ad037 100644 --- a/content/browser/download/mock_download_job.h +++ b/content/browser/download/mock_download_job.h
@@ -14,15 +14,20 @@ namespace content { +class DownloadItemImpl; + class MockDownloadJob : public DownloadJob { public: - MockDownloadJob(); + explicit MockDownloadJob(DownloadItemImpl* download_item); ~MockDownloadJob() override; + DownloadItemImpl* download_item() { return download_item_; } + // DownloadJob implementation. + MOCK_METHOD0(Start, void()); MOCK_METHOD1(Cancel, void(bool)); MOCK_METHOD0(Pause, void()); - MOCK_METHOD0(Resume, void()); + MOCK_METHOD1(Resume, void(bool)); MOCK_CONST_METHOD0(CanOpen, bool()); MOCK_CONST_METHOD0(CanResume, bool()); MOCK_CONST_METHOD0(CanShowInFolder, bool());
diff --git a/content/browser/download/parallel_download_job.cc b/content/browser/download/parallel_download_job.cc new file mode 100644 index 0000000..41ba75be --- /dev/null +++ b/content/browser/download/parallel_download_job.cc
@@ -0,0 +1,103 @@ +// Copyright 2017 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 "content/browser/download/parallel_download_job.h" + +#include "base/memory/ptr_util.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" + +namespace content { + +namespace { + +// TODO(xingliu): Use finch parameters to configure constants. +// Default number of requests in a parallel download, including the original +// request. +const int kParallelRequestCount = 2; + +} // namespace + +ParallelDownloadJob::ParallelDownloadJob( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> request_handle) + : DownloadJobImpl(download_item, std::move(request_handle)), + request_num_(kParallelRequestCount) {} + +ParallelDownloadJob::~ParallelDownloadJob() = default; + +void ParallelDownloadJob::Cancel(bool user_cancel) { + DownloadJobImpl::Cancel(user_cancel); + for (auto& worker : workers_) + worker->Cancel(); +} + +void ParallelDownloadJob::Pause() { + DownloadJobImpl::Pause(); + for (auto& worker : workers_) + worker->Pause(); +} + +void ParallelDownloadJob::Resume(bool resume_request) { + DownloadJobImpl::Resume(resume_request); + if (!resume_request) + return; + + for (auto& worker : workers_) + worker->Resume(); +} + +void ParallelDownloadJob::ForkRequestsForNewDownload(int64_t bytes_received, + int64_t total_bytes) { + if (!download_item_ || total_bytes <= 0 || bytes_received >= total_bytes || + request_num_ <= 1) { + return; + } + + int64_t bytes_left = total_bytes - bytes_received; + int64_t slice_size = bytes_left / request_num_; + slice_size = slice_size > 0 ? slice_size : 1; + int num_requests = bytes_left / slice_size; + int64_t current_offset = bytes_received + slice_size; + + // TODO(xingliu): Add records for slices in history db. + for (int i = 0; i < num_requests - 1; ++i) { + int64_t length = (i == (num_requests - 2)) + ? slice_size + (bytes_left % slice_size) + : slice_size; + CreateRequest(current_offset, length); + current_offset += slice_size; + } +} + +void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) { + std::unique_ptr<DownloadWorker> worker = base::MakeUnique<DownloadWorker>(); + + DCHECK(download_item_); + StoragePartition* storage_partition = + BrowserContext::GetStoragePartitionForSite( + download_item_->GetBrowserContext(), download_item_->GetSiteUrl()); + + std::unique_ptr<DownloadUrlParameters> download_params( + new DownloadUrlParameters(download_item_->GetURL(), + storage_partition->GetURLRequestContext())); + download_params->set_file_path(download_item_->GetFullPath()); + download_params->set_last_modified(download_item_->GetLastModifiedTime()); + download_params->set_etag(download_item_->GetETag()); + download_params->set_offset(offset); + + // Setting the length will result in range request to fetch a slice of the + // file. + download_params->set_length(length); + + // Subsequent range requests have the same referrer URL as the original + // download request. + download_params->set_referrer(Referrer(download_item_->GetReferrerUrl(), + blink::WebReferrerPolicyAlways)); + // Send the request. + worker->SendRequest(std::move(download_params)); + workers_.push_back(std::move(worker)); +} + +} // namespace content
diff --git a/content/browser/download/parallel_download_job.h b/content/browser/download/parallel_download_job.h new file mode 100644 index 0000000..e3914ed0 --- /dev/null +++ b/content/browser/download/parallel_download_job.h
@@ -0,0 +1,59 @@ +// Copyright 2017 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 CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_ +#define CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_ + +#include <memory> +#include <vector> + +#include "base/macros.h" +#include "content/browser/download/download_job_impl.h" +#include "content/browser/download/download_worker.h" +#include "content/common/content_export.h" + +namespace content { + +// DownloadJob that can create concurrent range requests to fetch different +// parts of the file. +// The original request is hold in base class DownloadUrlJob. +class CONTENT_EXPORT ParallelDownloadJob : public DownloadJobImpl { + public: + ParallelDownloadJob( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> request_handle); + ~ParallelDownloadJob() override; + + // DownloadUrlJob implementation. + void Cancel(bool user_cancel) override; + void Pause() override; + void Resume(bool resume_request) override; + + private: + friend class ParallelDownloadJobTest; + + typedef std::vector<std::unique_ptr<DownloadWorker>> WorkerList; + + // Build multiple http requests for a new download, + // the rest of the bytes starting from |bytes_received| will be equally + // distributed to each connection, including the original connection. + // the last connection may take additional bytes. + void ForkRequestsForNewDownload(int64_t bytes_received, int64_t total_bytes); + + // Create one range request, virtual for testing. + virtual void CreateRequest(int64_t offset, int64_t length); + + // Number of concurrent requests for a new download, include the original + // request. + int request_num_; + + // Subsequent tasks to send range requests. + WorkerList workers_; + + DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJob); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/content/browser/download/parallel_download_job_unittest.cc new file mode 100644 index 0000000..4828b2af --- /dev/null +++ b/content/browser/download/parallel_download_job_unittest.cc
@@ -0,0 +1,138 @@ +// Copyright 2017 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 "content/browser/download/parallel_download_job.h" + +#include <utility> +#include <vector> + +#include "base/memory/ptr_util.h" +#include "content/browser/download/download_item_impl_delegate.h" +#include "content/browser/download/mock_download_item_impl.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::NiceMock; + +namespace content { + +namespace { + +class MockDownloadRequestHandle : public DownloadRequestHandleInterface { + public: + MOCK_CONST_METHOD0(GetWebContents, WebContents*()); + MOCK_CONST_METHOD0(GetDownloadManager, DownloadManager*()); + MOCK_CONST_METHOD0(PauseRequest, void()); + MOCK_CONST_METHOD0(ResumeRequest, void()); + MOCK_CONST_METHOD0(CancelRequest, void()); + MOCK_CONST_METHOD0(DebugString, std::string()); +}; + +} // namespace + +class ParallelDownloadJobForTest : public ParallelDownloadJob { + public: + ParallelDownloadJobForTest( + DownloadItemImpl* download_item, + std::unique_ptr<DownloadRequestHandleInterface> request_handle) + : ParallelDownloadJob(download_item, std::move(request_handle)) {} + + void CreateRequest(int64_t offset, int64_t length) override { + fake_tasks_.push_back(std::pair<int64_t, int64_t>(offset, length)); + } + + std::vector<std::pair<int64_t, int64_t>> fake_tasks_; + + private: + DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJobForTest); +}; + +class ParallelDownloadJobTest : public testing::Test { + public: + void SetUp() override { + item_delegate_ = base::MakeUnique<DownloadItemImplDelegate>(); + download_item_ = + base::MakeUnique<NiceMock<MockDownloadItemImpl>>(item_delegate_.get()); + job_ = base::MakeUnique<ParallelDownloadJobForTest>( + download_item_.get(), base::MakeUnique<MockDownloadRequestHandle>()); + } + + void CreateNewDownloadRequests(int64_t total_bytes, + int64_t bytes_received, + int request_num) { + job_->request_num_ = request_num; + job_->ForkRequestsForNewDownload(bytes_received, total_bytes); + } + + content::TestBrowserThreadBundle browser_threads_; + std::unique_ptr<DownloadItemImplDelegate> item_delegate_; + std::unique_ptr<MockDownloadItemImpl> download_item_; + std::unique_ptr<ParallelDownloadJobForTest> job_; +}; + +// Test if sub tasks are created correctly. +TEST_F(ParallelDownloadJobTest, CreateNewDownloadRequests) { + EXPECT_TRUE(job_->fake_tasks_.empty()); + + // Totally 2 requests for 100 bytes. + // Original request: Range:0-49, for 50 bytes. + // Task 1: Range:50-99, for 50 bytes. + CreateNewDownloadRequests(100, 0, 2); + EXPECT_EQ(1, static_cast<int>(job_->fake_tasks_.size())); + EXPECT_EQ(50, job_->fake_tasks_[0].first); + EXPECT_EQ(50, job_->fake_tasks_[0].second); + job_->fake_tasks_.clear(); + + // Totally 3 requests for 100 bytes. + // Original request: Range:0-32, for 33 bytes. + // Task 1: Range:33-65, for 33 bytes. + // Task 2: Range:66-99, for 34 bytes. + CreateNewDownloadRequests(100, 0, 3); + EXPECT_EQ(2, static_cast<int>(job_->fake_tasks_.size())); + EXPECT_EQ(33, job_->fake_tasks_[0].first); + EXPECT_EQ(33, job_->fake_tasks_[0].second); + EXPECT_EQ(66, job_->fake_tasks_[1].first); + EXPECT_EQ(34, job_->fake_tasks_[1].second); + job_->fake_tasks_.clear(); + + // Totally 3 requests for 100 bytes. Start from the 17th byte. + // Original request: Range:17-43, for 27 bytes. + // Task 1: Range:44-70, for 27 bytes. + // Task 2: Range:71-99, for 29 bytes. + CreateNewDownloadRequests(100, 17, 3); + EXPECT_EQ(2, static_cast<int>(job_->fake_tasks_.size())); + EXPECT_EQ(44, job_->fake_tasks_[0].first); + EXPECT_EQ(27, job_->fake_tasks_[0].second); + EXPECT_EQ(71, job_->fake_tasks_[1].first); + EXPECT_EQ(29, job_->fake_tasks_[1].second); + job_->fake_tasks_.clear(); + + // Less than 2 requests, do nothing. + CreateNewDownloadRequests(100, 17, 1); + EXPECT_TRUE(job_->fake_tasks_.empty()); + CreateNewDownloadRequests(100, 17, 0); + EXPECT_TRUE(job_->fake_tasks_.empty()); + + // Received bytes are no less than total bytes, do nothing. + CreateNewDownloadRequests(100, 100, 3); + EXPECT_TRUE(job_->fake_tasks_.empty()); + CreateNewDownloadRequests(100, 255, 3); + EXPECT_TRUE(job_->fake_tasks_.empty()); + + // Edge cases for 0 bytes. + CreateNewDownloadRequests(0, 0, 3); + EXPECT_TRUE(job_->fake_tasks_.empty()); + + // 2 bytes left for 3 additional requests. Only 1 are built. + // Original request: Range:98-98, for 1 byte. + // Task 1: Range:99-99, for 1 byte. + CreateNewDownloadRequests(100, 98, 4); + EXPECT_EQ(1, static_cast<int>(job_->fake_tasks_.size())); + EXPECT_EQ(99, job_->fake_tasks_[0].first); + EXPECT_EQ(1, job_->fake_tasks_[0].second); + job_->fake_tasks_.clear(); +} + +} // namespace content
diff --git a/content/browser/download/url_downloader.cc b/content/browser/download/url_downloader.cc index 7f6019a..bc1ae26 100644 --- a/content/browser/download/url_downloader.cc +++ b/content/browser/download/url_downloader.cc
@@ -10,7 +10,6 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "content/browser/byte_stream.h" #include "content/browser/download/download_create_info.h" -#include "content/browser/download/download_manager_impl.h" #include "content/browser/download/download_request_handle.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_interrupt_reasons.h" @@ -27,27 +26,21 @@ class UrlDownloader::RequestHandle : public DownloadRequestHandleInterface { public: RequestHandle(base::WeakPtr<UrlDownloader> downloader, - base::WeakPtr<DownloadManagerImpl> download_manager_impl, scoped_refptr<base::SequencedTaskRunner> downloader_task_runner) : downloader_(downloader), - download_manager_impl_(download_manager_impl), downloader_task_runner_(downloader_task_runner) {} RequestHandle(RequestHandle&& other) : downloader_(std::move(other.downloader_)), - download_manager_impl_(std::move(other.download_manager_impl_)), downloader_task_runner_(std::move(other.downloader_task_runner_)) {} RequestHandle& operator=(RequestHandle&& other) { downloader_ = std::move(other.downloader_); - download_manager_impl_ = std::move(other.download_manager_impl_); downloader_task_runner_ = std::move(other.downloader_task_runner_); return *this; } // DownloadRequestHandleInterface WebContents* GetWebContents() const override { return nullptr; } - DownloadManager* GetDownloadManager() const override { - return download_manager_impl_ ? download_manager_impl_.get() : nullptr; - } + DownloadManager* GetDownloadManager() const override { return nullptr; } void PauseRequest() const override { downloader_task_runner_->PostTask( FROM_HERE, base::Bind(&UrlDownloader::PauseRequest, downloader_)); @@ -63,7 +56,6 @@ private: base::WeakPtr<UrlDownloader> downloader_; - base::WeakPtr<DownloadManagerImpl> download_manager_impl_; scoped_refptr<base::SequencedTaskRunner> downloader_task_runner_; DISALLOW_COPY_AND_ASSIGN(RequestHandle); @@ -71,7 +63,7 @@ // static std::unique_ptr<UrlDownloader> UrlDownloader::BeginDownload( - base::WeakPtr<DownloadManagerImpl> download_manager, + base::WeakPtr<UrlDownloader::Delegate> delegate, std::unique_ptr<net::URLRequest> request, const Referrer& referrer) { Referrer::SetReferrerForRequest(request.get(), referrer); @@ -82,16 +74,16 @@ // From this point forward, the |UrlDownloader| is responsible for // |started_callback|. std::unique_ptr<UrlDownloader> downloader( - new UrlDownloader(std::move(request), download_manager)); + new UrlDownloader(std::move(request), delegate)); downloader->Start(); return downloader; } UrlDownloader::UrlDownloader(std::unique_ptr<net::URLRequest> request, - base::WeakPtr<DownloadManagerImpl> manager) + base::WeakPtr<Delegate> delegate) : request_(std::move(request)), - manager_(manager), + delegate_(delegate), core_(request_.get(), this), weak_ptr_factory_(this) {} @@ -213,13 +205,14 @@ std::unique_ptr<DownloadCreateInfo> create_info, std::unique_ptr<ByteStreamReader> stream_reader, const DownloadUrlParameters::OnStartedCallback& callback) { - create_info->request_handle.reset( - new RequestHandle(weak_ptr_factory_.GetWeakPtr(), manager_, - base::SequencedTaskRunnerHandle::Get())); - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::Bind(&DownloadManagerImpl::StartDownload, - manager_, base::Passed(&create_info), - base::Passed(&stream_reader), callback)); + create_info->request_handle.reset(new RequestHandle( + weak_ptr_factory_.GetWeakPtr(), base::SequencedTaskRunnerHandle::Get())); + + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&UrlDownloader::Delegate::OnUrlDownloaderStarted, delegate_, + base::Passed(&create_info), base::Passed(&stream_reader), + callback)); } void UrlDownloader::OnReadyToRead() { @@ -241,7 +234,8 @@ void UrlDownloader::Destroy() { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this)); + base::Bind(&UrlDownloader::Delegate::OnUrlDownloaderStopped, delegate_, + this)); } } // namespace content
diff --git a/content/browser/download/url_downloader.h b/content/browser/download/url_downloader.h index ffbc7e6..4ba35d0 100644 --- a/content/browser/download/url_downloader.h +++ b/content/browser/download/url_downloader.h
@@ -21,17 +21,30 @@ namespace content { class ByteStreamReader; struct DownloadCreateInfo; -class DownloadManagerImpl; class UrlDownloader : public net::URLRequest::Delegate, public DownloadRequestCore::Delegate { public: + // Implemented by the owner of UrlDownloader, functions need to be called on + // UI thread. + class Delegate { + public: + // Called after response is handled and the byte stream is established. + virtual void OnUrlDownloaderStarted( + std::unique_ptr<DownloadCreateInfo> download_create_info, + std::unique_ptr<ByteStreamReader> stream_reader, + const DownloadUrlParameters::OnStartedCallback& callback) = 0; + + // Called after the connection is cannceled or finished. + virtual void OnUrlDownloaderStopped(UrlDownloader* downloader) = 0; + }; + UrlDownloader(std::unique_ptr<net::URLRequest> request, - base::WeakPtr<DownloadManagerImpl> manager); + base::WeakPtr<Delegate> delegate); ~UrlDownloader() override; static std::unique_ptr<UrlDownloader> BeginDownload( - base::WeakPtr<DownloadManagerImpl> download_manager, + base::WeakPtr<UrlDownloader::Delegate> delegate, std::unique_ptr<net::URLRequest> request, const Referrer& referrer); @@ -67,7 +80,9 @@ void Destroy(); std::unique_ptr<net::URLRequest> request_; - base::WeakPtr<DownloadManagerImpl> manager_; + + // Live on UI thread, post task to call |delegate_| functions. + base::WeakPtr<Delegate> delegate_; DownloadRequestCore core_; base::WeakPtrFactory<UrlDownloader> weak_ptr_factory_;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 6246fac3..3beb56b 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2603,6 +2603,12 @@ Send(new InputMsg_DeleteSurroundingText(routing_id_, before, after)); } +void RenderFrameHostImpl::DeleteSurroundingTextInCodePoints(int before, + int after) { + Send(new InputMsg_DeleteSurroundingTextInCodePoints(routing_id_, before, + after)); +} + void RenderFrameHostImpl::JavaScriptDialogClosed( IPC::Message* reply_msg, bool success,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 0ca442b..0dd8f60 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -458,9 +458,16 @@ void ExtendSelectionAndDelete(size_t before, size_t after); // Deletes text before and after the current cursor position, excluding the - // selection. + // selection. The lengths are supplied in Java chars (UTF-16 Code Unit), not + // in code points or in glyphs. void DeleteSurroundingText(size_t before, size_t after); + // Deletes text before and after the current cursor position, excluding the + // selection. The lengths are supplied in code points, not in Java chars + // (UTF-16 Code Unit) or in glyphs. Do nothing if there are one or more + // invalid surrogate pairs in the requested range. + void DeleteSurroundingTextInCodePoints(int before, int after); + // Notifies the RenderFrame that the JavaScript message that was shown was // closed by the user. void JavaScriptDialogClosed(IPC::Message* reply_msg,
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 987f0fa..f18085e 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -304,6 +304,8 @@ return "GPU_READ"; case gfx::BufferUsage::SCANOUT: return "SCANOUT"; + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: + return "SCANOUT_CPU_READ_WRITE"; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: return "GPU_READ_CPU_READ_WRITE"; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc index 5f8c5743..683e120a 100644 --- a/content/browser/loader/resource_scheduler.cc +++ b/content/browser/loader/resource_scheduler.cc
@@ -18,6 +18,7 @@ #include "base/stl_util.h" #include "base/supports_user_data.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/trace_event/trace_event.h" #include "content/common/resource_messages.h" #include "content/public/browser/resource_request_info.h" #include "content/public/browser/resource_throttle.h" @@ -371,7 +372,7 @@ in_flight_delayable_count_(0), total_layout_blocking_count_(0), priority_requests_delayable_(priority_requests_delayable), - has_pending_start_task_(false), + num_skipped_scans_due_to_scheduled_start_(0), started_requests_since_yielding_(0), did_scheduler_yield_(false), yielding_scheduler_enabled_(yielding_scheduler_enabled), @@ -402,7 +403,7 @@ EraseInFlightRequest(request); // Removing this request may have freed up another to load. - ScheduleLoadAnyStartablePendingRequests( + LoadAnyStartablePendingRequests( has_html_body_ ? RequestStartTrigger::COMPLETION_POST_BODY : RequestStartTrigger::COMPLETION_PRE_BODY); } @@ -765,12 +766,14 @@ // TODO(csharrison): Reconsider this if IPC batching becomes an easy to use // pattern. void ScheduleLoadAnyStartablePendingRequests(RequestStartTrigger trigger) { - if (has_pending_start_task_) - return; - has_pending_start_task_ = true; - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&Client::LoadAnyStartablePendingRequests, - weak_ptr_factory_.GetWeakPtr(), trigger)); + if (num_skipped_scans_due_to_scheduled_start_ == 0) { + TRACE_EVENT0("loading", "ScheduleLoadAnyStartablePendingRequests"); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&Client::LoadAnyStartablePendingRequests, + weak_ptr_factory_.GetWeakPtr(), trigger)); + } + num_skipped_scans_due_to_scheduled_start_ += 1; } void ResumeIfYielded() { @@ -803,7 +806,12 @@ // the previous request still in the list. // 3) We do not start the request, same as above, but StartRequest() tells // us there's no point in checking any further requests. - has_pending_start_task_ = false; + TRACE_EVENT0("loading", "LoadAnyStartablePendingRequests"); + if (num_skipped_scans_due_to_scheduled_start_ > 0) { + UMA_HISTOGRAM_COUNTS_1M("ResourceScheduler.NumSkippedScans.ScheduleStart", + num_skipped_scans_due_to_scheduled_start_); + } + num_skipped_scans_due_to_scheduled_start_ = 0; RequestQueue::NetQueue::iterator request_iter = pending_requests_.GetNextHighestIterator(); @@ -851,7 +859,9 @@ // be delayed. bool priority_requests_delayable_; - bool has_pending_start_task_; + // The number of LoadAnyStartablePendingRequests scans that were skipped due + // to smarter task scheduling around reprioritization. + int num_skipped_scans_due_to_scheduled_start_; // The number of started requests since the last ResumeIfYielded task was // run.
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc index 0c852a3..3721d364 100644 --- a/content/browser/renderer_host/ime_adapter_android.cc +++ b/content/browser/renderer_host/ime_adapter_android.cc
@@ -283,6 +283,17 @@ rfh->DeleteSurroundingText(before, after); } +void ImeAdapterAndroid::DeleteSurroundingTextInCodePoints( + JNIEnv*, + const JavaParamRef<jobject>&, + int before, + int after) { + RenderFrameHostImpl* rfh = + static_cast<RenderFrameHostImpl*>(GetFocusedFrame()); + if (rfh) + rfh->DeleteSurroundingTextInCodePoints(before, after); +} + bool ImeAdapterAndroid::RequestTextInputStateUpdate( JNIEnv* env, const JavaParamRef<jobject>&) {
diff --git a/content/browser/renderer_host/ime_adapter_android.h b/content/browser/renderer_host/ime_adapter_android.h index 288f4402..71ffef2 100644 --- a/content/browser/renderer_host/ime_adapter_android.h +++ b/content/browser/renderer_host/ime_adapter_android.h
@@ -75,6 +75,11 @@ const base::android::JavaParamRef<jobject>&, int before, int after); + void DeleteSurroundingTextInCodePoints( + JNIEnv*, + const base::android::JavaParamRef<jobject>&, + int before, + int after); void ResetImeAdapter(JNIEnv*, const base::android::JavaParamRef<jobject>&); void RequestCursorUpdate(JNIEnv*, const base::android::JavaParamRef<jobject>&, bool immediateRequest, bool monitorRequest);
diff --git a/content/common/input_messages.h b/content/common/input_messages.h index 7221f95..7deff3c 100644 --- a/content/common/input_messages.h +++ b/content/common/input_messages.h
@@ -163,11 +163,20 @@ int /* after */) // Deletes text before and after the current cursor position, excluding the -// selection. +// selection. The lengths are supplied in Java chars (UTF-16 Code Unit), not in +// code points or in glyphs. IPC_MESSAGE_ROUTED2(InputMsg_DeleteSurroundingText, int /* before */, int /* after */) +// Deletes text before and after the current cursor position, excluding the +// selection. The lengths are supplied in code points, not in Java chars (UTF-16 +// Code Unit) or in glyphs. Does nothing if there are one or more invalid +// surrogate pairs in the requested range +IPC_MESSAGE_ROUTED2(InputMsg_DeleteSurroundingTextInCodePoints, + int /* before */, + int /* after */) + // Selects between the given start and end offsets in the currently focused // editable field. IPC_MESSAGE_ROUTED2(InputMsg_SetEditableSelectionOffsets,
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java index 124dbcc8..5956eeea7 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -633,6 +633,26 @@ } /** + * Send a request to the native counterpart to delete a given range of characters. + * @param beforeLength Number of code points to extend the selection by before the existing + * selection. + * @param afterLength Number of code points to extend the selection by after the existing + * selection. + * @return Whether the native counterpart of ImeAdapter received the call. + */ + boolean deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) { + mViewEmbedder.onImeEvent(); + if (mNativeImeAdapterAndroid == 0) return false; + nativeSendKeyEvent(mNativeImeAdapterAndroid, null, WebInputEventType.RawKeyDown, 0, + SystemClock.uptimeMillis(), COMPOSITION_KEY_CODE, 0, false, 0); + nativeDeleteSurroundingTextInCodePoints( + mNativeImeAdapterAndroid, beforeLength, afterLength); + nativeSendKeyEvent(mNativeImeAdapterAndroid, null, WebInputEventType.KeyUp, 0, + SystemClock.uptimeMillis(), COMPOSITION_KEY_CODE, 0, false, 0); + return true; + } + + /** * Send a request to the native counterpart to set the selection to given range. * @param start Selection start index. * @param end Selection end index. @@ -783,6 +803,8 @@ private native void nativeSetComposingRegion(long nativeImeAdapterAndroid, int start, int end); private native void nativeDeleteSurroundingText(long nativeImeAdapterAndroid, int before, int after); + private native void nativeDeleteSurroundingTextInCodePoints( + long nativeImeAdapterAndroid, int before, int after); private native void nativeResetImeAdapter(long nativeImeAdapterAndroid); private native boolean nativeRequestTextInputStateUpdate(long nativeImeAdapterAndroid); private native void nativeRequestCursorUpdate(long nativeImeAdapterAndroid,
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java b/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java index f7dd561..274bb133 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
@@ -427,9 +427,21 @@ /** * @see InputConnection#deleteSurroundingTextInCodePoints(int, int) */ - public boolean deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) { - // TODO(changwan): Implement this. http://crbug.com/595525 - return false; + public boolean deleteSurroundingTextInCodePoints( + final int beforeLength, final int afterLength) { + if (DEBUG_LOGS) { + Log.w(TAG, "deleteSurroundingTextInCodePoints [%d %d]", beforeLength, afterLength); + } + ThreadUtils.postOnUiThread(new Runnable() { + @Override + public void run() { + if (mPendingAccent != 0) { + finishComposingTextOnUiThread(); + } + mImeAdapter.deleteSurroundingTextInCodePoints(beforeLength, afterLength); + } + }); + return true; } /**
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java index 41f43d8b..d4e2547 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
@@ -4,6 +4,7 @@ package org.chromium.content.browser.input; +import android.annotation.TargetApi; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; @@ -265,6 +266,38 @@ @SmallTest @Feature({"TextInput", "Main"}) + public void testDeleteSurroundingTextInCodePointsWithRangeSelection() throws Throwable { + final String trophy = "\uD83C\uDFC6"; + commitText("ab" + trophy + "cdef" + trophy + "gh", 1); + waitAndVerifyUpdateSelection(0, 12, 12, -1, -1); + + setSelection(6, 8); + waitAndVerifyUpdateSelection(1, 6, 8, -1, -1); + assertTextsAroundCursor("ab" + trophy + "cd", "ef", trophy + "gh"); + + deleteSurroundingTextInCodePoints(2, 2); + waitAndVerifyUpdateSelection(2, 4, 6, -1, -1); + assertTextsAroundCursor("ab" + trophy, "ef", "h"); + } + + @SmallTest + @Feature({"TextInput", "Main"}) + public void testDeleteSurroundingTextInCodePointsWithCursorSelection() throws Throwable { + final String trophy = "\uD83C\uDFC6"; + commitText("ab" + trophy + "cd" + trophy, 1); + waitAndVerifyUpdateSelection(0, 8, 8, -1, -1); + + setSelection(4, 4); + waitAndVerifyUpdateSelection(1, 4, 4, -1, -1); + assertTextsAroundCursor("ab" + trophy, null, "cd" + trophy); + + deleteSurroundingTextInCodePoints(2, 2); + waitAndVerifyUpdateSelection(2, 1, 1, -1, -1); + assertTextsAroundCursor("a", null, trophy); + } + + @SmallTest + @Feature({"TextInput", "Main"}) public void testSetComposingTextForNewCursorPositions() throws Throwable { // Cursor is on the right of composing text when newCursorPosition > 0. setComposingText("ab", 1); @@ -1382,6 +1415,48 @@ @MediumTest @Feature({"TextInput"}) + public void testContentEditableEvents_DeleteSurroundingTextInCodePoints() throws Throwable { + focusElementAndWaitForStateUpdate("contenteditable_event"); + waitForEventLogs("selectionchange,selectionchange"); + clearEventLogs(); + + commitText("hello", 1); + waitAndVerifyUpdateSelection(0, 5, 5, -1, -1); + waitForEventLogs("keydown(229),input,keyup(229),selectionchange"); + clearEventLogs(); + + setSelection(2, 2); + waitAndVerifyUpdateSelection(1, 2, 2, -1, -1); + waitForEventLogs("selectionchange"); + clearEventLogs(); + + deleteSurroundingTextInCodePoints(1, 1); + waitAndVerifyUpdateSelection(2, 1, 1, -1, -1); + // TODO(yabinh): It should only fire 1 input and 1 selectionchange events. + waitForEventLogs("keydown(229),input,input,keyup(229),selectionchange,selectionchange"); + } + + @MediumTest + @Feature({"TextInput"}) + public void testInputTextEvents_DeleteSurroundingTextInCodePoints() throws Throwable { + commitText("hello", 1); + waitAndVerifyUpdateSelection(0, 5, 5, -1, -1); + waitForEventLogs("keydown(229),input,keyup(229),selectionchange"); + clearEventLogs(); + + setSelection(2, 2); + waitAndVerifyUpdateSelection(1, 2, 2, -1, -1); + waitForEventLogs("selectionchange"); + clearEventLogs(); + + deleteSurroundingTextInCodePoints(1, 1); + waitAndVerifyUpdateSelection(2, 1, 1, -1, -1); + // TODO(yabinh): It should only fire 1 input and 1 selectionchange events. + waitForEventLogs("keydown(229),input,input,keyup(229),selectionchange,selectionchange"); + } + + @MediumTest + @Feature({"TextInput"}) public void testGetCursorCapsMode() throws Throwable { focusElementAndWaitForStateUpdate("contenteditable_event"); commitText("Hello World", 1); @@ -1756,6 +1831,21 @@ }); } + // Note that deleteSurroundingTextInCodePoints() was introduced in Android N (Api level 24), but + // the Android repository used in Chrome is behind that (level 23). So this function can't be + // called by keyboard apps currently. + @TargetApi(24) + private boolean deleteSurroundingTextInCodePoints(final int before, final int after) + throws Exception { + final ThreadedInputConnection connection = (ThreadedInputConnection) mConnection; + return runBlockingOnImeThread(new Callable<Boolean>() { + @Override + public Boolean call() { + return connection.deleteSurroundingTextInCodePoints(before, after); + } + }); + } + private CharSequence getTextBeforeCursor(final int length, final int flags) throws Exception { final ChromiumBaseInputConnection connection = mConnection; return runBlockingOnImeThread(new Callable<CharSequence>() {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 4555fc24..4af9b671 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1533,6 +1533,8 @@ IPC_MESSAGE_HANDLER(InputMsg_ExtendSelectionAndDelete, OnExtendSelectionAndDelete) IPC_MESSAGE_HANDLER(InputMsg_DeleteSurroundingText, OnDeleteSurroundingText) + IPC_MESSAGE_HANDLER(InputMsg_DeleteSurroundingTextInCodePoints, + OnDeleteSurroundingTextInCodePoints) IPC_MESSAGE_HANDLER(InputMsg_SetCompositionFromExistingText, OnSetCompositionFromExistingText) IPC_MESSAGE_HANDLER(InputMsg_SetEditableSelectionOffsets, @@ -2108,6 +2110,12 @@ frame_->deleteSurroundingText(before, after); } +void RenderFrameImpl::OnDeleteSurroundingTextInCodePoints(int before, + int after) { + ImeEventGuard guard(GetRenderWidget()); + frame_->deleteSurroundingTextInCodePoints(before, after); +} + void RenderFrameImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { if (accessibility_mode_ == new_mode) return;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index e80c00d..d1731be2 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -873,6 +873,7 @@ void OnExecuteNoValueEditCommand(const std::string& name); void OnExtendSelectionAndDelete(int before, int after); void OnDeleteSurroundingText(int before, int after); + void OnDeleteSurroundingTextInCodePoints(int before, int after); void OnReload(bool bypass_cache); void OnReloadLoFiImages(); void OnTextSurroundingSelectionRequest(uint32_t max_length);
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 90e361c..38e418b6 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -1670,6 +1670,31 @@ EXPECT_EQ(0, info.selectionEnd); } +TEST_F(RenderViewImplTest, OnDeleteSurroundingTextInCodePoints) { + // Load an HTML page consisting of an input field. + LoadHTML( + // "ab" + trophy + space + "cdef" + trophy + space + "gh". + "<input id=\"test1\" value=\"ab🏆 cdef🏆 gh\">"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); + + frame()->SetEditableSelectionOffsets(4, 4); + frame()->DeleteSurroundingTextInCodePoints(2, 2); + blink::WebInputMethodController* controller = + frame()->GetWebFrame()->inputMethodController(); + blink::WebTextInputInfo info = controller->textInputInfo(); + // "a" + "def" + trophy + space + "gh". + EXPECT_EQ(WebString::fromUTF8("adef\xF0\x9F\x8F\x86 gh"), info.value); + EXPECT_EQ(1, info.selectionStart); + EXPECT_EQ(1, info.selectionEnd); + + frame()->SetEditableSelectionOffsets(1, 3); + frame()->DeleteSurroundingTextInCodePoints(1, 4); + info = controller->textInputInfo(); + EXPECT_EQ("deh", info.value); + EXPECT_EQ(0, info.selectionStart); + EXPECT_EQ(2, info.selectionEnd); +} + // Test that the navigating specific frames works correctly. TEST_F(RenderViewImplTest, NavigateSubframe) { // Load page A.
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index d07808a..4215971 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -31,6 +31,8 @@ sources = [ "../browser/download/mock_download_file.cc", "../browser/download/mock_download_file.h", + "../browser/download/mock_download_item_impl.cc", + "../browser/download/mock_download_item_impl.h", "../browser/download/mock_download_job.cc", "../browser/download/mock_download_job.h", "../browser/media/session/mock_media_session_observer.cc", @@ -1051,6 +1053,7 @@ "../browser/download/download_job_unittest.cc", "../browser/download/download_manager_impl_unittest.cc", "../browser/download/download_request_core_unittest.cc", + "../browser/download/parallel_download_job_unittest.cc", "../browser/download/rate_estimator_unittest.cc", "../browser/download/save_package_unittest.cc", "../browser/fileapi/copy_or_move_file_validator_unittest.cc",
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index 7682e3e..786d5f4 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -56,6 +56,10 @@ OnDeleteSurroundingText(before, after); } +void TestRenderFrame::DeleteSurroundingTextInCodePoints(int before, int after) { + OnDeleteSurroundingTextInCodePoints(before, after); +} + void TestRenderFrame::Unselect() { OnUnselect(); }
diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h index 62ddb2d..9d799268 100644 --- a/content/test/test_render_frame.h +++ b/content/test/test_render_frame.h
@@ -38,6 +38,7 @@ void SetEditableSelectionOffsets(int start, int end); void ExtendSelectionAndDelete(int before, int after); void DeleteSurroundingText(int before, int after); + void DeleteSurroundingTextInCodePoints(int before, int after); void Unselect(); void SetAccessibilityMode(AccessibilityMode new_mode); void SetCompositionFromExistingText(
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc index b4de59f..38367685 100644 --- a/device/gamepad/gamepad_standard_mappings_linux.cc +++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -317,6 +317,38 @@ mapped->axesLength = AXIS_INDEX_COUNT; } +void MapperSamsung_EI_GP20(const blink::WebGamepad& input, + blink::WebGamepad* mapped) { + *mapped = input; + mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; + mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; + mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3]; + mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4]; + mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = NullButton(); + mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = NullButton(); + mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[6]; + mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[7]; + mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10]; + mapped->buttons[BUTTON_INDEX_START] = input.buttons[11]; + mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = NullButton(); + mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = NullButton(); + + mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[5]); + mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[5]); + mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[4]); + mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = + AxisPositiveAsButton(input.axes[4]); + mapped->buttons[BUTTON_INDEX_META] = input.buttons[15]; + + mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0]; + mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1]; + mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[2]; + mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[3]; + + mapped->buttonsLength = BUTTON_INDEX_COUNT; + mapped->axesLength = AXIS_INDEX_COUNT; +} + struct MappingData { const char* const vendor_id; const char* const product_id; @@ -335,6 +367,7 @@ {"046d", "c21d", MapperXInputStyleGamepad}, // Logitech F310 {"046d", "c21e", MapperXInputStyleGamepad}, // Logitech F510 {"046d", "c21f", MapperXInputStyleGamepad}, // Logitech F710 + {"04e8", "a000", MapperSamsung_EI_GP20}, // Samsung Gamepad EI-GP20 {"054c", "0268", MapperPlaystationSixAxis}, // Playstation SIXAXIS {"054c", "05c4", MapperDualshock4}, // Playstation Dualshock 4 {"054c", "09cc", MapperDualshock4}, // Dualshock 4 (PS4 Slim)
diff --git a/extensions/README b/extensions/README deleted file mode 100644 index c994549..0000000 --- a/extensions/README +++ /dev/null
@@ -1,3 +0,0 @@ -This will become a reusable extensions module. It implements the core parts of -Chrome's extension system, and can be used with any host of the 'content' -module.
diff --git a/extensions/README.md b/extensions/README.md new file mode 100644 index 0000000..e17a37d --- /dev/null +++ b/extensions/README.md
@@ -0,0 +1,9 @@ +This will become a reusable extensions module. It implements the core parts of +Chrome's extension system, and can be used with any host of the +[content module](/content/README.md). + +Some extensions code that is not Chrome-specific still lives in +[//chrome/browser/extensions](/chrome/browser/extensions) and will be moved +here. + +See [//extensions/docs](/extensions/docs) for technical documentation.
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index b810232..5788904 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -87,6 +87,19 @@ namespace { +// Describes the action taken by the Web Request API for a given stage of a web +// request. +// These values are written to logs. New enum values can be added, but existing +// enum values must never be renumbered or deleted and reused. +enum RequestAction { + CANCEL = 0, + REDIRECT = 1, + MODIFY_REQUEST_HEADERS = 2, + MODIFY_RESPONSE_HEADERS = 3, + SET_AUTH_CREDENTIALS = 4, + MAX +}; + const char kWebRequestEventPrefix[] = "webRequest."; // List of all the webRequest events. @@ -130,6 +143,12 @@ return "Not reached"; } +void LogRequestAction(RequestAction action) { + DCHECK_NE(RequestAction::MAX, action); + UMA_HISTOGRAM_ENUMERATION("Extensions.WebRequestAction", action, + RequestAction::MAX); +} + bool IsWebRequestEvent(const std::string& event_name) { std::string web_request_event_name(event_name); if (base::StartsWith(web_request_event_name, @@ -1800,6 +1819,8 @@ base::Time::Now() - blocked_request.blocking_time; request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); + bool request_headers_modified = false; + bool response_headers_modified = false; bool credentials_set = false; deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); @@ -1817,17 +1838,15 @@ } else if (blocked_request.event == kOnBeforeSendHeaders) { CHECK(!blocked_request.callback.is_null()); helpers::MergeOnBeforeSendHeadersResponses( - blocked_request.response_deltas, - blocked_request.request_headers, - &warnings, - blocked_request.net_log); + blocked_request.response_deltas, blocked_request.request_headers, + &warnings, blocked_request.net_log, &request_headers_modified); } else if (blocked_request.event == kOnHeadersReceived) { CHECK(!blocked_request.callback.is_null()); helpers::MergeOnHeadersReceivedResponses( blocked_request.request->url(), blocked_request.response_deltas, blocked_request.original_response_headers.get(), blocked_request.override_response_headers, blocked_request.new_url, - &warnings, blocked_request.net_log); + &warnings, blocked_request.net_log, &response_headers_modified); } else if (blocked_request.event == kOnAuthRequired) { CHECK(blocked_request.callback.is_null()); CHECK(!blocked_request.auth_callback.is_null()); @@ -1850,12 +1869,28 @@ browser_context, warnings)); } - if (canceled) { + const bool redirected = + blocked_request.new_url && !blocked_request.new_url->is_empty(); + + if (canceled) request_time_tracker_->SetRequestCanceled(request_id); - } else if (blocked_request.new_url && - !blocked_request.new_url->is_empty()) { + else if (redirected) request_time_tracker_->SetRequestRedirected(request_id); - } + + // Log UMA metrics. Note: We are not necessarily concerned with the final + // action taken. Instead we are interested in how frequently the different + // actions are used by extensions. Hence multiple actions may be logged for a + // single delta execution. + if (canceled) + LogRequestAction(RequestAction::CANCEL); + if (redirected) + LogRequestAction(RequestAction::REDIRECT); + if (request_headers_modified) + LogRequestAction(RequestAction::MODIFY_REQUEST_HEADERS); + if (response_headers_modified) + LogRequestAction(RequestAction::MODIFY_RESPONSE_HEADERS); + if (credentials_set) + LogRequestAction(RequestAction::SET_AUTH_CREDENTIALS); // This triggers onErrorOccurred if canceled is true. int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK;
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.cc b/extensions/browser/api/web_request/web_request_api_helpers.cc index 2acfd65d..4f9e10b 100644 --- a/extensions/browser/api/web_request/web_request_api_helpers.cc +++ b/extensions/browser/api/web_request/web_request_api_helpers.cc
@@ -687,7 +687,11 @@ const EventResponseDeltas& deltas, net::HttpRequestHeaders* request_headers, extensions::WarningSet* conflicting_extensions, - const net::NetLogWithSource* net_log) { + const net::NetLogWithSource* net_log, + bool* request_headers_modified) { + DCHECK(request_headers_modified); + *request_headers_modified = false; + EventResponseDeltas::const_iterator delta; // Here we collect which headers we have removed or set to new values @@ -784,6 +788,7 @@ } net_log->AddEvent(net::NetLogEventType::CHROME_EXTENSION_MODIFIED_HEADERS, base::Bind(&NetLogModificationCallback, delta->get())); + *request_headers_modified = true; } else { conflicting_extensions->insert( extensions::Warning::CreateRequestHeaderConflictWarning( @@ -1051,7 +1056,11 @@ scoped_refptr<net::HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url, extensions::WarningSet* conflicting_extensions, - const net::NetLogWithSource* net_log) { + const net::NetLogWithSource* net_log, + bool* response_headers_modified) { + DCHECK(response_headers_modified); + *response_headers_modified = false; + EventResponseDeltas::const_iterator delta; // Here we collect which headers we have removed or added so far due to @@ -1117,6 +1126,7 @@ } net_log->AddEvent(net::NetLogEventType::CHROME_EXTENSION_MODIFIED_HEADERS, CreateNetLogExtensionIdCallback(delta->get())); + *response_headers_modified = true; } else { conflicting_extensions->insert( extensions::Warning::CreateResponseHeaderConflictWarning(
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.h b/extensions/browser/api/web_request/web_request_api_helpers.h index b1b9e6c..d6da981 100644 --- a/extensions/browser/api/web_request/web_request_api_helpers.h +++ b/extensions/browser/api/web_request/web_request_api_helpers.h
@@ -281,11 +281,14 @@ const net::NetLogWithSource* net_log); // Modifies the headers in |request_headers| according to |deltas|. Conflicts // are tried to be resolved. +// Stores in |request_headers_modified| whether the request headers were +// modified. void MergeOnBeforeSendHeadersResponses( const EventResponseDeltas& deltas, net::HttpRequestHeaders* request_headers, extensions::WarningSet* conflicting_extensions, - const net::NetLogWithSource* net_log); + const net::NetLogWithSource* net_log, + bool* request_headers_modified); // Modifies the "Set-Cookie" headers in |override_response_headers| according to // |deltas.response_cookie_modifications|. If |override_response_headers| is // NULL, a copy of |original_response_headers| is created. Conflicts are @@ -302,6 +305,8 @@ // Extension-initiated redirects are written to |override_response_headers| // (to request redirection) and |*allowed_unsafe_redirect_url| (to make sure // that the request is not cancelled with net::ERR_UNSAFE_REDIRECT). +// Stores in |response_headers_modified| whether the response headers were +// modified. void MergeOnHeadersReceivedResponses( const GURL& url, const EventResponseDeltas& deltas, @@ -309,7 +314,8 @@ scoped_refptr<net::HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url, extensions::WarningSet* conflicting_extensions, - const net::NetLogWithSource* net_log); + const net::NetLogWithSource* net_log, + bool* response_headers_modified); // Merge the responses of blocked onAuthRequired handlers. The first // registered listener that supplies authentication credentials in a response, // if any, will have its authentication credentials used. |request| must be
diff --git a/extensions/docs/extension_and_app_types.md b/extensions/docs/extension_and_app_types.md new file mode 100644 index 0000000..b409a4b --- /dev/null +++ b/extensions/docs/extension_and_app_types.md
@@ -0,0 +1,87 @@ +# Extension and App Types + +Generally, browser extensions cut across websites and web apps, while apps +provide more isolated functionality. + +[TOC] + + + +## Browser extensions + +Browser extensions often provide an interactive toolbar icon, but can also run +without any UI. They may interact with the browser or tab contents, and can +request more extensive permissions than apps. + +## Apps + +### Platform app + +Platform apps (*v2 packaged apps*) are standalone applications that mostly run +independently of the browser. Their windows look and feel like native +applications but simply host the app's pages. + +Most apps, like Calculator and the Files app, create their window(s) and +initialize a UI in response to Chrome's `chrome.app.runtime.onLaunched` event. +Some apps don't show a window but work in the background instead. Platform apps +can connect to more device types than browser extensions have access to. + +Platform apps are deprecated on non-Chrome OS platforms. + +### Packaged app (legacy) + +[Legacy (v1) packaged apps](https://developer.chrome.com/extensions/apps) +combined the appearance of a [hosted app](#Hosted-app) -- a windowed wrapper +around a website -- with the power of extension APIs. With the launch of +platform apps and the app-specific APIs, legacy packaged apps are deprecated. + +### Hosted app + +A [hosted app](https://developer.chrome.com/webstore/hosted_apps) is mostly +metadata: a web URL to launch, a list of associated URLs, and a list of HTML5 +permissions. Chrome ask for these permissions during the app's installation, +allowing the associated URL to bypass the normal Chrome permission prompts for +HTML5 features. + +### Bookmark app + +A bookmark app is a simplified hosted app that Chrome creates on demand. When +the user taps "Add to desktop" (or "Add to shelf" on Chrome OS) in the Chrome +menu, Chrome creates a barebones app whose manifest specifies the current tab's +URL. A shortcut to this URL appears in chrome://apps using the site's favicon. + +Chrome then creates a desktop shortcut that will open a browser window with +flags that specify the app and profile. Activating the icon launches the +"bookmarked" URL in a tab or a window. + +## Manifest + +A particular manifest key in an extension's `manifest.json` file determines what +kind of extension it is: + +* Platform app: `app.background.page` and/or `app.background.scripts` +* Legacy packaged app: `app.launch.local_path` +* Hosted app: `app.launch.web_url` +* Browser extension: none of the above + +## Notes + +`Extension` is the class type for all extensions and apps, so technically +speaking, an app *is-an* `Extension`. The word "extension" usually refers only +to non-app extensions, a.k.a. *browser extensions*. + +## See also + +* [`Manifest::Type` declaration](https://cs.chromium.org/chromium/src/extensions/common/manifest.h?gs=cpp%253Aextensions%253A%253Aclass-Manifest%253A%253Aenum-Type%2540chromium%252F..%252F..%252Fextensions%252Fcommon%252Fmanifest.h%257Cdef&gsn=Type&ct=xref_usages) +* Extensions (3rd-party developer documentation) + * [Extension APIs](https://developer.chrome.com/extensions/api_index) + * [Extension manifest file format]( + https://developer.chrome.com/extensions/manifest) +* Apps (3rd-party developer documentation) + * [Platform app APIs](https://developer.chrome.com/apps/api_index) + * [Platform app manifest file format]( + https://developer.chrome.com/apps/manifest) + * [Choosing an app type](https://developer.chrome.com/webstore/choosing) + * Ancient article introducing the [motivation for apps (outdated)]( + https://developer.chrome.com/webstore/apps_vs_extensions)
diff --git a/extensions/docs/extension_types.png b/extensions/docs/extension_types.png new file mode 100644 index 0000000..5d66c16 --- /dev/null +++ b/extensions/docs/extension_types.png Binary files differ
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc index 37bd2ea..2efc42d 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc +++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
@@ -21,6 +21,7 @@ return kIOSurfaceLockAvoidSync; case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::SCANOUT: + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: return 0; }
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc index 9c2e1bc6..8390d38 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc +++ b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
@@ -98,6 +98,7 @@ case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: return true; case gfx::BufferUsage::SCANOUT: return false;
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h index fb27bb8..af67695c 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h +++ b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
@@ -53,6 +53,7 @@ for (auto format : gfx::GetBufferFormatsForTesting()) { gfx::BufferUsage usages[] = { gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, + gfx::BufferUsage::SCANOUT_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; for (auto usage : usages) {
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc index 64412459..aa3f179 100644 --- a/gpu/ipc/common/gpu_memory_buffer_support.cc +++ b/gpu/ipc/common/gpu_memory_buffer_support.cc
@@ -31,6 +31,7 @@ switch (usage) { case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::SCANOUT: + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: return format == gfx::BufferFormat::BGRA_8888 || format == gfx::BufferFormat::RGBA_8888 || format == gfx::BufferFormat::BGRX_8888;
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc index 860257c..e006083 100644 --- a/gpu/ipc/host/gpu_memory_buffer_support.cc +++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -70,8 +70,9 @@ gfx::BufferFormat::RGBX_8888, gfx::BufferFormat::BGRA_8888, gfx::BufferFormat::BGRX_8888, gfx::BufferFormat::UYVY_422, gfx::BufferFormat::YVU_420, gfx::BufferFormat::YUV_420_BIPLANAR}; - const gfx::BufferUsage kGPUReadWriteUsages[] = {gfx::BufferUsage::GPU_READ, - gfx::BufferUsage::SCANOUT}; + const gfx::BufferUsage kGPUReadWriteUsages[] = { + gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, + gfx::BufferUsage::SCANOUT_CPU_READ_WRITE}; for (auto format : kGPUReadWriteFormats) { for (auto usage : kGPUReadWriteUsages) { if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage))
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h index 0af2d6e8..4d0ed2d 100644 --- a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h +++ b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
@@ -32,6 +32,7 @@ for (auto format : gfx::GetBufferFormatsForTesting()) { gfx::BufferUsage usages[] = { gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, + gfx::BufferUsage::SCANOUT_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; for (auto usage : usages) {
diff --git a/gpu/tools/compositor_model_bench/render_tree.cc b/gpu/tools/compositor_model_bench/render_tree.cc index 752975c28..e98d174 100644 --- a/gpu/tools/compositor_model_bench/render_tree.cc +++ b/gpu/tools/compositor_model_bench/render_tree.cc
@@ -362,7 +362,7 @@ n->add_child(child.release()); } - return n; + return std::move(n); } std::unique_ptr<RenderNode> InterpretCanvasLayer( @@ -381,7 +381,7 @@ if (!InterpretCCData(node, n.get())) return nullptr; - return n; + return std::move(n); } std::unique_ptr<RenderNode> InterpretVideoLayer( @@ -400,7 +400,7 @@ if (!InterpretCCData(node, n.get())) return nullptr; - return n; + return std::move(n); } std::unique_ptr<RenderNode> InterpretImageLayer( @@ -419,7 +419,7 @@ if (!InterpretCCData(node, n.get())) return nullptr; - return n; + return std::move(n); } std::unique_ptr<RenderNode> InterpretNode(const base::DictionaryValue& node) { @@ -472,4 +472,3 @@ return InterpretContentLayer(*root); } -
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm index f669f1bf..2dc15af 100644 --- a/ios/chrome/browser/tabs/tab.mm +++ b/ios/chrome/browser/tabs/tab.mm
@@ -1796,6 +1796,11 @@ [parentTabModel_ notifyTabChanged:self]; } +- (void)webStateDidChangeTitle:(web::WebState*)webState { + [self saveTitleToHistoryDB]; + [parentTabModel_ notifyTabChanged:self]; +} + - (void)webStateDidDismissInterstitial:(web::WebState*)webState { [parentTabModel_ notifyTabChanged:self]; } @@ -1815,12 +1820,6 @@ return YES; } -- (void)webController:(CRWWebController*)webController - titleDidChange:(NSString*)title { - [self saveTitleToHistoryDB]; - [parentTabModel_ notifyTabChanged:self]; -} - - (BOOL)urlTriggersNativeAppLaunch:(const GURL&)url sourceURL:(const GURL&)sourceURL linkClicked:(BOOL)linkClicked {
diff --git a/ios/chrome/browser/tabs/tab_unittest.mm b/ios/chrome/browser/tabs/tab_unittest.mm index 1136415..7594a6980 100644 --- a/ios/chrome/browser/tabs/tab_unittest.mm +++ b/ios/chrome/browser/tabs/tab_unittest.mm
@@ -54,7 +54,6 @@ using web::WebStateImpl; static const char kNewTabUrl[] = "chrome://newtab/"; -static NSString* const kNewTabTitle = @"New Tab"; static const char kGoogleUserUrl[] = "http://google.com"; static const char kGoogleRedirectUrl[] = "http://www.google.fr/"; static NSString* const kGoogleTitle = @"Google"; @@ -247,7 +246,7 @@ base::string16 new_title = base::SysNSStringToUTF16(title); [tab_ navigationManager]->GetLastCommittedItem()->SetTitle(new_title); - [tab_ webController:mock_web_controller_ titleDidChange:title]; + web_state_impl_->OnTitleChanged(); [[[(id)mock_web_controller_ expect] andReturnValue:OCMOCK_VALUE(kPageLoaded)] loadPhase]; web_state_impl_->OnPageLoaded(redirectUrl, true); @@ -267,7 +266,7 @@ [[[(id)mock_web_controller_ expect] andReturnValue:OCMOCK_VALUE(kPageLoaded)] loadPhase]; web_state_impl_->OnPageLoaded(url, true); - [tab_ webController:mock_web_controller_ titleDidChange:kNewTabTitle]; + web_state_impl_->OnTitleChanged(); } void QueryAllHistory(history::QueryResults* results) {
diff --git a/ios/chrome/browser/ui/main/main_view_controller.h b/ios/chrome/browser/ui/main/main_view_controller.h index 92ea289..16174892 100644 --- a/ios/chrome/browser/ui/main/main_view_controller.h +++ b/ios/chrome/browser/ui/main/main_view_controller.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_H_ -#import <UIKit/UIKIt.h> +#import <UIKit/UIKit.h> // A UIViewController that provides a property to maintain a single child view // controller.
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.h b/ios/web/public/test/fakes/crw_test_web_state_observer.h index 5befde4..6d01ab0f 100644 --- a/ios/web/public/test/fakes/crw_test_web_state_observer.h +++ b/ios/web/public/test/fakes/crw_test_web_state_observer.h
@@ -46,6 +46,11 @@ double progress; }; +// Arguments passed to |webStateDidChangeTitle:|. +struct TestTitleWasSetInfo { + WebState* web_state; +}; + // Arguments passed to |webState:didSubmitDocumentWithFormNamed:userInitiated:|. struct TestSubmitDocumentInfo { WebState* web_state; @@ -116,6 +121,8 @@ // Arguments passed to |webState:didChangeLoadingProgress:|. @property(nonatomic, readonly) web::TestChangeLoadingProgressInfo* changeLoadingProgressInfo; +// Arguments passed to |webStateDidChangeTitle:|. +@property(nonatomic, readonly) web::TestTitleWasSetInfo* titleWasSetInfo; // Arguments passed to |webState:didSubmitDocumentWithFormNamed:userInitiated:|. @property(nonatomic, readonly) web::TestSubmitDocumentInfo* submitDocumentInfo; // Arguments passed to
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.mm b/ios/web/public/test/fakes/crw_test_web_state_observer.mm index b7e785c..1d79daf 100644 --- a/ios/web/public/test/fakes/crw_test_web_state_observer.mm +++ b/ios/web/public/test/fakes/crw_test_web_state_observer.mm
@@ -29,6 +29,8 @@ // Arguments passed to |webState:didChangeLoadingProgress:|. std::unique_ptr<web::TestChangeLoadingProgressInfo> _changeLoadingProgressInfo; + // Arguments passed to |webStateDidChangeTitle:|. + std::unique_ptr<web::TestTitleWasSetInfo> _titleWasSetInfo; // Arguments passed to // |webState:didSubmitDocumentWithFormNamed:userInitiated:|. std::unique_ptr<web::TestSubmitDocumentInfo> _submitDocumentInfo; @@ -72,6 +74,10 @@ return _changeLoadingProgressInfo.get(); } +- (web::TestTitleWasSetInfo*)titleWasSetInfo { + return _titleWasSetInfo.get(); +} + - (web::TestSubmitDocumentInfo*)submitDocumentInfo { return _submitDocumentInfo.get(); } @@ -143,6 +149,11 @@ _changeLoadingProgressInfo->progress = progress; } +- (void)webStateDidChangeTitle:(web::WebState*)webState { + _titleWasSetInfo = base::MakeUnique<web::TestTitleWasSetInfo>(); + _titleWasSetInfo->web_state = webState; +} + - (void)webState:(web::WebState*)webState didSubmitDocumentWithFormNamed:(const std::string&)formName userInitiated:(BOOL)userInitiated {
diff --git a/ios/web/public/web_state/ui/crw_web_delegate.h b/ios/web/public/web_state/ui/crw_web_delegate.h index 838af86..04d273a 100644 --- a/ios/web/public/web_state/ui/crw_web_delegate.h +++ b/ios/web/public/web_state/ui/crw_web_delegate.h
@@ -125,10 +125,6 @@ // or nil otherwise. - (id<CRWNativeContent>)controllerForUnhandledContentAtURL:(const GURL&)url; -// Called when the page supplies a new title. -- (void)webController:(CRWWebController*)webController - titleDidChange:(NSString*)title; - // Called when CRWWebController did suppress a dialog (JavaScript, HTTP // authentication or window.open). // NOTE: Called only if CRWWebController.shouldSuppressDialogs is set to YES.
diff --git a/ios/web/public/web_state/web_state_observer.h b/ios/web/public/web_state/web_state_observer.h index ff0a15de..bbf6da5 100644 --- a/ios/web/public/web_state/web_state_observer.h +++ b/ios/web/public/web_state/web_state_observer.h
@@ -85,6 +85,9 @@ // loaded). virtual void LoadProgressChanged(double progress) {} + // Called when the title of the WebState is set. + virtual void TitleWasSet() {} + // Called on form submission. |user_initiated| is true if the user // interacted with the page. virtual void DocumentSubmitted(const std::string& form_name,
diff --git a/ios/web/public/web_state/web_state_observer_bridge.h b/ios/web/public/web_state/web_state_observer_bridge.h index 93614ab..7e51232 100644 --- a/ios/web/public/web_state/web_state_observer_bridge.h +++ b/ios/web/public/web_state/web_state_observer_bridge.h
@@ -39,6 +39,9 @@ - (void)webState:(web::WebState*)webState didChangeLoadingProgress:(double)progress; +// Invoked by WebStateObserverBridge::TitleWasSet. +- (void)webStateDidChangeTitle:(web::WebState*)webState; + // Invoked by WebStateObserverBridge::DocumentSubmitted. - (void)webState:(web::WebState*)webState didSubmitDocumentWithFormNamed:(const std::string&)formName @@ -95,6 +98,7 @@ web::PageLoadCompletionStatus load_completion_status) override; void InterstitialDismissed() override; void LoadProgressChanged(double progress) override; + void TitleWasSet() override; void DocumentSubmitted(const std::string& form_name, bool user_initiated) override; void FormActivityRegistered(const std::string& form_name,
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.h b/ios/web/web_state/ui/crw_context_menu_controller.h index e068caf..9be3c98 100644 --- a/ios/web/web_state/ui/crw_context_menu_controller.h +++ b/ios/web/web_state/ui/crw_context_menu_controller.h
@@ -6,7 +6,7 @@ #define IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_CONTROLLER_H_ #import <Foundation/Foundation.h> -#import <Webkit/Webkit.h> +#import <WebKit/WebKit.h> #import "ios/web/public/block_types.h"
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index a232f4c6..ac37f126 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1019,12 +1019,8 @@ - (void)setDelegate:(id<CRWWebDelegate>)delegate { _delegate.reset(delegate); - if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { - if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) - [self.nativeController setDelegate:self]; - else - [self.nativeController setDelegate:nil]; - } + if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) + [self.nativeController setDelegate:self]; } - (void)dealloc { @@ -1086,8 +1082,7 @@ // NativeControllerDelegate method, called to inform that title has changed. - (void)nativeContent:(id)content titleDidChange:(NSString*)title { - // Responsiveness to delegate method was checked in setDelegate:. - [_delegate webController:self titleDidChange:title]; + _webStateImpl->OnTitleChanged(); } - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled { @@ -1375,10 +1370,7 @@ // other platforms send this (tab sync triggers need to be compared against // upstream). self.navigationManagerImpl->OnNavigationItemChanged(); - - if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { - [_delegate webController:self titleDidChange:title]; - } + _webStateImpl->OnTitleChanged(); } - (BOOL)isCurrentNavigationItemPOST { @@ -1803,15 +1795,12 @@ [self didFinishWithURL:currentURL loadSuccess:loadSuccess]; NSString* title = [self.nativeController title]; - if (title) + if (title) { [self setNavigationItemTitle:title]; + } - // If the controller handles title change notification, route those to the - // delegate. - if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { - if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { - [self.nativeController setDelegate:self]; - } + if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { + [self.nativeController setDelegate:self]; } }
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 3a52ccdc..51541e2 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -10,6 +10,7 @@ #include "base/ios/ios_util.h" #import "base/mac/scoped_nsobject.h" +#include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" #import "ios/testing/ocmock_complex_type_helper.h" #import "ios/web/navigation/crw_session_controller.h" @@ -992,6 +993,41 @@ EXPECT_FALSE([delegate_ initiatedByUser]); }; +// Tests page title changes. +typedef web::WebTestWithWebState CRWWebControllerTitleTest; +TEST_F(CRWWebControllerTitleTest, TitleChange) { + // Observes and waits for TitleWasSet call. + class TitleObserver : public web::WebStateObserver { + public: + explicit TitleObserver(web::WebState* web_state) + : web::WebStateObserver(web_state) {} + // Returns number of times |TitleWasSet| was called. + int title_change_count() { return title_change_count_; } + // WebStateObserver overrides: + void TitleWasSet() override { title_change_count_++; } + + private: + int title_change_count_ = 0; + }; + + TitleObserver observer(web_state()); + ASSERT_EQ(0, observer.title_change_count()); + + // Expect TitleWasSet callback after the page is loaded. + LoadHtml(@"<title>Title1</title>"); + EXPECT_EQ("Title1", base::UTF16ToUTF8(web_state()->GetTitle())); + EXPECT_EQ(1, observer.title_change_count()); + + // Expect at least one more TitleWasSet callback after changing title via + // JavaScript. On iOS 10 WKWebView fires 3 callbacks after JS excucution + // with the following title changes: "Title2", "" and "Title2". + // TODO(crbug.com/696104): There should be only 2 calls of TitleWasSet. + // Fix expecteation when WKWebView stops sending extra KVO calls. + ExecuteJavaScript(@"window.document.title = 'Title2';"); + EXPECT_EQ("Title2", base::UTF16ToUTF8(web_state()->GetTitle())); + EXPECT_GE(observer.title_change_count(), 2); +}; + // Fixture class to test WKWebView crashes. class CRWWebControllerWebProcessTest : public web::WebTestWithWebController { protected:
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h index 5d4f0e8..2123406 100644 --- a/ios/web/web_state/web_state_impl.h +++ b/ios/web/web_state/web_state_impl.h
@@ -88,6 +88,9 @@ // Notifies the observers that navigation to error page did finish. void OnErrorPageNavigation(const GURL& url); + // Called when page title was changed. + void OnTitleChanged(); + // Notifies the observers that the render process was terminated. void OnRenderProcessGone();
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm index 824affd..b386a03b 100644 --- a/ios/web/web_state/web_state_impl.mm +++ b/ios/web/web_state/web_state_impl.mm
@@ -207,6 +207,11 @@ observer.DidFinishNavigation(context.get()); } +void WebStateImpl::OnTitleChanged() { + for (auto& observer : observers_) + observer.TitleWasSet(); +} + void WebStateImpl::OnRenderProcessGone() { for (auto& observer : observers_) observer.RenderProcessGone();
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm index 3aa7097..dfd34691 100644 --- a/ios/web/web_state/web_state_impl_unittest.mm +++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -129,6 +129,7 @@ page_loaded_called_with_success_(false), history_state_changed_called_(false), did_finish_navigation_called_(false), + title_was_set_called_(false), web_state_destroyed_called_(false) {} // Methods returning true if the corresponding WebStateObserver method has @@ -154,6 +155,7 @@ bool did_finish_navigation_called() const { return did_finish_navigation_called_; } + bool title_was_set_called() const { return title_was_set_called_; } bool web_state_destroyed_called() const { return web_state_destroyed_called_; } @@ -180,6 +182,7 @@ page_loaded_called_with_success_ = load_completion_status == PageLoadCompletionStatus::SUCCESS; } + void TitleWasSet() override { title_was_set_called_ = true; } void WebStateDestroyed() override { EXPECT_TRUE(web_state()->IsBeingDestroyed()); web_state_destroyed_called_ = true; @@ -193,6 +196,7 @@ bool page_loaded_called_with_success_; bool history_state_changed_called_; bool did_finish_navigation_called_; + bool title_was_set_called_; bool web_state_destroyed_called_; }; @@ -399,6 +403,11 @@ web_state_->OnErrorPageNavigation(GURL("http://test")); EXPECT_TRUE(observer->did_finish_navigation_called()); + // Test that OnTitleChanged() is called. + EXPECT_FALSE(observer->title_was_set_called()); + web_state_->OnTitleChanged(); + EXPECT_TRUE(observer->title_was_set_called()); + // Test that WebStateDestroyed() is called. EXPECT_FALSE(observer->web_state_destroyed_called()); web_state_.reset();
diff --git a/ios/web/web_state/web_state_observer_bridge.mm b/ios/web/web_state/web_state_observer_bridge.mm index bf22c02c..cd54e6db 100644 --- a/ios/web/web_state/web_state_observer_bridge.mm +++ b/ios/web/web_state/web_state_observer_bridge.mm
@@ -73,6 +73,11 @@ [observer_ webState:web_state() didChangeLoadingProgress:progress]; } +void WebStateObserverBridge::TitleWasSet() { + if ([observer_ respondsToSelector:@selector(webStateDidChangeTitle:)]) + [observer_ webStateDidChangeTitle:web_state()]; +} + void WebStateObserverBridge::DocumentSubmitted(const std::string& form_name, bool user_initiated) { SEL selector =
diff --git a/ios/web/web_state/web_state_observer_bridge_unittest.mm b/ios/web/web_state/web_state_observer_bridge_unittest.mm index 8d626ef..e627675 100644 --- a/ios/web/web_state/web_state_observer_bridge_unittest.mm +++ b/ios/web/web_state/web_state_observer_bridge_unittest.mm
@@ -101,6 +101,15 @@ EXPECT_EQ(kTestLoadProgress, [observer_ changeLoadingProgressInfo]->progress); } +// Tests |webStateDidChangeTitle:| forwarding. +TEST_F(WebStateObserverBridgeTest, TitleWasSet) { + ASSERT_FALSE([observer_ titleWasSetInfo]); + + bridge_->TitleWasSet(); + ASSERT_TRUE([observer_ titleWasSetInfo]); + EXPECT_EQ(&test_web_state_, [observer_ titleWasSetInfo]->web_state); +} + // Tests |webState:didSubmitDocumentWithFormNamed:userInitiated:| forwarding. TEST_F(WebStateObserverBridgeTest, DocumentSubmitted) { ASSERT_FALSE([observer_ submitDocumentInfo]);
diff --git a/media/base/demuxer_perftest.cc b/media/base/demuxer_perftest.cc index 45b44991..b04db50 100644 --- a/media/base/demuxer_perftest.cc +++ b/media/base/demuxer_perftest.cc
@@ -12,6 +12,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" +#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" @@ -48,20 +49,19 @@ DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl); }; -static void QuitLoopWithStatus(base::MessageLoop* message_loop, +static void QuitLoopWithStatus(base::Closure quit_cb, media::PipelineStatus status) { CHECK_EQ(status, media::PIPELINE_OK); - message_loop->task_runner()->PostTask( - FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); + quit_cb.Run(); } static void OnEncryptedMediaInitData(EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data) { - VLOG(0) << "File is encrypted."; + DVLOG(1) << "File is encrypted."; } static void OnMediaTracksUpdated(std::unique_ptr<MediaTracks> tracks) { - VLOG(0) << "Got media tracks info, tracks = " << tracks->tracks().size(); + DVLOG(1) << "Got media tracks info, tracks = " << tracks->tracks().size(); } typedef std::vector<media::DemuxerStream* > Streams; @@ -177,10 +177,10 @@ static void RunDemuxerBenchmark(const std::string& filename) { base::FilePath file_path(GetTestDataFilePath(filename)); - double total_time = 0.0; + base::TimeDelta total_time; for (int i = 0; i < kBenchmarkIterations; ++i) { // Setup. - base::MessageLoop message_loop; + base::test::ScopedTaskScheduler scoped_task_scheduler; DemuxerHostImpl demuxer_host; FileDataSource data_source; ASSERT_TRUE(data_source.Initialize(file_path)); @@ -189,34 +189,32 @@ base::Bind(&OnEncryptedMediaInitData); Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind(&OnMediaTracksUpdated); - FFmpegDemuxer demuxer(message_loop.task_runner(), &data_source, + FFmpegDemuxer demuxer(base::ThreadTaskRunnerHandle::Get(), &data_source, encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog()); - demuxer.Initialize(&demuxer_host, - base::Bind(&QuitLoopWithStatus, &message_loop), - false); - base::RunLoop().Run(); + { + base::RunLoop run_loop; + demuxer.Initialize( + &demuxer_host, + base::Bind(&QuitLoopWithStatus, run_loop.QuitClosure()), false); + run_loop.Run(); + } + StreamReader stream_reader(&demuxer, false); // Benchmark. base::TimeTicks start = base::TimeTicks::Now(); - while (!stream_reader.IsDone()) { + while (!stream_reader.IsDone()) stream_reader.Read(); - } - base::TimeTicks end = base::TimeTicks::Now(); - total_time += (end - start).InSecondsF(); + total_time += base::TimeTicks::Now() - start; demuxer.Stop(); - QuitLoopWithStatus(&message_loop, PIPELINE_OK); - base::RunLoop().Run(); + base::RunLoop().RunUntilIdle(); } - perf_test::PrintResult("demuxer_bench", - "", - filename, - kBenchmarkIterations / total_time, - "runs/s", - true); + perf_test::PrintResult("demuxer_bench", "", filename, + kBenchmarkIterations / total_time.InSecondsF(), + "runs/s", true); } #if defined(OS_WIN)
diff --git a/media/filters/blocking_url_protocol.cc b/media/filters/blocking_url_protocol.cc index 9f8e95e..760e4c4e3 100644 --- a/media/filters/blocking_url_protocol.cc +++ b/media/filters/blocking_url_protocol.cc
@@ -17,6 +17,7 @@ const base::Closure& error_cb) : data_source_(data_source), error_cb_(error_cb), + is_streaming_(data_source_->IsStreaming()), aborted_(base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::InitialState::NOT_SIGNALED), // We never // want to @@ -31,24 +32,32 @@ void BlockingUrlProtocol::Abort() { aborted_.Signal(); + base::AutoLock lock(data_source_lock_); + data_source_ = nullptr; } int BlockingUrlProtocol::Read(int size, uint8_t* data) { - // Read errors are unrecoverable. - if (aborted_.IsSignaled()) - return AVERROR(EIO); + { + // Read errors are unrecoverable. + base::AutoLock lock(data_source_lock_); + if (!data_source_) { + DCHECK(aborted_.IsSignaled()); + return AVERROR(EIO); + } - // Even though FFmpeg defines AVERROR_EOF, it's not to be used with I/O - // routines. Instead return 0 for any read at or past EOF. - int64_t file_size; - if (data_source_->GetSize(&file_size) && read_position_ >= file_size) - return 0; + // Even though FFmpeg defines AVERROR_EOF, it's not to be used with I/O + // routines. Instead return 0 for any read at or past EOF. + int64_t file_size; + if (data_source_->GetSize(&file_size) && read_position_ >= file_size) + return 0; - // Blocking read from data source until either: - // 1) |last_read_bytes_| is set and |read_complete_| is signalled - // 2) |aborted_| is signalled - data_source_->Read(read_position_, size, data, base::Bind( - &BlockingUrlProtocol::SignalReadCompleted, base::Unretained(this))); + // Blocking read from data source until either: + // 1) |last_read_bytes_| is set and |read_complete_| is signalled + // 2) |aborted_| is signalled + data_source_->Read(read_position_, size, data, + base::Bind(&BlockingUrlProtocol::SignalReadCompleted, + base::Unretained(this))); + } base::WaitableEvent* events[] = { &aborted_, &read_complete_ }; size_t index = base::WaitableEvent::WaitMany(events, arraysize(events)); @@ -75,8 +84,10 @@ } bool BlockingUrlProtocol::SetPosition(int64_t position) { + base::AutoLock lock(data_source_lock_); int64_t file_size; - if ((data_source_->GetSize(&file_size) && position > file_size) || + if (!data_source_ || + (data_source_->GetSize(&file_size) && position > file_size) || position < 0) { return false; } @@ -86,11 +97,12 @@ } bool BlockingUrlProtocol::GetSize(int64_t* size_out) { - return data_source_->GetSize(size_out); + base::AutoLock lock(data_source_lock_); + return data_source_ ? data_source_->GetSize(size_out) : 0; } bool BlockingUrlProtocol::IsStreaming() { - return data_source_->IsStreaming(); + return is_streaming_; } void BlockingUrlProtocol::SignalReadCompleted(int size) {
diff --git a/media/filters/blocking_url_protocol.h b/media/filters/blocking_url_protocol.h index 4f9ef4f..7e6a1eb 100644 --- a/media/filters/blocking_url_protocol.h +++ b/media/filters/blocking_url_protocol.h
@@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/macros.h" +#include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "media/filters/ffmpeg_glue.h" @@ -17,19 +18,19 @@ class DataSource; // An implementation of FFmpegURLProtocol that blocks until the underlying -// asynchronous DataSource::Read() operation completes. +// asynchronous DataSource::Read() operation completes. Generally constructed on +// the media thread and used by ffmpeg through the AVIO interface from a +// sequenced blocking pool. class MEDIA_EXPORT BlockingUrlProtocol : public FFmpegURLProtocol { public: // Implements FFmpegURLProtocol using the given |data_source|. |error_cb| is // fired any time DataSource::Read() returns an error. - // - // TODO(scherkus): After all blocking operations are isolated on a separate - // thread we should be able to eliminate |error_cb|. BlockingUrlProtocol(DataSource* data_source, const base::Closure& error_cb); virtual ~BlockingUrlProtocol(); // Aborts any pending reads by returning a read error. After this method - // returns all subsequent calls to Read() will immediately fail. + // returns all subsequent calls to Read() will immediately fail. May be called + // from any thread and upon return ensures no further use of |data_source_|. void Abort(); // FFmpegURLProtocol implementation. @@ -44,8 +45,14 @@ // has completed. void SignalReadCompleted(int size); + // |data_source_lock_| allows Abort() to be called from any thread and stop + // all outstanding access to |data_source_|. Typically Abort() is called from + // the media thread while ffmpeg is operating on another thread. + base::Lock data_source_lock_; DataSource* data_source_; + base::Closure error_cb_; + const bool is_streaming_; // Used to unblock the thread during shutdown and when reads complete. base::WaitableEvent aborted_;
diff --git a/media/filters/blocking_url_protocol_unittest.cc b/media/filters/blocking_url_protocol_unittest.cc index 266f893..dda4000 100644 --- a/media/filters/blocking_url_protocol_unittest.cc +++ b/media/filters/blocking_url_protocol_unittest.cc
@@ -20,9 +20,10 @@ class BlockingUrlProtocolTest : public testing::Test { public: BlockingUrlProtocolTest() - : url_protocol_(&data_source_, - base::Bind(&BlockingUrlProtocolTest::OnDataSourceError, - base::Unretained(this))) { + : url_protocol_(new BlockingUrlProtocol( + &data_source_, + base::Bind(&BlockingUrlProtocolTest::OnDataSourceError, + base::Unretained(this)))) { CHECK(data_source_.Initialize(GetTestDataFilePath("bear-320x240.webm"))); } @@ -33,7 +34,7 @@ MOCK_METHOD0(OnDataSourceError, void()); FileDataSource data_source_; - BlockingUrlProtocol url_protocol_; + std::unique_ptr<BlockingUrlProtocol> url_protocol_; private: DISALLOW_COPY_AND_ASSIGN(BlockingUrlProtocolTest); @@ -43,35 +44,35 @@ TEST_F(BlockingUrlProtocolTest, Read) { // Set read head to zero as Initialize() will have parsed a bit of the file. int64_t position = 0; - EXPECT_TRUE(url_protocol_.SetPosition(0)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_TRUE(url_protocol_->SetPosition(0)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(0, position); // Read 32 bytes from offset zero and verify position. uint8_t buffer[32]; - EXPECT_EQ(32, url_protocol_.Read(32, buffer)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_EQ(32, url_protocol_->Read(32, buffer)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(32, position); // Read an additional 32 bytes and verify position. - EXPECT_EQ(32, url_protocol_.Read(32, buffer)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_EQ(32, url_protocol_->Read(32, buffer)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(64, position); // Seek to end and read until EOF. int64_t size = 0; - EXPECT_TRUE(url_protocol_.GetSize(&size)); - EXPECT_TRUE(url_protocol_.SetPosition(size - 48)); - EXPECT_EQ(32, url_protocol_.Read(32, buffer)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_TRUE(url_protocol_->GetSize(&size)); + EXPECT_TRUE(url_protocol_->SetPosition(size - 48)); + EXPECT_EQ(32, url_protocol_->Read(32, buffer)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(size - 16, position); - EXPECT_EQ(16, url_protocol_.Read(32, buffer)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_EQ(16, url_protocol_->Read(32, buffer)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(size, position); - EXPECT_EQ(0, url_protocol_.Read(32, buffer)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_EQ(0, url_protocol_->Read(32, buffer)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(size, position); } @@ -80,23 +81,23 @@ uint8_t buffer[32]; EXPECT_CALL(*this, OnDataSourceError()); - EXPECT_EQ(AVERROR(EIO), url_protocol_.Read(32, buffer)); + EXPECT_EQ(AVERROR(EIO), url_protocol_->Read(32, buffer)); } TEST_F(BlockingUrlProtocolTest, GetSetPosition) { int64_t size; int64_t position; - EXPECT_TRUE(url_protocol_.GetSize(&size)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_TRUE(url_protocol_->GetSize(&size)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); - EXPECT_TRUE(url_protocol_.SetPosition(512)); - EXPECT_FALSE(url_protocol_.SetPosition(size + 1)); - EXPECT_FALSE(url_protocol_.SetPosition(-1)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_TRUE(url_protocol_->SetPosition(512)); + EXPECT_FALSE(url_protocol_->SetPosition(size + 1)); + EXPECT_FALSE(url_protocol_->SetPosition(-1)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(512, position); - EXPECT_TRUE(url_protocol_.SetPosition(size)); - EXPECT_TRUE(url_protocol_.GetPosition(&position)); + EXPECT_TRUE(url_protocol_->SetPosition(size)); + EXPECT_TRUE(url_protocol_->GetPosition(&position)); EXPECT_EQ(size, position); } @@ -104,18 +105,21 @@ int64_t data_source_size = 0; int64_t url_protocol_size = 0; EXPECT_TRUE(data_source_.GetSize(&data_source_size)); - EXPECT_TRUE(url_protocol_.GetSize(&url_protocol_size)); + EXPECT_TRUE(url_protocol_->GetSize(&url_protocol_size)); EXPECT_NE(0, data_source_size); EXPECT_EQ(data_source_size, url_protocol_size); } TEST_F(BlockingUrlProtocolTest, IsStreaming) { EXPECT_FALSE(data_source_.IsStreaming()); - EXPECT_FALSE(url_protocol_.IsStreaming()); + EXPECT_FALSE(url_protocol_->IsStreaming()); data_source_.force_streaming_for_testing(); + url_protocol_.reset(new BlockingUrlProtocol( + &data_source_, base::Bind(&BlockingUrlProtocolTest::OnDataSourceError, + base::Unretained(this)))); EXPECT_TRUE(data_source_.IsStreaming()); - EXPECT_TRUE(url_protocol_.IsStreaming()); + EXPECT_TRUE(url_protocol_->IsStreaming()); } } // namespace media
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index f7747e6..7919a2e 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc
@@ -22,6 +22,8 @@ #include "base/strings/stringprintf.h" #include "base/sys_byteorder.h" #include "base/task_runner_util.h" +#include "base/task_scheduler/post_task.h" +#include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "media/audio/sample_rates.h" @@ -845,7 +847,13 @@ const scoped_refptr<MediaLog>& media_log) : host_(NULL), task_runner_(task_runner), - blocking_thread_("FFmpegDemuxer"), + // FFmpeg has no asynchronous API, so we use base::WaitableEvents inside + // the BlockingUrlProtocol to handle hops to the render thread for network + // reads and seeks. + blocking_task_runner_(base::CreateSequencedTaskRunnerWithTraits( + base::TaskTraits().MayBlock().WithBaseSyncPrimitives().WithPriority( + base::TaskPriority::USER_BLOCKING))), + stopped_(false), pending_read_(false), data_source_(data_source), media_log_(media_log), @@ -866,6 +874,12 @@ // NOTE: This class is not destroyed on |task_runner|, so we must ensure that // there are no outstanding WeakPtrs by the time we reach here. DCHECK(!weak_factory_.HasWeakPtrs()); + + // There may be outstanding tasks in the blocking pool which are trying to use + // these members, so release them in sequence with any outstanding calls. The + // earlier call to Abort() on |data_source_| prevents further access to it. + blocking_task_runner_->DeleteSoon(FROM_HERE, url_protocol_.release()); + blocking_task_runner_->DeleteSoon(FROM_HERE, glue_.release()); } std::string FFmpegDemuxer::GetDisplayName() const { @@ -899,9 +913,8 @@ format_context->max_analyze_duration = 60 * AV_TIME_BASE; // Open the AVFormatContext using our glue layer. - CHECK(blocking_thread_.Start()); base::PostTaskAndReplyWithResult( - blocking_thread_.task_runner().get(), FROM_HERE, + blocking_task_runner_.get(), FROM_HERE, base::Bind(&FFmpegGlue::OpenContext, base::Unretained(glue_.get())), base::Bind(&FFmpegDemuxer::OnOpenContextDone, weak_factory_.GetWeakPtr(), status_cb)); @@ -911,7 +924,7 @@ DCHECK(task_runner_->BelongsToCurrentThread()); // If Stop() has been called, then drop this call. - if (!blocking_thread_.IsRunning()) + if (stopped_) return; // This should only be called after the demuxer has been initialized. @@ -929,7 +942,7 @@ data_source_->Abort(); // Aborting the read may cause EOF to be marked, undo this. - blocking_thread_.task_runner()->PostTask( + blocking_task_runner_->PostTask( FROM_HERE, base::Bind(&UnmarkEndOfStream, glue_->format_context())); pending_read_ = false; @@ -949,12 +962,6 @@ data_source_->Stop(); url_protocol_->Abort(); - // This will block until all tasks complete. Note that after this returns it's - // possible for reply tasks (e.g., OnReadFrameDone()) to be queued on this - // thread. Each of the reply task methods must check whether we've stopped the - // thread and drop their results on the floor. - blocking_thread_.Stop(); - for (const auto& stream : streams_) { if (stream) stream->Stop(); @@ -963,7 +970,9 @@ data_source_ = NULL; // Invalidate WeakPtrs on |task_runner_|, destruction may happen on another - // thread. + // thread. We don't need to wait for any outstanding tasks since they will all + // fail to return after invalidating WeakPtrs. + stopped_ = true; weak_factory_.InvalidateWeakPtrs(); cancel_pending_seek_factory_.InvalidateWeakPtrs(); } @@ -1022,7 +1031,7 @@ pending_seek_cb_ = cb; base::PostTaskAndReplyWithResult( - blocking_thread_.task_runner().get(), FROM_HERE, + blocking_task_runner_.get(), FROM_HERE, base::Bind(&av_seek_frame, glue_->format_context(), seeking_stream->index, ConvertToTimeBase(seeking_stream->time_base, seek_time), // Always seek to a timestamp <= to the desired timestamp. @@ -1159,7 +1168,7 @@ void FFmpegDemuxer::OnOpenContextDone(const PipelineStatusCB& status_cb, bool result) { DCHECK(task_runner_->BelongsToCurrentThread()); - if (!blocking_thread_.IsRunning()) { + if (stopped_) { MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state"; status_cb.Run(PIPELINE_ERROR_ABORT); return; @@ -1173,20 +1182,17 @@ // Fully initialize AVFormatContext by parsing the stream a little. base::PostTaskAndReplyWithResult( - blocking_thread_.task_runner().get(), - FROM_HERE, - base::Bind(&avformat_find_stream_info, - glue_->format_context(), + blocking_task_runner_.get(), FROM_HERE, + base::Bind(&avformat_find_stream_info, glue_->format_context(), static_cast<AVDictionary**>(NULL)), base::Bind(&FFmpegDemuxer::OnFindStreamInfoDone, - weak_factory_.GetWeakPtr(), - status_cb)); + weak_factory_.GetWeakPtr(), status_cb)); } void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb, int result) { DCHECK(task_runner_->BelongsToCurrentThread()); - if (!blocking_thread_.IsRunning() || !data_source_) { + if (stopped_ || !data_source_) { MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state"; status_cb.Run(PIPELINE_ERROR_ABORT); return; @@ -1606,7 +1612,7 @@ DCHECK(task_runner_->BelongsToCurrentThread()); CHECK(!pending_seek_cb_.is_null()); - if (!blocking_thread_.IsRunning()) { + if (stopped_) { MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state"; base::ResetAndReturn(&pending_seek_cb_).Run(PIPELINE_ERROR_ABORT); return; @@ -1692,8 +1698,8 @@ DCHECK(task_runner_->BelongsToCurrentThread()); // Make sure we have work to do before reading. - if (!blocking_thread_.IsRunning() || !StreamsHaveAvailableCapacity() || - pending_read_ || !pending_seek_cb_.is_null()) { + if (stopped_ || !StreamsHaveAvailableCapacity() || pending_read_ || + !pending_seek_cb_.is_null()) { return; } @@ -1705,11 +1711,9 @@ pending_read_ = true; base::PostTaskAndReplyWithResult( - blocking_thread_.task_runner().get(), - FROM_HERE, + blocking_task_runner_.get(), FROM_HERE, base::Bind(&av_read_frame, glue_->format_context(), packet_ptr), - base::Bind(&FFmpegDemuxer::OnReadFrameDone, - weak_factory_.GetWeakPtr(), + base::Bind(&FFmpegDemuxer::OnReadFrameDone, weak_factory_.GetWeakPtr(), base::Passed(&packet))); } @@ -1718,7 +1722,7 @@ DCHECK(pending_read_); pending_read_ = false; - if (!blocking_thread_.IsRunning() || !pending_seek_cb_.is_null()) + if (stopped_ || !pending_seek_cb_.is_null()) return; // Consider the stream as ended if:
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index a5b15bc6..4c06c4c 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h
@@ -32,7 +32,9 @@ #include "base/callback.h" #include "base/macros.h" -#include "base/threading/thread.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" +#include "base/single_thread_task_runner.h" #include "media/base/audio_decoder_config.h" #include "media/base/decoder_buffer.h" #include "media/base/decoder_buffer_queue.h" @@ -295,8 +297,12 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - // Thread on which all blocking FFmpeg operations are executed. - base::Thread blocking_thread_; + // Task runner on which all blocking FFmpeg operations are executed; retrieved + // from base::TaskScheduler. + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; + + // Indicates if Stop() has been called. + bool stopped_; // Tracks if there's an outstanding av_read_frame() operation. //
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index 92766f1..d0a7d1a2 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc
@@ -18,6 +18,7 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/test/mock_callback.h" +#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "media/base/decrypt_config.h" @@ -85,6 +86,8 @@ virtual ~FFmpegDemuxerTest() { if (demuxer_) demuxer_->Stop(); + demuxer_.reset(); + base::RunLoop().RunUntilIdle(); } void CreateDemuxer(const std::string& name) { @@ -101,7 +104,7 @@ &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this)); demuxer_.reset(new FFmpegDemuxer( - message_loop_.task_runner(), data_source_.get(), + base::ThreadTaskRunnerHandle::Get(), data_source_.get(), encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog())); } @@ -188,9 +191,8 @@ buffer->discard_padding().first); EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame()); } - DCHECK_EQ(&message_loop_, base::MessageLoop::current()); OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us); - message_loop_.task_runner()->PostTask( + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); } @@ -239,11 +241,12 @@ } // Fixture members. + + base::test::ScopedTaskScheduler task_scheduler_; std::unique_ptr<FileDataSource> data_source_; std::unique_ptr<FFmpegDemuxer> demuxer_; StrictMock<MockDemuxerHost> host_; std::unique_ptr<MediaTracks> media_tracks_; - base::MessageLoop message_loop_; AVFormatContext* format_context() { return demuxer_->glue_->format_context();
diff --git a/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc index 558367e7..9e500dc 100644 --- a/media/formats/mp4/box_definitions.cc +++ b/media/formats/mp4/box_definitions.cc
@@ -1068,7 +1068,10 @@ // the wild don't set it. // // RCHECK((flags & 0x020000) && !(flags & 0x1)); - RCHECK(!(reader->flags() & 0x1)); + RCHECK_MEDIA_LOGGED(!(reader->flags() & 0x1), reader->media_log(), + "TFHD base-data-offset not allowed by MSE. See " + "https://www.w3.org/TR/mse-byte-stream-format-isobmff/" + "#movie-fragment-relative-addressing"); if (reader->flags() & 0x2) { RCHECK(reader->Read4(&sample_description_index));
diff --git a/media/test/BUILD.gn b/media/test/BUILD.gn index 595da4c..1d426da 100644 --- a/media/test/BUILD.gn +++ b/media/test/BUILD.gn
@@ -39,6 +39,7 @@ deps = [ "//base", + "//base/test:test_support", "//media:test_support", "//media/audio:test_support", "//media/base:test_support",
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc index 15e6e868..da174a1 100644 --- a/media/test/pipeline_integration_test.cc +++ b/media/test/pipeline_integration_test.cc
@@ -1723,16 +1723,12 @@ EXPECT_HASH_EQ(config.hash, GetAudioHash()); } -// TODO(CHCUNNINGHAM): Re-enable for OSX once 1% flakiness is root caused. -// See http://crbug.com/571898 -#if !defined(OS_MACOSX) // CBR seeks should always be fast and accurate. INSTANTIATE_TEST_CASE_P( CBRSeek_HasTOC, Mp3FastSeekIntegrationTest, ::testing::Values(Mp3FastSeekParams("bear-audio-10s-CBR-has-TOC.mp3", - "-0.71,0.36,2.96,2.68,2.10,-1.08,"))); -#endif + "-0.71,0.36,2.96,2.68,2.11,-1.08,"))); INSTANTIATE_TEST_CASE_P( CBRSeeks_NoTOC,
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc index 6115e472..3902b1f2 100644 --- a/media/test/pipeline_integration_test_base.cc +++ b/media/test/pipeline_integration_test_base.cc
@@ -59,6 +59,7 @@ if (pipeline_->IsRunning()) Stop(); + demuxer_.reset(); pipeline_.reset(); base::RunLoop().RunUntilIdle(); } @@ -310,6 +311,7 @@ data_source_ = std::move(data_source); #if !defined(MEDIA_DISABLE_FFMPEG) + task_scheduler_.reset(new base::test::ScopedTaskScheduler(&message_loop_)); demuxer_ = std::unique_ptr<Demuxer>(new FFmpegDemuxer( message_loop_.task_runner(), data_source_.get(), base::Bind(&PipelineIntegrationTestBase::DemuxerEncryptedMediaInitDataCB,
diff --git a/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h index 192d6f8..580e963c 100644 --- a/media/test/pipeline_integration_test_base.h +++ b/media/test/pipeline_integration_test_base.h
@@ -11,6 +11,7 @@ #include "base/md5.h" #include "base/memory/scoped_vector.h" #include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_scheduler.h" #include "media/audio/clockless_audio_sink.h" #include "media/audio/null_audio_sink.h" #include "media/base/demuxer.h" @@ -133,6 +134,9 @@ base::MD5Context md5_context_; bool hashing_enabled_; bool clockless_playback_; + + // TaskScheduler is used only for FFmpegDemuxer. + std::unique_ptr<base::test::ScopedTaskScheduler> task_scheduler_; std::unique_ptr<Demuxer> demuxer_; std::unique_ptr<DataSource> data_source_; std::unique_ptr<PipelineImpl> pipeline_;
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc index 14aa891..98f6882 100644 --- a/net/cert/nss_cert_database.cc +++ b/net/cert/nss_cert_database.cc
@@ -18,7 +18,9 @@ #include "base/logging.h" #include "base/macros.h" #include "base/observer_list_threadsafe.h" -#include "base/task_scheduler/post_task.h" +#include "base/task_runner.h" +#include "base/task_runner_util.h" +#include "base/threading/worker_pool.h" #include "crypto/scoped_nss_types.h" #include "net/base/crypto_module.h" #include "net/base/net_errors.h" @@ -100,14 +102,10 @@ // base::Passed will NULL out |certs|, so cache the underlying pointer here. CertificateList* raw_certs = certs.get(); - base::PostTaskWithTraitsAndReply( - FROM_HERE, base::TaskTraits() - .WithShutdownBehavior( - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) - .MayBlock(), - base::Bind(&NSSCertDatabase::ListCertsImpl, - base::Passed(crypto::ScopedPK11Slot()), - base::Unretained(raw_certs)), + GetSlowTaskRunner()->PostTaskAndReply( + FROM_HERE, base::Bind(&NSSCertDatabase::ListCertsImpl, + base::Passed(crypto::ScopedPK11Slot()), + base::Unretained(raw_certs)), base::Bind(callback, base::Passed(&certs))); } @@ -118,11 +116,8 @@ // base::Passed will NULL out |certs|, so cache the underlying pointer here. CertificateList* raw_certs = certs.get(); - base::PostTaskWithTraitsAndReply( - FROM_HERE, base::TaskTraits() - .WithShutdownBehavior( - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) - .MayBlock(), + GetSlowTaskRunner()->PostTaskAndReply( + FROM_HERE, base::Bind(&NSSCertDatabase::ListCertsImpl, base::Passed(crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot))), base::Unretained(raw_certs)), @@ -381,11 +376,8 @@ void NSSCertDatabase::DeleteCertAndKeyAsync( const scoped_refptr<X509Certificate>& cert, const DeleteCertCallback& callback) { - base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, base::TaskTraits() - .WithShutdownBehavior( - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) - .MayBlock(), + base::PostTaskAndReplyWithResult( + GetSlowTaskRunner().get(), FROM_HERE, base::Bind(&NSSCertDatabase::DeleteCertAndKeyImpl, cert), base::Bind(&NSSCertDatabase::NotifyCertRemovalAndCallBack, weak_factory_.GetWeakPtr(), callback)); @@ -409,6 +401,11 @@ observer_list_->RemoveObserver(observer); } +void NSSCertDatabase::SetSlowTaskRunnerForTest( + const scoped_refptr<base::TaskRunner>& task_runner) { + slow_task_runner_for_test_ = task_runner; +} + // static void NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot slot, CertificateList* certs) { @@ -429,6 +426,12 @@ CERT_DestroyCertList(cert_list); } +scoped_refptr<base::TaskRunner> NSSCertDatabase::GetSlowTaskRunner() const { + if (slow_task_runner_for_test_.get()) + return slow_task_runner_for_test_; + return base::WorkerPool::GetTaskRunner(true /*task is slow*/); +} + void NSSCertDatabase::NotifyCertRemovalAndCallBack( const DeleteCertCallback& callback, bool success) {
diff --git a/net/cert/nss_cert_database.h b/net/cert/nss_cert_database.h index d096f18..a9f5c8ac 100644 --- a/net/cert/nss_cert_database.h +++ b/net/cert/nss_cert_database.h
@@ -25,6 +25,7 @@ namespace base { template <class ObserverType> class ObserverListThreadSafe; +class TaskRunner; } namespace net { @@ -235,6 +236,10 @@ // Check whether cert is stored in a hardware slot. bool IsHardwareBacked(const X509Certificate* cert) const; + // Overrides task runner that's used for running slow tasks. + void SetSlowTaskRunnerForTest( + const scoped_refptr<base::TaskRunner>& task_runner); + protected: // Certificate listing implementation used by |ListCerts*| and // |ListCertsSync|. Static so it may safely be used on the worker thread. @@ -243,6 +248,11 @@ static void ListCertsImpl(crypto::ScopedPK11Slot slot, CertificateList* certs); + // Gets task runner that should be used for slow tasks like certificate + // listing. Defaults to a base::WorkerPool runner, but may be overriden + // in tests (see SetSlowTaskRunnerForTest). + scoped_refptr<base::TaskRunner> GetSlowTaskRunner() const; + protected: // Broadcasts notifications to all registered observers. void NotifyObserversCertDBChanged(); @@ -275,6 +285,9 @@ // A helper observer that forwards events from this database to CertDatabase. std::unique_ptr<Observer> cert_notification_forwarder_; + // Task runner that should be used in tests if set. + scoped_refptr<base::TaskRunner> slow_task_runner_for_test_; + const scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_; base::WeakPtrFactory<NSSCertDatabase> weak_factory_;
diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc index e3a7dfd..d3bb89c 100644 --- a/net/cert/nss_cert_database_chromeos.cc +++ b/net/cert/nss_cert_database_chromeos.cc
@@ -14,7 +14,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/location.h" -#include "base/task_scheduler/post_task.h" +#include "base/task_runner.h" #include "net/base/crypto_module.h" #include "net/cert/x509_certificate.h" @@ -49,13 +49,9 @@ // base::Pased will NULL out |certs|, so cache the underlying pointer here. CertificateList* raw_certs = certs.get(); - base::PostTaskWithTraitsAndReply( - FROM_HERE, base::TaskTraits() - .WithShutdownBehavior( - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) - .MayBlock(), - base::Bind(&NSSCertDatabaseChromeOS::ListCertsImpl, profile_filter_, - base::Unretained(raw_certs)), + GetSlowTaskRunner()->PostTaskAndReply( + FROM_HERE, base::Bind(&NSSCertDatabaseChromeOS::ListCertsImpl, + profile_filter_, base::Unretained(raw_certs)), base::Bind(callback, base::Passed(&certs))); }
diff --git a/net/cert/nss_cert_database_chromeos_unittest.cc b/net/cert/nss_cert_database_chromeos_unittest.cc index e5e3606..89b5c23 100644 --- a/net/cert/nss_cert_database_chromeos_unittest.cc +++ b/net/cert/nss_cert_database_chromeos_unittest.cc
@@ -8,9 +8,7 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" -#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread_task_runner_handle.h" #include "crypto/nss_util_internal.h" #include "crypto/scoped_test_nss_chromeos_user.h" @@ -50,8 +48,7 @@ public CertDatabase::Observer { public: NSSCertDatabaseChromeOSTest() - : scoped_task_scheduler_(base::MessageLoop::current()), - observer_added_(false), + : observer_added_(false), db_changed_count_(0), user_1_("user1"), user_2_("user2") {} @@ -69,6 +66,7 @@ crypto::GetPrivateSlotForChromeOSUser( user_1_.username_hash(), base::Callback<void(crypto::ScopedPK11Slot)>()))); + db_1_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get()); db_1_->SetSystemSlot( crypto::ScopedPK11Slot(PK11_ReferenceSlot(system_db_.slot()))); db_2_.reset(new NSSCertDatabaseChromeOS( @@ -76,6 +74,7 @@ crypto::GetPrivateSlotForChromeOSUser( user_2_.username_hash(), base::Callback<void(crypto::ScopedPK11Slot)>()))); + db_2_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get()); // Add observer to CertDatabase for checking that notifications from // NSSCertDatabaseChromeOS are proxied to the CertDatabase. @@ -92,8 +91,6 @@ void OnCertDBChanged() override { db_changed_count_++; } protected: - base::test::ScopedTaskScheduler scoped_task_scheduler_; - bool observer_added_; int db_changed_count_;
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc index 0d99c8a..235ea44c 100644 --- a/net/cert/nss_cert_database_unittest.cc +++ b/net/cert/nss_cert_database_unittest.cc
@@ -15,12 +15,10 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/lazy_instance.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_task_scheduler.h" #include "base/threading/thread_task_runner_handle.h" #include "crypto/scoped_nss_types.h" #include "crypto/scoped_test_nss_db.h" @@ -63,9 +61,6 @@ class CertDatabaseNSSTest : public testing::Test { public: - CertDatabaseNSSTest() - : scoped_task_scheduler_(base::MessageLoop::current()) {} - void SetUp() override { ASSERT_TRUE(test_nssdb_.is_open()); cert_db_.reset(new NSSCertDatabase( @@ -130,7 +125,6 @@ return result; } - base::test::ScopedTaskScheduler scoped_task_scheduler_; std::unique_ptr<NSSCertDatabase> cert_db_; const CertificateList empty_cert_list_; crypto::ScopedTestNSSDB test_nssdb_; @@ -151,6 +145,7 @@ // This test isn't terribly useful, though it will at least let valgrind test // for leaks. CertificateList certs; + cert_db_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get()); cert_db_->ListCerts(base::Bind(&SwapCertList, base::Unretained(&certs))); EXPECT_EQ(0U, certs.size());
diff --git a/net/cert/x509_util_openssl.cc b/net/cert/x509_util_openssl.cc index d36fd5e4..4a58262 100644 --- a/net/cert/x509_util_openssl.cc +++ b/net/cert/x509_util_openssl.cc
@@ -285,9 +285,16 @@ } // Returns true if |der_cache| points to valid data, false otherwise. -// (note: the DER-encoded data in |der_cache| is owned by |cert|, callers should +// (note: the DER-encoded data in |der_cache| is owned by |x509|, callers should // not free it). bool GetDER(X509* x509, base::StringPiece* der_cache) { + if (x509->buf) { + *der_cache = base::StringPiece( + reinterpret_cast<const char*>(CRYPTO_BUFFER_data(x509->buf)), + CRYPTO_BUFFER_len(x509->buf)); + return true; + } + int x509_der_cache_index = g_der_cache_singleton.Get().der_cache_ex_index();
diff --git a/net/data/ssl/wosign/wosign_domains.gperf b/net/data/ssl/wosign/wosign_domains.gperf index 88b2ee3..a57719b3 100644 --- a/net/data/ssl/wosign/wosign_domains.gperf +++ b/net/data/ssl/wosign/wosign_domains.gperf
@@ -6,34 +6,22 @@ // This file contains the set of domains that were issued certificates by // WoSign and StartCom-branded CAs and were logged before // 2016-10-21 00:00:00 UTC. This list only contains those domains whose -// certificates were not revoked as of 2016-12-31 and which appear within -// the Alexa Top 1M dataset as of 2016-12-28. +// certificates were not revoked as of 2017-02-27 and which appear within +// the top 500,000 entries of the Alexa Top 1M dataset as of 2016-12-28. %} %% 005.tv, 0 010100100000.com, 0 0101shop.com, 0 01788.net, 0 -01game.com, 0 -01teacher.com, 0 020leader.com, 0 -02cq.com, 0 -0318ol.com, 0 -0513c.com, 0 -0514soft.com, 0 05506.com, 0 -0577hr.com, 0 05.ru, 0 06681.com, 0 0678life.com, 0 07073.com, 0 -0762jr.com, 0 07zr.com, 0 -0800net.com.br, 0 -0951job.com, 0 -098.pl, 0 0fees.us, 0 -0web.ir, 0 10000.com, 0 10000link.com, 0 1000bankov.ru, 0 @@ -43,90 +31,48 @@ 1000ukg.kz, 0 10010.org, 0 10044.cn, 0 -100500miles.ru, 0 10086.cn, 0 1008.cn, 0 100bt.com, 0 -100e.com, 0 -100hub.com, 0 100-k-1.ru, 0 -100k.net.ua, 0 -100kuskov.ru, 0 100megabit.ru, 0 100msh.com, 0 -100steps.net, 0 100vkusov.ru, 0 100xuexi.com, 0 10101111.com, 0 -10155.com, 0 101.com, 0 -101hr.com, 0 -101ka.com, 0 101sauna.ru, 0 -101widgets.com, 0 -10333.com, 0 10brandchina.com, 0 10gigabit.net, 0 10to8.com, 0 110.com, 0 -110disk.net, 0 11185.cn, 0 -111.com.cn, 0 11315.com, 0 115.com, 0 -117o.com, 0 1-1ads.com, 0 -1-1.su, 0 11x11.ru, 0 -120na80.cz, 0 -120x.net, 0 121mai.com, 0 -12301.cn, 0 -123aprende.com, 0 123.com.cn, 0 -123hjemmeside.dk, 0 -123mov.net, 0 124zhe.com, 0 12580.tv, 0 -12582.cn, 0 125.la, 0 126.net, 0 -12seemeilen.de, 0 -1300acepro.com, 0 -133448.com, 0 -135qp.com, 0 1360.com, 0 139site.com, 0 1406.kz, 0 -15166.com, 0 -155175.com, 0 161.ru, 0 -1633.com, 0 -16889999.com, 0 -16hour.com, 0 16mb.com, 0 17500.cn, 0 178448.com, 0 -1791diamonds.com, 0 17bdc.com, 0 -17doubao.com, 0 17heli.com, 0 17house.com, 0 -17huo.com, 0 17k.com, 0 -17must.com, 0 -17sportweb.com, 0 17yigo.com, 0 -17zuoye.net, 0 -18183.com, 0 -185sy.com, 0 189.cn, 0 189cube.com, 0 -189go.cn, 0 -18zf.com, 0 1905.com, 0 190.com, 0 -1919.cn, 0 1919hdtv.com, 0 1927.kiev.ua, 0 197top.com, 0 @@ -136,218 +82,130 @@ 1blu.de, 0 1byone.com, 0 1byone.co.uk, 0 -1byone.de, 0 1byone.jp, 0 1cbit.ru, 0 -1chotel.ru, 0 1conan.com, 0 1dxr.com, 0 -1game.ua, 0 1gb.ua, 0 1hai.cn, 0 -1huwai.com, 0 1jbest.com, 0 -1ka.cn, 0 1kejian.com, 0 1kxun.mobi, 0 -1more.com, 0 1-page.com, 0 -1pkk.ru, 0 -1platforma.ru, 0 -1plus1.net, 0 1plus1.ua, 0 1popov.ru, 0 1prime.ru, 0 1proxy.de, 0 1september.ru, 0 -1st-attractive.com, 0 -1stwebdesigns.com, 0 1tempurl.com, 0 -1track.ru, 0 1tv.co.ua, 0 1tvcrimea.ru, 0 -1v2d.com, 0 2016bec.ro, 0 -2016.life, 0 -2100d.com, 0 -2114.com, 0 -212webhost.com, 0 2144.cn, 0 21cn.com, 0 21.co.uk, 0 21food.cn, 0 21jrr.com, 0 -21mmo.com, 0 21vbluecloud.com, 0 21vianet.com, 0 -21yunwei.com, 0 -22v.net, 0 22web.org, 0 230km.ru, 0 -2330.tw, 0 23356.com, 0 233.com, 0 2341.tv, 0 23yy.com, 0 -247rack.com, 0 24dx.ru, 0 24gadget.ru, 0 24maker.com, 0 24paybank.com, 0 -25u.com, 0 27.ua, 0 -29bet.co, 0 29.ru, 0 2ap.pl, 0 2bulu.com, 0 -2cash.ru, 0 2dfire.com, 0 2dip.su, 0 2do2go.ru, 0 -2fh.co, 0 2gis.ae, 0 -2gis.cl, 0 2gis.com, 0 2gis.com.cy, 0 -2gis.cz, 0 -2gis.it, 0 2gis.kg, 0 2gis.kz, 0 2gis.ru, 0 2gis.ua, 0 -2hi.pl, 0 -2iretegas.it, 0 -2ix.de, 0 2k2k.cc, 0 2kom.ru, 0 -2kraski.ru, 0 2manhua.com, 0 -2mao.cc, 0 -2peak.com, 0 2plus2.ua, 0 -2proxy.de, 0 -2ryby.pl, 0 -2stick.ru, 0 -2sxvpn.wang, 0 -300188.cn, 0 300.cn, 0 3023.com, 0 30post.com, 0 310win.com, 0 315jiage.cn, 0 -32ph.com, 0 3310.com, 0 3322.org, 0 33pol.net, 0 33rus.ru, 0 -33un.com, 0 3400.org, 0 34regiongaz.ru, 0 34travel.by, 0 360.cn, 0 360.com, 0 360doc.com, 0 -360fdc.com, 0 360haoyao.com, 0 360jie.com.cn, 0 -360jk.com, 0 360kad.com, 0 360kan.com, 0 -360pay.cn, 0 360safe.com, 0 360shouji.com, 0 360shouzhuan.com, 0 360totalsecurity.com, 0 360tpcdn.com, 0 -360zimeiti.com, 0 -361sport.com, 0 -365hsh.com, 0 365rili.com, 0 -365soke.cn, 0 365webcall.com, 0 36fy.com, 0 36jr.com, 0 -36krcnd.com, 0 36kr.com, 0 -37k.org, 0 -37ren.com, 0 39.net, 0 3arrafni.com, 0 3bro.info, 0 -3cx.asia, 0 3cx.com, 0 3cx.de, 0 3cx.es, 0 3cx.eu, 0 3cx.fr, 0 -3cx.it, 0 -3cx.net, 0 3cx.ru, 0 3cx.us, 0 -3cyber.info, 0 -3dcenter.org, 0 3dmgame.com, 0 3dnews.ru, 0 3dyf.com, 0 -3-e.cz, 0 -3e.eu, 0 -3esynaptiq.com, 0 -3ie.fr, 0 -3mang.com, 0 3proxy.de, 0 -3proxy.ru, 0 3songshu.com, 0 -3tong.net, 0 -3utilities.com, 0 -4008087799.com, 0 40407.com, 0 404content.com, 0 -41.cn, 0 -41q.com, 0 4231.vn, 0 -42trip.com, 0 -4399om.com, 0 -4399sy.com, 0 442hz.com, 0 45so.org, 0 -46etplus.com, 0 4848438.com, 0 48.cn, 0 -4all.com, 0 4c.cn, 0 4d.com, 0 -4dk.ru, 0 -4gjsq.net, 0 4hu.com, 0 4ka.sk, 0 4nmv.ru, 0 4paradigm.com, 0 4pda.uz, 0 4programmers.net, 0 -4proxy.us, 0 4px.com, 0 -4qualia.co.jp, 0 -4real.gr, 0 -4ru.es, 0 -4shared-desktop.com, 0 4tuning.ro, 0 -4uarab.com, 0 4vision.ru, 0 -50webs.org, 0 -5112017.org, 0 -515to.com, 0 517.cn, 0 517na.com, 0 -51baogao.cn, 0 51bi.com, 0 -51bmb.com, 0 51.com, 0 -51datakey.com, 0 51duoduo.com, 0 51duoying.com, 0 51eng.com, 0 51goagent.com, 0 -51gsl.com, 0 51laibei.com, 0 51liucheng.com, 0 51mypc.cn, 0 @@ -355,22 +213,15 @@ 51pianmen.com, 0 51rz.com, 0 51shebao.com, 0 -51tniu.com, 0 51tuodao.com, 0 51vip.biz, 0 51vv.com, 0 -51wnl.com, 0 -51xiaoshuang.com, 0 51yangsheng.com, 0 51ykb.com, 0 -51yund.com, 0 -51yunqiang.cn, 0 520cfc.com, 0 -5262.com, 0 52bug.cn, 0 52daohang.com, 0 52dfg.com, 0 -52ilm.com, 0 52ilm.vip, 0 52itstyle.com, 0 52jbj.com, 0 @@ -378,51 +229,37 @@ 52joy.org, 0 52life.cc, 0 52ml.net, 0 -52spin.com, 0 531314.com, 0 -550550.ru, 0 55188.com, 0 -552la.com, 0 55freehost.com, 0 55haitao.com, 0 565656.com, 0 56p2b.com, 0 5778.com, 0 -58bank.com, 0 58cdn.com.cn, 0 58corp.com, 0 -5900.com.ar, 0 59pi.com, 0 -59store.com, 0 5adm.cc, 0 -5c.com.cn, 0 5di.tv, 0 5dmat-web.com, 0 5gbfree.com, 0 5g-ppp.eu, 0 5hxn.com, 0 -5idream.net, 0 5igupiao.com, 0 5ilog.com, 0 -5karmanov.ru, 0 -5ok.com.ua, 0 5ppai.com, 0 5qqksa.com, 0 5xiaoyuan.cn, 0 5zig.net, 0 600280.com, 0 -601601.com, 0 -60500.ru, 0 6080bo.com, 0 60-fps.org, 0 612459.com, 0 66163.com, 0 6655.la, 0 -66law.cn, 0 66.ru, 0 6789g.com, 0 68edu.ru, 0 -68kmla.org, 0 6ack.com, 0 6a.com, 0 6d1b.cc, 0 @@ -431,25 +268,18 @@ 6rz.in, 0 6so.so, 0 6te.net, 0 -700shin.ru, 0 -7-11.cn, 0 72du.com, 0 72e.net, 0 -7311.by, 0 7618.com, 0 76.ru, 0 77169.com, 0 -771dian.com, 0 77file.com, 0 7958.com, 0 -7bitcasino.com, 0 7days.ru, 0 7ero.org, 0 7fon.ru, 0 7i24.com, 0 7launcher.com, 0 -7moor.com, 0 -7n5.net, 0 7nujoom.com, 0 7to.com.tw, 0 7tor.org, 0 @@ -458,11 +288,8 @@ 80code.com, 0 80pai.net, 0 80s.tw, 0 -80uncle.com, 0 -80vps.com, 0 81mv.com, 0 85vod.com, 0 -868e.com, 0 86y.org, 0 87.cn, 0 87dyy.com, 0 @@ -471,9 +298,7 @@ 8866.org, 0 890m.com, 0 8a.hk, 0 -8asyym.com, 0 8eoe.com, 0 -8gongli.com, 0 8pig.com, 0 8solution.de, 0 8solutions.cloud, 0 @@ -484,44 +309,32 @@ 9080.tv, 0 90music.ir, 0 9111.ru, 0 -911proxy.com, 0 -91300.com, 0 9158.com, 0 -9188.com, 0 91.com, 0 91game.com, 0 91huayi.com, 0 -91kds.net, 0 -91moe.com, 0 -91pintuan.com, 0 91pxb.com, 0 91ri.org, 0 91ssfq.com, 0 91sst.com, 0 91wii.com, 0 91wutong.com, 0 -91y.com, 0 91yun.org, 0 91yunxiao.com, 0 92081.org, 0 921.com, 0 -92ez.com, 0 9384.com, 0 945.com, 0 -94cb.com, 0 9513.com, 0 9527yy.com, 0 95579.com, 0 -9597.biz, 0 96533.com, 0 9666.cn, 0 96.lt, 0 980x.com, 0 -988house.com, 0 99496.com, 0 999.com, 0 999d.com, 0 -99chan.org, 0 99.com, 0 9ht.com, 0 9ifriend.com, 0 @@ -532,198 +345,107 @@ a2yy.com, 0 a360.ru, 0 a4yy.com, 0 -a696.com, 0 -a6adserv.com, 0 -a8z8.com, 0 a-a-ah.ru, 0 aaayun.com, 0 -aab-edu.net, 0 aapig.com.cn, 0 aasaanjobs.com, 0 -aasfp.com, 0 aas.org, 0 aasp.org.br, 0 aauekpoma.edu.ng, 0 aazyw.com, 0 -abacusemedia.com, 0 -abadan-ref.ir, 0 -abakan.ru, 0 -abakus-internet-marketing.de, 0 -abble.cn, 0 -abbseo.com, 0 abbyy.com, 0 abbyyeu.com, 0 -abbyy-ls.com, 0 abbyy.ru, 0 -abbyy.ua, 0 -abbyyusa.com, 0 abc188.com, 0 abc360.com, 0 -abc6.net, 0 abcapk.com, 0 -abcb2b.eu, 0 -abcd.bz, 0 -abc.edu.sv, 0 abclite.net, 0 abc.re, 0 abcydia.com, 0 -abelohost.com, 0 abfar-kh.ir, 0 -abf.cz, 0 abf.se, 0 -abhiguitar.com, 0 -abidjan911.com, 0 abileneisd.org, 0 abit-poisk.org.ua, 0 abitu.net, 0 -abitur-und-studium.de, 0 -abiyefon.com, 0 -ablecloud.cn, 0 abletive.com, 0 -abm-com.de, 0 -about-nya.com, 0 abp.bzh, 0 abresalamat.ir, 0 abrites.com, 0 -abs.cn, 0 absi.be, 0 absolutbank.ru, 0 absolutist.com, 0 absolutist.ru, 0 -abuxiaoxi.com, 0 -abz.ch, 0 -abzone.cz, 0 -academicconf.com, 0 -academy21.ru, 0 acanomas.com, 0 -accentforex.com, 0 -access.ly, 0 -accounterlive.com, 0 -accuenplatform.com, 0 -acelerato.com, 0 acer.com, 0 -aceteamwork.com, 0 acfun.tv, 0 -acg.bz, 0 acgcss.com, 0 acg-moe.com, 0 acgmoon.org, 0 acgn.ren, 0 -ac.gov.ru, 0 acgpy.com, 0 acg.tf, 0 -acilissaati24.com, 0 ac-illust.com, 0 acision.com, 0 -acko.net, 0 -acko.ru, 0 -acli.it, 0 -a-closer-look.com, 0 aclu.org, 0 -acm.ac.uk, 0 acmcoder.com, 0 -acmhabitat.fr, 0 -acom.pt, 0 -aconcaguapoker.com, 0 acoola.ru, 0 acornsau.com.au, 0 acousticalsurfaces.com, 0 -ac-project.net, 0 acquadiparma.com, 0 acronis.com, 0 acrylicwifi.com, 0 acsc.az, 0 acs.si, 0 -acs-tpkg.com, 0 -actilove.ch, 0 actionnetwork.org, 0 -actiplans.com, 0 actitime.com, 0 active24.cz, 0 -active-city.net, 0 -activeeon.com, 0 activelink.ie, 0 -activemotif.com, 0 activ.kz, 0 -actonlytics.com, 0 actoys.net, 0 acueducto.com.co, 0 -acumatica.com, 0 -acupuncture.org.uk, 0 -ad7.com, 0 ada.edu.az, 0 adamas.ru, 0 adashboard.info, 0 adbusters.org, 0 ad.co.kr, 0 adcom.it, 0 -adctools.com, 0 -adcubum.com, 0 -added-value.com, 0 addison-electronique.com, 0 -addpipe.com, 0 addradio.de, 0 -add.re.kr, 0 -addvalue.de, 0 -adept.co.za, 0 -adfreehost.ir, 0 adic.co.kr, 0 -adicu.com, 0 adioma.com, 0 -adks.cn, 0 adkulan.kz, 0 -adllink.com.br, 0 admagazine.ru, 0 -admgor.nnov.ru, 0 admin.ch, 0 adminhost.org, 0 administrator.de, 0 adminn.cn, 0 admin.tomsk.ru, 0 -admissions.fr, 0 admkrsk.ru, 0 admoblkaluga.ru, 0 -admon.org, 0 admsakhalin.ru, 0 -adobeconnect.ir, 0 -adofms.com.au, 0 adp.com, 0 -adpop-1.com, 0 -adpop.com, 0 -adquisitio.com.mx, 0 adquisitio.es, 0 adquisitio.it, 0 -ad-rek.ru, 0 adriagate.com, 0 adrs.me, 0 ads1-adnow.com, 0 ads2-adnow.com, 0 ads3-adnow.com, 0 ads5-adnow.com, 0 -adsanityplugin.com, 0 adseedata.com, 0 -adselect.ir, 0 adsender.us, 0 adsensor.org, 0 adstarknetwork.com, 0 aduana.cl, 0 -adukacyja.info, 0 -adultwebmastercenter.biz, 0 advancedrenamer.com, 0 advancedtomato.com, 0 advendor.net, 0 adverten.com, 0 -adverti.ru, 0 advertising.management, 0 adview.cn, 0 -adviqo.com, 0 advisor.travel, 0 adways.net, 0 adwhiztech.com, 0 -adwifi.com.tw, 0 -adwitiyacollection.com, 0 -adxxx.me, 0 -adxxx.org, 0 ady.az, 0 ady-co.com, 0 adygnet.ru, 0 @@ -734,67 +456,34 @@ adzuna.co.za, 0 adzuna.de, 0 adzuna.fr, 0 -adzuna.in, 0 adzuna.nl, 0 adzuna.pl, 0 adzuna.ru, 0 adzz.me, 0 aegean.gr, 0 aegee.org, 0 -aegif.jp, 0 aelius.com, 0 -ae.org, 0 -aeparser.com, 0 -aepb.gov.cn, 0 -aerial.net, 0 aerosoft.de, 0 aertecsolutions.com, 0 -aerztekammer.at, 0 aesop.com, 0 aewb.cn, 0 -afagh.info, 0 -afaghnet.ir, 0 -afanti100.com, 0 -afd.berlin, 0 -afflecks.com, 0 -affordplan.com, 0 afghan123.com, 0 afphabitat.cl, 0 -afraid.org, 0 -africaintelligence.com, 0 africaintelligence.fr, 0 -africaninnovation.org, 0 africanleadershipacademy.org, 0 -africanmeccasafaris.com, 0 -afrimalin.cm, 0 -afrimalin.com.gn, 0 -agantty.com, 0 agava.net, 0 agava.ru, 0 -agc-energies.fr, 0 -agearche.ru, 0 agefi.fr, 0 -agendatrad.org, 0 agfw.me, 0 -agglo-annecy.fr, 0 agh.edu.pl, 0 -agilecontents.com, 0 -agimonline.com, 0 aginomoto.com, 0 agnesb.com, 0 agonistes.gr, 0 -agoodme.com, 0 agora.co.il, 0 -agora-energiewende.de, 0 -agpc28.com, 0 -agrafka.com.ua, 0 agrant.cn, 0 agrantsem.com, 0 agriconomie.com, 0 agroklub.com, 0 -agro-mash.ru, 0 -agronationale.ru, 0 -agropravda.com, 0 agrosemfond.ru, 0 agroxxi.ru, 0 agts.tv, 0 @@ -802,54 +491,25 @@ ahjzu.edu.cn, 0 ahmia.fi, 0 ahml.ru, 0 -ahnw.gov.cn, 0 -ahs-de.com, 0 ahtv.cn, 0 ahu.edu.cn, 0 -ahvaznovin.ir, 0 aia.com.sg, 0 -aiaiu.com, 0 -aibing.cc, 0 -ai.ch, 0 aidaojia.com, 0 -aidl.pw, 0 -aigame100.com, 0 -aihuo360.com, 0 -aiirony.com, 0 aiisen.com, 0 aikaiyuan.com, 0 -aikf.com, 0 aimatech.com, 0 -aimms.com, 0 -aimodel.me, 0 -aim.uz, 0 -ainiseo.com, 0 -aipa.ru, 0 -aipb.org, 0 air-austral.com, 0 airbase.ru, 0 airbusgroup.com, 0 aircn.org, 0 -aircrack-ng.org, 0 airdog.com, 0 airedesantafe.com.ar, 0 airelf.com.tw, 0 airgun.org.ua, 0 -airlinegeeks.com, 0 -airly.co, 0 airmp3.me, 0 -airnet.ru, 0 -air-serenity.com, 0 airstoc.com, 0 airtime.pro, 0 -airtribune.com, 0 -airwarriors.com, 0 airweave.jp, 0 -ais.by, 0 -aisidi.com, 0 -aisne.fr, 0 -aist.net.ru, 0 -ais.ua, 0 ait.ac.th, 0 aitech.ac.jp, 0 ai-thinker.com, 0 @@ -858,53 +518,30 @@ aizhuizhui.com, 0 ajaums.ac.ir, 0 ajinga.com, 0 -ajmide.com, 0 ajou.ac.kr, 0 akademie-bv.de, 0 -akademikerverlag.de, 0 akado-ural.ru, 0 akairan.com, 0 -akama.com.tw, 0 -akasakaprince.com, 0 -akb48game.jp, 0 -akcis.org, 0 akisho.ru, 0 akket.com, 0 -aknw.de, 0 -akosi.ru, 0 akson.ru, 0 -aktinos.com, 0 -akud.info, 0 akusherstvo.ru, 0 -alain-bensoussan.com, 0 alamesacuba.com, 0 -alapetite.fr, 0 alarmtrade.ru, 0 -alaska.ua, 0 alau.kz, 0 albank.ru, 0 albedo.pw, 0 alberlet.hu, 0 alberthsieh.com, 0 -alberto.gr, 0 -albooked.com, 0 alcateia.com.br, 0 alcatelonetouch.com, 0 -alchevsk.net, 0 -alconost.com, 0 -aldebaran.cz, 0 aldjf.com, 0 -alemtat.kz, 0 alertachiapas.com, 0 -aler.to, 0 alexa_host, 0 alexander-freundeskreis.org, 0 alexandriava.gov, 0 alexandrinsky.ru, 0 -alexbloggt.com, 0 -alexbruni.ru, 0 alexfitness.ru, 0 -alexnettm.org.ua, 0 alexwz.com, 0 alexyanovsky.com, 0 alfabank.kz, 0 @@ -912,560 +549,298 @@ alfa-forex.ru, 0 alfatyping.com, 0 alfred.camera, 0 -algoritma.it, 0 -alhassan.de, 0 -ali213.net, 0 aliall.ru, 0 -aliapp.com, 0 aliatic.com, 0 -alibi.by, 0 alicall.com, 0 -alicomez.com, 0 -alidemo.cn, 0 aliexsale.ru, 0 -aligo.in, 0 alinino.az, 0 -aliseed.com, 0 -alittlebit.ru, 0 -alittlebityummy.com, 0 -aliwords.com, 0 aliyuncs.com, 0 -all4os.com, 0 allaboutjazz.com, 0 -allaboutparenting.ro, 0 -allananas.ru, 0 all.biz, 0 allboxing.ru, 0 allcoin.com, 0 -allcorp.ru, 0 -alldiscount.info, 0 alles-vegetarisch.de, 0 -alleyneinc.net, 0 allfon.org, 0 -allhostings.ru, 0 -alliance-global.com, 0 allinpay.com, 0 -all-in.xyz, 0 allmedia.ru, 0 allmovies.uz, 0 allnokia.ru, 0 allobnk.com, 0 allo.ua, 0 allplay.uz, 0 -allrad.ru, 0 allseenalliance.org, 0 allthefallen.ninja, 0 alltobid.com, 0 allure.ru, 0 -allwetterzoo.de, 0 allyes.com, 0 -almamarket.pl, 0 almasdarnews.com, 0 almatv.kz, 0 -almaz.center, 0 almedina.net, 0 -almin.ru, 0 almodi.org, 0 almohtarifdz.com, 0 alo.ir, 0 -alone.tw, 0 -alpedhueznet.com, 0 alphabrock.cn, 0 alphacrc.com, 0 -alphacrew.com, 0 alpha-network.io, 0 -alphaspel.se, 0 alpha-wallet.com, 0 -alphest.com, 0 -alpine.com, 0 -alpinelinux.org, 0 alser.kz, 0 -als-japan.com, 0 -alsyundawy.com, 0 altarix.ru, 0 altechna.com, 0 -altegrosky.ru, 0 altel.kz, 0 alternatehistory.com, 0 -alternetivo.cz, 0 altervista.org, 0 -alterway.fr, 0 -altigator.com, 0 -altinkaya.com.tr, 0 altissia.com, 0 altlinux.org, 0 -altlinux.ru, 0 altrk.net, 0 -altruja.de, 0 altspu.ru, 0 -alt-team.com, 0 -alvanikoku.edu.ng, 0 alwaysdata.net, 0 -alyzq.com, 0 amainhobbies.com, 0 -amalgam-fansubs.tk, 0 amanbo.co.ke, 0 amanbo.com, 0 amap.com, 0 amaroma.it, 0 -amarone.hu, 0 amazee.io, 0 -amazingradio.com, 0 amazonaws.com, 0 -ambiente.gob.ar, 0 amdn.news, 0 -amersport.ru, 0 -amforward.com, 0 amfostacolo.ro, 0 amigaosecreto.com.br, 0 amigo.lv, 0 amigosdecosat.com, 0 -amikash.ca, 0 -aminidc.com, 0 amiro.ru, 0 -ammc.ma, 0 -amniran.org, 0 amocrm.com, 0 -amolf.nl, 0 amorousgame.com, 0 -amoskadan.cz, 0 ampfutures.com, 0 amplexor.com, 0 ampr.org, 0 -amrita-rus.ru, 0 amss.ac.cn, 0 -amt.com.cn, 0 -amv.es, 0 -anadea.info, 0 -anadyr.org, 0 -anafarsh.com, 0 -analyticaltrader.com, 0 -anapa-official.ru, 0 -anchel.nl, 0 ancii.com, 0 -ancor.ru, 0 andalucia.org, 0 -anderlecht.be, 0 anderlecht-online.be, 0 -anderssen.ru, 0 andipartners.com, 0 andraste.io, 0 andrewcbancroft.com, 0 androbit.net, 0 androidcentral.com, 0 -android-coffee.com, 0 -android-gems.com, 0 android-help.ru, 0 android-iphone-recovery.com, 0 -androidlearning.in, 0 androidlost.com, 0 -andyet.com, 0 -andykamto.com, 0 anegrinews.ru, 0 anekdot.ru, 0 -anevia.com, 0 angara.net, 0 -angellight.com, 0 -anglius.ru, 0 angrymetalguy.com, 0 anhuinews.com, 0 -anidesu.ru, 0 anidex.moe, 0 animan.uz, 0 animationclub.ru, 0 animecharactersdatabase.com, 0 -animeimpulse.com, 0 animelayer.ru, 0 -anime-pictures.net, 0 anime-rus.ru, 0 animetosho.org, 0 -animetreff.de, 0 -anionix.ru, 0 anitama.cn, 0 anitoys.com, 0 anizone.net, 0 -ankaraka.org.tr, 0 ankerkraut.de, 0 ankermann.com, 0 ankiety-tv.pl, 0 -anko3.com, 0 -ankolpakov.ru, 0 anmb.ro, 0 -annet.pl, 0 annibuku.com, 0 -annkestore.com, 0 -anoneko.com, 0 anonimag.es, 0 anonymox.net, 0 anotherhome.net, 0 -anovaculinary.com, 0 -anpc.ro, 0 -anpec.org.br, 0 anritsu.com, 0 anruan.com, 0 ansan.ac.kr, 0 -ans.cz, 0 anseo.cn, 0 answercenter.ir, 0 -answerconnect.com, 0 -answerconnect.co.uk, 0 anta.cn, 0 anta.com, 0 -antagosoft.com, 0 -antclub.org, 0 -anticenz.org, 0 -antiplag.ru, 0 antizapret.info, 0 antoshkaspb.ru, 0 -antplanet.ru, 0 -antrak.org.tr, 0 -antshares.org, 0 antsoul.com, 0 anturis.com, 0 -anunciobot.com, 0 anunciosparatodos.com, 0 -anvidelabs.org, 0 anviz.com, 0 anwalt24.de, 0 -anyfiles.co, 0 anysdk.com, 0 -anysports.tv, 0 -anyway.fm, 0 anzhen.org, 0 anzhi.com, 0 -aoaoao.me, 0 -aofall.com, 0 aomygod.com, 0 aonb.ru, 0 -aor.ca, 0 -aoreteam.com, 0 aori.ru, 0 aos.com, 0 -aov.de, 0 -ap1.by, 0 apabi.com, 0 apachehaus.com, 0 apachelounge.com, 0 -apaipian.com, 0 -apalon.com, 0 apartamenty.kz, 0 -apave.com, 0 -apba.es, 0 aperza.jp, 0 apexdc.net, 0 -apex.fr, 0 apexpoint.com, 0 -apfelwerk.de, 0 -apgsensors.com, 0 -apgsga.ch, 0 -apic.in, 0 -apimatic.io, 0 -apkdigg.co, 0 apkdy.com, 0 apk.tw, 0 -aplgo.com, 0 -aplicit.com, 0 aplikasipc.com, 0 apmetrix.com, 0 apn.ru, 0 apolisglobal.com, 0 appadhoc.com, 0 -appbase.io, 0 -appbonus.ru, 0 appcan.cn, 0 appcelerator.com, 0 -appcoachs.com, 0 appdated.de, 0 appdb.cc, 0 appfollow.io, 0 -appful.io, 0 -app-global.ru, 0 appier.com, 0 -appier.net, 0 applico.ru, 0 -applied-research.ru, 0 applinzi.com, 0 applysquare.com, 0 applythis.net, 0 apppark.cn, 0 -appreal-vr.com, 0 apps555.com, 0 -appshike.com, 0 appsmod.com, 0 -appsocks.cn, 0 appson.ir, 0 -appstar.com.cn, 0 -appvault.com, 0 -apreva.fr, 0 apricityos.com, 0 -apronline.gov.ar, 0 apropos-store.com, 0 -aptekarsk.ru, 0 apur.org, 0 apusapps.com, 0 apuscn.com, 0 apx.fr, 0 aqha.com, 0 -aql.com, 0 aqua-calc.com, 0 aqualogo.ru, 0 aquariumbg.com, 0 -aquaservice.com, 0 aqua-shop.ru, 0 -arabshack.com, 0 aradhost.com, 0 arado.org, 0 -aranycsillag.net, 0 aras.com, 0 -arawaza.com, 0 arb4host.net, 0 arba.uz, 0 -arbeitsschutz-portal.de, 0 -arbicon.ru, 0 arbital.ru, 0 arb-silva.de, 0 -arbuse.ru, 0 -arcadiamedical.ro, 0 arcadja.com, 0 -arch-anywhere.org, 0 -archboy.org, 0 -archermind.com, 0 -archersbr.com, 0 archirodon.net, 0 -arcsoft.com.cn, 0 ardahan.edu.tr, 0 -ardda.gov.az, 0 ardisson.ir, 0 -areajugones.es, 0 -areeya.co.th, 0 -arefyevstudio.com, 0 -arenabg.ch, 0 -arenabg.com, 0 arencenter.ir, 0 -ares.com.tw, 0 -argentinacompra.gov.ar, 0 argentina.gob.ar, 0 -argor.com, 0 -ar.gov, 0 ariacomputer.ir, 0 ariansystem.net, 0 ariejan.net, 0 arielis.com, 0 -ari.ir, 0 arindo.net, 0 aris.ge, 0 -aristo.ru, 0 -aritmos.it, 0 arize.ir, 0 arkadium.com, 0 arkena.com, 0 arkh-edu.ru, 0 arkrdigital.com, 0 -arkvpn.wang, 0 -arlan.ru, 0 -arlingtonva.us, 0 arma3.ru, 0 -armene.com, 0 armor.kiev.ua, 0 -armorymarek.com, 0 armtorrent.com, 0 army.gr, 0 -armysoft.es, 0 arnotts.ie, 0 aroundprague.cz, 0 -arpuplus.com, 0 -arqatech.com, 0 -arsacia.ir, 0 -arsenal-sib.ru, 0 ars-grin.gov, 0 ars.sicilia.it, 0 -art1st.me, 0 -artar.com.sa, 0 -artcom.de, 0 -art-download.org, 0 -artezio.com, 0 artfoxlive.com, 0 artinfo.pl, 0 artinvestment.ru, 0 -artistravel.eu, 0 artist.ru, 0 -artlife.ru, 0 -artlords.com, 0 art-oboi.com.ua, 0 artonline.ru, 0 artrade.com, 0 -artreal.ru, 0 artron.net, 0 -artsadd.com, 0 arturia.com, 0 -arty.space, 0 -asafaweb.com, 0 asanak.ir, 0 asanapps.com, 0 -asandk.com, 0 asanfile.com, 0 asanwebhost.com, 0 asaptickets.com, 0 -ascendcorp.com, 0 -ascendi.pt, 0 -asc.es, 0 -asda.gr, 0 -asendiahk.com, 0 aseugame.com, 0 ashampoo.net, 0 -ashanet.org, 0 -asheblog.org, 0 -ashiyue.com, 0 -ashkalov.ru, 0 ashland.edu, 0 -ashmanov.com, 0 asiafull.com, 0 -asiago.it, 0 asiainfo.com, 0 -asiainfo.com.cn, 0 -asiangeo.com, 0 asiaplus.tj, 0 asiatech.ir, 0 -asicminermarket.com, 0 asilmedia.uz, 0 -asirikuy.com, 0 asjyy.com, 0 askermekani.com, 0 askform.cn, 0 asknlearn.com, 0 askona.ru, 0 -askthepsych.com, 0 aslenkov.ru, 0 aslibra.com, 0 asomin.net, 0 -asp.be, 0 asphaltgold.de, 0 aspiremi.com, 0 -asp.krakow.pl, 0 aspone.me, 0 aspswelten.de, 0 asrock.com, 0 assai.com.br, 0 asse.fr, 0 -assistbet.co, 0 -assorti-market.ru, 0 astana.kz, 0 -astana.tk, 0 astegiudiziarie.it, 0 -asteriskmx.org, 0 asteroidos.org, 0 astralnalog.ru, 0 astrobites.org, 0 astrocenter.com, 0 astrogeo.va.it, 0 astrohled.cz, 0 -astrology.com, 0 astro-online.ru, 0 astropro.ru, 0 astrosage.com, 0 astroweb.tv, 0 astrowi.com, 0 -asurgumus.com, 0 -asus.com.cn, 0 asuscomm.com, 0 -asusmarket.ru, 0 aswifter.com, 0 atabank.com, 0 -ataka.tv, 0 -ataksupermarket.ru, 0 ataland.com, 0 -atanor.ru, 0 at-consulting.ru, 0 -atel76.ru, 0 atempurl.com, 0 atfbooru.ninja, 0 -atg-corp.com, 0 ath.cx, 0 -athlenda.com, 0 athome.lu, 0 atiyehsazan.ir, 0 -atlanta.ua, 0 -atlanticmetro.net, 0 -atm.gob.ec, 0 atmyplace.ru, 0 atnf.csiro.au, 0 -atnifty.com, 0 atol.ru, 0 -atomuniverse.net, 0 -aton.ru, 0 -atpesercizio.it, 0 -atraining.ru, 0 atrapalo.com, 0 atraveo.de, 0 -atrsara.ir, 0 atservers.net, 0 -atso-net.jp, 0 attijariwafa.com, 0 -attivonetworks.com, 0 at.ua, 0 atua.com.br, 0 atyourservice.com.cy, 0 -atzenbunker.ws, 0 auca.kg, 0 auchandirect.fr, 0 auchan.net, 0 auchan.ro, 0 auchan.ru, 0 auctionata.com, 0 -audacity-forum.de, 0 -audatex.de, 0 audials.com, 0 audiklub.cz, 0 audinate.com, 0 -audiofreaks.nl, 0 -audiophile.org, 0 audioveda.ru, 0 -auditionpvs.com, 0 audit-it.ru, 0 au.edu.tw, 0 aufe.edu.cn, 0 -augcg.com, 0 -auis.edu, 0 -aulacenter.com, 0 -aulamejor.com, 0 auna.de, 0 auna.fr, 0 auna.it, 0 -auna-multimedia.co.uk, 0 -auna-multimedia.es, 0 -auno.kz, 0 auooo.com, 0 -aurora-online.ru, 0 -aurubis.com, 0 -aussiebushwalking.com, 0 -austlink.net, 0 austral.edu.ar, 0 australia.com, 0 australianturfclub.com.au, 0 -austrian.com, 0 author24.ru, 0 autoalkatresz.hu, 0 autoazart.ru, 0 -autobam.ru, 0 -autobase.biz, 0 -autobole.com, 0 autocash.com, 0 -autocensor.com, 0 autocharge.ir, 0 autocont.cz, 0 -autofides.ru, 0 -autoflex.hu, 0 autofoco.com, 0 autoforum.com.br, 0 autohausaz.com, 0 -autoimport31.ru, 0 autojarov.cz, 0 -autojerry.fi, 0 autoklad.ua, 0 -autoklub.cz, 0 -autolikeviet.vn, 0 automic.com, 0 -automotivelinux.org, 0 autonavi.com, 0 autonavigator.hu, 0 autoonline.com, 0 @@ -1475,13 +850,8 @@ autopilot.li, 0 autoradiopc.it, 0 autoria.biz, 0 -autoshinavrn.ru, 0 autospares.lv, 0 -autostels.ru, 0 -autostrong-m.by, 0 autosup.by, 0 -autosup.ru, 0 -autoteile-teufel.at, 0 autoteile-teufel.de, 0 autotoolza.ru, 0 autotown55.ru, 0 @@ -1490,74 +860,42 @@ autozi.com, 0 auxiliadorapredial.com.br, 0 avaclinic.ru, 0 -avalon.ru, 0 -ava.md, 0 -avance-lg.com, 0 avanset.com, 0 avantbrowser.com, 0 -avantel.ru, 0 -avantgarde-labs.de, 0 ava-saz.ir, 0 -avatanplus.com, 0 -avatan.ru, 0 -avatanshop.ru, 0 -avbt123.com, 0 avcast.org, 0 -avenard.com, 0 -avenuedesvins.fr, 0 aversi.ge, 0 avg.club, 0 -av-gk.ru, 0 avia.lt, 0 -avia.md, 0 avianca.com.br, 0 aviapark.com, 0 -aviationsmilitaires.net, 0 avic.com, 0 avic.ir, 0 -avis.pl, 0 avito.ru, 0 avlab.pl, 0 -avocat.qc.ca, 0 -avokado.kz, 0 -avokzal.ru, 0 avonstore.com.br, 0 avosapps.com, 0 -avra.pl, 0 av.ru, 0 -avselectro-msk.ru, 0 avselectro.ru, 0 avsim.net, 0 avspare.com, 0 avtobor.uz, 0 avtograd.ru, 0 -avtomir.ru, 0 avtonalogi.ru, 0 -avtoopt.com, 0 avto.pro, 0 avtovod.org.ua, 0 -avtovokzal-on-line.ru, 0 avtovokzaly.ru, 0 -avt.pl, 0 -avvalniaz.ir, 0 -awem.com, 0 -awstaticdn.net, 0 awwapp.com, 0 axa.cz, 0 -axelname.ru, 0 axiangblog.com, 0 -axigen.com, 0 -axiomplus.com.ua, 0 axiomtelecom.com, 0 axiomus.ru, 0 axp.dk, 0 axzchou.com, 0 ayla.com.cn, 0 -aytopalencia.es, 0 ayudatpymes.com, 0 ayurina.net, 0 ayz.pl, 0 -azarfam.com, 0 azasrs.gov, 0 azcuba.cu, 0 azersu.az, 0 @@ -1567,26 +905,18 @@ az.gov, 0 azimuthotels.com, 0 azinsurance.az, 0 -azoft.com, 0 az.pl, 0 azsigorta.az, 0 -azskmg.kz, 0 aztu.edu.az, 0 azure.cn, 0 azure.com, 0 -b0ne.com, 0 b1.com.cn, 0 -b1-systems.de, 0 -b2cpl.ru, 0 b2wdigital.com, 0 b3log.org, 0 -b4value.net, 0 b5m.com, 0 -b7yy.com, 0 b8b8.tv, 0 b8yy.com, 0 baba-mail.co.il, 0 -babelsberger-filmgymnasium.de, 0 babilon-m.tj, 0 babilon-t.tj, 0 babosik.ru, 0 @@ -1594,46 +924,27 @@ babruisk.com, 0 babyblog.ru, 0 babylongirls.co.uk, 0 -babypark.nl, 0 -babysfera.ru, 0 -babysitting24.ch, 0 bacc1688.com, 0 back2basics-wow.eu, 0 bad.watch, 0 bagevent.com, 0 -baggersmag.com, 0 -bagllerina.com, 0 ba.gov.br, 0 bahamsafar.com, 0 -bahmut.com, 0 baicheng.com, 0 baidu.com, 0 -baidu.nu, 0 -baidupan.com, 0 baiduyun.me, 0 baijiahulian.com, 0 baijindai.com, 0 baikal-daily.ru, 0 baiten.cn, 0 baitv.com, 0 -baixing.cn, 0 baixou.com.br, 0 -bajiegc.com, 0 -bakemono-subs.com, 0 -bakkerdehouthandel.nl, 0 baksman.com, 0 baktelecom.az, 0 -baku2015.com, 0 baku2017.com, 0 -bakulev.ru, 0 balancer.ru, 0 -balassiintezet.hu, 0 -balder.se, 0 baldtruthtalk.com, 0 baldwins.co.uk, 0 -balgrist.ch, 0 -balitrand.fr, 0 -balkan.ru, 0 ballbar.cc, 0 baltikums.eu, 0 bamada.net, 0 @@ -1641,18 +952,14 @@ bamilo.com, 0 bamper.by, 0 bananacare.ch, 0 -bancogalicia.com.ar, 0 bancomoc.mz, 0 bandaancha.eu, 0 bang5mai.com, 0 bangcle.com, 0 banggood.cn, 0 banglatext.com, 0 -bangnipai.com, 0 bangqu.com, 0 banhai.com, 0 -banif.com.mt, 0 -banio.ir, 0 banjiajia.com, 0 bank24.uz, 0 bankbps.pl, 0 @@ -1662,157 +969,84 @@ bankmandiri.co.id, 0 bankofbeijing.com.cn, 0 bankofdl.com, 0 -bankowebezprawie.pl, 0 bankreferatov.ru, 0 banks.is, 0 -banmaxiaozhen.com, 0 banob.ir, 0 banyantree.com, 0 bao.cn, 0 -baojia.com, 0 baomitu.com, 0 -baoyuntong.com, 0 -baozou.com, 0 baozun.cn, 0 -bappedakaltim.com, 0 -baraodemaua.br, 0 -baratz.es, 0 -barbars.ru, 0 barbioyunu.com.tr, 0 barcodeberlin.com, 0 -bareknucklepickups.co.uk, 0 -barnacl.es, 0 barneos22.ru, 0 barracuda.digital, 0 bartin.edu.tr, 0 -bartonccc.edu, 0 bas.co.jp, 0 -basetis.com, 0 basezap.com, 0 bashagroplast.com, 0 bashkortostan.ru, 0 -basis.com, 0 baskcompany.ru, 0 -basnet.by, 0 bast.ru, 0 basu.ac.ir, 0 -batcave.net, 0 batiaoyu.com, 0 battlecomics.co.kr, 0 -battleofballs.com, 0 battleship-game.org, 0 -baykoreans.com, 0 -baykoreans.net, 0 baysideonline.com, 0 -baza-artistov.ru, 0 -bazakolejowa.pl, 0 -baza.net, 0 -bazarelentrerriano.com.ar, 0 -bazarknig.ru, 0 bazhongol.com, 0 bazhuayu.com, 0 -bbdogroup.ru, 0 bbmundo.com, 0 -bbonfire.com, 0 -bbport.ru, 0 bbspro.net, 0 bbvafrances.com.ar, 0 bbztx.com, 0 -bcactc.com, 0 -bcamath.org, 0 bcassessment.ca, 0 -bcat.ge, 0 bcb5.com, 0 bccto.me, 0 bcebos.com, 0 bch.com.cn, 0 -bch.hn, 0 -bcr.gob.sv, 0 bcr.ro, 0 bcsh.com, 0 bcy.net, 0 bda.bg, 0 bdear.xyz, 0 -bdew.net, 0 bd-film.com, 0 bdimg.com, 0 -bdjc001.com, 0 -bdo.global, 0 bdpan.com, 0 -bdpu.org, 0 bdqn.cn, 0 -bdsmclub.pl, 0 bdsm-russia.com, 0 bdstatic.com, 0 -bdsu.de, 0 bea.aero, 0 -beactive.it, 0 -beamr.com, 0 -beam.tv, 0 bearworld.co.kr, 0 beate-uhse.com, 0 -beatsound.ru, 0 beatstage.com, 0 -beautyjagd.de, 0 -bebehouse.com, 0 bebekoyunu.com.tr, 0 bebinak.com, 0 bebio.pl, 0 -becoder.org, 0 -beejournal.ru, 0 beeline.ru, 0 beeteco.com, 0 -beevalley.co.jp, 0 -beevideo.tv, 0 behe.com, 0 -behranoil.com, 0 -behsaa.com, 0 -behsakala.com, 0 -behtarin.tj, 0 beibei.com, 0 -beiersdorfgroup.com, 0 -beijingtoday.com.cn, 0 -beitaichufang.com, 0 beitone.com, 0 bejbynet.cz, 0 belgazprombank.by, 0 belgium.be, 0 belgraviacentre.com, 0 -belhard.com, 0 belightsoft.com, 0 belink.com, 0 belive.ru, 0 belle8.com, 0 bellicon.com, 0 -bellini.fr, 0 -bellpotter.com.au, 0 belorusskiy-trikotazh.ru, 0 belregion.ru, 0 -beltranssat.by, 0 be.ma, 0 bemanicn.com, 0 -bencil.pro, 0 -benedettis.com, 0 benefitresource.com, 0 -benefitsystems.bg, 0 benefitsystems.pl, 0 beneylu.com, 0 beneyluschool.net, 0 -bengalimusic.in, 0 bengbeng.com, 0 -bengtsfors.se, 0 -benlai.com, 0 -benlailife.com, 0 benmi.com, 0 -benq.com.cn, 0 -benrmatthews.com, 0 -beogradskioglasi.com, 0 -beontop.ae, 0 berbidvps.ir, 0 -berdyansk.net, 0 -beridver.ru, 0 berito.ru, 0 -berlin-partner.de, 0 berlitz.com, 0 berlitz.de, 0 bernat.im, 0 @@ -1827,24 +1061,15 @@ besmart.kz, 0 besplatnyeprogrammy.net, 0 bestcake.com, 0 -best-carnival.ru, 0 -besthosting.ua, 0 -bestload.me, 0 -bestmani.ru, 0 best-price.com, 0 bestprice.gr, 0 -bestr.it, 0 bestsdk.com, 0 bestsecret.at, 0 -bestsecret.ch, 0 bestsecret.com, 0 bestsecret.co.uk, 0 -bestsecret.fr, 0 bestsecret.se, 0 bestsolution.at, 0 bestsub.com, 0 -bestv.cn, 0 -bestwallpapers-hd.com, 0 bestwatch.ru, 0 bestwinsoft.com, 0 betaarchive.com, 0 @@ -1852,247 +1077,137 @@ beta.gouv.fr, 0 betawoo.com, 0 betcity.ru.com, 0 -betcityru.com, 0 -bethowen.ru, 0 bethplanet.ru, 0 betina.ir, 0 -bet-minute.com, 0 betonline.ag, 0 -beton.org, 0 -betprisma.com, 0 -betsbc-24.com, 0 -betsbc42.com, 0 betscsgo.net, 0 betsdota2.net, 0 -betsgate.com, 0 -bettingbusiness.ru, 0 bexio.com, 0 beyond3d.com, 0 -beyond-edge.com, 0 -beyond.pl, 0 beyondsoft.com, 0 beyotime.com, 0 -bezaza.ru, 0 -bezko.ru, 0 -bezlimit.ru, 0 bezrealitky.cz, 0 -bezuzyteczna.pl, 0 bfarm.de, 0 -bfgames.biz, 0 -bfh.com.cn, 0 bfi.org, 0 -bfkh.ru, 0 -bfme-modding.ru, 0 bftcom.com, 0 bfun.cn, 0 bfxdata.com, 0 -bfz.hu, 0 -bg.ac.rs, 0 bgctv.com.cn, 0 bget.ru, 0 bgflash.com, 0 bgforum.ru, 0 -bgreco.net, 0 bgtop.net, 0 bgu.co.il, 0 -bgunb.ru, 0 bgy.com.cn, 0 bh3.com, 0 bialystok.pl, 0 -biapy.com, 0 -biba.de, 0 bible-center.ru, 0 bibleonline.ru, 0 -bible.ru, 0 biblio.by, 0 biblioclub.ru, 0 biblionix.com, 0 -biboran.com, 0 bibs.jp, 0 -bichruletka.ru, 0 bidnews.cn, 0 bidoo.com, 0 bieszczady.pl, 0 -bi-file.ru, 0 -bigangwan.com, 0 bigbangnews.com, 0 bighost.ir, 0 bigmir.net, 0 bignox.com, 0 bigotti.ro, 0 bigpicture.ru, 0 -bigquant.com, 0 bi-group.kz, 0 biji.io, 0 -bikecitizens.net, 0 -bikefriday.com, 0 -bikemaster.ru, 0 bikeroar.com, 0 bikexpert.ro, 0 bildungscentrum.de, 0 -bildung-schweiz.ch, 0 biletix.ru, 0 -biletsofit.ru, 0 bilibili.com, 0 bilietai.lt, 0 biligame.com, 0 bilimal.kz, 0 -billing.ru, 0 billin.net, 0 bilp.fr, 0 bimacarecard.com, 0 bimm.uz, 0 bimt.com, 0 -binarisonori.com, 0 -binaryfruit.com, 0 -binary.ninja, 0 -binb.co, 0 -bingo-boom.ru, 0 -bingoenglish.com, 0 bingostars.com, 0 bingyan.net, 0 binomo.com, 0 -bin.sh, 0 binus.ac.id, 0 binzhi.com, 0 -biogena.com, 0 -biopodushka.ru, 0 -biotecan.com, 0 bioware.ru, 0 -bipc.co.jp, 0 bipdrive.com, 0 -bipskickers.com, 0 -bipush.com, 0 -birdol.com, 0 -birlikhabergazetesi.com, 0 -birmingham.io, 0 -birulevo.net, 0 biryerde.biz, 0 bisaboard.de, 0 bisafans.de, 0 -bisai.tv, 0 -bislink.ir, 0 -bisoft.com.mx, 0 -bistek.com.br, 0 bistudio.com, 0 bistu.edu.cn, 0 bit2.biz, 0 bitauto.com, 0 bitballoon.com, 0 -bitcheese.net, 0 bitcoin.com, 0 bitcomet.com, 0 -bitgame.ir, 0 bit-hdtv.com, 0 -bitinn.net, 0 bitkan.com, 0 -bitmessage.ch, 0 bitminter.com, 0 bitnamiapp.com, 0 -bitovi.com, 0 -bitp.kiev.ua, 0 bitref.com, 0 bitrix24.com, 0 bits-handwerkersoftware.de, 0 -bits-hochschule.de, 0 bitsighttech.com, 0 bitskins.com, 0 -bittiraha.fi, 0 -bittorrentfiles.org, 0 -bittv.info, 0 bittylicious.com, 0 biyao.com, 0 -biysk22.ru, 0 bizagi.com, 0 biz.ht, 0 -bizmate.it, 0 bizovo.ru, 0 -bizright.co.jp, 0 biz.tm, 0 bizws.cn, 0 -bjadks.com, 0 bjd.com.cn, 0 bjdx.gov.cn, 0 bjedu.gov.cn, 0 -bjev.com.cn, 0 bjhd.gov.cn, 0 -bjitic.com, 0 -bjjlb.org.cn, 0 bjjtgl.gov.cn, 0 bjkw.gov.cn, 0 bjnsf.org, 0 -bjpost.com.cn, 0 -bj-tct.com, 0 bjtu.edu.cn, 0 -bjwh.gov.cn, 0 bk55.ru, 0 bk-media.de, 0 bkool.com, 0 blablacar.com, 0 -blablacar.net, 0 -blablacode.ru, 0 -blackanddecker.com.br, 0 blackberries.ru, 0 blackberrys.ru, 0 blackbiz.ws, 0 -blackpixel.com, 0 -blackroosteraudio.com, 0 -blackyau.cc, 0 -blafusel.de, 0 blagovest-moskva.ru, 0 blanco.com, 0 -blankslate.io, 0 bl.ee, 0 blender.org, 0 -bleujour.com, 0 -bl.gov.cn, 0 blibao.com, 0 -blinko.ru, 0 blitz-cinestar-bh.ba, 0 blitz-cinestar.hr, 0 -blitzcorp.org, 0 -blockchainiz.io, 0 block.io, 0 -bloemert.com, 0 blogfeng.com, 0 -blogforacure.com, 0 blogfuntw.com, 0 -bloggersclub.net, 0 blogin.co, 0 blogpage.eu, 0 -blogram.net, 0 blogrebellen.de, 0 -blogshark.net, 0 -blogs-optimieren.de, 0 blogsyte.com, 0 blogun.ru, 0 -bloodcat.com, 0 bloombex-options.com, 0 -blowtopop.net, 0 -blueandwhitehousepubandhkco.com, 0 -bluecomvn.com, 0 bluefocusgroup.com, 0 bluegolf.com, 0 -bluemarblegeo.com, 0 -bluemp.net, 0 -blueprintsys.com, 0 blueprism.com, 0 bluereader.org, 0 -bluesales.ru, 0 blueshop.ca, 0 blueshop.com.tw, 0 bluesoft.com.br, 0 bluevine.com, 0 -bluvacanze.it, 0 -bmbgroup.com, 0 bme.hu, 0 bm.lv, 0 bmobile.ne.jp, 0 -bm.ru, 0 bm-services.com, 0 -bmwclubmoto.ru, 0 bmw.com.cn, 0 -bnaat.com, 0 bndes.gov.br, 0 bnext.com.tw, 0 bnisecurities.co.id, 0 @@ -2100,261 +1215,140 @@ bn.ru, 0 bnu.edu.cn, 0 board24.lg.ua, 0 -boardom.io, 0 boatingmag.com, 0 bobs.com.br, 0 bobsfa.com.br, 0 boce.cn, 0 -bochkameda.net, 0 -bodc.ac.uk, 0 boeffla.de, 0 boeingisback.com, 0 -boerde-berufskolleg.de, 0 boerse-stuttgart.de, 0 bog.gov.gh, 0 -bohemiaenergy.cz, 0 -boioiong.com, 0 bokee.net, 0 -boke.io, 0 -bokeyy.com, 0 bombardir.ru, 0 bombardo.ru, 0 -bombato.net, 0 bomberarena.com, 0 -bomc.top, 0 bome.com, 0 bonbg.com, 0 -bonding.de, 0 bondora.com, 0 -bondora.ee, 0 -bonek.de, 0 bonitasoft.com, 0 bonjwa.de, 0 bonniercorp.com, 0 bonnier.news, 0 bonree.com, 0 -bonusesfera.com.br, 0 -bookacan.com, 0 -bookandtrip.ru, 0 -bookandtrip.ua, 0 -bookbet23.com, 0 bookcdn.com, 0 bookcity.club, 0 booked.net, 0 -bookinbudapest.com, 0 bookingpoint.net, 0 bookmanager.com, 0 -bookmap.com, 0 bookmate.com, 0 book.ru, 0 booksfree4u.tk, 0 bookshop.ru, 0 -booksrun.com, 0 -booktory.com, 0 -booktype.pro, 0 book-ye.com.ua, 0 -bookzone.ro, 0 boombate.com, 0 boomer.sk, 0 boosj.com, 0 -boothamschool.com, 0 bootstrapstudio.io, 0 -borfast.com, 0 -borges.es, 0 borimed.com, 0 borjdental.ir, 0 bork.ru, 0 -bornemann.net, 0 borsonline.hu, 0 -bose.res.in, 0 -bosscasino.eu, 0 botevgrad.com, 0 -botnet.cc, 0 bot.nu, 0 -botreetechnologies.com, 0 -botscript.ir, 0 botzone.org, 0 -boukal.cz, 0 bounceme.net, 0 -bouncepingpong.com, 0 bourky.cz, 0 boutique-parfums.fr, 0 bov.com, 0 -boweihe.me, 0 -bowwowinsurance.com.au, 0 -boxcar.io, 0 boxed.com, 0 -box-evidence.com, 0 boxueio.com, 0 boyans.net, 0 -boyhost.cn, 0 -boypoint.de, 0 -boysonyourscreen.org, 0 boytrap2.net, 0 bozhong.com, 0 -boziking.com, 0 bozza.ru, 0 bplaced.net, 0 -bpmsg.com, 0 bq.sg, 0 -braas.de, 0 brainient.com, 0 brainpad.co.jp, 0 -brainsoftware.org, 0 -brainwave-research-institute.com, 0 branchable.com, 0 -brandica.ir, 0 -brandos.se, 0 -brankovucinec.com, 0 -bravecollective.com, 0 -braveineve.com, 0 bravosupermarket.az, 0 -br.com, 0 br.de, 0 -breachalarm.com, 0 breakingmuscle.com, 0 -breitling.co.jp, 0 bremerhaven.de, 0 -bremsspur.org, 0 bresser.de, 0 -bretty.de, 0 -brewers.com, 0 -brg14.at, 0 -bricker.info, 0 bricker.ru, 0 bricofer.it, 0 bricomarche.pt, 0 -bridgeresort.ru, 0 -brightbox.com, 0 -brightsignnetwork.com, 0 brightwallpapers.com.ua, 0 briian.com, 0 brilliancce.com, 0 -bringo247.ru, 0 -brn.cz, 0 -broadrichness.com, 0 brocent.com, 0 brodude.ru, 0 -broekhuis.nl, 0 -brokersjeans.com, 0 -bromium.com, 0 brot-fuer-die-welt.de, 0 brown-eyes.ru, 0 brownpapertickets.com, 0 brownsugar.tw, 0 browserdoktor.de, 0 browserleaks.com, 0 -browshot.com, 0 brra.bg, 0 brrc.ru, 0 -bruderste.in, 0 -brudno.com.ua, 0 -brusnika.ru, 0 bsau.ru, 0 -bscotch.net, 0 -bsi.si, 0 bsn.ru, 0 bspb.ru, 0 -bspect.com, 0 -bstester.com, 0 bstu.ru, 0 -bsuc.cc, 0 bsuir.by, 0 -bswj.net, 0 -bt2d.com, 0 btago.com, 0 btbtdy.com, 0 btcfans.com, 0 -btcinv4u.com, 0 btempurl.com, 0 btfx.net, 0 btime.com, 0 -btk-fh.de, 0 -btmgg.com, 0 btn-muenzen.de, 0 btpeer.com, 0 btrans.by, 0 -btsearch.co, 0 -btsearch.me, 0 btydt.com, 0 buaa.edu.cn, 0 bubi.cn, 0 -bucek.name, 0 -buchmann.ch, 0 bucketlist.org, 0 buct.edu.cn, 0 -budacode.com, 0 -bud-stroynoy.ru, 0 buffer.com, 0 bufs.ac.kr, 0 bugclose.com, 0 bugetul.ro, 0 -bugscan.net, 0 bugtags.com, 0 -bugunneleroldu.com, 0 -buhaoting.com, 0 buhgalter911.com, 0 buildabazaar.com, 0 -builder.eu, 0 builder.hu, 0 -builds.io, 0 -buildyourownguitar.com.au, 0 bukaba.com, 0 bukainfo.com, 0 -buklya.com, 0 bukmacherskie.com, 0 -bulkinkeys.com, 0 -bulkreefsupply.com, 0 -bulletsend.com, 0 bultannews.com, 0 bumimi.com, 0 bundesliga.at, 0 -bunkus.org, 0 bunz.com, 0 bupa.com.sa, 0 bupt.edu.cn, 0 -burenqi.com, 0 -burgerfuel.com, 0 -burgessyachts.com, 0 burjauto.com, 0 burningshed.com, 0 busfor.com, 0 -busfor.pl, 0 busfor.ru, 0 -business4all.ca, 0 business-gazeta.ru, 0 -businesshemden.com, 0 -businessinfo.cz, 0 -business-internet.biz, 0 businessportal.gr, 0 -business-software.com, 0 businessstudio.ru, 0 -businesstoday.co.ke, 0 -busmap.vn, 0 busqueda-local.es, 0 bussoladoinvestidor.com.br, 0 -busybeeschildcare.co.uk, 0 buyalenovo.com, 0 -buycheapr.com, 0 buyex.ir, 0 -buyunder500.in, 0 buzzerbeater.com, 0 -buzzhire.co, 0 bvbcode.com, 0 -bwt-group.com, 0 bybbs.org, 0 -byb.cn, 0 bydauto.com.cn, 0 -bydgoszcz.pl, 0 byethost10.com, 0 -byethost11.com, 0 -byethost12.com, 0 byethost13.com, 0 byethost14.com, 0 byethost15.com, 0 byethost16.com, 0 byethost17.com, 0 -byethost18.com, 0 byethost22.com, 0 byethost24.com, 0 byethost32.com, 0 @@ -2363,25 +1357,12 @@ byethost8.com, 0 byethost9.com, 0 byfen.com, 0 -byggahus.se, 0 bygmax.dk, 0 -byside.com, 0 -bytecdn.cn, 0 byte.fm, 0 -bytemag.ru, 0 -bz-bx.net, 0 -bzgame.cc, 0 -bzs.su, 0 -c2lab.ovh, 0 c4dcn.com, 0 -c7sky.com, 0 c9users.io, 0 caac.net, 0 caa.edu.cn, 0 -caat.org.uk, 0 -cableforum.co.uk, 0 -cabovillas.com, 0 -cadict.net, 0 cadstudio.ru, 0 cafe24.com, 0 cafekado.ir, 0 @@ -2394,179 +1375,93 @@ caijing.com.cn, 0 cailianpress.com, 0 cailiaoren.com, 0 -caimomo.com, 0 -cainiaoapp.cn, 0 -caisan.io, 0 caixin.com, 0 caknun.com, 0 caktusgroup.com, 0 calcudoku.org, 0 -calculator-imt.com, 0 calculatorpi.com, 0 -caldera.com, 0 californiasciencecenter.org, 0 callbackhunter.com, 0 calligra.org, 0 -callnote.net, 0 calmradio.com, 0 caltech.edu, 0 -calvarycare.org.au, 0 -calweb.com, 0 -calyptix.com, 0 -camayak.com, 0 cambiaresearch.com, 0 cambiaste.com, 0 -cambio.se, 0 -cambodia-airports.aero, 0 -cambsed.net, 0 camelia.lt, 0 camellia-sinensis.com, 0 cameron.edu, 0 -cameronsino.com, 0 camisetanerd.com, 0 -camlab.co.uk, 0 camonster.com, 0 -campaignmaster.co.uk, 0 camping.info, 0 -camping-penhoat.com, 0 camptocamp.com, 0 -campusgifts.co.uk, 0 campyokwe.org, 0 -canaan.io, 0 -canadianarchitect.com, 0 -cancer.gov.co, 0 -cancerimagingarchive.net, 0 -candsleads.com, 0 -candy.it, 0 canfreee.com, 0 cang.com, 0 canliligtvseyret.org, 0 -canoe.ie, 0 canpars.ca, 0 -cantr.net, 0 -can-tv.cn, 0 can.ua, 0 -caobai.com, 0 caogen8.co, 0 caoliuporn.com, 0 -capeanalytics.com, 0 -capitalmadrid.com, 0 -capital-match.com, 0 -capitalsports.de, 0 -captainbook.gr, 0 captaincontrat.com, 0 -captainverify.com, 0 -captiv8.io, 0 captivoice.com, 0 -captureone.cn, 0 -caracter.ru, 0 carambis.com, 0 carambis.ru, 0 -caravaning-univers.com, 0 cardcastgame.com, 0 -cardmarket.eu, 0 cardpay.com, 0 -cardq.co.kr, 0 -card-sharing.ru, 0 -cardwinner.com, 0 careerindex.jp, 0 -career.lk, 0 -careesma.in, 0 -carefy.com, 0 -careiphone.com, 0 carfix.ru, 0 cargeek.ir, 0 -carhire.ie, 0 caricatura.ru, 0 caritas.at, 0 carlab.co.kr, 0 carnoc.com, 0 carpediem.cd, 0 -carptime.ru, 0 carrefourinternet.com, 0 -carreirafashion.com.br, 0 -carsbase.com, 0 cars.kg, 0 -cars-promo.com, 0 -carta.ro, 0 carteblanchepartenaires.fr, 0 -cartft.com, 0 cartridgesave.co.uk, 0 carus-verlag.com, 0 -car.uz, 0 casadocodigo.com.br, 0 casaley.com.mx, 0 -casalomacollege.edu, 0 cas.cz, 0 case24.it, 0 -caseloadmanager.com, 0 -cash24.ru, 0 -cashlai.com, 0 casicloud.com, 0 casinuevo.net, 0 caspian.aero, 0 cass.cn, 0 castavote.it, 0 casting360.com, 0 -castrol-original.ru, 0 -casualgamers.club, 0 catalinahub.net, 0 catalysts.cc, 0 catfan.me, 0 -catharinehill.com.br, 0 -cathay-ins.com.cn, 0 -catholic.edu.au, 0 -catie.ac.cr, 0 catlin.edu, 0 cattry.com, 0 -catwalkwholesale.com, 0 cau.edu.cn, 0 causeway.com, 0 -cavinnash.at, 0 cawi.fr, 0 -caykaragazetesi.com, 0 -cayneshousewares.com, 0 cazin.net, 0 -cba.pl, 0 cbbank.com, 0 -cbc.rs, 0 cbda.cn, 0 -cbk.waw.pl, 0 c-brains.jp, 0 cbri.res.in, 0 -cbsi.com, 0 -cbsig.net, 0 ccav1.com, 0 ccav1.me, 0 ccav.info, 0 ccb.com, 0 -ccc.ac, 0 -cccamonde.com, 0 cccampass.com, 0 ccc.de, 0 cccm.com, 0 cccpmo.com, 0 cccyun.cc, 0 ccdi.gov.cn, 0 -cce.cz, 0 ccf.com.cn, 0 -ccgenbr.com.br, 0 -ccit.js.cn, 0 cclonline.com, 0 ccpph.com.cn, 0 -cctin.com, 0 -cctld.ru, 0 -cdbbank.az, 0 cdc.im, 0 cdcoslm.com, 0 cdeway.com, 0 cdfgj.gov.cn, 0 -cdischina.com, 0 cdmarf.ru, 0 -cdm.org, 0 -cdn3x.com, 0 -cdnbetcity.com, 0 -cdrinfo.pl, 0 cds.spb.ru, 0 cdu.edu.ua, 0 cdut.edu.cn, 0 @@ -2574,93 +1469,45 @@ cdvpodarok.ru, 0 cea.gov.cn, 0 ceair.com, 0 -ceamadeus.com, 0 cecb2b.com, 0 ce.cn, 0 cedarhd.com, 0 -cedrus.hu, 0 -ceeji.net, 0 -cefa.com, 0 ce.gov.br, 0 -ceh9.tv, 0 cehome.com, 0 cei.com.cn, 0 cekid.com, 0 -ceknito.cz, 0 -ceknito.sk, 0 -celakaja.lv, 0 celemony.com, 0 -celera-group.com, 0 celesc.com.br, 0 -celignes.com, 0 -cellstat.net, 0 celulardireto.com.br, 0 -censhare.com, 0 censys.io, 0 centaline.com.cn, 0 center-inform.ru, 0 -centeva.com, 0 -cention.se, 0 centiumsoftware.com, 0 centminmod.com, 0 -centracom.com, 0 centralclubs.com, 0 -centralhealth.com.hk, 0 -centralmenu.com.pt, 0 centralpark.com, 0 centralstationcrm.net, 0 -centredeliquidationduquebec.com, 0 centreon.com, 0 centriohost.com, 0 -centroimpiego.it, 0 -centrora.com, 0 -centrzaimov.ru, 0 -cenynadne.sk, 0 cephaiti.ht, 0 -cephastanesi.org, 0 ceph.org.cn, 0 -ceramique.com, 0 -cerfrance.fr, 0 -certbase.de, 0 -certissim.com, 0 -certitudes.org, 0 -cert.org.cn, 0 cesan.com.br, 0 -cesanta.com, 0 -cesareox.com, 0 -cesco.co.kr, 0 ces.edu.uy, 0 cesurformaciononline.com, 0 -cetc.com.cn, 0 -cetera.ru, 0 -ceu.edu.ph, 0 ceva.com, 0 ceve-market.org, 0 -cev.lu, 0 cez.cz, 0 cez.ro, 0 -cezurity.com, 0 -cf2016.ru, 0 cfdsupport.com, 0 -cfei.net, 0 -cfldcn.com, 0 -cflex.com, 0 -cfpd.org.cn, 0 -cg976.fr, 0 -cgilfe.it, 0 cgil.it, 0 cgpersia.ru, 0 cgs.gov.cn, 0 cgu.edu.tw, 0 -chachazhan.com, 0 chacuo.net, 0 -chadis.com, 0 chaicp.com, 0 chainfire.eu, 0 chains.cc, 0 -chainsea.com.tw, 0 chain.so, 0 -chaiwubi.com, 0 chalmers.se, 0 chal-tec.com, 0 chamonet.com, 0 @@ -2672,7 +1519,6 @@ chanet.com.cn, 0 changan.com.cn, 0 changba.com, 0 -change38.ch, 0 changeip.net, 0 changingedu.com, 0 changyou.com, 0 @@ -2683,72 +1529,43 @@ chaoshanw.cn, 0 chapaiming.com, 0 charogh.com, 0 -charter.com, 0 -chartrank.com, 0 chat2desk.com, 0 chataoke.com, 0 chat-brasil.com, 0 chatcity.de, 0 chat-pt.com, 0 -chatruletka.com, 0 -chattermill.io, 0 chatti.de, 0 chaturbate.com.br, 0 -chatworld.de, 0 -chaxuntu.com, 0 chb.com.tw, 0 chcivyhodnejsienergie.cz, 0 chdbits.vip, 0 chd.edu.cn, 0 che300.com, 0 -cheapjerseysfree.com, 0 -cheatcodesiosandroid.com, 0 cheatorhackgames.com, 0 -cheatsandhack.info, 0 -cheatsgamehack.info, 0 chebaba.com, 0 -chebao.com.cn, 0 -checknow.co.uk, 0 cheers.com.tw, 0 -chefpartyswinger.com, 0 cheladmin.ru, 0 chelcenter.ru, 0 chelm.pl, 0 chel.ru, 0 chem99.com, 0 -chemistry.org.tw, 0 -chemweb.com, 0 -chengduair.cc, 0 chengdu.cn, 0 -chengniu.com, 0 chengzivr.com, 0 -chennaihalls.in, 0 chenxingweb.com, 0 chenyudong.com, 0 cherinfo.ru, 0 -chernigiv-rada.gov.ua, 0 -cheros.ru, 0 -chers.com.ua, 0 cherubicsoft.com, 0 -cheryjaguarlandrover.com, 0 chesspuzzle.net, 0 chess-samara.ru, 0 chevy-clan.ru, 0 -chexch.com, 0 -chexiu.cn, 0 -chgaki.ru, 0 -chgik.ru, 0 chiapas.gob.mx, 0 chia.ua, 0 chickenkiller.com, 0 chicrank.ir, 0 childdevelop.com.ua, 0 -chiletrabajos.cl, 0 -chillglobal.com, 0 chinaar.com, 0 chinabluemix.net, 0 chinacache.com, 0 -chinacardpos.com, 0 china-cba.net, 0 chinachugui.com, 0 chinacloudapi.cn, 0 @@ -2757,105 +1574,56 @@ china.com.cn, 0 chinadaily.com.cn, 0 chinadance.cn, 0 -chinaeducationexpo.com, 0 chinaemail.cn, 0 -china-entercom.com, 0 -chinahr.com, 0 chinahrt.com, 0 chinamobile.com, 0 chinancce.com, 0 chinanetcenter.com, 0 -chinaoct.com, 0 chinaopple.com, 0 chinapiwei.com, 0 chinaports.com, 0 -china-post-track.com, 0 chinasalestore.com, 0 china-shftz.gov.cn, 0 -chinaums.com, 0 -chinaunicom.cn, 0 -chinayasha.com, 0 chineseall.cn, 0 chinesecio.com, 0 chinesegamer.net, 0 chinesetest.cn, 0 -chinlingo.com, 0 chint.com, 0 chipfind.ru, 0 -chipic.ir, 0 -chitaitext.ru, 0 -chither.com, 0 -chkaja.com, 0 -chnlanker.com, 0 -chocolissimo.de, 0 choices360.com, 0 -choisirsonfioul.fr, 0 -chongmoa.com, 0 -chopacho.ru, 0 -chordshub.com, 0 chorus.ai, 0 chrdk.ru, 0 -chrihani.com, 0 chrishogan360.com, 0 -christenenvoorisrael.nl, 0 -christianliebel.com, 0 -christian-luetgens.de, 0 chronicle.co.zw, 0 chroniclejournal.com, 0 chsu.ru, 0 -chtodelat.com, 0 chuangkit.com, 0 -chuangkoo.com, 0 chuanke.com, 0 -chu-dijon.fr, 0 chudobilet.ru, 0 -chudu24.com, 0 chuhai.edu.hk, 0 -chuhai.hk, 0 chujianapp.com, 0 -chunk.com.cn, 0 chuvsu.ru, 0 -chuyhiep.net, 0 -chv.ua, 0 -chytryhonza.cz, 0 -chzu.edu.cn, 0 ci123.com, 0 cib.com.cn, 0 -ci-bi.ru, 0 cicams.ac.cn, 0 cicon.ru, 0 -cidcode.net, 0 ciencia-ficcion.com, 0 ciftlikbank.com, 0 -cifttik.com, 0 -cig.com.cn, 0 -cik.bg, 0 -cimb.com, 0 cimex.com.cu, 0 -cimt.de, 0 -cindasc.com, 0 -cinecoffee.com, 0 cinemacity.hu, 0 cinemapark.ru, 0 cinematik.net, 0 cinestarcinemas.rs, 0 -cinoherniklub.cz, 0 ciob.org, 0 -cipcipstore.it, 0 ciper.cl, 0 -cipf.es, 0 -circuitodejerez.com, 0 circulaire-en-ligne.ca, 0 cirici.com, 0 ciscoexam.online, 0 -cislink.com, 0 citadele.lt, 0 citationprocessingcenter.com, 0 cit.edu.tw, 0 citicsf.com, 0 -citictel-cpc.com, 0 citrio.com, 0 -cits.br, 0 citsgbt.com, 0 cittadellasalute.to.it, 0 cityads.com, 0 @@ -2863,191 +1631,111 @@ city.kharkov.ua, 0 cityshop.com.cn, 0 citytaxi.az, 0 -city-wohnen.de, 0 -ciu20.org, 0 -ciuvo.com, 0 civey.com, 0 -civilavia.info, 0 -cizgi.com.tr, 0 -cjh.com.cn, 0 cjlu.edu.cn, 0 -cjwsjy.com.cn, 0 ck12info.org, 0 ck180.com, 0 -ckclouds.com, 0 ck-modelcars.de, 0 clammr.com, 0 -clang.cn, 0 clans.de, 0 clansweb.com, 0 clarin.com, 0 -clark-chen.com, 0 -clarocloud.co.za, 0 classicalarchives.com, 0 classic-gaming.net, 0 -classit.ro, 0 -classmethod.info, 0 -clayboxltd.com, 0 -clayesmore.com, 0 -cleanenergywire.org, 0 cleanlinesurf.com, 0 -cleanpix.com, 0 -cleanvoice.ru, 0 -clearcast.co.uk, 0 clearch.org, 0 -clear-code.com, 0 clearscore.com, 0 clearwebstats.com, 0 -clemensotto.com, 0 cles.jp, 0 cleveroad.com, 0 -cleversite.ru, 0 cleversubtitles.ru, 0 clewm.net, 0 clickad.info, 0 clickers.info, 0 -clickpayment.ir, 0 click.uz, 0 clickview.com.au, 0 cliclavoroveneto.it, 0 client-shop-logistics.ru, 0 client.xzn.ir, 0 cli.im, 0 -clilk.com, 0 climate-kic.org, 0 -clinicbuddy.com, 0 -clio.it, 0 -clip.af, 0 clippersync.com, 0 -clir.org, 0 clockshop.ru, 0 -cloud4you.biz, 0 -cloud4y.ru, 0 cloud86.cn, 0 cloudapp.net, 0 -cloudcampus.cc, 0 cloudcc.com, 0 clouddn.com, 0 cloudfire.ir, 0 cloudfront.net, 0 -cloud.geek.nz, 0 cloudin.cn, 0 cloudlinux.com, 0 cloudme.com, 0 cloud-mine.online, 0 -cloudns.cc, 0 cloudonaut.io, 0 -cloudparse.com, 0 cloudrexx.com, 0 cloudrino.net, 0 -cloudron.io, 0 cloudsite.ir, 0 -cloudsmart.lu, 0 -cloudsms.com.ng, 0 -cloudsplus.com.cn, 0 clouds.tf, 0 cloudtv.bz, 0 cloudvhost.cn, 0 cloudware.jp, 0 -cloudxink.com, 0 -club3.cf, 0 -clubdesavantages.fr, 0 -clubs1.bg, 0 clutchpoints.com, 0 clzg.cn, 0 -cmaritime.com.cn, 0 -cmbi.com.hk, 0 -cmc.gv.ao, 0 -cmcnu.or.kr, 0 cmeiwei.com, 0 -cmfchina.com, 0 -cmgame.com, 0 -cmgine.net, 0 cml.pt, 0 cmlt.ru, 0 cmonitor.pl, 0 -cmscafe.ru, 0 cms.gov.af, 0 cms-guide.com, 0 cm-sintra.pt, 0 cmsky.com, 0 -cmtt.ru, 0 cmu.ac.th, 0 cmu.edu, 0 cmu-edu.eu, 0 cnaidai.com, 0 -cnbb.com.cn, 0 cnblogs.com, 0 -cnbluebox.com, 0 cncf.io, 0 cndhl.com, 0 cnexps.com, 0 cnfeol.com, 0 -cngaosu.com, 0 cngold.org, 0 cn-healthcare.com, 0 cnhnb.com, 0 cnhubei.com, 0 -cnic.cn, 0 cnki.net, 0 cnkrl.cn, 0 -cnl.sk, 0 cnl.su, 0 -cnl.tv, 0 -cnoa.cn, 0 cnooc.com.cn, 0 cnool.net, 0 cnpatent.com, 0 cnpq.br, 0 -cnprint.org, 0 -cnpzhe.com, 0 cnr.cn, 0 cnseay.com, 0 cnsecer.com, 0 cnshb.ru, 0 cnsuning.com, 0 -cnsuning.com.hk, 0 -cntaiping.com, 0 -cnte.tn, 0 cnt.my, 0 cntraveller.ru, 0 cntv.cn, 0 -cnxct.com, 0 cnx-software.com, 0 coaching-foot.com, 0 -coap.kz, 0 cocha.com, 0 -cocobongo.com, 0 cocoking.info, 0 cocoleech.com, 0 codacy.com, 0 co.de, 0 codeaurora.org, 0 -codebeer.ru, 0 codebox.ir, 0 -codecanyonwp.com, 0 codecasts.com.br, 0 codeclic.com, 0 codeforge.cn, 0 codeforge.com, 0 codefresh.io, 0 code-industry.net, 0 -codelife.me, 0 codemao.cn, 0 -coderknock.com, 0 coder-note.com, 0 -code-route.info, 0 -coding-academy.fr, 0 -coding.io, 0 -coduka.de, 0 -coffee-butik.ru, 0 -cofina.pt, 0 cofm.es, 0 -cofpo.org, 0 -coi.cz, 0 -coinflux.com, 0 coinjar.com, 0 -coinjar.com.au, 0 coinkeeper.me, 0 coinpalace.io, 0 coinsbank.com, 0 @@ -3055,122 +1743,64 @@ coinsup.com, 0 colasoft.com, 0 colasoft.com.cn, 0 -colbeh.ir, 0 -coldline.hu, 0 colettehq.com, 0 -colibri.io, 0 collabora.com, 0 collaboraoffice.com, 0 collaborative.org, 0 -collect.ai, 0 collectivefab.com, 0 -collegeblondin.qc.ca, 0 collegemarching.com, 0 -collibra.com, 0 collsk12.org, 0 -colobot.info, 0 coloproperty.com, 0 color.com, 0 -colornumbers.ru, 0 -color-print39.ru, 0 -colourlife.com, 0 -colproba.org.ar, 0 -coma.lv, 0 -com.be, 0 combowombo.ru, 0 combr.ru, 0 -comein.sk, 0 -comeitaliani.it, 0 -comelite-arch.com, 0 -comelz.com, 0 -comeremcasa.com, 0 -comfone.com, 0 -comicool.cn, 0 -comics-porno.ru, 0 com.kz, 0 -comlan.com, 0 comli.com, 0 comlu.com, 0 -commaster.net, 0 -commcenter.es, 0 -commerceduniya.com, 0 commonhealth.com.tw, 0 -commonkindness.com, 0 commotionwireless.net, 0 -comm-tec.de, 0 -communications.support, 0 compagniedumontblanc.fr, 0 -companeo.be, 0 companeo.com, 0 -compariimobiliare.ro, 0 compass.education, 0 -compassplus.ru, 0 -complexityexplorer.org, 0 -comptable-en-ligne.fr, 0 -compulab.co.il, 0 compumatrix.co, 0 -compumatrix.us.com, 0 -compumed.com.my, 0 -compusoluciones.com, 0 -computerads.ir, 0 -computershop.pisa.it, 0 computrabajo.com, 0 computrabajo.com.hn, 0 -com.se, 0 comss.ru, 0 comstats.de, 0 -comtech.com.cn, 0 comtradeshop.com, 0 comune.siena.it, 0 comxa.com, 0 conanwiki.org, 0 -concordemed.com, 0 conde.com, 0 condenast.co.uk, 0 condenast.ru, 0 confessionsofahomeschooler.com, 0 -confmaster.net, 0 conglinnet.com, 0 congm.in, 0 connectedly.com, 0 -connectify.com, 0 connectify.me, 0 co.no, 0 -conpoint.com, 0 conseil-config.com, 0 conseq.cz, 0 -conservatoriotorino.gov.it, 0 -construction411.com, 0 -consulimus.de, 0 consultant.ru, 0 consumerscompare.org, 0 contabo.host, 0 contactlab.com, 0 conta.mobi, 0 contao.org, 0 -conte.by, 0 content-cooperation.com, 0 -continentalcarbonic.com, 0 contractiq.com, 0 contragents.ru, 0 -controlerp.org, 0 -controletechniquegratuit.com, 0 converter.cz, 0 convex.ru, 0 coobar.com, 0 coodoor.com, 0 -coohua.com, 0 -cook-key.de, 0 -cook-key.it, 0 coolapk.com, 0 coolapkmarket.com, 0 -coolbaby.ru, 0 -coolion.com, 0 coolnull.com, 0 coolyun.com, 0 coop-game.com, 0 coop.py, 0 -coore.jp, 0 copasa.com.br, 0 copel.net, 0 copiny.com, 0 @@ -3179,406 +1809,213 @@ co.pt, 0 copybet.com, 0 copy.sh, 0 -copytrack.com, 0 -coracle.com, 0 -coradir.com.ar, 0 coral-club.com, 0 -cordoba.es, 0 -corecodec.com, 0 -coreinfrastructure.org, 0 -corelan.be, 0 -corenominal.org, 0 corepacks.com, 0 -core-rpg.net, 0 cornell.edu, 0 -corrections.govt.nz, 0 -corsocomo.com, 0 -cortona3d.com, 0 -co.ru, 0 -cosmobase.ru, 0 -cosmos.ru, 0 -cotonti.com, 0 counsellingresource.com, 0 countryclubworld.com, 0 countrygarden.com.cn, 0 -couponkun.jp, 0 coursinformatiquepdf.com, 0 cowlevel.net, 0 co.za, 0 cp247.net, 0 -cpanel.ir, 0 -cpapd.org.cn, 0 -cp.com.cn, 0 cpc.vn, 0 cpic.com.cn, 0 -cplusplus.me, 0 cpmchina.co, 0 -cpnv.ch, 0 -cpoc.cn, 0 -cppcc.gov.cn, 0 -cprsweb.com, 0 -cpsite.ru, 0 cpygames.com, 0 -cq118.com, 0 -cqgh.org, 0 cqjtu.edu.cn, 0 cqnews.net, 0 cqsq.com, 0 cqtimes.cn, 0 cqu.edu.cn, 0 cqupt.edu.cn, 0 -cr911.ru, 0 -cra0vision.net, 0 crackberry.com, 0 -crack-cheat.ru, 0 -crackhogar.com, 0 crackingking.com, 0 craftmann.ru, 0 crate.io, 0 craym.eu, 0 -crazycen.com, 0 -crazyguyonabike.com, 0 -crazyhotseeds.com, 0 crb-dnr.ru, 0 crcc.cn, 0 crc.com.cn, 0 -crc.com.hk, 0 -crdclub.su, 0 creagames.com, 0 creartest.com, 0 createjs.cc, 0 -createsurvey.ru, 0 -creativcdn.net, 0 credit2go.cn, 0 credit-card.ru, 0 creditchina.gov.cn, 0 creditolo.de, 0 crediton.ge, 0 -creditonline.hu, 0 -crediton.lv, 0 -crefal.edu.mx, 0 -cretaforce.gr, 0 crevalue.cn, 0 cribs.me, 0 cri.cn, 0 crictracker.com, 0 crimea.com, 0 crimea.ru, 0 -criogenizado.com, 0 crisp.im, 0 -crm-simple.com, 0 -crmtipoftheday.com, 0 crn.ru, 0 -croc-informatique.fr, 0 croc.ru, 0 -crocus-hall.ru, 0 croix-rouge.fr, 0 cronista.com, 0 -cronobet.com, 0 cronodeal.ch, 0 croppola.com, 0 cross-area.com, 0 -crouse.org, 0 crous-toulouse.fr, 0 crowdtangle.com, 0 -crsc.cn, 0 -crt.ru, 0 crtslt.com, 0 cruisingworld.com, 0 cruzados.cl, 0 -crypters.ru, 0 -cryptogods.net, 0 -cryptomator.org, 0 -cryptshare.com, 0 -crystalvoice.sg, 0 cs12333.com, 0 csa.fr, 0 csair.com, 0 -csbaonline.org, 0 cscec.com, 0 csc.fi, 0 cs.co.nz, 0 -csdb.cn, 0 -csd.org.tw, 0 cse.ru, 0 -csf.fr, 0 -csfunds.com.cn, 0 csg.cn, 0 csgoblaze.com, 0 csgo.com, 0 -csgodestroy.com, 0 csgofast.com, 0 csgo-fate.ru, 0 -csgogamers.com, 0 csgohouse.org, 0 csgola.com, 0 -csgoloot.com, 0 csgoshop.com, 0 csgo.tm, 0 csh.org.tw, 0 -cshr.com.cn, 0 -cshrss.gov.cn, 0 -cs-htc.com, 0 csicr.cz, 0 csie.org, 0 -csi.it, 0 csi-net.it, 0 -cska.ru, 0 cskin.net, 0 -csldbz.gov.cn, 0 -cslg.cn, 0 csmania.ru, 0 -csna.cn, 0 csob.sk, 0 -csopa.hu, 0 csrc.ac.cn, 0 csrc.gov.cn, 0 -csroller.ru, 0 cssbuy.com, 0 csscompressor.com, 0 csserv.ru, 0 csswg.org, 0 cstnet.cn, 0 -c-stud.ru, 0 csumentor.edu, 0 -csvt.qc.ca, 0 csvw.com, 0 ct10000.com, 0 ct8.pl, 0 ctfeshop.com.cn, 0 ctfmall.com, 0 -cto1.ru, 0 ctolib.com, 0 ctrip.com, 0 -ctrlworks.com, 0 c-t-s.ru, 0 -ctx.zone, 0 -cubalan.com, 0 -cubeisland.de, 0 cubingchina.com, 0 -cuc.ac.jp, 0 cuca.co.ao, 0 cuccfree.com, 0 cuc.edu.cn, 0 -cu-elbayadh.dz, 0 cuentosparadormir.com, 0 cuevana-movil.com, 0 cuhk.edu.hk, 0 -cuintouch.com, 0 cuiqingcai.com, 0 cuizituan.com, 0 cuk.pl, 0 -cultizone.fr, 0 -cu.ma, 0 cumt.edu.cn, 0 -cupcakeproject.com, 0 cupet.cu, 0 cup.ir, 0 -cure53.de, 0 -curitzjt.cf, 0 currencyrate.today, 0 -curriculum-web.com, 0 -curs.md, 0 cursomeca.com, 0 -cuspy.org, 0 customs4u.com, 0 customs.ru, 0 -cuteness.com, 0 cutestat.com, 0 cutv.com, 0 -cv.ee, 0 -cv.lv, 0 -cvmc.org, 0 -cvonline.lt, 0 cvp.com, 0 cvte.com, 0 cvut.cz, 0 -cw1.tw, 0 cwbook.com.tw, 0 cw.com.tw, 0 -cwdsellier.com, 0 cwt-online.com.cn, 0 cx580.com, 0 -cxcyds.com, 0 cxhxrz.com, 0 -cxstar.com, 0 -cybercrime.gov.ua, 0 -cyberdefense.jp, 0 cyberduck.io, 0 -cybergun.it, 0 cyberoam.com, 0 -cyberprofs.com, 0 -cybersitter.com, 0 cybo.com, 0 -cyclestore.com.es, 0 cyclestore.co.uk, 0 -cycleworld.com, 0 -cycloneshockey.com, 0 cycu.edu.tw, 0 cyklobazar.cz, 0 cyolito.com, 0 cyotek.com, 0 -cyscorpions.com, 0 -cytbj.com, 0 cyut.edu.tw, 0 -czcg.com, 0 czech.cz, 0 -czechgames.com, 0 -czech-games.net, 0 czechia.com, 0 -cz-pes.cz, 0 -czsmk.com, 0 czxiu.com, 0 -d2fan.com, 0 -dabtc.com, 0 dactylocours.com, 0 dadaabc.com, 0 -dadacps.com, 0 dadasoft.net, 0 daddyleagues.com, 0 -dadget.ru, 0 daewooenc.com, 0 daewoong.co.kr, 0 dafabet.com, 0 dafangya.com, 0 dafangya.com.cn, 0 daft.ie, 0 -dahe.cn, 0 dahuangbbs.com, 0 dahuatech.com, 0 -dahuitu.net, 0 daichuqu.com, 0 -daily-movies.ch, 0 dailynews.co.th, 0 dailystandard.com, 0 -dairyfarmgroup.com, 0 dajia365.com, 0 dajie.com, 0 -dalasterisk.com, 0 -dalcroze.ch, 0 -dalegames.com, 0 daling.com, 0 -dalinuosi.lt, 0 -damailicai.com, 0 -dameiketang.com, 0 -damochka.ru, 0 -danar.ru, 0 -danbistore.com, 0 -danceconvention.net, 0 -daneiakartes.info, 0 -danet.vn, 0 dangbei.com, 0 dangdang.com, 0 -danilova.pro, 0 dankstop.com, 0 -dan.me.uk, 0 -danmuji.cn, 0 -dannysite.com, 0 -dansezza.ru, 0 daoiqi.com, 0 daojia.com, 0 daojia.com.cn, 0 daojia-inc.com, 0 daoyoudao.com, 0 -dapa.ir, 0 daparto.de, 0 -dapenti.com, 0 dapiniu.com, 0 -dapmalaysia.org, 0 -dapurcokelat.com, 0 daren.pro, 0 -daricheno.com, 0 -darkbyte.ru, 0 -darkko.net, 0 -darklight.online, 0 dark-night.me, 0 -darkseed.fr, 0 darksidecc.com, 0 darktech.org, 0 dark-time.com, 0 daroo.by, 0 daroo.ru, 0 -da.ru, 0 daryo.uz, 0 dasannetworks.com, 0 dataart.com, 0 datacaciques.com, 0 -datacave.ch, 0 -dataexpress.com.tw, 0 datagate.ee, 0 data.gouv.fr, 0 -data.gov.hk, 0 -datagroup.ua, 0 -datakrat.ru, 0 dataobject.hu, 0 -datapath.io, 0 -dataspeex.de, 0 datastory.com.cn, 0 datayes.com, 0 datayuan.cn, 0 -datazucar.cu, 0 -datek.cn, 0 -datepanchang.com, 0 datys.cu, 0 -daukce.cz, 0 -daunix.com, 0 -dautermann.io, 0 daveramsey.com, 0 -davidrm.com, 0 davidshuttle.com, 0 -davinciapps.com, 0 davin.work, 0 -davispolk.com, 0 -davra.uz, 0 dawang.tv, 0 dawsoncollege.qc.ca, 0 -daxx.com, 0 daybet24.com, 0 daybuy.tw, 0 daycare.com, 0 daydao.com, 0 dayezhifu.com, 0 dayhr.com, 0 -dayin.la, 0 -daythem.edu.vn, 0 -dazzlepod.com, 0 -dba-china.com, 0 dbappsecurity.com.cn, 0 -dbbest.com, 0 -dbelyaev.ru, 0 dbface.com, 0 dbpayment.com, 0 -dbscar.com, 0 dc.gov, 0 -dcits.com, 0 dcservices.in, 0 dctp.tv, 0 -ddc.ac.kr, 0 dd-dns.de, 0 -ddelivery.ru, 0 ddit.ac.in, 0 -ddky.com, 0 -ddn.com, 0 ddnsfree.com, 0 ddns.info, 0 -ddnsking.com, 0 ddns.me, 0 -ddns.ms, 0 -ddnss.de, 0 -ddns.us, 0 ddoddotv.com, 0 ddo.jp, 0 -ddol.es, 0 -ddoong2.com, 0 ddpai.com, 0 de1.cc, 0 -deaftone.com, 0 dealber.gr, 0 -dealhaitao.com, 0 -deals.mu, 0 deanza.edu, 0 -dearii.com, 0 -deartanker.com, 0 deathgrind.club, 0 debate.com.mx, 0 debeste.de, 0 @@ -3586,90 +2023,43 @@ debianforum.ru, 0 debian-handbook.info, 0 debian.net, 0 -debtcc.com, 0 debugme.eu, 0 de-clic.ro, 0 -decofire.pl, 0 -decoriko.ru, 0 dedibox.fr, 0 -dedicated.co.za, 0 -dedizones.com, 0 dedyn.io, 0 -deelkall.com, 0 -deeper.eu, 0 -deepgram.com, 0 -deepin.org, 0 deepoon.com, 0 deepss.co, 0 -defcon.ru, 0 defo.ru, 0 -defre.be, 0 deg.net, 0 -deichbrand.de, 0 -dejoris.de, 0 del.ac.id, 0 delaempokupki.ru, 0 delfi.ee, 0 delfi.lt, 0 delfi.lv, 0 -delhivery.com, 0 deliveryhero.com, 0 deliverymuch.com.br, 0 dell-brand.com, 0 delmagyar.hu, 0 -deloks.ru, 0 delovoymir.biz, 0 -delovoy-saransk.ru, 0 delsa.net, 0 delta.com.tw, 0 deltacredit.ru, 0 -delwi-itr.de, 0 demiart.ru, 0 demirbank.az, 0 demis.ru, 0 -demohoster.com, 0 demoup.com, 0 -denascorp.ru, 0 -denbusiness.ru, 0 -dengivsem.com, 0 -denibertovic.com, 0 -denkwerk.com, 0 -dentaid.es, 0 dentalspeedgraph.com.br, 0 -deondernemer.nl, 0 de-oosterpoort.nl, 0 depit.ru, 0 -depna.com, 0 depositphotos.com, 0 deppon.com, 0 -derbysoft.com, 0 derev-grad.ru, 0 -derinat.ru, 0 -dermustermann.de, 0 desamais.fr, 0 -descendentstudios.com, 0 desc-wondo.org, 0 -designeroutlets-wolfsburg.de, 0 -design-hero.ru, 0 -design-sites.ru, 0 -desu.me, 0 -detective-conan-vostfr.info, 0 -detivgorode.ua, 0 -detoatepentrutoti.ro, 0 -detsky-mir.com, 0 -dev2.in, 0 devbean.net, 0 -devel.cz, 0 -devicelock.com, 0 -devinotele.com, 0 deviq.com, 0 deviserweb.com, 0 devochki-i-igry.ru, 0 -devoffice.com, 0 -devsmm.com, 0 -devuan.org, 0 -dewaele.com, 0 -dezhou.gov.cn, 0 dezinfo.net, 0 dfacture.com, 0 dfb365.com, 0 @@ -3677,255 +2067,140 @@ dfss.com.cn, 0 dftb.cn, 0 dg.gov.cn, 0 -dgphoenix.com, 0 dgprocast.com, 0 dgso.cn, 0 dgut.edu.cn, 0 -dgx.io, 0 -dhammacitta.org, 0 dhb168.com, 0 -dhcp.com.br, 0 dh.hu, 0 dhis2.org, 0 -dhs.org, 0 dhu.edu.cn, 0 -dhyhost.com, 0 diakoweb.com, 0 -dialnice.info, 0 -diamondkeys.ru, 0 -diandianzu.com, 0 -dian.fm, 0 dianhun.cn, 0 dianjia.com, 0 dianjoy.com, 0 -dianlujitao.com, 0 -dianrui.com, 0 dianxiaomi.com, 0 diaox2.com, 0 diaoyuweng.com, 0 -diarioeltiempo.com.ar, 0 diarioregistrado.com, 0 diasporafoundation.org, 0 -dibpak.com, 0 -dicholding.com, 0 dicoding.com, 0 -diconium.com, 0 didatrip.com, 0 -diddlefinger.com, 0 -di-digo.com, 0 didispace.com, 0 -didtheyreadit.com, 0 didww.com, 0 -didyoumean-generator.com, 0 -die-auto-welt.de, 0 diedart1.com, 0 -diederichs.com, 0 -diego.hu, 0 -dieselaccess.com, 0 dieteren.be, 0 die-tier-welt.com, 0 -digger-online.ru, 0 digiboy.ir, 0 -digicom.net.ua, 0 digiexam.com, 0 digiexam.se, 0 digift.ru, 0 digikam.org, 0 digik.ir, 0 digitalcourage.de, 0 -digitaldruid.net, 0 -digitalero.rip, 0 -digital-forest.info, 0 digitalmarketing.jp, 0 digitalpad.co.jp, 0 -digitas.fr, 0 digitellmobile.com, 0 digito.com.tw, 0 -digix.io, 0 -dilekecza.com, 0 -dimensiondata.cloud, 0 dimonvideo.ru, 0 dinamicbet.com, 0 dinaserver.com, 0 -dingdone.com, 0 dingtalk.com, 0 dinnerqueen.net, 0 -diocese-frejus-toulon.com, 0 diocesismalaga.es, 0 -dior.cn, 0 -dipacademy.ru, 0 -dipaul.ru, 0 dip.jp, 0 diploma.de, 0 -directcall.com.br, 0 directemar.cl, 0 directgames.co.kr, 0 directg.net, 0 -directnews.gr, 0 -directoriocubano.info, 0 -directoriodelosaltos.net, 0 directpay.ir, 0 -directreal.sk, 0 dirindirin.com, 0 -dirox.net, 0 -dirteam.com, 0 dirtrider.com, 0 discharge.be, 0 -discotek.club, 0 -discoworld.dk, 0 -disfilm.cz, 0 diskingressos.com.br, 0 -diskret.de, 0 -diskstation.eu, 0 diskstation.me, 0 -displayfusion.com, 0 distance.ru, 0 -districenter.es, 0 -ditujiupian.com, 0 dituwuyou.com, 0 diulas.com, 0 -diva-e.com, 0 -diveinedu.com, 0 -divineengine.xyz, 0 divteam.com, 0 diychina.org, 0 diyidan.com, 0 -diyidan.net, 0 -dj66.net, 0 djcity.com.au, 0 djdelivery.com, 0 djduoduo.com, 0 djfansub.com, 0 djicorp.com, 0 -djjuniores.com, 0 dj.ru, 0 djv.de, 0 djvu-pdf.com, 0 djzmz.org, 0 dk.kz, 0 -dlang.org, 0 -dle-news.ir, 0 dlinkddns.com, 0 -dlinnov.com, 0 -dlsite.com.tw, 0 -dlt.com, 0 dm930.com, 0 dmall.com, 0 dmc.de, 0 dm.center, 0 dmeng.net, 0 dmnico.cn, 0 -dmww.com, 0 -dndz.tv, 0 dnevnik.ru, 0 -dniproavia.com, 0 dnpr.com.ua, 0 dnr24.su, 0 -dnrsovet.su, 0 dnsalias.com, 0 -dnsalias.org, 0 dnsbil.com, 0 dns.com.cn, 0 dnscrypt.org, 0 -dns-dns.com, 0 dnsisp.net, 0 dnspai.com, 0 dnsrv.ru, 0 -dnswa.com, 0 -dns.watch, 0 do1.com.cn, 0 -dobavim.ru, 0 dobot.cc, 0 -dobreobaly.cz, 0 docdoc.ru, 0 docer.com, 0 dockerapp.io, 0 -docland.ru, 0 docscrewbanks.com, 0 -docs-for-me.ru, 0 -doctorbormental.ru, 0 -doctorcom.com, 0 -doctormckay.com, 0 doctorspring.com, 0 doctrine.fr, 0 -doctu.ru, 0 documentfoundation.org, 0 -dodohome.com.tw, 0 -dodopal.com, 0 -do.edu.ru, 0 doefiratv.org, 0 dogechain.info, 0 dogovor24.kz, 0 -doguselektrik.com.tr, 0 -doido.ru, 0 -doi.gov, 0 doity.com.br, 0 dojobsonline.com, 0 -dojos.org, 0 -doki.co, 0 dokipedia.ru, 0 doktordanhaberler.com, 0 -doktornarabote.ru, 0 -dolabank.com, 0 dollaruz.com, 0 dolopo.net, 0 -dolorescannon.com, 0 -dom2-lifes.info, 0 -domain.by, 0 -domaintescil.com, 0 domashke.net, 0 -dom-decora.ru, 0 domeny.tv, 0 domex.do, 0 dominicos.org, 0 -dominos.by, 0 dominos.com.do, 0 dominos.ua, 0 domirobot.com, 0 -dom-land.com, 0 -domob.cn, 0 -domobile.com, 0 -domovid.ru, 0 -domovina.je, 0 -domtain.de, 0 domtele.com, 0 donationalerts.ru, 0 -donfishback.com, 0 dongao.com, 0 dongeejiao.com, 0 -dongjiang.com.cn, 0 dongshun3d.com, 0 -dongyoungsang.com, 0 donjons-tresors.com, 0 donland.ru, 0 donnons.org, 0 donya-digital.com, 0 -dooa.com, 0 dooland.com, 0 -doppelkopf-palast.de, 0 -doraemoney.com, 0 dorama.asia, 0 -doremir.com, 0 dornanet.net, 0 dornbracht.com, 0 -doroga.tv, 0 dor.org, 0 dorsafamily.ir, 0 doska.chita.ru, 0 -dosnap.com, 0 -dosp.org, 0 doswap.com, 0 dota2house.com, 0 dota2.net, 0 -dota2top.cn, 0 dothome.co.kr, 0 dotlan.net, 0 dotroll.com, 0 -dots-game.org, 0 dottnet.it, 0 dotunnel001.com, 0 dotunnel.com, 0 -dotw.com, 0 dou-bi.co, 0 doublemap.com, 0 doubletwist.com, 0 @@ -3934,223 +2209,116 @@ douran.com, 0 dowater.com, 0 dowerandhall.com, 0 -downarchive.link, 0 -down.lc, 0 downloadatoz.com, 0 downloadcenter.me, 0 -download-flow.com, 0 downloadgamesnow.org, 0 downloadmanager.ir, 0 download-redtube.eu, 0 -downloads-world.net, 0 doxue.com, 0 -dozer.cc, 0 dpap.ro, 0 dpb.sk, 0 -dpfs.net, 0 dp.gov.ua, 0 -dpg-physik.de, 0 -dpmb.cz, 0 dpm.org.cn, 0 dpo.cz, 0 -dprp.net, 0 dp.ru, 0 -dpsi.com, 0 dracoblue.net, 0 draeger.com, 0 dragonbound.net, 0 dragongoserver.net, 0 dragonknight.ru, 0 -dragonteam.ninja, 0 -dragplus.com, 0 -drakor.com, 0 -draw123.com.tw, 0 -drbd.org, 0 drdump.com, 0 -dreamaction.co, 0 dream.ren, 0 -dream-soft.de, 0 dreifisch.com, 0 drfakhar.ir, 0 -drgrab.ca, 0 drgrab.com, 0 drgrab.com.au, 0 -drgrab.co.nz, 0 drgrab.co.uk, 0 -driedfloralshop.com, 0 -drillseo.com, 0 -driptip.ru, 0 -dripworks.com, 0 -drive2day.de, 0 -drive-my.com, 0 driversnout.com, 0 -drlrcs.com, 0 drofa-ventana.ru, 0 -drogariasnissei.com.br, 0 -drohobych.net, 0 -droi.com, 0 droidbox.co.uk, 0 droidboxforums.com, 0 droidmod.ru, 0 droidwiki.de, 0 drom.ru, 0 -drone-forum.com, 0 -droneland.nl, 0 -dronk.ru, 0 dropscan.de, 0 -drtihanyi.com, 0 drugscouts.de, 0 -dschool.ru, 0 -dscloud.biz, 0 dscloud.me, 0 -ds.cn, 0 -dsd.gov.hk, 0 -dshield.org, 0 dsmynas.com, 0 dsnews.ua, 0 -dsphere.info, 0 -dsporto.de, 0 dss.go.th, 0 -dstu.education, 0 dsty.ac.jp, 0 -dszo.cz, 0 -dszysoft.com, 0 -dtcj.com, 0 -dtcom.com.br, 0 dtdns.net, 0 -dtempurl.com, 0 dtest.cz, 0 -dtest.sk, 0 -dtln.ru, 0 -du9l.com, 0 -dualnitro.com, 0 dualshockers.com, 0 duanzhihu.com, 0 duapp.com, 0 dubna.net, 0 dubtrack.fm, 0 -duc.cn, 0 duckdns.org, 0 duden.de, 0 -duguletian.com, 0 -duhowpi.net, 0 duia.com, 0 duiba.com.cn, 0 duitang.com, 0 dujin.org, 0 duke.edu, 0 -dukey.cn, 0 dumaosheng.com, 0 -duma.tomsk.ru, 0 -dumrt.ru, 0 dundi.in, 0 -duniapulsa.co, 0 dunkhome.com, 0 -duobeiyun.com, 0 duocaitou.com, 0 duoc.cl, 0 duoduotv.com, 0 -duohuo.org, 0 -duoluodeyu.com, 0 duplicationcentre.co.uk, 0 durdom.in.ua, 0 dushu.io, 0 -dusign.cn, 0 dusoyun.com, 0 -dustmoon.com, 0 dut.edu.ua, 0 dutpt.com, 0 -duxa.cc, 0 -dva.lu, 0 -dvbank.ru, 0 -dv-com.net, 0 dvdfab.cn, 0 dvfu.ru, 0 dvinaland.ru, 0 -dvr163.com, 0 dvrdns.org, 0 dwhd.org, 0 -dwhite.gr, 0 -dwkeji.com, 0 dx.am, 0 -dxdt.ru, 0 -dx-racer.cz, 0 -dy530.com, 0 -dy886.com, 0 dy.fi, 0 -dylog.it, 0 -dynabic.com, 0 dynalias.com, 0 dynalias.org, 0 dynamic-dns.net, 0 -dynamo-dresden.de, 0 -dyndns-at-home.com, 0 dyndns.biz, 0 dyndns.dk, 0 dyndns.info, 0 dyndns-ip.com, 0 -dyndns.pro, 0 -dyndns-remote.com, 0 dyndns-server.com, 0 dyndns.tv, 0 dyndns.ws, 0 dynns.com, 0 dynu.com, 0 -dynu.net, 0 -dyn-vpn.de, 0 -dzienniknaukowy.pl, 0 dzo.com.ua, 0 -dzs.cz, 0 dzsofts.net, 0 dzwww.com, 0 -e100.eu, 0 -e123.pw, 0 e2e4online.ru, 0 -e2say.com, 0 -e2time.net, 0 -e36.lv, 0 -e-actionlearning.jp, 0 eadaily.com, 0 -eae-publishing.com, 0 eagleplatform.com, 0 -ean-search.org, 0 eapteka.ru, 0 eareview.net, 0 -earthtreksclimbing.com, 0 easemob.com, 0 -easetou.com, 0 easeye.com.cn, 0 -easi-services.fr, 0 -eastal.com, 0 -eastcom.com, 0 eastday.com, 0 eastmachinery.com, 0 eastview.com, 0 -eastweb.ir, 0 easyapi.com, 0 easyaq.com, 0 -easyaq.org, 0 -easycoding.org, 0 -easycoin.cz, 0 easydrop.ru, 0 easyfly.club, 0 -easynotebooks.de, 0 easynvest.com.br, 0 easyon.cn, 0 easypano.com, 0 easypass.cn, 0 -easypay.bg, 0 easypm.cn, 0 -easysport.de, 0 -easytaxi.com.br, 0 easytoys.cz, 0 easyuni.com, 0 -easywebshop.com, 0 ebacheca.it, 0 -ebaoquan.org, 0 ebarrito.com, 0 ebase.com, 0 -eb.br, 0 ebesucher.com, 0 ebesucher.de, 0 ebesucher.es, 0 @@ -4159,407 +2327,232 @@ ebg.net, 0 ebible.org, 0 ebmpapst.com, 0 -ebnevelde.hu, 0 -eboo.ir, 0 ebookcn.com, 0 -ebottega.it, 0 ebptt.com, 0 ebrarbilgisayar.com, 0 ebs.org.cn, 0 -ebuick.com.cn, 0 -ecall.ch, 0 -ecbiz.ru, 0 eccom.com.cn, 0 -ecenter.travel, 0 ecf.asso.fr, 0 e-chinalife.com, 0 echo24.cz, 0 -echofabrik.de, 0 echosante.com, 0 echoteen.com, 0 -eckert-schulen.de, 0 -eclisse.it, 0 eclub.se, 0 ecmsglobal.com, 0 -ecn.cz, 0 ecnu.edu.cn, 0 -ecodms.de, 0 ecoin.cc, 0 -ecolex.org, 0 -ecom-labs.com, 0 -ecommerce.gov.ir, 0 economy.gov.az, 0 -economy.gov.by, 0 -economy.gov.ru, 0 eco.pt, 0 -ecorepay.cc, 0 -ecovacs-japan.com, 0 -ecovanna.ru, 0 -ecovita.ru, 0 ecpic.com.cn, 0 -ecplay.com, 0 ecrm.com.tw, 0 -ecu.ac.uk, 0 eczhuyin.com, 0 ed2k.in, 0 edaixi.cn, 0 edaixi.com, 0 edelweiss5.com, 0 edge-core.com, 0 -edia.nl, 0 -edifier.ru, 0 edigital.hu, 0 edinarcoin.com, 0 editions-ue.com, 0 -edizioni-ai.com, 0 edj.club, 0 -edmundwatson.com, 0 edm.uz, 0 edmw.xyz, 0 ednet.ns.ca, 0 edns.com, 0 edoc2.com, 0 edooon.com, 0 -edoramedia.com, 0 -edsonqueiroz.com.br, 0 edt02.net, 0 -edthena.com, 0 edu35.ru, 0 -edu4school.gr, 0 edu4schools.gr, 0 -edu53.ru, 0 -edu95.ru, 0 -eduasistent.ro, 0 educacion.gob.ar, 0 -educationalinitiatives.com, 0 educatorshandbook.com, 0 educom.ru, 0 -edu-family.ru, 0 eduherald.ru, 0 -edu.ky, 0 edu.kz, 0 edusite.ru, 0 edu.sk, 0 eduspb.com, 0 edu.te.ua, 0 edu.tomsk.ru, 0 -eduweb.com.ve, 0 -edznet.com, 0 eee.com, 0 eelly.com, 0 -eeload.com, 0 -eenot.com, 0 eeworld.com.cn, 0 -eexcel.com.hk, 0 eeyy.com, 0 efeihu.com, 0 -efenix.cz, 0 eff.org, 0 -effu.eu, 0 efko.ru, 0 -efm.de, 0 eforms.org, 0 efrei.fr, 0 efrontlearning.com, 0 -efsol.ru, 0 efsyn.gr, 0 efubo.com, 0 efun.com, 0 efunfun.com, 0 -efunkr.com, 0 efuntw.com, 0 efusion.co.jp, 0 -efw.cn, 0 efzg.hr, 0 -e-garakuta.net, 0 -egarante.com, 0 egent.ru, 0 -egmanga.com.tw, 0 egou.com, 0 egov66.ru, 0 egret.com, 0 -egret-labs.org, 0 egrp365.ru, 0 egrul-egrip.ru, 0 ehaoyao.com, 0 -ehbds.gov.cn, 0 -eheyin.com, 0 ehighsun.com, 0 ehm.cz, 0 ehousechina.com, 0 ehrana.si, 0 ehrmedijugrupa.lv, 0 eia.edu.co, 0 -eias.ru, 0 -eichsfeld-gymnasium.de, 0 eicp.net, 0 -eiffel.com, 0 eimagine.com, 0 eink.com, 0 e-inv.cn, 0 eircom.net, 0 -eisenbahn.com.br, 0 ejabberd.im, 0 ejarehkhodro.com, 0 ejieban.com, 0 -ejn.gov.ba, 0 ejsino.com, 0 -ejuice.cz, 0 -ekartki-swiateczne.pl, 0 eken.com, 0 e-koncept.ru, 0 -ekr.or.kr, 0 eksenbilgisayar.com, 0 -ekspresskonto.ee, 0 eks.sk, 0 -eku8.com, 0 -elabjournal.com, 0 elaion.ch, 0 -elane.ru, 0 elar.ru, 0 elasticbeanstalk.com, 0 -elasticrun.in, 0 -e-lationshop.de, 0 elblag.pl, 0 elbrus-zapchasti.ru, 0 -eldawlanews.com, 0 eldiadehoy.net, 0 eldorado.com.ua, 0 eldorar.com, 0 -e-lead.com.tw, 0 eleadglobal.com, 0 elec.ru, 0 -electriclove.at, 0 -electroflot.ru, 0 -electrofun.ro, 0 electro-mpo.ru, 0 electronic-star.ch, 0 electronic-star.cz, 0 electronic-star.es, 0 -electronic-star.fi, 0 electronic-star.fr, 0 electronic-star.hr, 0 electronic-star.hu, 0 electronic-star.it, 0 electronic-star.pl, 0 -electronic-star.pt, 0 electronic-star.ro, 0 -electronic-star.se, 0 electronic-star.si, 0 electronic-star.sk, 0 -elegantt.com, 0 -eleks.com, 0 elektra.ru, 0 elektronik-star.de, 0 -elektronline.hu, 0 -elemer.ru, 0 elem.mobi, 0 elenafurs.ru, 0 -elenet.me, 0 ele.to, 0 eletrosom.com, 0 elevenpaths.com, 0 elf.com.tw, 0 -elfdict.com, 0 elga.gr, 0 elgato.com, 0 -elgaucho.com, 0 eliademy.com, 0 -elinklaw.com, 0 -eliquidshop.cz, 0 -eliseparts.com, 0 elitesochi.com, 0 eliteunitedcrew.org, 0 elitmus.com, 0 elit.ro, 0 -elit.ua, 0 eliv-group.ru, 0 -elkomp.ru, 0 elkor.lv, 0 ellco.ru, 0 elleshop.com.cn, 0 ellwoodepps.com, 0 elm327rus.ru, 0 elma-bpm.ru, 0 -elmarplatense.com, 0 elmosanat.com, 0 elnet.by, 0 eloancn.com, 0 elotech.com.br, 0 -elpo.net, 0 -elpreciodelagasolina.com, 0 -elsa.org, 0 -elsu.ru, 0 eltallerdelbit.com, 0 elte.hu, 0 -eltek.com, 0 -elumbus-reisen.de, 0 elway.ru, 0 ely.by, 0 -emailbidding.com, 0 -emailtray.com, 0 emaintec.com, 0 -e-maker.com.tw, 0 emao.com, 0 -emaos.de, 0 emarbox.com, 0 emarsys.com, 0 -emasa.es, 0 embdev.net, 0 embedy.cc, 0 embl.de, 0 -emccann.net, 0 emcmos.ru, 0 -emcsthai.com, 0 -emediamusic.com, 0 -emediava.org, 0 emedi.gr, 0 emeil.ir, 0 -emeraldmatch.com, 0 -emergencymedicinecases.com, 0 -emg.ru, 0 emis.co.ao, 0 emlid.com, 0 -emmalabs.com, 0 emmaus-france.org, 0 emnuvens.com.br, 0 emo.org.tr, 0 emory.edu, 0 emos.cz, 0 -empathia.cz, 0 -empathy-portal.de, 0 empireofcode.com, 0 empleonuevo.com, 0 emprana.ru, 0 -empro.com.br, 0 emsb.qc.ca, 0 -ems.com.br, 0 -ems.network, 0 emtec.com, 0 -emtelco.co, 0 -emu.ee, 0 -emulatornexus.com, 0 -emza.ru, 0 enaa.com, 0 enablecloud.co.uk, 0 -enaces.com, 0 enact.co.uk, 0 ename.net, 0 -en-charente-maritime.com, 0 e-nci.com, 0 encipher.it, 0 -enco.com, 0 encoding.com, 0 endian.com, 0 endmyopia.org, 0 endomondo.com, 0 -endplay.com, 0 endpoint.com, 0 -energietec.eu, 0 energiezivota.com, 0 -energy.gov.ua, 0 -energylabel.gov.cn, 0 enflares.com, 0 -engagement.fr, 0 engineowning.com, 0 eng.it, 0 england.nhs.uk, 0 -english-club.tv, 0 englishtopics.net, 0 -engolit.de, 0 -eniac.ir, 0 -eniyikuafor.com, 0 -enjoitech.com, 0 -enkral.net, 0 -enlaza.mx, 0 -enl.wtf, 0 en-marche.fr, 0 e-norvik.eu, 0 -enow.cn, 0 -enportal.de, 0 enriccorberainstitute.com, 0 -enro-griffins.de, 0 ensage-forum.ru, 0 ensartaos.com.ve, 0 ensg.eu, 0 -entboost.com, 0 entega.de, 0 -entre-geeks.com, 0 entreleadership.com, 0 -entsog.eu, 0 -entware.net, 0 enu.kz, 0 -envirolink.org, 0 -envisioncn.com, 0 -enwebhost.com, 0 -eoft.eu, 0 -eos.ru, 0 -eos-uptrade.de, 0 eot.su, 0 epac.to, 0 -epafos.gr, 0 epam.com, 0 epanchang.com, 0 e-pard.com, 0 epaslaugos.lt, 0 -epast.org, 0 -e-paths.com, 0 -epawaweather.com, 0 epay.com, 0 -epay.lt, 0 -epcos.com, 0 -epd47.ru, 0 -epe.ir, 0 epetbar.com, 0 -ephotobay.com, 0 epicwow.com, 0 -epi.es, 0 epi.sk, 0 -epita.fr, 0 epitech.eu, 0 -epizod.ua, 0 epizy.com, 0 -epm.br, 0 -e-pointchina.com.cn, 0 epom.com, 0 epommarket.com, 0 -epos.dk, 0 -epremki.pl, 0 eprints.org, 0 eprocurement.gov.gr, 0 -eproton.cz, 0 epsic.ch, 0 eptonic.com, 0 epwk.com, 0 eq28.cn, 0 eqbal.ac.ir, 0 erasmusu.com, 0 -erdalcelebi.com, 0 -ergasianews.gr, 0 ericom.com, 0 erinn.biz, 0 -erinome.net, 0 -eronsk.xxx, 0 eropolis.hu, 0 eroticen.com, 0 erp-mz.ru, 0 -erpscan.com, 0 errrotica.com, 0 ershouhui.com, 0 -ertyu.org, 0 -esadn.com, 0 escapefromtarkov.com, 0 -escape-game.org, 0 escapes.ca, 0 escience.cn, 0 escolasecreches.com.br, 0 escorts2000.com, 0 -escuelassj.com, 0 esdict.cn, 0 -esearch.me, 0 eseemodel.com, 0 -e-seenet.com, 0 -esetafrica.com, 0 eset.kz, 0 es.gov.br, 0 eshangke.com, 0 @@ -4568,198 +2561,118 @@ eshuyuan.net, 0 esiea.fr, 0 esi.uz, 0 -eskalat24.ru, 0 -eskalat.biz, 0 -eskom.eu, 0 -eso-database.com, 0 eso.lt, 0 -esotravel.cz, 0 -espaciovino.com.ar, 0 -espago.com, 0 -esper.net, 0 -espol.edu.ec, 0 -esr-case.com, 0 esri.com, 0 -essaybox.org, 0 essayedge.com, 0 essencegold.com.br, 0 essentialpim.com, 0 estcard.ee, 0 -estet.ru, 0 -esteveterradas.cat, 0 estismail.com, 0 -estlandro.cc, 0 -estratosplus.com, 0 estreams.tv, 0 est.ua, 0 estudarfora.org.br, 0 -estudar.org.br, 0 -estudiantesdelaplata.com, 0 esu10.org, 0 esu3.org, 0 esu7.org, 0 -e-svatek.cz, 0 esxi.gr, 0 esy.es, 0 et8.org, 0 eta.cz, 0 etaex.com, 0 etagi.com, 0 -etalab.gouv.fr, 0 -etalasebisnis.com, 0 etaplius.lt, 0 -etarget.cz, 0 etb.net.co, 0 etcnetwork.tv, 0 -etenal.me, 0 etf.com, 0 et-forum.org, 0 -eth0.com.br, 0 ethereal-gaming.com, 0 -ethereumpool.co, 0 ethfans.org, 0 -eth-gethired.ch, 0 -ethicsoft.it, 0 -ethinking.de, 0 -ethitter.com, 0 -ethst.de, 0 -ethz.ch, 0 -etick.ir, 0 etland.co.kr, 0 etong.com, 0 etongdai.com, 0 -etowns.net, 0 -etowns.org, 0 etracker.com, 0 -etruel.com, 0 -ets2planet.com, 0 etsb.qc.ca, 0 -etstory.cn, 0 -etu.ru, 0 euchost.com, 0 eudic.net, 0 -eulji.ac.kr, 0 eunetworks.com, 0 euobserver.com, 0 eurabota.com, 0 eurasia.edu, 0 -eurasiangroup.org, 0 -eureka.lk, 0 eurekamag.com, 0 eurekers.com, 0 eurodir.ru, 0 eurofirms.es, 0 -eurogalaxy.sk, 0 eurogest.company, 0 euronics.cz, 0 euronics.hu, 0 euronova-italia.it, 0 europa2.sk, 0 europages.com, 0 -europa-market.ru, 0 europeya.ru, 0 eurostudy.info, 0 -eurovial.ro, 0 eu.spb.ru, 0 euvic.pl, 0 eval.hu, 0 evasionssecretes.fr, 0 -eveger.de, 0 -evejiaoben.com, 0 evenflo.com, 0 eventact.com, 0 eventfarm.com, 0 -eventhia.com, 0 eventim.si, 0 eventpal.com.tw, 0 eventsair.com, 0 eve-online-com.ru, 0 everest.com.tw, 0 evergrande.com, 0 -evergreen.ca, 0 evermarker.com, 0 -evermeet.cx, 0 -eversendai.com, 0 everycaller.com, 0 -everyday.in.th, 0 everymatrix.com, 0 everything.kz, 0 evget.com, 0 -evibe.in, 0 -evicertia.com, 0 eviivo.com, 0 evil0x.com, 0 -eviloctal.com, 0 eviron.ru, 0 evn.bg, 0 evoi.ru, 0 -evolio.ro, 0 evolix.net, 0 -evolutiontravel.it, 0 -evolveum.com, 0 evotor.ru, 0 evo-web.co.uk, 0 evraz.com, 0 evroopt.by, 0 evvnt.com, 0 -evzo.net, 0 -eway-crm.com, 0 eways.co, 0 eways.ir, 0 ewe.de, 0 ewei.com, 0 eweiqi.com, 0 -ewon.biz, 0 -exali.de, 0 examslocal.com, 0 -exane.com, 0 exaprint.fr, 0 -exapro.com, 0 -exceda.com, 0 excelcalcs.com, 0 -excelsiorcommerce.com, 0 exdreams.net, 0 exehack.net, 0 exertisireland.ie, 0 exetools.com, 0 ex-fs.net, 0 -exileed.com, 0 eximb.com, 0 -experientia.com, 0 experitest.com, 0 experty.com, 0 -explee.com, 0 -exploretunes.com, 0 explorr.net, 0 -expoforum.ru, 0 exportimes.com, 0 -exportpages.com, 0 exportpages.de, 0 express.com.ar, 0 -express-odarennost.ru, 0 -exrates.me, 0 extmail.org, 0 -extplorer.net, 0 extrahop.com, 0 extremecraft.net, 0 extremo.club, 0 eyaos.com, 0 eyehere.net, 0 -eyou.net, 0 ezacg.net, 0 -ezaisheng.com, 0 ezdravkrg.org, 0 ezfun.xyz, 0 ezloo.com, 0 -ezmedia.me, 0 ez.no, 0 -ezotericum.ru, 0 ezoterikus.hu, 0 -ez-pz.com, 0 ezwow.org, 0 -ezxing.com, 0 ezyro.com, 0 -f0x.pw, 0 f1news.ru, 0 f3322.net, 0 f3322.org, 0 @@ -4768,79 +2681,41 @@ fabfab.net, 0 fabrikaokon.ru, 0 fabula.club, 0 -fabulous.ch, 0 -fabzat.com, 0 facebac.com, 0 -facehack.me, 0 faceit.ir, 0 facenews.ua, 0 -facens.br, 0 -faceu.mobi, 0 -faceunity.com, 0 -facforpro.com, 0 -fackelmann.de, 0 facta.com.br, 0 factcool.com, 0 -factorenergia.com, 0 factorkon.ir, 0 factor.ua, 0 -facturamos.com.mx, 0 factureaza.ro, 0 fael.edu.br, 0 fafait.ir, 0 fainor.com.br, 0 -fairfieldcityschools.com, 0 fairr.de, 0 -fairtop.in, 0 faisco.cn, 0 faisco.com, 0 fakturyonline.eu, 0 -falconsocial.com, 0 -fals.com.br, 0 -famafutar.hu, 0 famebit.com, 0 famerom.ir, 0 -familienshirt.com, 0 -family.com.tw, 0 familydoctor.com.cn, 0 -familyds.com, 0 -familyds.net, 0 famo.ir, 0 -famtastic.cz, 0 -famtastic.hr, 0 -famtastic.hu, 0 -famtastic.ro, 0 -famtastic.sk, 0 fancourier.ro, 0 fanfic-fr.net, 0 -fanfic.hu, 0 -fanfou.com, 0 fangamer.com, 0 -fangjie.info, 0 fangjinsuo.com, 0 -fangrs.com, 0 fangte.com, 0 fanhaojia.com, 0 -fanpagesmarket.ru, 0 fanqier.cn, 0 -fantabobshow.com, 0 -fantasyleague.com, 0 fantawild.com, 0 -fantazya.net, 0 fantlab.ru, 0 -fapiao.com, 0 -faponly.com, 0 -fapstor.com, 0 far800.com, 0 farakav.com, 0 farapayamak.ir, 0 farapic.com, 0 faraso.org, 0 fareastone.com.tw, 0 -farebookings.com, 0 fariasbrito.com.br, 0 -farmaimpex.ru, 0 -farmainstant.com, 0 farmalisto.com.co, 0 farmec.ro, 0 farmnest.com, 0 @@ -4849,98 +2724,63 @@ farsiworld.ir, 0 fashaoyou.net, 0 fashion71.net, 0 -fashion.bg, 0 fashioncompany.rs, 0 fashionfriends.ch, 0 -fashn.de, 0 fast-anime.ru, 0 fastcr.cz, 0 fasteasy.at, 0 -fasten.com, 0 fastjet.com, 0 -fastloader.co, 0 fast-mirror.de, 0 fastprom.net, 0 -fastread.ru, 0 fast-report.com, 0 -fastreport.ru, 0 fasttony.es, 0 fast-unfollow.com, 0 fastvideotoscana.it, 0 fastwebserver.de, 0 fat.com.tw, 0 -fat-down.ru, 0 -fattor-rc.com.br, 0 favbet.com, 0 favera.ru, 0 favorit.com.ua, 0 -favoritsport.com.ua, 0 faw-vw.com, 0 fayea.com, 0 fayzfm.uz, 0 fazekas.hu, 0 -fazmusic15.org, 0 -faz-musics.in, 0 fbresponder.com.br, 0 -fbxos.fr, 0 fcasd.edu, 0 fcbarcelona.cz, 0 fccs.com, 0 fckrasnodar.ru, 0 -fcm-live.de, 0 fcn.de, 0 -fcrmedia.ie, 0 -fcsm.ru, 0 fcstpauli.com, 0 fct-altai.ru, 0 -fcv.edu.br, 0 fd114.com, 0 fdc.com.cn, 0 fdlx.com, 0 -f-droid.org, 0 fedpress.ru, 0 fedsp.com, 0 -fedyay.net, 0 feedbooks.com, 0 feedbooks.net, 0 -feedonomics.com, 0 feedvisor.com, 0 -feelingplace.com, 0 fee.org, 0 -feidai.com, 0 feifandy.net, 0 -feifanvpn.com.cn, 0 -feig.de, 0 -feihuo.com, 0 feijiu.net, 0 feiliu.com, 0 fei.sg, 0 feisovet.ru, 0 -feixueacg.com, 0 -feiyangedu.com, 0 feiyulian.cn, 0 felgenshop.de, 0 felink.com, 0 -feliway.com, 0 -femininesite.ru, 0 fengbuy.com, 0 feng.com, 0 feng-shui.ru, 0 fengsung.com, 0 -fengzigame.com, 0 fenjinshe.com, 0 fensifuwu.com, 0 fenxiangba.org, 0 fernsehkritik.tv, 0 -ferrarischule.at, 0 ferrino.it, 0 -ferrite.ru, 0 -ferrotec.com, 0 ferro-video.com, 0 -fertagus.pt, 0 fert.cn, 0 -feste-ip.net, 0 -festima.ru, 0 fextralife.com, 0 ffa-assurance.fr, 0 ffforever.info, 0 @@ -4948,138 +2788,64 @@ ffhs.ch, 0 ffmpeg.org, 0 ffplum.info, 0 -ffruit.eu, 0 ffsg.org, 0 ffxiv.cn, 0 -fgs-impianti.it, 0 -fgup-ohrana.ru, 0 fh21.com.cn, 0 -fh-diploma.de, 0 fh-koeln.de, 0 -fhmsolutions.com, 0 fhnw.ch, 0 -fia.academy, 0 -fialkovod.ru, 0 fia-net.com, 0 fiberhome.com, 0 -fibrum.com, 0 fictiongrill.com, 0 fictionmania.tv, 0 -fidelity-media.com, 0 -fidelitysalus.it, 0 -fidella.org, 0 fidion.de, 0 fieb.org.br, 0 fieldandstream.com, 0 fieldnation.com, 0 -fieldschina.com, 0 -fievent.com, 0 -fifanice.com, 0 fiff.de, 0 -figotan.org, 0 -fileconvoy.com, 0 filelist.ro, 0 -filemakermagazine.com, 0 -file.pet, 0 filerooz.com, 0 fileseek.ca, 0 filesell.ir, 0 filesend.to, 0 filetender.com, 0 -fileup.ir, 0 -file-up.net, 0 -filewave.com, 0 -filkab.com, 0 -fill.ee, 0 filmcrave.com, 0 filmesonlinex1.com, 0 filmistreet.com, 0 film--izle.com, 0 film.tv, 0 film-ussr.ru, 0 -filorga.com, 0 finansovyesovety.ru, 0 -finas-services.de, 0 findercom.ru, 0 -findface.me, 0 -findface.pro, 0 findface.ru, 0 -findlifevalue.com, 0 findmima.com, 0 -findschool.ca, 0 findsomeone.co.nz, 0 findtenders.ru, 0 findu.com, 0 -findyourtrainer.com, 0 -finestsin.de, 0 -fingent.com, 0 -finkafe.com, 0 -finkzeit.at, 0 -finolog.ru, 0 -fin-partners.ru, 0 -firdi.org.tw, 0 -fire2000.rocks, 0 -firefoxfan.cc, 0 -firehol.org, 0 firejune.com, 0 -firepoweredgaming.com, 0 firestock.ru, 0 -firmenkontaktmesse.de, 0 firmstep.com, 0 firo.ru, 0 -firstbit.ae, 0 -firstcare.com.cn, 0 firstcarrental.co.za, 0 firstleap.cn, 0 -first-moment.de, 0 firstonetv.eu, 0 -firststage.org, 0 -fischer.com.br, 0 fisc.md, 0 fishbattle.net, 0 -fishcn.com, 0 -fisherman-market.ru, 0 -fishifarm.ru, 0 fishki.net, 0 -fishyforum.com, 0 -fiskarsmarket.ru, 0 -fit.ac.ir, 0 -fitilio.com, 0 -fitnesspell.com, 0 -fitnessplus.ru, 0 fitnezz.net, 0 -fixcenter.com.ua, 0 -fiza.ir, 0 -fizkult-nn.ru, 0 fj.cn, 0 fjcyl.com, 0 -fjdqqb.com, 0 -fjrs.gov.cn, 0 fju.edu.tw, 0 flag.org, 0 flamboyant.com.br, 0 flamp.ru, 0 -flarumone.com, 0 -flashphoner.com, 0 flatfy.az, 0 flatfy.by, 0 flatfy.kz, 0 -flatfy.pl, 0 flatfy.ro, 0 -flatfy.ru, 0 -flaticon.es, 0 -flatterer.ru, 0 -flboos.com, 0 -fleeber.com, 0 fleex.tv, 0 flexcils.com, 0 flexibits.com, 0 -flibusta.net, 0 flickrocket.com, 0 -flight-finder.com, 0 -flinteractive.fr, 0 -flip.id, 0 -flipup.ru, 0 flipwalls.com.cn, 0 flixbus.at, 0 flixbus.be, 0 @@ -5087,7 +2853,6 @@ flixbus.co.uk, 0 flixbus.cz, 0 flixbus.de, 0 -flixbus.dk, 0 flixbus.es, 0 flixbus.fr, 0 flixbus.hr, 0 @@ -5095,204 +2860,100 @@ flixbus.nl, 0 flixbus.pl, 0 flixbus.ru, 0 -flixbus.se, 0 -flixmobility.com, 0 flnet.org, 0 flnka.ru, 0 floobits.com, 0 floralinvestment.com, 0 floraverse.com, 0 -floridelux.ro, 0 -flotalamacarena.com, 0 flowerpassword.com, 0 flowerplus.cn, 0 -flow-list.cz, 0 -flowmon.com, 0 -flowtraders.com, 0 flptrading.net, 0 -fluentcloud.com, 0 -fluffy.is, 0 -fluger.pro, 0 -flukso.net, 0 -fluxbytes.com, 0 fluxfm.de, 0 -fluxicon.com, 0 -flyco.com, 0 -flycosmos.com, 0 flyerdevil.de, 0 -flyerpilot.de, 0 -flyingacademy.com, 0 flyingmag.com, 0 -flymycloud.com, 0 -flynet.by, 0 flynsarmy.com, 0 flytcloud.com, 0 -fly.tj, 0 flyuia.com, 0 flyvpn.com, 0 -fmach.it, 0 -fmaroof.ir, 0 fmdisk.net, 0 -fnblasanimas.com, 0 fnmotol.cz, 0 foboko.com, 0 -focusmedia.cn, 0 -focus-net.net, 0 focus.ua, 0 -fodar.ru, 0 -foheart.com, 0 -followmyvote.com, 0 fonar.tv, 0 fondazionearching.it, 0 -fond-kino.ru, 0 -f-online.at, 0 -fontenay-sous-bois.fr, 0 -foodband.ru, 0 -foodbrothers.com, 0 foodclub.ru, 0 food.co.il, 0 -foodfox.ru, 0 -foodrussia.net, 0 foody.com.cy, 0 -football-onlain.tv, 0 footballua.tv, 0 -footbolka.ru, 0 footway.dk, 0 -footway.fi, 0 -footway.no, 0 footway.se, 0 -force9.co.uk, 0 forces-war-records.co.uk, 0 fordaq.com, 0 -fordclubs.org, 0 -ford-koegler.de, 0 -foresealife.com, 0 foreveross.com, 0 -forexac.com, 0 -forexclub-russia.ru, 0 -forexsklad.com, 0 forgerock.com, 0 forgerock.org, 0 forgottenbooks.com, 0 forma2plus.com, 0 -formalytx.com, 0 -format-tv.net, 0 -formo.ua, 0 -formpipe.com, 0 formsdotstar.com, 0 formstone.it, 0 formulalubvi.com, 0 -formulastudent.de, 0 formz.com, 0 foroffice.ru, 0 forotrolls.com, 0 fortiddns.com, 0 fortinet.com, 0 -fortiss.org, 0 -fortunebill.com, 0 forum-3dcenter.org, 0 forumbee.com, 0 -forum-hardware.de, 0 -forum-laptopy.info.pl, 0 forum.vn.ua, 0 -forumx.com.br, 0 -forushefile.com, 0 -forus.ru, 0 for-vk.com, 0 forward-bank.com, 0 -forwardvelo.ru, 0 foscam.com, 0 foscammall.com, 0 -fossee.in, 0 fossies.org, 0 fosu.edu.cn, 0 fotile.com, 0 -fotky-foto.cz, 0 -fotoalbum.ee, 0 -fotoalbum.es, 0 -fotocopy.hu, 0 fotoev.com, 0 -fotogoroda.net, 0 fotograf.de, 0 fotokasten.de, 0 fotolab.ru, 0 foton.com.cn, 0 -fotoprivet.com, 0 fotor.com, 0 fotor.com.cn, 0 fotosklad.ru, 0 -fotospektr.ru, 0 fotostars.me, 0 foundationsu.com, 0 -founder.com, 0 -founderio.com, 0 fountainpen.it, 0 -fourglobe.co.jp, 0 -fourierdsl.co.za, 0 -fow.watch, 0 fox008.com, 0 foxconn.com, 0 foxconnmall.com, 0 -foxdeploy.com, 0 foxitreader.cn, 0 fox-mall.ru, 0 -foxrenderfarm.com, 0 foxtrot.com.ua, 0 fozzy.com, 0 fpucentral.com, 0 fqapps.com, 0 -fqproxy.com, 0 -fqrouter2.cn, 0 -frac.tl, 0 fragfinn.de, 0 -frag-mutti.de, 0 -francedns.com, 0 -franceserv.com, 0 -franceserv.fr, 0 france-troc.com, 0 -francite.net, 0 francochinois.com, 0 frankkingclub.com, 0 -franklincollege.edu, 0 -frankysweb.de, 0 -fraudect.com, 0 frdic.com, 0 -free521.com, 0 freebieac.com, 0 freeboxos.fr, 0 freebusy.io, 0 -freebytes.com, 0 freeconferencecall.com, 0 -freeddns.org, 0 -freedns.io, 0 freedomrussia.org, 0 freedom-vrn.ru, 0 -freedriver.org, 0 free-ebooks.net, 0 free-electrons.com, 0 -freefeed.net, 0 -freefielder.jp, 0 -freefii.de, 0 free.fr, 0 -freegeoip.net, 0 -free-hack.com, 0 -freehacks.ru, 0 -free-hosting.ir, 0 -freeintro.net, 0 -free-it.ru, 0 -freeje.com, 0 -freekulinar.ru, 0 freelance.boutique, 0 freelance.com, 0 -freelancerclub.net, 0 freelance.ru, 0 freelance.today, 0 freemail.gr, 0 freemaineads.com, 0 -freeman-btc.com, 0 freepaper.me, 0 free-pdftoword.com, 0 -freepik.es, 0 freepost.es, 0 freeprojectz.com, 0 free-ro.com, 0 @@ -5300,156 +2961,96 @@ freeskiers.net, 0 freesoft-board.to, 0 freestoriesforkids.com, 0 -freestylersworld.com, 0 freetemplatesonline.com, 0 free-torrent.org, 0 free-torrents.org, 0 freevar.com, 0 -freevpnxz.com, 0 freevps.us, 0 freexf.com, 0 freezingblue.com, 0 freie-volksmission.de, 0 freifunk.net, 0 -frejustoulon.fr, 0 frekvence1.cz, 0 -frenchkiss.ru, 0 freshports.org, 0 freshwatersystems.com, 0 fr.ht, 0 friends-forum.com, 0 fri-gate.org, 0 -frischeis.at, 0 friskyradio.com, 0 -fritzsch.net, 0 -frogshealth.com, 0 fromae.com, 0 -frontcam.ru, 0 -frontenddev.org, 0 fronter.com, 0 frontpad.ru, 0 frostland.pro, 0 froxlor.org, 0 -frozenbyte.com, 0 frozencpu.com, 0 frsky-rc.com, 0 -fruct.org, 0 -frugalmechanic.com, 0 fruitday.com, 0 -fryd.ru, 0 -fryshuset.se, 0 fs.com, 0 fsfund.com, 0 -fsfxpackages.com, 0 fshrss.gov.cn, 0 fsinf.at, 0 fsk-ees.ru, 0 -fskn.gov.ru, 0 fspro.net, 0 -fstrf.ru, 0 -ftbeautycn.com, 0 -ftsafe.com, 0 -ftvyifubi.com, 0 fuckav.ru, 0 -fuckbilibili.com, 0 fudan.edu.cn, 0 fudan.sh.cn, 0 -fuelcellsworks.com, 0 -fugumobile.cn, 0 -fujian.gov.cn, 0 fujifilm-x.ru, 0 -fukun.org, 0 fulba.com, 0 -fulgan.com, 0 fulidang.com, 0 -fulid.net, 0 fuli.moe, 0 fuling.com, 0 -fuliren.com, 0 fuliv8.com, 0 -full-chip.net, 0 -fullprogramindir.biz, 0 fullsecurity.org, 0 fumasoft.com, 0 funcook.com, 0 fundamenta.hu, 0 fundamental-research.ru, 0 -funeed.com, 0 -funeralone.com, 0 funfactory.com, 0 -funfunquiz.com, 0 -fungames-forfree.com, 0 funiber.org, 0 funi.com, 0 -funinsta.ru, 0 -funkmeldesystem.de, 0 -funnysocks.ru, 0 funpot.net, 0 funradio.sk, 0 funshion.com, 0 fun-taiwan.com, 0 funweek.it, 0 fuqizy.com, 0 -furfest.org, 0 -furnation.com, 0 -furnation.ru, 0 fusker.xxx, 0 fussballfantipp.de, 0 futbalnet.sk, 0 futboholic.com, 0 futboholic.com.ua, 0 futboholic.ru, 0 -futbolki.ru, 0 futpack.ru, 0 fut.ru, 0 futu5.com, 0 futunn.com, 0 -futurecovenant.com, 0 -future-processing.pl, 0 fuwo.com, 0 fuyaogroup.com, 0 -fvds.ru, 0 -fx678.com, 0 -fx77.com, 0 fxclub.org, 0 -fx-mt4.info, 0 fxpan.com, 0 fxsound.com, 0 fxteam.ru, 0 fyber.com, 0 -fyeedu.net, 0 -fync.edu.cn, 0 -fynews.net, 0 fyygame.pw, 0 fyysports.com, 0 fyzhuji.com, 0 fzdm.com, 0 -gadz.org, 0 -gaeamobile.com, 0 -gaeamobile.net, 0 gagahi.com, 0 gainapp.com, 0 -gaiz.com, 0 galactikka.com, 0 galaksion.com, 0 -galaktika.ru, 0 -galanz.com, 0 galax.com, 0 -galaxytech.com, 0 galgame.co, 0 galinos.gr, 0 -gallerr.com, 0 gallery-dump.com, 0 galpenergia.com, 0 gals.uz, 0 game13.com, 0 game2.cn, 0 game2.com.cn, 0 -gamed9.com, 0 gamedreamer.com.tw, 0 gameforgirl.ru, 0 gamehitzone.com, 0 -gamehonor.com, 0 gameindy.com, 0 gameliebe.com, 0 gamelumi.com, 0 @@ -5466,7 +3067,6 @@ gamesites.cz, 0 gamesow.com, 0 gamesplanet.com, 0 -gamesuit.ru, 0 gameswelt.at, 0 gameswelt.ch, 0 gameswelt.de, 0 @@ -5474,194 +3074,110 @@ gameurs.net, 0 gameware.at, 0 gamexp.ru, 0 -gamingmasters.org, 0 gamyun.net, 0 gannun.cn, 0 ganso.com.cn, 0 gansuche.cn, 0 -gaogulou.com, 0 gaokaopai.com, 0 -gaokaowangbao.com, 0 gaopeng.com, 0 gaosouyi.com, 0 gaotizi.com, 0 garada.net, 0 -garageentertainment.com.au, 0 -garage-gps.com, 0 garagemca.org, 0 -garant.by, 0 garant.ru, 0 -garazh.ir, 0 garden.org, 0 garminshop.ir, 0 gartenhaus-gmbh.de, 0 -garvan.org.au, 0 gaskrank.tv, 0 gastrogate.com, 0 gasu.ru, 0 -gatan.com, 0 gavag.ru, 0 -gaws.ru, 0 -gaypal.co, 0 gazeta.ru, 0 gazprom.ru, 0 -gaz.ru, 0 gazu.ru, 0 gba.gov.ar, 0 -gbs.edu, 0 gcbi.com.cn, 0 -gcnewhorizons.net, 0 -gcp.edu.cn, 0 -gcstech.net, 0 gcup.ru, 0 -gcx.org, 0 -gd10010.cn, 0 -gd88.org, 0 gdalpha.com, 0 -gdcuffs.com, 0 -gdekluet.ru, 0 gdga.gov.cn, 0 gdgbpx.com, 0 gd-line.com, 0 -gdsyzx.edu.cn, 0 gdufs.edu.cn, 0 -gdzelektrik.com.tr, 0 gear.host, 0 -gearsource.com, 0 -gebeco.de, 0 -gebrauchte-veranstaltungstechnik.de, 0 -geckosoftware.com, 0 ge.com.cn, 0 -gedichte.com, 0 -gedizelektrik.com.tr, 0 -gedofile.com, 0 geekbang.org, 0 geekbrains.ru, 0 geekie.com.br, 0 geekielab.com.br, 0 -geekmaze.ru, 0 geekpeek.net, 0 geekteam.pro, 0 geekup.pl, 0 -geekweekconf.com, 0 -geenfc.com, 0 gefaellt-mir.me, 0 gegejia.com, 0 -geichina.org, 0 -geilicdn.com, 0 -geizreich.de, 0 gem4me.com, 0 -gemfury.com, 0 -gemkadeh.com, 0 gemz.ir, 0 gench.edu.cn, 0 genealogieonline.nl, 0 geneanet.org, 0 geneawiki.com, 0 -genebang.com, 0 genecopoeia.com, 0 -generalroca.gov.ar, 0 -generals.mobi, 0 generationlove.com, 0 -generations-patrimoine.com, 0 -geniesolutions.com.au, 0 genofond.org, 0 genomics.cn, 0 genscript.com, 0 genscript.com.cn, 0 genser.ru, 0 -geodata.it, 0 geoprostor.net, 0 -georgikon.hu, 0 -georgio.fr, 0 gerald.top, 0 gerdoo.net, 0 gerdoosoft.com, 0 gerencianet.com.br, 0 -german-railroads.de, 0 -germanssky.de, 0 germanystudy.net, 0 geru.com.br, 0 -gesamtschule-zeuthen.eu, 0 ges-bo.de, 0 -geschenkkartenwelt.de, 0 gesext.de, 0 get4click.ru, 0 -geta6.net, 0 getabstract.com, 0 getadmiral.com, 0 -getawesomesupport.com, 0 -getcoins.win, 0 getcs16.ru, 0 getdc.ru, 0 -getfreegate.com, 0 get-in-it.de, 0 getinmybelly.com, 0 getitfree.cn, 0 -getitnow.gr, 0 -getkey.eu, 0 -getline.in, 0 getmyscript.com, 0 getriver.com, 0 getrix.it, 0 getsitecontrol.com, 0 -getsteam.cards, 0 get-styles.ru, 0 gettertools.com, 0 -getter-tools.de, 0 get-tune.cc, 0 -get-tune.net, 0 -gettune.net, 0 getujobs.com, 0 -getway.me, 0 -getwox.com, 0 gewobag.de, 0 -gezergiyim.com, 0 -gfaq.ru, 0 -gfi.es, 0 -gfmrecharge.co.in, 0 gfw.pics, 0 gfycat.com, 0 gg4m.com, 0 -ggbinary.com, 0 ggcj.com, 0 ggmgastro.com, 0 ghac.cn, 0 -ghostforbeginners.com, 0 -ghostry.cn, 0 -ghtinc.com, 0 -gianganh.net, 0 gibdd.ru, 0 gicp.net, 0 gidnetwork.com, 0 -giftcards.eu, 0 -giftman.ru, 0 giftster.com, 0 gigabaza.ru, 0 gigabyte.cn, 0 gigaleecher.com, 0 -giga-rapid.com, 0 gigaserver.cz, 0 -gigatribe.com, 0 -gigatron.rs, 0 gigatronshop.com, 0 -giga.ua, 0 gigfa.com, 0 giiwa.org, 0 -gilbo.ru, 0 gimhoy.com, 0 -gimlet.us, 0 gimp.org, 0 -gimvic.org, 0 ginger-cat.ru, 0 -ginsystem.us, 0 gioc.kiev.ua, 0 gionee.com, 0 giordano.com, 0 gioseppo.com, 0 gioxx.org, 0 -gipsr.ru, 0 -gira.cc, 0 gira.com, 0 gira.de, 0 girimulya.com, 0 @@ -5671,125 +3187,63 @@ girsa.ru, 0 gisclub.tv, 0 gis-lab.info, 0 -gisroad.com, 0 -gitgud.io, 0 github.io, 0 gitlab.cc, 0 -gitsea.com, 0 giuseppe.cn, 0 giustizia-amministrativa.it, 0 -givegift.com.hk, 0 giveyousomecolortoseesee.com, 0 gizmiz.com, 0 gizzmoheaven.com, 0 -gjn.cz, 0 -gjs.so, 0 gjzq.com.cn, 0 -gkk.uz, 0 -gkovd.ru, 0 -gladiators.ru, 0 glamius.ru, 0 -glamot.cz, 0 glamour.ru, 0 glashkoff.com, 0 glassrpske.com, 0 -glav-dostavka.ru, 0 glavred.info, 0 glitchthegame.com, 0 -glitzcloud.com, 0 -glkb.ch, 0 -globaladvisors.biz, 0 -global-customer.com, 0 globaldynamicmarketing.com, 0 -globalhitss.com, 0 globalitanalytics.com, 0 -global-katalog.ru, 0 globalnomadic.com, 0 -globalpartszone.com, 0 globalpolicy.org, 0 -globex.cn, 0 globusmax.co.il, 0 glocalme.com, 0 -gloeckle.de, 0 glogow.pl, 0 -glopoi.com, 0 -glorioustrainwrecks.com, 0 -glyphter.com, 0 gmcc.net, 0 -gm-city.ru, 0 -gmdao.cc, 0 -gmg.biz, 0 -gmod.de, 0 -gmtincorp.com, 0 -gmuz.uz, 0 -gnawers.de, 0 -gnewstv.com, 0 gnome.org, 0 -gntech.ac.kr, 0 gnway.cc, 0 gnway.com, 0 -go189.cn, 0 -go2bus.ru, 0 go2olymp.com, 0 -goanews.com, 0 goapr.com, 0 -goarmy.co.uk, 0 gobaidugle.com, 0 gob.bo, 0 gob.cl, 0 gob.do, 0 -gobelinland.fr, 0 gochengdu.cn, 0 -godata.tw, 0 godeyes.cn, 0 godic.net, 0 god.jp, 0 godnota.org, 0 -godon.biz, 0 goeasy.io, 0 -goeducation.com.tw, 0 -goflyla.com, 0 -gogames.me, 0 gogosu.xyz, 0 -gogovan.sg, 0 -go.gov.br, 0 -gogovpn.org, 0 gogvo.com, 0 -goingnative.cn, 0 goip.de, 0 -golbazar.net, 0 -gol.bg, 0 goldapple.ru, 0 goldbroker.com, 0 goldbroker.fr, 0 -goldbroker.it, 0 golden-monkey.ru, 0 goldenpages.ie, 0 -goldenpalace.be, 0 -golden-time.ru, 0 -goldflyer.ru, 0 -goldpharma.cn, 0 goldwind.com.cn, 0 golo365.com, 0 golospravdy.com, 0 golpas.com, 0 -gomefinance.com.cn, 0 gomehigo.hk, 0 gomel.today, 0 -gomezacebo-pombo.com, 0 gomobil.cz, 0 -goncakitap.com.tr, 0 g-one-inc.com, 0 -gonetis.com, 0 gongfubb.com, 0 -gonightshift.com, 0 -goocig.com, 0 good.cc, 0 goodgame.ru, 0 goodly.pro, 0 -goodmaoningboy.com, 0 -good-movie.ru, 0 -goodnight.at, 0 goodsflow.com, 0 goodtyping.com, 0 goody25.com, 0 @@ -5797,32 +3251,21 @@ goo.kz, 0 gootara.org, 0 gopas.cz, 0 -gorcenter.spb.ru, 0 -gorcomnet.ru, 0 -gorcom.ru, 0 gorlice.pl, 0 go.ro, 0 gorodche.ru, 0 -gorodovik.com, 0 -gorodtv.net, 0 goskills.com, 0 -gosmonitor.ru, 0 gospmr.org, 0 gossh.net, 0 gotdns.com, 0 -gotdns.org, 0 gothicwiki.pw, 0 gotocdn.com, 0 gotokeep.com, 0 -gotye.com.cn, 0 -goujiawang.com, 0 gouv.bj, 0 gouv.ci, 0 -gov110.cn, 0 gov35.ru, 0 gov.cl, 0 government.bg, 0 -gov.karelia.ru, 0 gov.kz, 0 gov.md, 0 gov.mg, 0 @@ -5830,208 +3273,106 @@ govoritmoskva.ru, 0 gov.ro, 0 gov.sc, 0 -gov.sk, 0 gov.taipei, 0 govvrn.ru, 0 gow.help, 0 gp.by, 0 gpgtools.org, 0 -gpl-express.com, 0 gpntb.ru, 0 -gppc.ru, 0 -gqget.com, 0 gq.ru, 0 -graacc.org.br, 0 -graa.ru, 0 -grabberz.com, 0 grabien.com, 0 grabitjeeves.com, 0 -graffitishop.it, 0 -graffitishop.net, 0 -gramula.com, 0 grandcapital.net, 0 -grandest.fr, 0 grandtheftarma.com, 0 -graphcommons.com, 0 graphsketch.com, 0 -gravitypayments.com, 0 gravitytales.com, 0 gr.ch, 0 grcrt.net, 0 greatagroup.com, 0 -greekfestival.gr, 0 -greenbooki.ru, 0 -greengo.hu, 0 green-japan.com, 0 -greenlightdigital.com, 0 greenmama.ru, 0 greenpeace.fr, 0 greenpeace.org.br, 0 greetz.be, 0 greetz.nl, 0 -greg-kennedy.com, 0 -gregsdrivingschool.net, 0 -griddynamics.net, 0 gridrepublic.org, 0 gridsum.com, 0 -griffincapital.com, 0 -grimbets.com, 0 -grishko.ru, 0 -grisino.com, 0 grnet.gr, 0 grodno.net, 0 groene.nl, 0 -gronkh-wiki.de, 0 groov.pl, 0 -grossum.com, 0 groundspeak.com, 0 -groupboard.com, 0 groupe-efrei.fr, 0 -groupeleader.com, 0 -groupensia.com, 0 -group-ib.com, 0 -grouppartner.ru, 0 growfood.pro, 0 grpl.org, 0 grsu.by, 0 -gruendl.de, 0 -grupoasv.com, 0 grupocobra.com, 0 -grupodass.com.br, 0 -grupofrisa.com, 0 grupoiris.net, 0 -grupomednet.com.br, 0 gruponzn.com, 0 gruposanilab.es, 0 gruposayer.com, 0 -grupovips.com, 0 gruppoiren.it, 0 -gruppolapastamadre.it, 0 grupposandonato.it, 0 gruso.cz, 0 gruzovichkof.ru, 0 -gs8.com.tw, 0 -gsier.com.cn, 0 -gskj.gov.cn, 0 -gsmarena.com, 0 gsmhosting.com, 0 gsn7.jp, 0 -gso-koeln.de, 0 -g-store.ru, 0 gstu.by, 0 gtags.net, 0 gtk.org, 0 -gtsce.com, 0 -gtshina.ru, 0 -gtue.de, 0 -guadaltel.es, 0 -guagua.cn, 0 guahao.com, 0 guanba.com, 0 guangming.com.my, 0 guap.ru, 0 guardian.ng, 0 -guavabooking.com, 0 guazi.com, 0 gucheng.com, 0 -gucodd.ru, 0 gudauri.ru, 0 guerrillamail.com, 0 guestcentric.net, 0 -gufener.com, 0 -gufs.org, 0 -guge.xxx, 0 guguke.net, 0 guidechem.com, 0 -guide.com.ru, 0 -guifibaix.net, 0 -guifi.net, 0 guiguiw.com, 0 -guihaibk.com, 0 guilinbank.com.cn, 0 gulbenkian.pt, 0 -gulfstream.ru, 0 -gulliway.org, 0 -gullprint.com, 0 gumrf.ru, 0 gum.ru, 0 -gundam.eu, 0 -gunserver.ru, 0 guosen.com.cn, 0 -guostrj.ru, 0 -gup.kz, 0 -gup.ru, 0 gusline.ru, 0 -gusti-cuir.fr, 0 -gusti-lader.se, 0 gusti-leder.de, 0 gustullays.ro, 0 guu.ru, 0 gv.com.sg, 0 -gvhouse.com, 0 gvodbox.com, 0 gw500.com, 0 -gwales.com, 0 gwdang.com, 0 gwifi.com.cn, 0 -gwsecu.com, 0 -gwup.net, 0 -gxdlr.gov.cn, 0 -gxi.gov.cn, 0 gxnews.com.cn, 0 -gxufe.edu.cn, 0 -gxust.edu.cn, 0 -gyb.ch, 0 -gybond.de, 0 -gyenno.com, 0 -gyertyalang.hu, 0 -gym-gbw.de, 0 -gymlit.cz, 0 gymnasium-ganderkesee.eu, 0 gymondo.de, 0 -gym-stolz.de, 0 -gym-training.com, 0 gyroscope.com, 0 gz163.cn, 0 gzedu.com, 0 gzjjzd.gov.cn, 0 gzjkw.net, 0 gzkkonline.com, 0 -gzlanen.com, 0 gzmpc.com, 0 gzmtr.com, 0 -gznet.com, 0 -gzpot.com, 0 -gzsfj.gov.cn, 0 -gztz.org, 0 -gzwhir.com, 0 h1n.ru, 0 -h2opal.com, 0 h3c.com, 0 h3yun.com, 0 -h5jun.com, 0 -h6app.com, 0 -haadthip.com, 0 haahi.com, 0 -haa.su, 0 -habari.co.tz, 0 habbopoop.org, 0 -haberegider.com, 0 habito.com, 0 habitos.mx, 0 habtium.es, 0 hacam.me, 0 hack80.com, 0 -hackacheats.com, 0 hackademics.fr, 0 hack.chat, 0 hack-cn.com, 0 hac-ker.net, 0 hackerthemes.com, 0 -hackforums.ru, 0 -hackmygame.info, 0 -hacksbycheats.com, 0 -hacksforcheats.info, 0 hackspark.fr, 0 hacpai.com, 0 hadawebshop.hu, 0 @@ -6043,41 +3384,22 @@ haibei.in, 0 haier.com, 0 haier.net, 0 -haihangyun.com, 0 haimanchajian.com, 0 -haiphong.gov.vn, 0 -hairde.cn, 0 -hair.ms, 0 -hair.su, 0 haisoft.net, 0 haiziwang.com, 0 -hajduszoboszlo.hu, 0 -ha-lab.com, 0 hal.ac.jp, 0 half-moon.org, 0 -halidi.org, 0 halihali.tv, 0 hallard.me, 0 hallenstadion.ch, 0 halykbank.kz, 0 ham3d.co, 0 -hamdi.web.id, 0 -hamfiles.co.uk, 0 -hamhire.com, 0 -haminvara.com, 0 hamlog.ru, 0 -hamradioshop.it, 0 hamresan.net, 0 -hamromovie.com, 0 -handball4all.de, 0 handbrake.fr, 0 hand-china.com, 0 -handel.pro, 0 handhand.net, 0 handicap-job.com, 0 -handicap-love.de, 0 -handyparadies.de, 0 -handy.travel, 0 hanfan.cc, 0 hanfverband.de, 0 hangge.com, 0 @@ -6085,147 +3407,82 @@ hangzhou.gov.cn, 0 hanhuazu.cc, 0 hanjutv.com, 0 -hansn.cn, 0 hanwha.co.kr, 0 -hanyalewat.com, 0 hao123.com, 0 hao24.cn, 0 hao24.com, 0 hao76.com, 0 -haoche51.com, 0 haochedai.com, 0 haodai.com, 0 haodianpu.com, 0 haodou.com, 0 -haofang.net, 0 haohaizi.com, 0 haoid.cn, 0 -haojs.cc, 0 haomaiche.com, 0 -haomwei.com, 0 -haoshitong.com, 0 -haoso.com, 0 haosou.com, 0 haosuzhou.com, 0 -haowanyou.com, 0 haoxiana.com, 0 -haoyangmao8.com, 0 haozhebao.com, 0 -happeak.ru, 0 -happening.im, 0 happist.com, 0 happy88.com, 0 -happyelements.cn, 0 happyelements.com, 0 happyjuzi.com, 0 -happyme.club, 0 -happyskin.vn, 0 -happyz.me, 0 -harats.ru, 0 hardgrand.com, 0 hardtunedstore.com, 0 -hardwarebg.com, 0 -hargawebsite.com, 0 haribo.com, 0 -harizanov.com, 0 haroldltd.ru, 0 -harpacrista.org, 0 harpoongaming.com, 0 harpost.com, 0 harvest.org, 0 -hasgeek.com, 0 -hash-c.co.jp, 0 hashemian.com, 0 hashflare.io, 0 hashkiller.co.uk, 0 -hashlearn.com, 0 hasjob.co, 0 -haskellstack.org, 0 -hassanabul.com, 0 hassyon.com, 0 hasznaltauto.hu, 0 -hasznaltautokereso.hu, 0 -hata.mobi, 0 -hatco.ir, 0 -hausaerzteverband.de, 0 -haus-des-meeres.at, 0 -haushaltshilfe24.at, 0 haust.edu.cn, 0 havaforum.com, 0 -hawaii.edu, 0 hawaiipacifichealth.org, 0 -hayatikodla.net, 0 -haykerproductions.de, 0 haypost.am, 0 -hays-careers.com, 0 hazeover.com, 0 -hbcsd.org, 0 -hbhtxx.com, 0 hb-n-tax.gov.cn, 0 -hboeck.de, 0 hbooker.com, 0 -hbsc.cn, 0 hbut.edu.cn, 0 hc360.com, 0 -hcamur.ru, 0 hcc.edu.tw, 0 -hclugano.ch, 0 hc.ru, 0 hcsibir.ru, 0 hcs.land, 0 -hd123.com, 0 hdarea.co, 0 hdb.com, 0 hdbox.ws, 0 -hdcity.org, 0 hdclub.org, 0 -hdclub.sk, 0 hdcmct.org, 0 -hddlife.com, 0 -hddlife.ru, 0 -hdfax.com, 0 hd.free.fr, 0 hdhello.com, 0 hdhome.org, 0 -hdk.cz, 0 -hdktv.org, 0 hdmoney.cn, 0 -hdmyjob.com, 0 hdschools.org, 0 hdshwh.com, 0 hdslb.com, 0 hd-spain.com, 0 hdtmedia.com, 0 hdw.la, 0 -head.ru, 0 headstats.com, 0 healthday.com.au, 0 health.nz, 0 heartbowsmakeup.com, 0 -hearthigen.com, 0 -hearth.net, 0 -heateor.com, 0 heavytools.hu, 0 -hebaodai.com, 0 hebei.com.cn, 0 -hebergratuit.net, 0 hebis.de, 0 hebut.edu.cn, 0 hec.gov.pk, 0 -hechonghua.com, 0 -hedonism.com, 0 -hefe-und-mehr.de, 0 heidelbergerwohnen.de, 0 -heidelpay.de, 0 heiguang.com, 0 -heilsarmee.ch, 0 hej.sk, 0 hekko24.pl, 0 heliguy.com, 0 heliohost.org, 0 -heliopark.ru, 0 -helios.kz, 0 -hellclan.co.uk, 0 hellenicnavy.gr, 0 hellmann.net, 0 hellocq.net, 0 @@ -6233,103 +3490,60 @@ hellotars.com, 0 hellweg.de, 0 helmo.be, 0 -helpangel.org, 0 -help.com, 0 -help-im.ru, 0 helpmij.nl, 0 helprace.com, 0 helpshift.com, 0 -helsinn.com, 0 hemden.de, 0 hentairules.net, 0 -herbies-herbs.com, 0 -herbolariosiempreviva.com, 0 hercrentals.com, 0 hermitageshop.ru, 0 herni.cz, 0 herokuapp.com, 0 heureka.cz, 0 heureka.sk, 0 -heuteinhamburg.de, 0 heveya.ru, 0 heweather.com, 0 hexieshe.com, 0 hexindai.com, 0 -hey-ai.com, 0 -heysky.cn, 0 -hgame.com, 0 hgmail.com, 0 -hgsfss.com, 0 -hgyouxi.net, 0 hh010.com, 0 -hh2.com, 0 hhos.ru, 0 -hhwforum.hu, 0 hiapk.com, 0 hiapphere.com, 0 hicraft.cn, 0 hidalgo.gob.mx, 0 -hidata.org, 0 hide-my-ip.com, 0 hi-docs.com, 0 -hidolphin.cn, 0 -hifi.fr, 0 hifi-tower.co.uk, 0 -hifi-tower.ie, 0 -higherlogic.com, 0 high-minded.net, 0 highpin.cn, 0 highscreen.ru, 0 hightech.fm, 0 hihocoder.com, 0 -hihotel.asia, 0 -hiknow.com, 0 -hillstonenet.com, 0 hinabian.com, 0 hinaloe.net, 0 hinata-online-community.fr, 0 -hindustansoftware.in, 0 -hinine.com, 0 hipac.cn, 0 hi-pda.com, 0 hipertextual.com, 0 -hipnosenapratica.com.br, 0 hippocratesinst.org, 0 -hirealestate.es, 0 hirede.com, 0 hiredops.com, 0 hirist.com, 0 hisense.com, 0 -his.gov.sd, 0 -hismarttv.com, 0 histmag.org, 0 histock.tw, 0 -histoire-image.org, 0 -hisunpharm.com, 0 hitbox.tv, 0 hitechboard.ru, 0 hit.edu.cn, 0 hitonline.ua, 0 hitour.cc, 0 -hitrust.com.tw, 0 hitutor.com.tw, 0 -hiyd.com, 0 -hiyowa.com, 0 hj-qz.com, 0 hkbf.org, 0 -hkcccc.org, 0 -hkcompany.org, 0 hkedu.sh.cn, 0 -hk-lawyer.org, 0 -hkl-baumaschinen.de, 0 hkst.com, 0 -hksuning.com, 0 -hkust.se, 0 -hkzyy.com.cn, 0 hlamer.ru, 0 -hldns.ru, 0 -hledejinzerat.cz, 0 -hlidacsmluv.cz, 0 hm.edu, 0 hnagroup.com, 0 hnagroup.net, 0 @@ -6337,166 +3551,82 @@ hnair.net, 0 hndnews.com, 0 hneao.cn, 0 -hnee.de, 0 -hnks.gov.cn, 0 -hnldesign.nl, 0 hnr.cn, 0 hnrsks.com, 0 -hnrsks.gov.cn, 0 hnteacher.net, 0 hnu.edu.cn, 0 -hobbybrauerversand.de, 0 -hobby-site.com, 0 -hobimasak.info, 0 -hochanda.com, 0 hochbahn.de, 0 hochbahn-direkt.de, 0 hockey30.com, 0 -hoerbiger.com, 0 hoffmann-group.com, 0 hoge.cn, 0 -hoippo.km.ua, 0 -hojitoyz.ir, 0 hokudai.ac.jp, 0 hola.com, 0 holarse-linuxgaming.de, 0 -holder.com.ua, 0 -holema.eu, 0 hol.es, 0 -holidaycalendar.com, 0 holike.com, 0 -holime.cz, 0 hollard.co.za, 0 -hollr2099.ga, 0 holmesreport.com, 0 -holmglad.edu.hk, 0 hologfx.com, 0 holyo.org, 0 -homates.com, 0 home-cloud.me, 0 -homecloud.pl, 0 homeip.net, 0 homelinux.com, 0 homelinux.org, 0 -homemadetools.net, 0 -homemasters.ru, 0 homemediaserver.ru, 0 homenet.org, 0 homepc.it, 0 home.pl, 0 homerez.com, 0 homeserver.com, 0 -homeservice24.ch, 0 homeunix.com, 0 homeworkmarket.com, 0 -homeworkshop.org.uk, 0 -honest-fund.com, 0 -hongweipeng.com, 0 -hongxinbao.com, 0 honor.es, 0 -honxb.com, 0 -hoop.co.uk, 0 -hoor.ir, 0 -hoornews.com, 0 -hoozin.com, 0 -hopdoddy.com, 0 -hopebilling.com, 0 hoperun.com, 0 -hoplon.com, 0 -hop-sport.pl, 0 hopto.org, 0 horabrasil.com.br, 0 -horariodeapertura24.es, 0 -horki.info, 0 horoscope.com, 0 horoscopo.com, 0 -horoshee.fm, 0 -hospedando.com, 0 -hospmall.com, 0 -host4africa.com, 0 -host4g.ru, 0 hostazor.com.tr, 0 -hostcoz.com, 0 host-ed.me, 0 -hostedpbx.lu, 0 hostelmanagement.com, 0 -hoste.pl, 0 hosteurope.de, 0 -hoste.work, 0 -host-food.ru, 0 hostforweb.com, 0 hostiman.ru, 0 -hostingasp.pl, 0 -hostinghouse.pl, 0 hostingkunde.de, 0 -hostingradio.ru, 0 hostingtime.de, 0 -hosting.ua, 0 -hostit.ir, 0 hostitsmart.com, 0 -host.kz, 0 hostminio.es, 0 hostpair.com, 0 hostpark.cn, 0 hostplus.gr, 0 hostseo.com, 0 -hostserv.eu, 0 -hostsleek.com, 0 -hostsuki.pro, 0 host-tracker.com, 0 -hostwp.es, 0 -hostzi.com, 0 hotbikeweb.com, 0 hotdealsclub.com, 0 hot-deals.org, 0 -hotelmix.es, 0 -hotelmix.it, 0 -hotelnow.co.kr, 0 hotels.ru, 0 -hotelston.com, 0 hotjob.cn, 0 ho.ua, 0 -houam.com, 0 -houbank.com, 0 house365.com, 0 housingcare.org, 0 houxue.com, 0 hoverwatch.com, 0 -howarth-timber.co.uk, 0 how-living.com, 0 -howoo.net, 0 howtoinstall.co, 0 hozehkh.com, 0 -hozi.co.za, 0 -hozobzor.com, 0 -hpc.ru, 0 hp-lexicon.org, 0 -hponline.cz, 0 -hpplay.com.cn, 0 -hpxy.net, 0 -hqhost.net, 0 hq-patronen.de, 0 hqvpn.cn, 0 -hrackarna.cz, 0 hrbeu.edu.cn, 0 -hrc.govt.nz, 0 -hrjuice.com, 0 -hrlocker.com, 0 hrloo.com, 0 -hrnz.co.nz, 0 -hro.ru, 0 hrp.hu, 0 -hrpraktijk.nl, 0 -hrs.cn, 0 hrsd.com, 0 hrstop.com, 0 hrstoppro.com, 0 hrtl.com.cn, 0 -hrtoday.ch, 0 hrtpayment.com, 0 hrwhisper.me, 0 -hs21.de, 0 -hsc.gov.ua, 0 hschinese.com, 0 h-schmidt.net, 0 hscloud.cn, 0 @@ -6505,205 +3635,112 @@ hslda.org, 0 hsw.com.au, 0 hsweb.me, 0 -htche.com, 0 htfc.com, 0 -htgwf.com, 0 ht-line.ru, 0 -htl-klu.at, 0 htmlweb.ru, 0 hts.ru, 0 -ht-systems.ru, 0 -httv.de, 0 -htv.bg, 0 htyd50.com, 0 -htzyw.com, 0 -huai123.me, 0 huajiao.com, 0 -huangwenchao.com.cn, 0 -huangxiaolong.net, 0 -huanhuba.com, 0 -huanqiushuzi.com, 0 -huashengsheng.com, 0 huawei.com, 0 huaxi100.com, 0 huaxincem.com, 0 huaxing.com, 0 -huayugame.com, 0 -hub-avocat.fr, 0 hubcity.ir, 0 -hubeikaowu.com, 0 hublaa.me, 0 hubpress.ir, 0 hubsan.com, 0 -hucheck.com, 0 -hudebnibanka.cz, 0 -huhamhire.com, 0 huijia.edu.cn, 0 huilianyi.com, 0 huimaiche.com, 0 huim.com, 0 -huimei.com, 0 huimin.cn, 0 -huishoubao.com, 0 -hulsta.com, 0 -humaxasia.com.tw, 0 -humlak.cz, 0 humlnet.cz, 0 hunan.gov.cn, 0 -hunarr.co.in, 0 hundsun.com, 0 -hunhan.kr, 0 -hunjuwang.com, 0 hunliji.com, 0 -hunterdouglas.com.ar, 0 hunters.com, 0 -hunters.sx, 0 huntnews.in, 0 huntworld.ru, 0 huodonghezi.com, 0 huoduan.com, 0 -huoduan.net, 0 -huodull.com, 0 huorong.cn, 0 -huox.tv, 0 -huoyunren.com, 0 hushangcaifu.com, 0 hust.edu.cn, 0 hustonline.net, 0 -hustvpn.com, 0 -hutamakarya.com, 0 huway.com, 0 huxiu.com, 0 huzhan.com, 0 -hvaonline.net, 0 -hvf-bs.net, 0 -hvngroups.net, 0 hwu.edu.tw, 0 hx9999.com, 0 hxacc.com, 0 hxsd.com, 0 hxtao.site, 0 -hybridmedia.be, 0 hyipchina.com, 0 hyip.tc, 0 -hyit.edu.cn, 0 hymer.com, 0 hymnal.net, 0 hyperay.cc, 0 hyperhosting.gr, 0 hyperledger.org, 0 hyperreal.info, 0 -hypers.com, 0 hypetap.com, 0 hypnoseries.tv, 0 -hypweb.net, 0 hytc.edu.cn, 0 hytera.com, 0 hzfc.gov.cn, 0 -hzg.de, 0 hzjcb.com, 0 -hzsh.xyz, 0 i234.me, 0 -i24.cc, 0 -i3dpworld.com, 0 i3wm.org, 0 i4th.in.th, 0 -i7vpnn.com, 0 i8xiaoshi.com, 0 -iachieved.it, 0 iae.edu.ar, 0 iaixue.com, 0 -ialf.edu, 0 -ialpa.net, 0 -iamgstore.com, 0 -iamue.com, 0 iamwhitneywisconsin.com, 0 -iandunn.name, 0 iapppay.com, 0 -iariss.fr, 0 iasassessment.com, 0 iasbs.ac.ir, 0 -ias.com.tr, 0 iask.in, 0 iautos.cn, 0 ib3tv.com, 0 -ibanquan.com, 0 ibantang.com, 0 ibanyu.com, 0 ibaoyin.com, 0 -ibaren.com, 0 -ibaroody.com, 0 -ibayapp.com, 0 -ibb.waw.pl, 0 -ibc-solar.de, 0 -ibdfam.org.br, 0 ibero.mx, 0 ibis.net.ua, 0 -ibooked.com.br, 0 iboxpay.com, 0 iboys.at, 0 iboys.cz, 0 -ibpssc.in, 0 ibroadlink.com, 0 ibs.re.kr, 0 -ibs.ru, 0 -ibsys.com, 0 -iburger.bz, 0 i-cad.fr, 0 icaile.com, 0 -icard.com, 0 -icasa.ru, 0 icculus.org, 0 iccup.com, 0 -icc-usa.com, 0 -icdo.org, 0 -ice-apple.com, 0 iceberg.ru, 0 -ice-fx.com, 0 icegram.com, 0 -icej.org, 0 icetrade.by, 0 -iceveil.com, 0 -icewing.cc, 0 ichess.es, 0 ichess.net, 0 iciba.com, 0 icicilombard.com, 0 -i-circle.net, 0 ickd.cn, 0 -iclassx.com, 0 iclei.org, 0 -icn.org.au, 0 icourse163.org, 0 -icreator.cn, 0 icrt.cu, 0 ict.ac.cn, 0 -icta.lk, 0 -ictb.cz, 0 icult.ru, 0 icybee.cn, 0 icy-veins.com, 0 -idaam.com.br, 0 idaybreak.com, 0 -idda.com.au, 0 ideabank.by, 0 -ideachess.com, 0 ideadunes.com, 0 ideal.az, 0 idealkaynak.net, 0 -idealsee.com, 0 -idesa.com.py, 0 idf.il, 0 idhost.kz, 0 -idiannaomi.com, 0 -idioma.com, 0 -idirecto.es, 0 idl.pl, 0 -idmarch.org, 0 -idm.party, 0 idokep.eu, 0 idokep.hu, 0 -idokep.ro, 0 idoklad.cz, 0 idomix.de, 0 idope.se, 0 @@ -6713,420 +3750,217 @@ idsurvey.it, 0 idtdna.com, 0 id.uz, 0 -idv.biz, 0 -idv.la, 0 idwpublishing.com, 0 idx.com.cn, 0 -iecc.com, 0 -iee.lu, 0 -iemag.ru, 0 -ieminc.com, 0 -iesde.com.br, 0 -iesgrancapitan.org, 0 iesp.edu.br, 0 -ietv.cc, 0 ifanqiang.cn, 0 ifanr.com, 0 -ifcmarkets.ae, 0 ifcmarkets.com, 0 -ifcmarkets.es, 0 -ifcmarkets.ru, 0 ifcmir.asia, 0 ifeng.com, 0 ifinterface.com, 0 ifj.edu.pl, 0 -ifjing.com, 0 -iflym.com, 0 iflysse.com, 0 ifmo.ru, 0 -ifmsa.pl, 0 -ifnet.or.jp, 0 ifood360.com, 0 -ifreespeed.com, 0 ifto.edu.br, 0 -ifz.ru, 0 -igma.ru, 0 ignatianum.edu.pl, 0 ignitenet.com, 0 ignorelist.com, 0 -igola.com, 0 igoos.net, 0 igps.ru, 0 i-gram.ir, 0 -igrarniya.ru, 0 -igrovyeavtomatyvulcan.com, 0 igrow.cn, 0 igrushki7.com.ua, 0 -igs-aurichwest.de, 0 -igs-buchholz.de, 0 -igs-linden.eu, 0 -igsmelle.net, 0 ih5.cn, 0 -ihaima.com, 0 -ihep.ac.cn, 0 -ihewro.com, 0 -ihoc.net, 0 iho.in, 0 ihonex.com, 0 -ihr-darlehen.de, 0 ihrscloud.com, 0 ihuaben.com, 0 ihuan.me, 0 ihx99.vip, 0 -iiapple.com, 0 -iica.in, 0 iicavers.ru, 0 ii-i.org, 0 iiit.ac.in, 0 iimjobs.com, 0 -iinfo.cz, 0 -iinuu.lv, 0 -iirose.com, 0 iiss.org, 0 iitb.ac.in, 0 iitg.ac.in, 0 -iitp.ru, 0 -ijh.cc, 0 -ijser.cn, 0 ikalogs.ru, 0 -ikapiracy.com, 0 -ikarussecurity.com, 0 ikc.edu.tr, 0 -ikiapharm.com, 0 iki.fi, 0 iklangratiz.com, 0 iklub.sk, 0 iknow.jp, 0 iknow.travel, 0 -ikraikra.ru, 0 ikros.sk, 0 -iks.ru, 0 ikuai8.com, 0 ilab.cn, 0 ilam.ac.ir, 0 -ilance.com, 0 ilanni.com, 0 ilaoyawo.com, 0 ilcorsaronero.info, 0 -iletisimmakinesi.com, 0 -iliasnet.de, 0 iligang.cn, 0 ilizium.com, 0 -illucit.com, 0 -ilook.by, 0 ilounge.ua, 0 ilovemum.ru, 0 -iloveoops.com, 0 ilucca.net, 0 -ilustra.org, 0 -ilvescovado.it, 0 -ilync.cn, 0 im9.cz, 0 -imafex.sk, 0 imageban.ru, 0 -images-du-monde.fr, 0 imag.fr, 0 -imaginacolombia.com, 0 imaginarium.com.br, 0 imaginarium.es, 0 imarket.by, 0 imarotulos.com, 0 -imas.me, 0 -imatrix.com, 0 -imaxin.com, 0 -imaxmv.com, 0 imcn.me, 0 -imcopex.com, 0 -imc.tomsk.ru, 0 imedi.ge, 0 imeidata.net, 0 imei-server.com, 0 imei-server.ru, 0 -ime.moe, 0 -imenidni.eu, 0 -i-meto.com, 0 -imgchr.com, 0 -img.com.br, 0 img.com.ua, 0 -imikoko.com, 0 -imin.ru, 0 immigrationvoice.org, 0 -immmmm.com, 0 -immobiliarefull.com, 0 immobilienscout24.at, 0 immobilienscout24.de, 0 -immocha.com, 0 immotransit.be, 0 imoffice.com, 0 imore.com, 0 impactradius.com, 0 -imperator.club, 0 imperia-sadovoda.ru, 0 imperiyanews.ru, 0 -imperosoftware.com, 0 implyingrigged.info, 0 impresa.pt, 0 impressorajato.com.br, 0 improbable.io, 0 impulse.de, 0 -imspm.com, 0 -imssx.com, 0 imsxm.com, 0 imwork.net, 0 -in66.com, 0 inaani.com, 0 -inap.gob.ar, 0 in-berlin.de, 0 -inboxinsight.co.uk, 0 inbucovina.ro, 0 -incaa.gob.ar, 0 inc.com, 0 incircle.jp, 0 inconcertcc.com, 0 incontrion.com, 0 inc.ru, 0 -incust.com, 0 inc-vrdl.iq, 0 indamail.hu, 0 -indexa.de, 0 -indexforce.com, 0 -index.org.ru, 0 indiada.ru, 0 indiatradefair.com, 0 -indieweb.org, 0 indirads.work, 0 -indir.biz, 0 -indirimkuponum.net, 0 -individualkimsk.com, 0 -indonesianbacktrack.or.id, 0 indra.com, 0 -indue.com.au, 0 -indusos.com, 0 -ine.gob.gt, 0 -inera.se, 0 -ines.ro, 0 inet.edu.ar, 0 i-news.kz, 0 -inf74.ru, 0 -infars.ru, 0 -infiniflux.com, 0 infiniti.com.cn, 0 infinitus.com.cn, 0 infinitycloud.com, 0 infinixmobility.com, 0 -infino.me, 0 -infiplay.com, 0 inflibnet.ac.in, 0 -influans.com, 0 -influencerdb.net, 0 inflyteapp.com, 0 info241.com, 0 infobox.ru, 0 infobusiness2.ru, 0 -infoherman.com, 0 infoimoveis.com.br, 0 infokam.su, 0 -infokartta.fi, 0 -infolan.by, 0 -info-leaks.ru, 0 infomaniak.ch, 0 infomaniak.com, 0 infomercados.com, 0 -infometer.org, 0 -infomir.com.ua, 0 infomir.eu, 0 -infomiruk.co.uk, 0 infonavit.org.mx, 0 -infoniqa.com, 0 infon.ru, 0 infopraca.pl, 0 -infoprotector.com, 0 -inforesheniya.ru, 0 inforesist.org, 0 informamolise.com, 0 -informatics.ru, 0 -information-security.fr, 0 -informika.ru, 0 inform.kz, 0 inforoutefpt.org, 0 infoskidka.ru, 0 infosliv.club, 0 -infosport.ru, 0 -infoteca.it, 0 infotec.be, 0 -infotec.com.pe, 0 info.tm, 0 infovend.ru, 0 -infovip.biz, 0 infradead.org, 0 infrymo.com, 0 inf.ua, 0 -ingegneriareputazionale.com, 0 ingeteam.com, 0 -ingress-mosaics.com, 0 -ingrnet.com, 0 inistrack.net, 0 -initkms.ru, 0 -inits.at, 0 inje.ac.kr, 0 -injntu.com, 0 -inkdrop.info, 0 inke.cn, 0 -inke.com, 0 -inklestudios.com, 0 -inloox.com, 0 -inloox.de, 0 -inmart.ua, 0 -inmotionhosting.com, 0 inmyroom.ru, 0 innab.org, 0 -innerwise.com, 0 -innolux.com, 0 innopolis.ru, 0 innotech.co.jp, 0 -innotechx.com, 0 -inobroker.de, 0 inonu.edu.tr, 0 inovance.cn, 0 inovarmais.com, 0 -inovex.de, 0 inpa.gov.br, 0 -inpayment.ru, 0 -inplat-tech.com, 0 inpost.ru, 0 inpsycho.ru, 0 inres.sk, 0 -inscripcionscc.com, 0 -inscription-facile.com, 0 -insearch.edu.au, 0 insertcoin.mx, 0 insert.com.pl, 0 -insgeek.com, 0 -inshanedesigns.com, 0 -insideblog.org, 0 insideparadeplatz.ch, 0 insistpost.com, 0 inspire-energy.com.cn, 0 inspur.com, 0 instabot.ir, 0 instagramtakiphilesi.com, 0 -instahack.me, 0 -instakib.com, 0 -instalex.ru, 0 instamc.com.br, 0 -instaps.ru, 0 instawork.com, 0 instela.com, 0 instrumentschedule.com, 0 insurancenewsnet.com, 0 insynq.com, 0 -intaa.net, 0 intant.ru, 0 -inteam.com, 0 -intechinfo.fr, 0 intechnic.com, 0 integle.com, 0 -integnity.com, 0 -integralmedica.com.br, 0 -intel-academy.ru, 0 -intelek.cz, 0 -intelipost.com.br, 0 -intelligenceonline.com, 0 -intellij.net, 0 -intelsib.ru, 0 intelvision.sc, 0 interaction-design.org, 0 -interactivewebs.com, 0 interaffairs.ru, 0 interakt.co, 0 -interalpen.com, 0 -interaxions.ru, 0 -intercity.by, 0 intermaps.com, 0 -international-license.com, 0 internations.org, 0 -internetkurse-koeln.de, 0 -internetreputation.com, 0 -internet-verschenkmarkt.de, 0 internetwerk.de, 0 -internorm.com, 0 -interpane.com, 0 interpreters.travel, 0 interra.ru, 0 -interspeedia.com, 0 intersport.es, 0 intersport.ru, 0 -inters.ru, 0 -intertop.kz, 0 -intertrustgroup.com, 0 -intertwine.it, 0 intex.in, 0 inthepicture.com, 0 -inti.co.id, 0 intimcity.nl, 0 intinfra.com, 0 -intnet.dj, 0 intocareers.org, 0 -intorobot.com, 0 intovps.com, 0 -intred.it, 0 -intt.gob.ve, 0 intuit.com, 0 intuit.ru, 0 intvua.com, 0 inventec.com, 0 investservices.ir, 0 -invoicebus.com, 0 invoiceplane.com, 0 -inwebpro.gr, 0 -inwx.com, 0 inwx.de, 0 iobb.net, 0 -iocenter.ru, 0 ioe.edu.np, 0 ioinformatics.org, 0 iok.la, 0 iol8.com, 0 ioliu.cn, 0 iomedia.ru, 0 -iondigi.com, 0 -ionidea.com, 0 i-on.net, 0 -iooo.hu, 0 ios.ac.cn, 0 -iosjailbreak.tech, 0 iotivity.org, 0 ip138.com, 0 ip-188-165-217.eu, 0 -ipalfish.com, 0 -ip-approval.com, 0 -ipaslovakia.sk, 0 ipb.ac.id, 0 -ipcn.org, 0 ipdisk.co.kr, 0 iperf.fr, 0 -ipeye.ru, 0 ipfs.io, 0 -ip-games.ru, 0 ipinyou.com, 0 ipipe.ru, 0 ipmobilea.com, 0 ipmu.jp, 0 ipnxnigeria.net, 0 -ipoint.kz, 0 -ippexpo.org, 0 -ippi.com, 0 ipresta.ir, 0 ipricegroup.com, 0 -iprim.ru, 0 -iprotime.com, 0 -ipstock.com, 0 -iptel.org, 0 iptime.org, 0 -ipxe.org, 0 iqads.ro, 0 -iqbaby.ru, 0 -iqbusiness.net, 0 iqit-commerce.com, 0 iqoption.com, 0 iqor.com, 0 @@ -7137,13 +3971,9 @@ irangpsmap.com, 0 iranh.ir, 0 iranicard.com, 0 -irankhodros.com, 0 irankiai.lt, 0 iranmap.biz, 0 -iranmodern.com, 0 iranmohajerat.ir, 0 -iran-music.com, 0 -irannic.org, 0 iranonymous.org, 0 iransamaneh.com, 0 iranserver.com, 0 @@ -7153,35 +3983,24 @@ iraqinews.com, 0 irbib.com, 0 ircity.ru, 0 -irdp.ac.tz, 0 ireadercity.com, 0 iredmail.org, 0 iresis.com, 0 irfanview.de, 0 irgups.ru, 0 -irht.ir, 0 -iriding.cc, 0 -iridize.com, 0 iriney.ru, 0 -irklib.ru, 0 irk.ru, 0 irockbunny.com, 0 ironplanet.com, 0 -ironwifi.com, 0 iroot.kr, 0 irpowerweb.com, 0 irr.ru, 0 irsahosting.ir, 0 irsecteam.org, 0 -irserv.ir, 0 -irun.org, 0 is74.ru, 0 -isaanco.com, 0 -is-a-geek.com, 0 is-a-geek.org, 0 is-best.net, 0 ischool.com.tw, 0 -i-schools.ru, 0 iscool.co.il, 0 isea.ru, 0 iseehd.tv, 0 @@ -7190,238 +4009,127 @@ ishangzu.com, 0 ishanitech.biz, 0 ishansong.com, 0 -ishield.cn, 0 ishinfo.com, 0 ishoutbox.com, 0 ishuhui.com, 0 -isiarussia.ru, 0 isi.edu, 0 isif-life.com, 0 -iskmarket.com, 0 iskn.co, 0 -iskyshop.com, 0 islands.com, 0 ismdy.com, 0 isming.me, 0 -isnap.com, 0 -isoffice.cn, 0 isolux.ru, 0 isotools.org, 0 -ispbyte.ru, 0 ispeak.cn, 0 -ispfr.net, 0 -isqchina.cn, 0 -isqchina.com, 0 -isra.edu.pk, 0 -israela.ru, 0 israfish.com, 0 issaplus.com, 0 issdigitalthe.com.br, 0 -istafrica.com, 0 istanbulbilisim.com.tr, 0 -istanbulfm.com.tr, 0 istarshine.com, 0 istarvip.cn, 0 istek.edu.az, 0 istic.ac.cn, 0 istio.com, 0 -istitutodeglinnocenti.it, 0 -istranet.ru, 0 istt.ir, 0 istu.edu, 0 isu.ru, 0 -isuv.de, 0 -iswind.com, 0 -it2b.com.br, 0 -it376.com, 0 -itaita.ru, 0 -italtronik.it, 0 italy-vms.ru, 0 itangyi.com, 0 itb.ac.id, 0 -itbusiness.com.ua, 0 itcast.cn, 0 -itchannel.pt, 0 itcinfotech.com, 0 -itc-life.ru, 0 itcolima.edu.mx, 0 -it-connection.ru, 0 it.cx, 0 -itdos.com, 0 iteam.ru, 0 -itec.es, 0 itecgoi.in, 0 itechgyan.com, 0 -itechromania.com, 0 -itehk.com.hk, 0 itelligence.de, 0 -itelon.ru, 0 ithmz.com, 0 -ithub.hu, 0 -itiankong.net, 0 itiffany.cc, 0 -itinsight.pt, 0 -itiscali.cz, 0 itivi.pl, 0 -itjh.net, 0 it-kb.ru, 0 itlab.com.br, 0 itlalaguna.edu.mx, 0 itmages.ru, 0 itm.edu, 0 -itmitte.de, 0 itmo.com, 0 itmonline.co.in, 0 -itnull.ru, 0 -itotii.com, 0 itour.cn, 0 itouzi.com, 0 -itoyun.cn, 0 -itp.ac.cn, 0 it.pt, 0 itransition.com, 0 itresearches.ir, 0 itrip.com, 0 -itsajten.se, 0 itshaman.ru, 0 -itshneg.com, 0 itsk.com, 0 -itsyourshop.ru, 0 ittour.com.ua, 0 -ittun.com, 0 -it-tv.org, 0 -itugo.com, 0 -itural.ru, 0 -itworx.com, 0 -itwriter.ru, 0 -ityx.de, 0 itzmx.com, 0 i.ua, 0 iubh.de, 0 -iusss.us, 0 -iust.ac.ir, 0 iustice.net, 0 iuventa.sk, 0 iuvui.net, 0 -ivan-site.com, 0 -ivaoru.org, 0 ivc34.ru, 0 -ivedu.ru, 0 -ivers.ru, 0 ivest.kz, 0 iviewui.com, 0 ivi.ru, 0 -ivolga.tv, 0 i-vtb.by, 0 ivteleradio.ru, 0 iwant.cz, 0 -iwascoding.com, 0 -iwavesystems.com, 0 -iwin.me, 0 -iwo.es, 0 -iwuzhen.org, 0 -iwww.me, 0 ixdzs.com, 0 ixingpan.com, 0 ixinyou.com, 0 ixiumei.com, 0 -iyibank.com, 0 iyingdi.com, 0 iyiou.com, 0 -iyuce.com, 0 iyuntoo.com, 0 iyunv.com, 0 iyunxiao.com, 0 -izhforum.info, 0 -izhuchuang.com, 0 izim.az, 0 izmailovo.ru, 0 -izntz.com, 0 iztwp.com, 0 izvestia.ru, 0 -j0.cn, 0 -j2e.com, 0 jaadee.com, 0 -jaai.cn, 0 jaas.ac.cn, 0 jabber.ru, 0 jac.com.cn, 0 -jackcola.org, 0 -jacksonholewy.com, 0 jaeapp.com, 0 jaguar.ru, 0 -jahanscan.ir, 0 jahanserver.com, 0 -jahwa.com.cn, 0 -jakerevans.com, 0 -jakumo.org, 0 jalf.com, 0 jamasp.ir, 0 -jambit.com, 0 -jambler.com, 0 jamesallen.com, 0 -jammer4uk.com, 0 -jana.com, 0 -janfou.com, 0 -ja.nl, 0 janosh.com, 0 -jantrish.ru, 0 -japandaisuki.com, 0 -japantrek.ru, 0 japex.ru, 0 -jap-mom.com, 0 jaranguda.com, 0 jardinazuayo.fin.ec, 0 jarjad.ru, 0 -jarltech.de, 0 -jaroslaw.pl, 0 -javacardos.com, 0 -javamilk.com, 0 javanonline.ir, 0 javarush.ru, 0 javascript.ru, 0 jawset.com, 0 jazz-shop.ru, 0 -jc-bingo.com, 0 jci.cc, 0 jcndev.com, 0 -jconline.cn, 0 -jcouncil.net, 0 jcy.gov.cn, 0 jdair.net, 0 -jdbc.tokyo, 0 jd.com, 0 jdlf.com.au, 0 -jdriven.com, 0 jecvay.com, 0 -jee.io, 0 jejunu.ac.kr, 0 jelastic.com, 0 jellyfish.net, 0 jenkers.com, 0 -jenniczech.com, 0 -jennifersoft.com, 0 -je-papote.com, 0 -jeppson.org, 0 jerez.es, 0 jergym.cz, 0 -jerky.com, 0 jerryspizza.ro, 0 -jester-soft.ws, 0 -jesuislibre.net, 0 jesus-comes.com, 0 jetinsta.com, 0 -jetlovers.com, 0 jetzt.at, 0 -jewcer.org, 0 jeyserver.com, 0 jfservice.ru, 0 -jfz.com, 0 -jg-gta.com, 0 jgospel.net, 0 jhddg.com, 0 -jhs.ch, 0 -jhsnet.org, 0 jhu.edu, 0 jia.com, 0 jiae.com, 0 @@ -7431,33 +4139,17 @@ jiangmen.gov.cn, 0 jiangnan.edu.cn, 0 jianjiaobuluo.com, 0 -jiankang51.cn, 0 jiankang.com, 0 -jianyezuqiu.cn, 0 -jianzhimao.com, 0 jiashuangkuaizi.com, 0 -jiashuangkuaizi.com.cn, 0 -jiasule.com, 0 -jiaxincloud.com, 0 jiayougo.com, 0 -jicin.cz, 0 -jiecao.fm, 0 jiedaibao.com, 0 jiedai.cn, 0 -jieliku.com, 0 jiemodui.com, 0 jieyitong.cn, 0 -jiitsimplified.com, 0 jijiys.com, 0 -jike.info, 0 jikewenku.cn, 0 -jileniao.net, 0 -jiloc.com, 0 -jiluxinqing.com, 0 jin10.com, 0 jindl.com.cn, 0 -jingletruck.com, 0 -jingruis.com, 0 jinkan.org, 0 jinnong.cn, 0 jinri.cn, 0 @@ -7470,121 +4162,69 @@ jinzhoubank.com, 0 jios.org, 0 jisutiyu.com, 0 -jit.edu.cn, 0 jitterclick.it, 0 -jiu6.com, 0 jiuguge.com, 0 jiuxian.com, 0 -jiuzhang.net, 0 jiuzhilan.com, 0 jivaro.com, 0 -jixuanran.com, 0 jj.cn, 0 jjmmw.com, 0 jkpan.cc, 0 jl.gov.cn, 0 -jlmedu.com, 0 jlnu.edu.cn, 0 jlpay.com, 0 jlu.edu.cn, 0 jluzh.com, 0 -jmc.asia, 0 jme.com, 0 -jmmama.com.cn, 0 -jmoins.fr, 0 jmramirez.pro, 0 -jmtw.cc, 0 -jmyan.com, 0 -jnbhgbox.org, 0 -job-63.ru, 0 jobbik.hu, 0 -jobcluster.de, 0 jobindo.com, 0 -jobitus.com, 0 -jobmixer.com, 0 -jobnet.com.tw, 0 job.ru, 0 job-sbu.org, 0 jobthai.com, 0 -jodies.de, 0 jodoplay.com, 0 -joelmediatv.de, 0 -joeyh.name, 0 -johanpaul.net, 0 joiiup.com, 0 -joinfcloud.com, 0 joinquant.com, 0 -joins-job.com, 0 -joinsquad.ru, 0 joker.com, 0 -jokerkartenwelt.de, 0 jolco.com, 0 joomlagate.com, 0 -joomlashop.org, 0 -joseantoniomadrigal.com, 0 -josefprusa.cz, 0 jostle.me, 0 -joubert-change.fr, 0 -joudou.com, 0 jourdegalop.com, 0 -journeyman.tv, 0 joybomb.com.tw, 0 joyfulhonda.com, 0 -joykidshop.com, 0 -joyland.se, 0 joyme.com, 0 joyomm.com, 0 -joyoung.com, 0 joyowo.com, 0 -jozsefattilaszinhaz.hu, 0 jpgazeta.ru, 0 jpg.wtf, 0 -jplopsoft.idv.tw, 0 jpmarumaru.com, 0 -jpmens.net, 0 jp.net, 0 jpn.ph, 0 -jpwind.com, 0 jqpublicblog.com, 0 jquery.re, 0 jrj.com.cn, 0 -jrmf360.com, 0 -js7tv.cn, 0 js99cf.com, 0 jsbc.com, 0 jsinfo.net, 0 -jsj.com.cn, 0 jslib.org.cn, 0 jsrun.net, 0 -j-stash.club, 0 jst-hosp.com.cn, 0 jstv.com, 0 -jsychrss.gov.cn, 0 -jtfa.cn, 0 -jtljia.com, 0 -jtmfoodgroup.com, 0 -jtthink.com, 0 ju53.com, 0 -juandemariana.org, 0 juanpi.com, 0 juanpi.org, 0 jubaopay.com, 0 juben108.com, 0 jubna.com, 0 -jubushoushen.com, 0 jucaicat.com, 0 juesheng.com, 0 juhe.cn, 0 -juick.com, 0 juicysexstories.com, 0 -juii.net, 0 juju.com, 0 julianhuang.cc, 0 julyedu.com, 0 jumei.com, 0 -jumin.cc, 0 juming.com, 0 -jumpingcrab.com, 0 jumpserver.org, 0 juneinter.com, 0 juneyaoair.com, 0 @@ -7592,27 +4232,14 @@ jungle-world.com, 0 juniperresearch.com, 0 juniqe.com, 0 -junkart.in, 0 -junlin.li, 0 -juntong.or.kr, 0 -junzejun.com, 0 jupem.gov.my, 0 -jupiterhell.com, 0 jurion.de, 0 jusha.com, 0 -justarchi.net, 0 -justcoded.com, 0 -just-half-price.dk, 0 -just-hosting.ru, 0 justhost.ru, 0 -justmoda.ru, 0 -just.social, 0 justwinit.cn, 0 juzhao.net, 0 juzilab.com, 0 -juziplus.net, 0 jv.ru, 0 -jvstoronto.org, 0 jvtuiba.com, 0 jvweb.fr, 0 jvweb.org, 0 @@ -7622,10 +4249,7 @@ jxzmz.org, 0 jy391.com, 0 jyall.com, 0 -jyh.com, 0 jylc168.com, 0 -jzez100.com, 0 -jzteyao.com, 0 k12.al.us, 0 k12.ca.us, 0 k12china.com, 0 @@ -7638,19 +4262,12 @@ k12.or.us, 0 k12.pa.us, 0 k12.va.us, 0 -k1kan.cc, 0 -k31.ru, 0 k3.cn, 0 -k3idc.com, 0 -k5-conference.com, 0 k7computing.com, 0 -k8dy.top, 0 -kaartenhuis.nl, 0 kaartje2go.nl, 0 kabbalahgroup.info, 0 kabbalah.info, 0 kachon.com, 0 -kade.de, 0 kadinca.club, 0 kadrovik.ru, 0 kadu.ru, 0 @@ -7662,59 +4279,33 @@ kaganonline.com, 0 kagawa.jp, 0 kagirl.cn, 0 -kagithane.bel.tr, 0 kags.com, 0 -kaifakuai.com, 0 kaikeba.com, 0 kaike.la, 0 kaimi.io, 0 kaist.ac.kr, 0 kaixian.tv, 0 -kajot-casino.com, 0 kajot.cz, 0 -kakolijeciti.com, 0 kakpravilnosdelat.ru, 0 -kakuro-knacker.de, 0 kalcaddle.com, 0 kaleostra.com, 0 kalibr603.ru, 0 kaluga-gov.ru, 0 kalvin.cn, 0 kalyanamitra.org, 0 -kalyanis.ru, 0 -kalyanmir.ru, 0 -kalyanvkarmane.ru, 0 -kamaran.ru, 0 kamaz.ru, 0 kameleoon.com, 0 kamensktel.ru, 0 -kamenwang.com, 0 -kametsu.com, 0 -kamgov.ru, 0 -kamjachoob.com, 0 -kamo-uniforma.ru, 0 -kamrad.ru, 0 kanagawa.jp, 0 -kanalizaciyavdome.ru, 0 -kancapos.com, 0 kancelarskezidle.com, 0 kancloud.cn, 0 kandasoft.com, 0 -kandianying.tv, 0 kaneland.org, 0 -kanet.ru, 0 -kangmei.com.cn, 0 -kangndo.com, 0 kangou.cn, 0 -kanibaspinar.net.tr, 0 kannadigaworld.com, 0 kanyanbao.com, 0 -kanyewestshoe.com, 0 kanyewestsneakers.com, 0 -kanz.jp, 0 kaolalicai.cn, 0 -kaomanfen.com, 0 -kaonsoftwares.com, 0 kaoputou.com, 0 kaoyan.com, 0 kapaza.be, 0 @@ -7724,230 +4315,140 @@ kapten-son.com, 0 karandash.by, 0 karaoteca.com, 0 -karate.ru, 0 karatov.com, 0 karcher.ru, 0 karelia.pro, 0 -karex.ru, 0 kargo.com, 0 karibiya.ru, 0 karl.com, 0 -karmagroup.com, 0 karmania-auto.ir, 0 -karner-dechow.at, 0 karofilm.ru, 0 -karpvp.net, 0 kartagrada.ru, 0 -kartasportowa.pl, 0 kartina.tv, 0 -kartinatv.co.il, 0 kartinfo.me, 0 kartkolandia.pl, 0 kartoteka.by, 0 karwan.cn, 0 kasaba.uz, 0 -kasperskyclub.ru, 0 kaspersky.ru, 0 -kassa.uz, 0 -kassir.kz, 0 -kastnersw.cz, 0 katacoda.com, 0 -katatelecom.com, 0 -katetooncopywriter.com.au, 0 -kau-boys.com, 0 kau-boys.de, 0 kaufen.com, 0 kaufmann.dk, 0 kauf.sk, 0 -kaunoenergija.lt, 0 -kautbullinger.de, 0 -kavehglass.com, 0 kavehome.com, 0 kawasaki-net.ne.jp, 0 -kazagro.kz, 0 -kazakhmys.kz, 0 -kazakh-zerno.kz, 0 -kaze-travel.co.jp, 0 kazminerals.com, 0 kaznau.kz, 0 kazntu.kz, 0 -kazpost.kz, 0 -kaztranscom.kz, 0 -kaztransoil.kz, 0 kaztrk.kz, 0 kb20.cc, 0 -kbb1.com, 0 kbcnet.rs, 0 kbdyw.com, 0 kbrnet.ru, 0 -kbs.co.kr, 0 kbstar.com, 0 kbtu.kz, 0 kcg.gov.tw, 0 -kcloud.me, 0 -kcorp.sk, 0 kc-shoes.ru, 0 -kcsnet.or.kr, 0 kddi.com, 0 kde.org, 0 kdevelop.org, 0 kdliker.com, 0 kdl.org, 0 kdslife.com, 0 -ke8u.com, 0 keaz.ru, 0 kebudayaanindonesia.net, 0 -kechlibar.net, 0 kedou.com, 0 keejob.com, 0 keelbeel.com, 0 -keepfree.de, 0 keepo.me, 0 -keep.pl, 0 -keft.ru, 0 kejianet.cn, 0 kelasexcel.web.id, 0 -kemdikbud.go.id, 0 -kenfor.com, 0 kenh76.vn, 0 -kenkaitube.com, 0 -kentrade.go.ke, 0 -kepeslap.hu, 0 -kerawa.com, 0 kerch.net, 0 -keri.re.kr, 0 -kerneleros.com, 0 kernelnewbies.org, 0 kernel.org, 0 -kerosoft.com, 0 ketabrah.ir, 0 ketabshop.ir, 0 ketangpai.com, 0 ketianyun.com, 0 kevinguanchedarias.com, 0 -kewaimiao.com, 0 kexindai.com, 0 key4math.com, 0 keyboardmaestro.com, 0 keybr.com, 0 keylol.com, 0 keymachine.de, 0 -keysystems.ru, 0 -keytrade.com, 0 keyweb.de, 0 -keywordinspector.com, 0 kfc.ru, 0 kg7.ru, 0 kgeu.ru, 0 -kgh.on.ca, 0 kgs-drochtersen.de, 0 kgsu.ru, 0 khabshop.com, 0 khai.edu, 0 -khaneirany.com, 0 kharidaram.com, 0 -kharidazma.com, 0 -khatvongsong.vn, 0 kh.edu.tw, 0 khhq.net, 0 -khidmatnegara.gov.my, 0 khnu.km.ua, 0 khosousi.com, 0 -khotkovo.net, 0 khstu.ru, 0 khv.gov.ru, 0 khv.ru, 0 kia.ru, 0 kichler.com, 0 -kick9.com, 0 -kick.lv, 0 kicks-ass.net, 0 kicksdaily.net, 0 kickservapp.com, 0 kickz.com, 0 -kidcheck.com, 0 -kid-control.com, 0 -kiddywood.ru, 0 kidlogger.net, 0 kidscasting.com, 0 kidsmusic.info, 0 kids-price.ru, 0 kievcity.gov.ua, 0 kimsufi.com, 0 -kinderedu.ru, 0 -kindertelefoon.nl, 0 -kineme.net, 0 kingdee.com, 0 kingnet.com.tw, 0 kingoapp.com, 0 kingpokers.com, 0 -kingsoft.net, 0 kingss.win, 0 -kingsunsoft.com, 0 -kinhom.com, 0 -kinokosmos.ee, 0 -kinoloop.ru, 0 kinoluvr.net, 0 kinomarvel.info, 0 -kinonews.de, 0 kinopark.kz, 0 kinopik.info, 0 -kinoscenariy.net, 0 kinosearch.me, 0 -kinosky.net, 0 kinosmena.ru, 0 -kinotut.org, 0 kinovinki.net, 0 -kinozal.cc, 0 kinozal.website, 0 -kippee.com, 0 -kippnyc.org, 0 kiprinform.com, 0 -kipspb.ru, 0 -kirmiziperfect.com, 0 -kirpalani.com, 0 kissandfly.at, 0 kissandfly.com, 0 kissandfly.de, 0 -kissfm.md, 0 -kit.ac.jp, 0 kitchenmag.ru, 0 kitenet.ru, 0 kitwee.com, 0 -kiwihk.net, 0 -kiwi.nz, 0 kiwitaxi.com, 0 kiwitaxi.ru, 0 kiyu.tw, 0 -kjb-connect.com, 0 kjds.com, 0 kjm6.de, 0 kjson.com, 0 kjvvv.kr, 0 -kkguan.com, 0 kkmcom.ru, 0 -kknyazeva.ru, 0 kktv8.com, 0 kku.ac.kr, 0 kku.ac.th, 0 klagemauer.tv, 0 klarstein.com, 0 klarstein.fr, 0 -klarstein.hu, 0 klarstein.it, 0 -klarstein.sk, 0 kla.tv, 0 -klavtorg.ru, 0 kl.com.ua, 0 kldp.org, 0 kl.edu.tw, 0 kleeneze.co.uk, 0 -kleotour.ru, 0 -kler.pl, 0 klickmail.com.br, 0 klick-tipp.com, 0 -klimatex.eu, 0 -klogeschichten.net, 0 kloud51.com, 0 klubcytrynki.pl, 0 klv-oboi.ru, 0 @@ -7960,165 +4461,95 @@ knastu.ru, 0 knet.cn, 0 kneu.edu.ua, 0 -knigafund.ru, 0 knightfrank.com, 0 knighthunter.com, 0 knigogid.ru, 0 -knigosvet.com, 0 knowbox.cn, 0 -knowledgehook.com, 0 knutd.com.ua, 0 knutd.edu.ua, 0 -knu.ua, 0 kobayashi.co.jp, 0 -koblist.com, 0 -kochanhaengerwerke.de, 0 koenig-solutions.com, 0 kolgot.net, 0 kolhoz.mobi, 0 kolosej.si, 0 komcity.ru, 0 -komersa.lv, 0 -komicolle.org, 0 -komi-news.ru, 0 komoot.de, 0 komparify.com, 0 -kompas.si, 0 komtv.org, 0 konduit.io, 0 konicaminolta.com.cn, 0 -konigchain.com, 0 konstanz.de, 0 -kontestapp.com, 0 konwerter.net, 0 konzolokszervize.hu, 0 koo.cn, 0 kookit.com, 0 kookje.ac.kr, 0 koolearn.com, 0 -kooxpi.com, 0 -kopeysk24.ru, 0 kopilkaclub.ru, 0 korea.ac.kr, 0 koreastardaily.com, 0 -korenpub.com, 0 koreus.com, 0 korex.co.kr, 0 -kornit.com, 0 -koronacloud.com, 0 -koshelek.kz, 0 -koshikira.de, 0 -kosice.sk, 0 -kosmos-kino.ru, 0 kosmos-x.net.ru, 0 -kotitorni.com, 0 koule.cz, 0 -koulouba.com, 0 -kovrov.net, 0 kpfu.ru, 0 kpi.kharkov.ua, 0 -kplus.pro, 0 -kpoly.edu.gh, 0 kq88.com, 0 krakow.pl, 0 -kralici.cz, 0 -kralmp3.org, 0 kramtp.info, 0 krasgmu.ru, 0 -kraslan.ru, 0 krasmama.ru, 0 -krasno.ru, 0 -krasview.ru, 0 krautchan.net, 0 -krebsforum-fuer-angehoerige.de, 0 kreditech.com, 0 kre.hu, 0 kresla-market.ru, 0 -k-res.net, 0 -kr.gov.ua, 0 krita.org, 0 -krl.co.id, 0 kro.kr, 0 krones.com, 0 -krosno.com.pl, 0 kros.sk, 0 -krsn.ru, 0 krsu.edu.kg, 0 -kr-ustecky.cz, 0 -krutomer.ru, 0 ksamata.ru, 0 -ksbao.com, 0 -ksd-i.com, 0 -ksil.com, 0 ksivi.co, 0 -ksivi.pro, 0 -ksk66.ru, 0 -ksmx.me, 0 ksoa.net, 0 kspu.ru, 0 ksrf.ru, 0 -kss45.ru, 0 -kstp.ir, 0 kstu.kg, 0 kstu.ru, 0 ksu.edu.tw, 0 ksu.kz, 0 ksyic.com, 0 kt.am, 0 -ktb.com.tw, 0 ktb.co.th, 0 k-telecom.org, 0 kth.se, 0 ktng.com, 0 ktokogda.com, 0 ktovkurse.com, 0 -ktze.kz, 0 -kuadro.com.br, 0 kuaidi.com, 0 kuaidihelp.com, 0 kuaidi.hk, 0 kuaikanmanhua.com, 0 -kuaishou.com, 0 -kuaiyun.cn, 0 kuaxue.com, 0 -kubaninstrument.ru, 0 kubankredit.ru, 0 kubannet.ru, 0 kubsau.ru, 0 kubstu.ru, 0 kucharkaprodceru.cz, 0 kudo.co.id, 0 -kueiwa.com, 0 kufatec.de, 0 -kugou.net, 0 kuguya.com, 0 kuitao8.com, 0 kukmin.tv, 0 kukubt.com, 0 kuku.lu, 0 kullsms.com, 0 -kulturniportal.cz, 0 -kumamoto.jp, 0 -kunstnet.de, 0 -kupai.me, 0 kupi-prodai.kz, 0 -kuponuna.com, 0 -kupplung.at, 0 -kupplung.de, 0 -kuraldisi.com, 0 -kurien.co.kr, 0 kurier.at, 0 kursoteka.ru, 0 -kurtizanki.su, 0 -kurzy.sk, 0 kusuriexpress.com, 0 -kutnahora.cz, 0 -kuvajmo-blogovski.com, 0 kuwo.cn, 0 kuz.ua, 0 kvaclub.ru, 0 -kvado.ru, 0 -kvarnado.ru, 0 kvartiranasutki.by, 0 kvartplata.info, 0 kvcc.edu, 0 @@ -8126,71 +4557,37 @@ kwant-project.org, 0 kwps.info, 0 kws7.com, 0 -kxtui.com, 0 -kyberia.sk, 0 kyiv.ua, 0 -kylesfileserver.org, 0 kylos.pl, 0 -kymcolux.com, 0 -kyoceramobile.com, 0 kyoto-wu.ac.jp, 0 kysto.com, 0 kzn.ru, 0 -kzwr.com, 0 l2jbrasil.com, 0 l3600.com, 0 l4m.fr, 0 -laartcc.org, 0 lab4u.ru, 0 labazur.com, 0 labelup.ru, 0 -labelzone.co.uk, 0 labix.org, 0 labmedica-patient.fr, 0 -laboradian.com, 0 labruixador.es, 0 -lacl.fr, 0 lacompagnie.com, 0 -lacomunity.com, 0 -lacotto.jp, 0 -lada.kz, 0 -ladige.it, 0 -ladya-avto.ru, 0 ladyband.com, 0 -ladybirds.ru, 0 ladyclick.ru, 0 ladyplace.ru, 0 -lae-edu.com, 0 -laekh.de, 0 lael.be, 0 -lafibre.info, 0 -lagarderob.ru, 0 -lagence.pt, 0 -laguiaw.com, 0 lagunacity.ru, 0 -lairen.com, 0 lakana.com, 0 -lalettrea.fr, 0 lalilali.com, 0 -laltroweb.it, 0 -lambertgroup.ro, 0 -lames.jp, 0 -lamptkes.org, 0 lan1.de, 0 lance.moe, 0 -lancloud.ru, 0 -landiannews.com, 0 landi.com, 0 -landicorp.com, 0 -landmarklondon.co.uk, 0 landray.com.cn, 0 landrover.ru, 0 lanet.lv, 0 lanet.me, 0 lanet.ua, 0 lanfw.com, 0 -langageoral.com, 0 -langate.tv, 0 langhamhotels.com, 0 langland.cc, 0 langren8.com, 0 @@ -8200,179 +4597,101 @@ lanseyujie.com, 0 lanterncn.cn, 0 lanzou.com, 0 -laocaibao.com, 0 laparfumerie.ru, 0 -laplacinte.ro, 0 -laplagnet.com, 0 lap-publishing.com, 0 -laptopg7.vn, 0 laptopszaki.hu, 0 laptopvip.vn, 0 laravist.com, 0 -laraweb.ir, 0 lardbucket.org, 0 -largadoemguarapari.com.br, 0 -larinshop.com, 0 larsjung.de, 0 -larusodejda.ru, 0 -laserbits.com, 0 -laserline.de, 0 -lasignificationprenom.com, 0 lasindias.com, 0 -laspace.ru, 0 last2ticket.com, 0 -lastationdeski.com, 0 -latamautos.com, 0 -latetrain.cn, 0 lativ.com, 0 lativ.com.tw, 0 -latoquedor.com, 0 latvenergo.lv, 0 -latymer.co.uk, 0 laukar.com, 0 launchaco.com, 0 lausanne.ch, 0 lavaradio.com, 0 lavector.com, 0 -lavitrinedelamode.com, 0 -lawfulpath.com, 0 -law-school.de, 0 layabox.com, 0 -layouteditor.net, 0 laziodisu.it, 0 lazurit.com, 0 lazyland.net, 0 -lazytool2.com, 0 -lbgoo.com, 0 lbxcn.com, 0 -lbyx.cn, 0 lcbk.net, 0 lcd1.ru, 0 -lcgitsystems.com.br, 0 lcxzs.cn, 0 -lcygroup.com, 0 -ldap-account-manager.org, 0 ldcx.net, 0 ldichina.com, 0 ldiglobal.org, 0 leadbit.com, 0 -leadercf.com, 0 -leader-id.ru, 0 -leadermt.ru, 0 -leadingsoft.com, 0 leadiq.io, 0 -leadsale.com, 0 leadvertex.ru, 0 -leaf-hide.jp, 0 -league-mastery.com, 0 leandev.cn, 0 leangoo.com, 0 -leanlabs.io, 0 -learnamatrol.com, 0 learnattack.de, 0 -learning2learn.cn, 0 learninghabitat.org, 0 -learningshop.com, 0 -learnsoci.al, 0 leavesongs.com, 0 leawo.com, 0 leboncoin.fr, 0 lecake.com, 0 -leclick.ru, 0 lecloud.com, 0 lede-project.org, 0 -ledwatts.fr, 0 -leechking.com, 0 leeet.net, 0 -leet.cc, 0 leforumcatholique.org, 0 -lefresnoy.net, 0 legadelfilodoro.it, 0 legalacts.ru, 0 -legalaid.gov.ua, 0 legal-alien.ru, 0 -legavolleyfemminile.it, 0 leg.br, 0 -legendsec.com, 0 -legionowo.pl, 0 legnica.pl, 0 legrandchangement.com, 0 legrandchangement.tv, 0 -lehangart.com, 0 lehner-versand.ch, 0 lehrerfortbildung-bw.de, 0 leibnitz.net, 0 -leicashop.ir, 0 -leidiandian.com, 0 leiner.at, 0 leju.com, 0 lemeids.com, 0 -lemezkucko.hu, 0 -lemoboo.de, 0 -lemonnow.com, 0 lemonsay.com, 0 lemurov.net, 0 -lending51.com, 0 lendio.com, 0 lendock.com, 0 lendon.pl, 0 -lenfilm.ru, 0 -leniter.org, 0 lenizdat.ru, 0 -lennoxintl.com, 0 lenobl.ru, 0 lenovo.com, 0 lenovo.com.cn, 0 -lenreg.ru, 0 leomadeiras.com.br, 0 leoneteam.com, 0 leonrestaurants.co.uk, 0 leopays.com, 0 -leplandiscret.com, 0 lepu.cn, 0 -lepumedical.com, 0 lerevecraze.com, 0 -lesieur.fr, 0 lesiteimmo.com, 0 lesk.ru, 0 -lestendances.fr, 0 -lestheatres.net, 0 -lesy.sk, 0 letgo.com, 0 letitfly.me, 0 -lets-farm.com, 0 letsfilm.org, 0 lets-fish.com, 0 -lets-hunt.com, 0 letsinvite.xyz, 0 letstalkpayments.com, 0 letu.ru, 0 letu.ua, 0 leupay.eu, 0 -levelup.in.th, 0 levneknihy.cz, 0 lewaimai.com, 0 lewaos.com, 0 -lewei50.com, 0 lexdir.com, 0 lextel.it, 0 leya.com, 0 -leyifan.com, 0 leyue100.com, 0 -lfrm.net, 0 -lfs.org.uk, 0 -lgallardo.com, 0 -lgek.ru, 0 -lgg.ru, 0 -lhageek.com, 0 -lh-broker.ru, 0 lh.or.kr, 0 lhoroscope.com, 0 liangxinyao.com, 0 lianshang.com, 0 lianyexiuchang.in, 0 liaohuqiu.net, 0 -libbs.com.br, 0 libertex.com, 0 libertex.org, 0 liberty.me, 0 @@ -8380,139 +4699,76 @@ libraryofbabel.info, 0 library.sh.cn, 0 libreoffice.org, 0 -libreriacoletti.it, 0 libri.it, 0 libro.at, 0 -libroco.it, 0 -libros.ink, 0 libsdl.org, 0 -libsmr.ru, 0 libvirt.org, 0 -license.ddns.net, 0 licenseha.com, 0 -lichanglin.cn, 0 -lider-exp.ru, 0 lidgroup.ru, 0 -liesegang-partner.de, 0 lieyunwang.com, 0 -lifan.moe, 0 life2film.com, 0 -lifefood.eu, 0 lifehacker.ru, 0 lifeline.org.au, 0 life-realty.ru, 0 -lifeseasy.com.cn, 0 lifestyle4living.de, 0 lifestyle.ng, 0 -lifetyper.com, 0 -lifo.gr, 0 -ligainternet.ru, 0 liga.net, 0 -ligerelectronics.com, 0 -lightc.com, 0 -lighthouse.gr, 0 lightss.co, 0 -lightstar.ru, 0 -ligloo.fr, 0 -liguebretagnebillard.fr, 0 like4u.ru, 0 -likefifa.ru, 0 -likelo.ws, 0 -likesnew.ru, 0 likewear.ru, 0 likinming.com, 0 lilanz.com, 0 -lileesystems.com, 0 -lilletourism.com, 0 lima-city.de, 0 lime-shop.ru, 0 limh.me, 0 -limijiaoyin.com, 0 limin.com, 0 limuzhengxin.com, 0 linban.com, 0 lindner-group.com, 0 linekong.com, 0 -linemedia.ru, 0 -linewell.com, 0 linghit.com, 0 lingla.com, 0 -linglongtech.com, 0 linguanet.ru, 0 -linguarana.com, 0 linguitronics.com, 0 linhadefensiva.org, 0 linkello.com, 0 linkpc.net, 0 linkup.com, 0 -linsenpate.de, 0 lintut.com, 0 -linux62.org, 0 -linuxcenter.kz, 0 -linux.cn, 0 linuxeye.com, 0 linuxfoundation.org, 0 linuxihaa.ir, 0 linuxito.com, 0 -linux-mips.org, 0 -linux-mm.org, 0 linux-onlineshop.de, 0 linuxpl.eu, 0 -linuxsecurity.com, 0 linuxsoid.com, 0 -linux-tips-and-tricks.de, 0 -linzi.ru, 0 -linzy.ru, 0 -lionfree.net, 0 lions.de, 0 -liotech.ru, 0 lipi.go.id, 0 liqu.com, 0 -liquidation.com, 0 liquid-life.de, 0 liquidm.com, 0 -lirise.com, 0 lirn.net, 0 lis99.com, 0 listafirme.ro, 0 -listcarbrands.com, 0 -listenflower.com, 0 listenod.ru, 0 -listingdomsearch.com, 0 -listupp.com.br, 0 -listupp.es, 0 -listupp.fr, 0 listupp.it, 0 listupp.pl, 0 -listupp.ru, 0 liteforex.com, 0 liteforex.ru, 0 -litl-admin.ru, 0 littlecaprice-dreams.com, 0 -littlelunch.de, 0 littleswan.com, 0 -liturgia.pt, 0 liu.ba, 0 liubingyang.com, 0 -liugong.com, 0 liujason.com, 0 liujunchen.xyz, 0 liuzhichao.com, 0 livacha.com, 0 livecoding.tv, 0 -livecoins.ru, 0 livefast.it, 0 -livehome3d.com, 0 livelivelive.com, 0 -livepda.ru, 0 -liveschool.net, 0 livescore.com, 0 livescore.co.uk, 0 -livetyping.com, 0 -living-bots.net, 0 -livingnaturally.com, 0 livrenet.ru, 0 -liwai.com, 0 lixin.edu.cn, 0 liyang.io, 0 liyathabara.com, 0 @@ -8520,67 +4776,37 @@ lizhenwang.cn, 0 lizhenwang.com, 0 lizhi.fm, 0 -lizhi.io, 0 lizhiweike.com, 0 lizi.com, 0 -lizihang.com, 0 -ljscripts.com, 0 ljsilvers.com, 0 -lj-top.ru, 0 -lkker.com, 0 lks-tv.ru, 0 llamayamovil.com, 0 lmcservers.com, 0 -lmdinteractive.com, 0 lmt.lv, 0 -lncc.br, 0 lnka.cn, 0 lnu.edu.cn, 0 lnu.edu.ua, 0 -lo9.de, 0 loadedmovies.com, 0 -loadup.ru, 0 loadxtreme.ph, 0 localau.com, 0 -loccitane.cn, 0 -lockinchina.com, 0 locojoy.com, 0 -locpg.hk, 0 -locutorioonline.es, 0 loe.lviv.ua, 0 -loganmarchione.com, 0 logcg.com, 0 logic-games.spb.ru, 0 -logicmelon.com, 0 -logico.cloud, 0 -logindex.com, 0 loginto.me, 0 logobaker.ru, 0 logodashi.com, 0 -logoip.de, 0 -logomatic.fr, 0 -logos.net, 0 -logre.eu, 0 -loh-group.com, 0 -lojasegmento.com.br, 0 lojaskd.com.br, 0 loji.com, 0 -lokalebasen.dk, 0 lol5s.com, 0 loldan.com, 0 loli-h.com, 0 -lomax.cz, 0 londontheatredirect.com, 0 -longfor.com, 0 longsys.com, 0 lookfor.kz, 0 looknij.in, 0 loongair.cn, 0 -loopbyte.com, 0 -loramobile.de, 0 -lords.mobi, 0 loreal.net, 0 -lostcut.net, 0 lostiempos.com, 0 loto.ro, 0 lottery.gov.cn, 0 @@ -8589,210 +4815,119 @@ louisacoffee.com.tw, 0 louisiana.edu, 0 louisiana.gov, 0 -lovean.com, 0 -lovehd.top, 0 loveliv.es, 0 lovelivewiki.com, 0 loveota.com, 0 -love-piano.ru, 0 lovepresent.ru, 0 loveq.cn, 0 -loveslife.biz, 0 -loveu.tw, 0 -lowcostparking.eu, 0 lowcygier.pl, 0 lowyinstitute.org, 0 -loxforum.com, 0 loyalsoldier.me, 0 -lpcorp.com, 0 lpcware.com, 0 lpgenerator.ru, 0 -lrts.net, 0 lsjsoso.com, 0 -lskc.edu.hk, 0 -lsoft.hu, 0 -ltdtickets.com, 0 ltd.ua, 0 ltsu.org, 0 lua.org, 0 -luatminhgia.com.vn, 0 lublin.eu, 0 lucca.fr, 0 luciad.com, 0 -ludado.com, 0 ludwig.guru, 0 luebeck.de, 0 lufficc.com, 0 lugasat.org.ua, 0 lugons.org, 0 -luisfm.es, 0 -luluyou.com, 0 -lumenvox.com, 0 -lundalogik.com, 0 -lundao.com, 0 lun.ua, 0 -luogu.org, 0 luohuedu.net, 0 -luolei.org, 0 luoxiao123.cn, 0 -lurenet.ua, 0 lurkmo.re, 0 lurkmore.co, 0 -lurkmore.net, 0 lurkmore.ru, 0 lurkmore.so, 0 lurkmore.to, 0 lusen.com, 0 -lush.com.ua, 0 lusilusi.com, 0 -luviaglobal.com, 0 luxedition.ru, 0 luxoft.com, 0 luxottica.com, 0 -luxuqing.com, 0 luzhou.com, 0 lv9.org, 0 -lvbeivpn.cc, 0 lvbeivpn.cn, 0 lvcgroup.com, 0 lvwenhan.com, 0 -lvxia.me, 0 lvyouquan.cn, 0 -lwl12.com, 0 lwl.org, 0 -lwxshow.com, 0 lxx1.com, 0 lyad.fr, 0 -lyblog.net, 0 -lybomudr.ru, 0 -lyceefrancais.at, 0 -lyceefrancais.org.uk, 0 lyceum62.ru, 0 -lyfboat.com, 0 -lylinux.org, 0 -lysa-hora.cz, 0 -lzhaofu.cn, 0 lzu.edu.cn, 0 m19aixin.com, 0 m1net.com.sg, 0 m247.com, 0 m24.ru, 0 -m2c.ru, 0 m2indonesia.com, 0 -m2mled.net, 0 -m3guo.com, 0 -maansun.com, 0 mabangerp.com, 0 ma.by, 0 -macau-airport.com, 0 maccentre.ru, 0 -macgames.fr, 0 mach3.jp, 0 -machinalis.com, 0 -machula.ru, 0 -maco.eu, 0 macpeers.com, 0 macphun.com, 0 macprime.ch, 0 -macroscop.com, 0 mac-status.de, 0 macx86.cn, 0 macx.cn, 0 macx.ws, 0 madailicai.com, 0 madefire.com, 0 -madeinua.org, 0 mad-gamble.net, 0 madisoft.it, 0 -madison.ru, 0 -madurodam.nl, 0 -madvaper.ru, 0 -madwave.ru, 0 maeda-atsuko.cn, 0 maedchenflohmarkt.de, 0 maemo.org, 0 -magazindoberman.ru, 0 -magazinlinz.ru, 0 magcity74.ru, 0 -magecom.net, 0 -magenting.com, 0 maggioli.it, 0 -magicalgirlsubs.de, 0 magiccardmarket.eu, 0 -magicdoorss.com, 0 magickartenmarkt.de, 0 magiclen.org, 0 -magicstreams.gr, 0 -magicutilities.net, 0 -magimetrics.com, 0 -magnya.com, 0 magtu.ru, 0 -mahluklar.org, 0 -mahor.ru, 0 -mahost.ca, 0 mahua.com, 0 -maihaoche.com, 0 -mail3admin.de, 0 mail-archive.com, 0 -mailasail.com, 0 mailbox.hu, 0 mailermailer.com, 0 mail.gov.af, 0 mail.kz, 0 -mailpile.is, 0 maimemo.com, 0 maimiaotech.com, 0 mainbox.com, 0 mainkeys.net, 0 -mainstreamdata.com, 0 -maiotaku.com, 0 mai.ru, 0 maiseed.com, 0 makedonias.gr, 0 makedreamprofits.ru, 0 -makeevka.com, 0 -makeii.com, 0 -makeupgroup.cz, 0 maki-chan.de, 0 makkhichoose.com, 0 makler.md, 0 makler.ua, 0 -maknails.ru, 0 -makovka.com.ua, 0 maksatbilgi.com, 0 maktab.tj, 0 malaga.es, 0 -malchish.org, 0 maliactu.info, 0 -maliburumdrinks.com, 0 malina.ru, 0 -malloom.com, 0 mamanam.com, 0 -mamantena.ru, 0 mamazin.com.ua, 0 mambaby.com, 0 mamsy.ru, 0 -manabii.info, 0 mandarinaduck.com, 0 -m-and-d.com, 0 mangapanda.info, 0 mango.com, 0 mangoerp.com, 0 mangooutlet.com, 0 maniac-forum.de, 0 -manifest.ge, 0 mann.tv, 0 -manprogress.com, 0 -manqian.cn, 0 mans.edu.eg, 0 -manstrong.com.tw, 0 manticgames.com, 0 -mantoufan.com, 0 -manuskri.tn, 0 -manybot.io, 0 manzana.ua, 0 maoming.gov.cn, 0 -maori.nz, 0 mapado.com, 0 mapamista.org.ua, 0 mapbar.com, 0 @@ -8802,111 +4937,61 @@ mapshop.ir, 0 maralhost.com, 0 maralhost.marketing, 0 -maratsafin.pro, 0 -marbeho.com, 0 marburg.de, 0 marcaentradas.com, 0 -marcopinheiro.com, 0 -marcopol.pl, 0 marelepescar.ro, 0 marfeel.com, 0 marietta.edu, 0 mariinsky.ru, 0 -mariinsky.tv, 0 -marijuanagrowing.eu, 0 -marine-conservation.org, 0 marinelink.com, 0 -maritimeprofessional.com, 0 -markaz.uz, 0 -marketgoo.com, 0 -market.hu, 0 -marketinsight.it, 0 marketmind.at, 0 -marketsmaster.org, 0 markiza.sk, 0 marklogic.com, 0 -markova.com, 0 mark.ru, 0 marktplatz-mittelstand.de, 0 markum.net, 0 -marlinmag.com, 0 -marshrutka.com.ua, 0 marthadebayle.com, 0 -martinezloriente.com, 0 -marwell.org.uk, 0 marya.ru, 0 masalnews.ir, 0 -mascheronistore.it, 0 mashhad724.ir, 0 mashhad.me, 0 masivapp.com, 0 -maslahatim.uz, 0 -masnegocio.com, 0 maspormas.com, 0 massaget.kz, 0 massengeschmack.tv, 0 mastera-rukodeliya.ru, 0 mastercity.ru, 0 -masterofsoccer.com, 0 masterphone.ru, 0 -master-tao.com, 0 -masterzx.com, 0 -masutaka.net, 0 -matekmindenkinek.hu, 0 -matrixcalc.org, 0 -matrix-vision.com, 0 matrony.ru, 0 -mauiarts.org, 0 mavn.is, 0 mawenjian.net, 0 mawqe3.net, 0 -maxcuties.top, 0 -maxi.by, 0 -maxicard.ua, 0 -maxi-sale.ru, 0 maxjia.com, 0 maxmilhas.com.br, 0 -maxserv.com, 0 -maxst.com, 0 -maxtrack.uz, 0 maxxipoint.com, 0 -maxzon.ru, 0 mayflower.de, 0 -maytoni.ru, 0 -mazda.at, 0 mazda.ch, 0 mazda.de, 0 mazdaeur.com, 0 mazda.fr, 0 mazda.hr, 0 -mazsihisz.hu, 0 m-bet.co.tz, 0 mbfilm.ir, 0 mbhs.edu, 0 mblox.com, 0 -mbo.com.ph, 0 -mbwar.com, 0 mcafeestore.com, 0 -mc-auto.ru, 0 mcbot.gq, 0 -mcb.ru, 0 mccme.ru, 0 mcdir.ru, 0 mcdonalds.cz, 0 mcent.com, 0 -mcetv.fr, 0 -mcfuzhu.net, 0 -mcgen.eu, 0 mcguirksgolf.com, 0 -m-classic.com, 0 mclc.ir, 0 mcmaster.ca, 0 mcncc.com, 0 -mcocmod.net, 0 mconvert.net, 0 m-cosmetica.ru, 0 mcplay.cn, 0 -mcscostruzioni.it, 0 mct.gov.az, 0 mcu.edu.tw, 0 mcx.ru, 0 @@ -8914,26 +4999,18 @@ mdict.cn, 0 mdlivre.com.br, 0 mdman.cc, 0 -mdog.mobi, 0 mdolls.mobi, 0 mdrv.ru, 0 mdt-dodin.ru, 0 -mdv.de, 0 meabilis.fr, 0 measurementlab.net, 0 meatbox.co.kr, 0 -mebeel.ru, 0 mebelion.ru, 0 -mebel-top.ru, 0 mecare.cn, 0 mecbsegov.in, 0 mecbsekvs.in, 0 -mechanization.ru, 0 -mectronica.it, 0 medansatu.com, 0 -medbanks.cn, 0 medbox.ru, 0 -medeintegra.com, 0 medgadgets.ru, 0 mediabak.com, 0 mediabinn.com, 0 @@ -8946,160 +5023,85 @@ mediakee.com, 0 medialid.com, 0 medialog.fr, 0 -mediaquelle.at, 0 -mediaraven.be, 0 -mediaresearch.se, 0 -mediascanner.net, 0 -mediasity.co, 0 mediate.com, 0 mediatoday.ru, 0 -mediatop.ws, 0 mediavex.com, 0 -mediaweb.ru, 0 mediazenn.com, 0 medicalvideos.us, 0 -medicinalegal.gov.co, 0 -medicina.ru, 0 -medienrecht-urheberrecht.de, 0 medieval-europe.eu, 0 -mediker.kz, 0 medion.com, 0 medjouel.com, 0 -medlibrary.org, 0 -medmag.ru, 0 -medmastery.com, 0 medmedicine.it, 0 medmeeting.org, 0 mednet.ru, 0 medscape.ru, 0 medspros.ru, 0 meduza.io, 0 -meekan.com, 0 meest.us, 0 meetfighters.com, 0 meetme.com, 0 meetshared.com, 0 -mef.net, 0 megacampus.ru, 0 megafilmes4k.com.br, 0 -mega-f.ru, 0 -megaglest.org, 0 megaleech.us, 0 megaline-films.kz, 0 -megaline.kg, 0 -megalink.ru, 0 megamag.by, 0 megamart.az, 0 -megameh.com, 0 -megaplan.by, 0 -megaplan.ru, 0 megaterem.ru, 0 megatheme.ir, 0 megatrack.ru, 0 -megazat.com, 0 -megcart.com, 0 me.gov.ar, 0 -mehrschool.com, 0 -meibu.net, 0 meidebi.com, 0 meideng.net, 0 meiduimall.com, 0 -meigongyun.com, 0 -meijisp.jp, 0 meilele.com, 0 -meinezwangsversteigerung.de, 0 meinfernbus.de, 0 meipian.cn, 0 meipian.me, 0 meishi.cc, 0 meishij.net, 0 -meister.de, 0 meitu.com, 0 -meix.com, 0 -meiyijia.com.cn, 0 meizu.cn, 0 meizu.com, 0 -melastampi.it, 0 -melenky.ru, 0 mel.fm, 0 -melhorembarque.com.br, 0 -melodiak.hu, 0 meloman.kz, 0 memedai.cn, 0 -memeorandum.com, 0 mena.org.eg, 0 -menariniapac.com, 0 mendikat.net, 0 mengdouwang.cn, 0 mengniu.com.cn, 0 mengzhu.tv, 0 mensa.es, 0 -mensa.hu, 0 menschen-leben.at, 0 mephi.ru, 0 -mercadopme.com.br, 0 mercedes-benz.ua, 0 mercurial-scm.org, 0 -merici.ca, 0 -merproject.org, 0 mersen.com, 0 -mertcangokgoz.com, 0 mesago.de, 0 -mesalva.com, 0 mesec.cz, 0 mes.edu.cu, 0 meshok.net, 0 meshok.ru, 0 meslekhocam.com, 0 -mestam.info, 0 -metabo.su, 0 metapix.net, 0 -metasix.com.br, 0 -metasix.solutions, 0 -meten.cn, 0 -meteobox.cz, 0 -meteocontrol.de, 0 -meteorad.ru, 0 meteor.ie, 0 metin2.tc, 0 -metragi.ru, 0 metricskey.net, 0 metro.cl, 0 -metrol.jp, 0 metropol.co.ke, 0 -metropole.cz, 0 -metropolitan.bg, 0 metrosantiago.cl, 0 -metrosphera.ru, 0 -metroui.org.ua, 0 metrouusor.com, 0 metservice.com, 0 -metstr.com, 0 -mew.su, 0 mexicoo.mx, 0 -mf8.biz, 0 mfa.gov.by, 0 mfb.io, 0 -mfc-74.ru, 0 -mfc74.ru, 0 -mfcto.ru, 0 mferma.ru, 0 mfor.hu, 0 -mfortune.co.uk, 0 mf.uz, 0 -mgameday.com, 0 -mgb.bg, 0 -mgou.ru, 0 -mg-pen.com, 0 mgpu.ru, 0 mgts.ru, 0 mgutm.ru, 0 -mguu.ru, 0 -mgvision.com, 0 -mhecy.com, 0 mhelp.kz, 0 -mhliving.ru, 0 -mhp.com.ua, 0 mhr-developer.com, 0 mhunters.com, 0 miacugra.ru, 0 @@ -9107,187 +5109,109 @@ miamed.de, 0 miamidade.gov, 0 mianfeiwucan.org, 0 -mianshui365.com, 0 -miantiao.me, 0 mianvpn.com, 0 -miaomiao520.cn, 0 miaoyueyue.com, 0 -miascarpa.ru, 0 miass.ru, 0 -mibd-gold.com, 0 -mibew.org, 0 micasaverde.com, 0 -mic.co.at, 0 -michaelwest.com.au, 0 -michalsons.com, 0 -michelf.ca, 0 -michiganlabs.com, 0 -micous.com, 0 -microline.hr, 0 microsoft.com, 0 microsoftonline.cn, 0 micros.uz, 0 -midaijihua.com, 0 midea.com, 0 -midrub.com, 0 -miestilo.ru, 0 mie-u.ac.jp, 0 mightysignal.com, 0 mignews.com.ua, 0 -migocorp.com, 0 migros.ch, 0 migu.cn, 0 -mihanwebserver.com, 0 mihoyo.com, 0 -miit.gov.cn, 0 mijnhva.nl, 0 mikatiming.de, 0 mikenopa.com, 0 mikrocontroller.net, 0 -mikrotik-bg.net, 0 -mikrovps.hu, 0 -mikroways.net, 0 mik.ua, 0 mikulas.sk, 0 mila.by, 0 milanpassport.com.ua, 0 -militaryzone.ru, 0 miloserdie.ru, 0 -mima.re, 0 mimemoi.com, 0 mimikko.cn, 0 minbank.ru, 0 minceraft.cl, 0 mindai.com, 0 mindasset.com, 0 -mindcont.com, 0 mindjet.com, 0 -mindmeld.com, 0 mindnode.com, 0 -mindoktor.se, 0 mindresearch.org, 0 mindstore.io, 0 mineblue.com, 0 mine.bz, 0 mineconcapes.net, 0 -minecraft-alex.ru, 0 -minecrafting.ru, 0 minecraftiplist.com, 0 minecraft-moscow.com, 0 minelist.kr, 0 -minem.gob.ar, 0 mine.nu, 0 mine-online.pw, 0 -minervanetworks.com, 0 mines.edu, 0 minfin.com.ua, 0 -mingdianwu8.com, 0 mingkyaa.com, 0 mingli.ru, 0 -mingyuanyun.com, 0 mini189.cn, 0 mini-koleso.ru, 0 -minimalart.cn, 0 -mininfra.gov.rw, 0 mininterior.gob.ar, 0 mininterior.gov.ar, 0 -miniyun.cn, 0 -minq.info, 0 minsal.cl, 0 minsk.by, 0 mintrans.ru, 0 -mintrud.karelia.ru, 0 minuporno.com, 0 -minus33.com, 0 minv.sk, 0 minyo.us, 0 -minzdravsakhalin.ru, 0 mioji.com, 0 mios.com, 0 -mipa.de, 0 -mipa-paints.com, 0 mipko.ru, 0 mipt.ru, 0 mipuf.es, 0 miracal.ru, 0 mirage.ru, 0 -miranda-ng.org, 0 -mirante.net.br, 0 mirapri.com, 0 -miraton.ua, 0 -mirbeer.ru, 0 mirchar.ru, 0 mirgaza.ru, 0 miridei.com, 0 mirkrestikom.ru, 0 mirkvartir.ru, 0 -mirndv.ru, 0 -mir.partners, 0 -mirpchel.com, 0 -mirsushi.com, 0 mis66.ru, 0 missevan.com, 0 -missfresh.cn, 0 missland.com, 0 -mista.ru, 0 misterhorse.tv, 0 -misterspex.ch, 0 -misterspex.com, 0 misterspex.co.uk, 0 misterspex.de, 0 misterspex.es, 0 misterspex.fr, 0 -misterspex.nl, 0 mist-game.ru, 0 misuland.com, 0 -mi-sys.com, 0 mit.com.mm, 0 mit.edu, 0 mitsubishielectric.com, 0 mittwaldserver.info, 0 -mitusky.com, 0 -mitutoyo.eu, 0 mit.uz, 0 -mitwork.kz, 0 miu.ac.ir, 0 miui.com, 0 -miuipro.ru, 0 miutour.com, 0 mivitec.net, 0 mivlgu.ru, 0 -mivocloud.com, 0 -mixdrop.ru, 0 mixupload.com, 0 mixxx.org, 0 -miyagi.es, 0 miyagi.jp, 0 -miyijia.com, 0 mizban24.net, 0 -mizbansite.com, 0 -mjbang.cn, 0 mj-king.net, 0 mkb.ru, 0 -mke.hu, 0 mkf.com, 0 -mk.gov.ua, 0 -mk-host.com, 0 -mkn.de, 0 -mkrada.gov.ua, 0 mkvcorporation.com, 0 mkvtoolnix.download, 0 mlbeta.com, 0 -mlhang.com, 0 -mlife.by, 0 -mljia.cn, 0 -mljiadev.cn, 0 mlpmerch.com, 0 -mlsdev.com, 0 mma.su, 0 mmbank.ru, 0 -mmcs.pro, 0 mmdai.com, 0 mmet.cn, 0 -mmgp.com, 0 mmgp.ru, 0 mmk.ru, 0 mmo4me.net, 0 @@ -9295,56 +5219,26 @@ mmotraffic.com, 0 mmtrix.com, 0 mmyuer.com, 0 -mnbaa.com, 0 mnb.hu, 0 -mnb.mn, 0 -mnd.cz, 0 -mnenie.su, 0 mne.ru, 0 mngz.ru, 0 mnogokarat.ru, 0 mnt.ee, 0 -mo2g.com, 0 mo9.com, 0 -moahr.cn, 0 -mobazi.ir, 0 -mobcb.com, 0 mob.com, 0 mobdisc.com, 0 mobialia.com, 0 -mobiamo.com, 0 mobibrw.com, 0 -mobicheckin.com, 0 -mobicom.mn, 0 -mobile-harddisk.nl, 0 mobilenations.com, 0 -mobileshop.ir, 0 mobil-helden.de, 0 -mobilnost.hr, 0 mobinnet.net, 0 -mobit.dp.ua, 0 -mobi-to-pdf.com, 0 -mobius.studio, 0 mobomarket.net, 0 -mobopan.cn, 0 mobsoftffree.xyz, 0 mobtakeran.com, 0 -mobwall.com.ua, 0 mockuai.com, 0 -mockup.io, 0 -modablaj.com, 0 -modayiz.com, 0 -mod.bg, 0 modcom.kz, 0 -moddota.com, 0 modelmen.ru, 0 -modelon.com, 0 -modeltag.com, 0 modmcpe.net, 0 -modmed.com, 0 -modstore.pro, 0 -modularcircuits.com, 0 -modum.by, 0 modxcloud.com, 0 modx.com, 0 modx.pro, 0 @@ -9353,175 +5247,101 @@ moegirl.org, 0 moe.hm, 0 moemesto.ru, 0 -moe-navi.jp, 0 moesk.ru, 0 mofac-alfred.com, 0 mofang.com, 0 mofangge.com, 0 -mofanghr.com, 0 moguta.ru, 0 moha.gov.my, 0 mohammad-toluei.ir, 0 -mohande3.com, 0 mohandeseit.ir, 0 mohmo.net, 0 -mohmoshop.net, 0 mohurd.gov.cn, 0 moikit.com, 0 moi-uni.ru, 0 -mojdoktor.gov.rs, 0 -mojeid.cz, 0 mojichina.com, 0 mojilala.com, 0 mokpo.ac.kr, 0 mokylin.com, 0 molbase.cn, 0 molbase.com, 0 -moleskines.ru, 0 molnet.ru, 0 -molochnoe.ru, 0 -momic.me, 0 -momo-net.com, 0 monamie.kz, 0 -mondiaspora.net, 0 -mondovantaggio.com, 0 -mondraker.com, 0 -monema.it, 0 -monerohash.com, 0 monetizus.com, 0 moneydashboard.com, 0 moneyman.es, 0 moneyman.ge, 0 moneyman.kz, 0 -moneyman.pl, 0 -money-man.ru, 0 moneyman.ru, 0 moneyplatform.com, 0 -mongeneraliste.be, 0 -mon.gov.ru, 0 -mon.gov.ua, 0 -monifymedia.com, 0 monitoring-plugins.org, 0 -monitor-polski.pl, 0 -monitorsanywhere.com, 0 monitorulcj.ro, 0 -monkey-live.com, 0 monkeytravel.com, 0 -monkkee.com, 0 monolife.ru, 0 monopoly-one.com, 0 monstandardfacile.com, 0 monsters-tk.net, 0 montclair.edu, 0 -mooban.cn, 0 moocollege.com, 0 -moodleschule.de, 0 moodviewer.com, 0 moojing.com, 0 moonback.ru, 0 -moonfly.net, 0 moonseo.cn, 0 mooo.com, 0 -mooseframework.com, 0 -mooseframework.org, 0 moovel.com, 0 -moovweb.com, 0 mopaasapp.com, 0 mopaas.com, 0 moparscape.org, 0 -mopubi.com, 0 morebooks.de, 0 morefirm.ru, 0 -morepiva.ua, 0 moretv.com.cn, 0 morfans.cn, 0 morgan.edu, 0 -morgoth.ru, 0 -morph.io, 0 -morznet.com, 0 -moscow.ovh, 0 -moscowteslaclub.ru, 0 -moseeker.com, 0 mos-gorsud.ru, 0 -mos-kino.ru, 0 mosmoda.com.tr, 0 mosolymp.ru, 0 mosreg.ru, 0 mos.ru, 0 -mossport.ru, 0 -mostinfo.net, 0 -mosturflot.ru, 0 motarjeminiran.com, 0 -motchallenge.net, 0 motocms.com, 0 motof.cn, 0 -motomaxonlineshop.com, 0 motorbit.com, 0 motorcyclistonline.com, 0 -motor-oel-guenstig.de, 0 -moto-scuter.ru, 0 -motosdetrabajo.com.mx, 0 -motoslave.net, 0 -motot.net, 0 mountainduck.io, 0 mountfield.cz, 0 mountfield.sk, 0 -mountyhall.com, 0 -mousesports.com, 0 -mouwasat.com, 0 movavi.com, 0 moviejie.com, 0 movielala.com, 0 -moviemaps.org, 0 movienthusiast.com, 0 movietend.com, 0 -movilizer.com, 0 -moviran.org, 0 movitech.cn, 0 movit-tech.com, 0 -movnow.com, 0 -moxacg.com, 0 -moxiaonai.cn, 0 moyoyo.com, 0 moyuniver.ru, 0 mozaika.dn.ua, 0 -mozaik.info.hu, 0 mozanaplo.hu, 0 -mozaweb.com, 0 mozaweb.hu, 0 -mozayka.com.ua, 0 moz.gov.ua, 0 -mozilla.community, 0 mp3bass.ru, 0 mp3.cc, 0 mp3kw.com, 0 mp3nta.com, 0 mp3.pm, 0 -mp3-telechargement.net, 0 -mp4la.net, 0 mp.br, 0 mpets.mobi, 0 mp.gov.in, 0 -mpgu.info, 0 mpgu.org, 0 mplayerhq.hu, 0 mplife.com, 0 mpsj99.com, 0 -mptool.cn, 0 mpt.ru, 0 -mqlforum.com, 0 mratwork.com, 0 mrcode.ir, 0 mrcraig.xyz, 0 -mrcredits.ru, 0 mrecorder.com, 0 -mrgfd.org.ua, 0 mritd.me, 0 -mrju.cn, 0 -mrlong.cc, 0 -mrmo.cc, 0 mrmondialisation.org, 0 -m.ro, 0 mrporn.com, 0 mrtimemaker.com, 0 mrush.mobi, 0 @@ -9529,247 +5349,134 @@ mr-wu.cn, 0 ms0571.com, 0 msa.gov.cn, 0 -msalkirov.ru, 0 msd25.com, 0 -msdi.cn, 0 msignitechina.com, 0 msig.sg, 0 -msilab.net, 0 -msk.su, 0 -m-sku.com, 0 msl.ua, 0 -msmsu.ru, 0 -m-stat.gr, 0 msu.ru, 0 -msv-duisburg.de, 0 -msxf.com, 0 mta.mn, 0 -mta-sa.org, 0 mta.ua, 0 mt-bbs.com, 0 -mtcsys.com, 0 -mtechpro.com, 0 mte.gov.br, 0 mt.gov.br, 0 -mtgpulse.com, 0 mti.co.jp, 0 mtis.by, 0 -mti.ua, 0 mtn.co.za, 0 -mtrend.ru, 0 mtroyal.ca, 0 mts.by, 0 mts.ru, 0 mts.tm, 0 -mtuci.ru, 0 mtv235.com, 0 -mubrr.com.br, 0 -mucangjun.com, 0 mucfc.com, 0 muchong.com, 0 -mueller-of.de, 0 muh.ru, 0 muis.gov.sg, 0 -mujglock.com, 0 -mujin.co.jp, 0 -mujot.net, 0 -mu-kingdom.com, 0 -mukolin.cz, 0 muloqot.uz, 0 -multiloginapp.com, 0 -multinet.dp.ua, 0 multi-net.ru, 0 multi-online.ru, 0 multiplay.ru, 0 multirama.gr, 0 multirom.me, 0 -multisport.cz, 0 -multitest.me, 0 multitest.ua, 0 multitran.com, 0 multitran.ru, 0 multiupload.biz, 0 multiwork.org, 0 mumayi.com, 0 -mumble.ru, 0 -mumms.com, 0 mums.ac.ir, 0 mun.ca, 0 -mundialvac.com, 0 muniao.com, 0 munzinger.de, 0 -muppetism.com, 0 -muquan.net, 0 murabba.com, 0 murad.com, 0 murdoch.edu.au, 0 -murm.pro, 0 -musa24.fi, 0 musc.edu, 0 -musclebearporn.com, 0 -museumsbund.de, 0 music-all.ir, 0 music-group.com, 0 -musicland.ru, 0 -musicnota.ru, 0 -musicshelf.jp, 0 musikazblai.com, 0 -musik-promotion.net, 0 musiland.cn, 0 mutlucell.com, 0 -mutterhaus.de, 0 -muv.ac, 0 muyingzhijia.com, 0 muzhiso.com, 0 -muzikata.net, 0 -muziker.com, 0 -muziker.es, 0 -muziker.pt, 0 muziker.si, 0 muziker.sk, 0 muzikum.eu, 0 -muzkom.ru, 0 muzlan.ru, 0 muzmix.com, 0 muzoic.com, 0 muzoic.org, 0 -muzrec.com, 0 muz.uz, 0 mvbits.com, 0 -mvmv.com.tw, 0 mvs.gov.ua, 0 -mvu.com.br, 0 mwa.co.th, 0 -mwee.cn, 0 -mw-light.ru, 0 -mxp.tw, 0 -mxyun.com, 0 -my3ds.pl, 0 -my3gb.com, 0 my3w.com, 0 -my891.com, 0 m-yabe.com, 0 myaiji.com, 0 -myanimeshelf.com, 0 myanmarmp3.net, 0 -myanmore.com, 0 myanonamouse.net, 0 -myartsonline.com, 0 myasustor.com, 0 myauto.ge, 0 -mybanker.dk, 0 -mybb.de, 0 mybodygraph.com, 0 -myboracayguide.com, 0 mybox.ru, 0 -mycat.io, 0 -my-cccp.ru, 0 -mycos.com, 0 -mydailymanga.com, 0 -myddns.com, 0 -myddns.ru, 0 mydns.jp, 0 -mydreamplus.com, 0 myds.me, 0 my-eclipse.cn, 0 -myfirms.su, 0 myfolio.com, 0 myfoscam.com, 0 myfoscam.org, 0 myfreeproject.com, 0 myfritz.net, 0 -myftb.de, 0 -myftp.biz, 0 myftp.org, 0 mygalgame.com, 0 mygarage.ro, 0 -mygaste.com, 0 my-gateway.de, 0 -mygiftcard.ru, 0 mygiftcardsplus.com, 0 -mygjp.com, 0 my.gov.cn, 0 -mygzb.com, 0 -myhloli.com, 0 myhome.cx, 0 myhomeworkapp.com, 0 myihor.ru, 0 myimmitracker.com, 0 myindiacoupons.com, 0 -myjar.com, 0 -myjeeva.com, 0 myjino.ru, 0 myjob.uz, 0 -mykhg.de, 0 mykitchen.am, 0 myl.com.cn, 0 mylifeorganized.net, 0 -mymoria.de, 0 mymru.ca, 0 -mynetgear.com, 0 mynetname.net, 0 mynewcompany.com, 0 -mynj.cn, 0 myop.cf, 0 -myowndns.info, 0 -myparcels.net, 0 myparcels.ru, 0 -mypet-online.ru, 0 my-phone-finder.com, 0 -myphotobook.ch, 0 -myphotobook.de, 0 -myphotobook.fr, 0 myphotobook.it, 0 myphotos.cc, 0 mypoints.com, 0 -mypoolin.com, 0 mypos.eu, 0 mypost4u.com, 0 my-private-network.co.uk, 0 myprom.ru, 0 myqcloud.com, 0 myqnapcloud.com, 0 -myrenova.com, 0 -myrescue.net, 0 myrusakov.ru, 0 -mysav.eu, 0 myschoolapp.com, 0 myschoolcdn.com, 0 -mysecuritycamera.com, 0 myseldon.com, 0 my-servers.us, 0 -mysisel.com, 0 mysocialbook.com, 0 mysocio.ru, 0 -mysocrat.com, 0 mysof.net, 0 myspiegel.de, 0 -myss.club, 0 -mytextmusic.com, 0 -mythware.com, 0 -mytickets.ae, 0 my.to, 0 mytokri.com, 0 -myvapedeal.com, 0 -my.vg, 0 myviasat.ru, 0 myvimir.ru, 0 mywed.ru, 0 -mywinamp.com, 0 -mywire.org, 0 -mywishboard.com, 0 mywork.com.vn, 0 mywpku.com, 0 -myxs.net, 0 myxzy.com, 0 myyearbook.com, 0 -myzqb.cn, 0 -myzte.com, 0 mz19.ru, 0 mzmoney.com, 0 -mzoo.mobi, 0 -mztgame.com, 0 -mzt.ru, 0 mz-web.de, 0 n0l.hu, 0 n131adserv.com, 0 @@ -9780,64 +5487,35 @@ n159adserv.com, 0 n19adshostnet.com, 0 n214adserv.com, 0 -n24.ru, 0 n264adserv.com, 0 -n280adserv.com, 0 -n329adserv.com, 0 n4bb.com, 0 n56adshostnet.com, 0 -n64adserv.com, 0 n99adshostnet.com, 0 -nabezky.sk, 0 naca.com, 0 nacalynx.com, 0 nacao.org.cn, 0 -nacta.edu.cn, 0 -nadesne.ru, 0 nadloc.kz, 0 -naftan.by, 0 -naiadmmm.com, 0 -naifl.ru, 0 -naikuber.com, 0 -naimies.com, 0 naim.ru, 0 najlepszefoto.pl, 0 -nalogcodex.ru, 0 nalog.ru, 0 namava.ir, 0 namba.kg, 0 -named.cn, 0 nametests.com, 0 -namhuy.net, 0 namidensetsu.com, 0 -nanaiki.ru, 0 nanguo.cn, 0 -nanhai.gov.cn, 0 nanhutravel.com, 0 nani.com.tw, 0 nanoo.tv, 0 -nano-pad.ru, 0 nanopool.org, 0 nanosemantics.ru, 0 nanrenwa.com, 0 -na-olimpe.ru, 0 naomi24.com.ua, 0 nap6.com, 0 -napa.com, 0 napai.cn, 0 -napensii.ua, 0 napratica.org.br, 0 narfu.ru, 0 -narkom.net, 0 -narkom.pro, 0 -narkom.tv, 0 -narod-expert.ru, 0 -naroi.ru, 0 -nartac.com, 0 nas-broker.com, 0 nasejidelna.cz, 0 -nasf.ru, 0 -nas.gov.ua, 0 nashanyanya.ru, 0 nashaplaneta.net, 0 nashural.ru, 0 @@ -9846,46 +5524,27 @@ nat123.net, 0 natalie-tours.ru, 0 natapp.cn, 0 -nationsgame.net, 0 nativeads.com, 0 native-network.net, 0 nativerootsdispensary.com, 0 -natlot.be, 0 natm.ru, 0 natron.fr, 0 -nattule.com, 0 natural-sciences.ru, 0 -naturalwellbeing.com, 0 -natureacoeur.fr, 0 -nauchu-gotovit.ru, 0 nau.edu.ua, 0 nauka.gov.pl, 0 -naumen.ru, 0 -nav.by, 0 naviextras.com, 0 -navigate.de, 0 -navikey.org, 0 -naviki.org, 0 -navrcholu.cz, 0 nayavideo.com, 0 nazk.gov.ua, 0 -nazuby.cz, 0 nazwa.pl, 0 -nbastats.info, 0 nbd.com.cn, 0 nbdeli.com, 0 -nbedu.gov.cn, 0 -nbepb.gov.cn, 0 nbhis.com, 0 -nbikemsu.ru, 0 -nbmetro.com, 0 nbn.org.il, 0 nbrc.ac.in, 0 nca.gov.tw, 0 ncas.or.kr, 0 ncca.ie, 0 ncfgroup.com, 0 -nchkz.ru, 0 ncihealth.cn, 0 ncku.edu.tw, 0 ncnu.edu.tw, 0 @@ -9901,34 +5560,17 @@ ndr.de, 0 ndv.ru, 0 nea.gov.cn, 0 -nearadio.no, 0 -nebopro.ru, 0 -neco.tech, 0 -nectarin.ru, 0 -necy.eu, 0 -nedes.sk, 0 neftekamsk.ru, 0 neigou.com, 0 nejlepsiceny.cz, 0 nekto.me, 0 nemaloknig.info, 0 -nemidoonam.com, 0 -nemzetiszinhaz.hu, 0 -neocron-game.com, 0 -neocube-russia.ru, 0 -neoebiz.co.kr, 0 neoferr.com, 0 -neoflex.ru, 0 -neolant.ru, 0 neoline.ru, 0 neotriad.com, 0 neoway.com.br, 0 -nephila.it, 0 nepszava.hu, 0 nestoilgroup.com, 0 -net46.net, 0 -net9.org, 0 -net-agenta.ru, 0 netangels.ru, 0 netatmo.com, 0 netau.net, 0 @@ -9937,173 +5579,95 @@ netcraft.com, 0 netease.com, 0 netease.im, 0 -neteasy.pl, 0 -neteng.co, 0 net-film.ru, 0 -nethesis.it, 0 nethouse.ru, 0 netim.com, 0 -netim.fr, 0 -netim.net, 0 netiyi.com, 0 -net-load.com, 0 -netmaid.com.sg, 0 -netnea.com, 0 netoearth.com, 0 netpioneer.de, 0 netplus.ch, 0 -netplus.tv, 0 -netsdl.com, 0 netsh.org, 0 netsparkmobile.com, 0 netsun.com, 0 -nettoplast.ru, 0 netvolante.jp, 0 -net-well.ru, 0 -netwi.ru, 0 -networkguru.ru, 0 -networkhealth.com, 0 -netxms.org, 0 netzpolitik.org, 0 netztest.at, 0 neu.edu.cn, 0 -neura.edu.au, 0 -neurocogtrials.com, 0 -neurogroove.info, 0 neuronup.com, 0 neusoft.com, 0 neusoft.edu.cn, 0 neutrik.com, 0 neutrium.net, 0 -nevalink.net, 0 -nevsedni-svet.cz, 0 -newalive.net, 0 newbd.com, 0 -newchama.com, 0 newchic.com, 0 -newdefend.com, 0 newfrog.com, 0 newhistorian.com, 0 -newhopegroup.com, 0 newhorizonindia.edu, 0 -newhorizons.ae, 0 newifi.com, 0 -newikis.com, 0 newinform.com, 0 -newmanity.com, 0 newmanvip.com, 0 newm.co.kr, 0 newmobilelife.com, 0 new-retail.ru, 0 -new-rock-france.com, 0 new-rus.tv, 0 -newsbin.com, 0 news.cn, 0 newscom.com, 0 -newsdog.today, 0 news-for.me, 0 newsghana.com.gh, 0 newsko.ru, 0 newsone.ua, 0 newsprom.ru, 0 -newssummedup.com, 0 news.tj, 0 newstral.com, 0 newszeit.com, 0 newtab.club, 0 newtimes.ru, 0 -newtranx.com, 0 -newz-complex.org, 0 -nexsoft.com.tr, 0 nex-tech.com, 0 -nextgis.com, 0 nextlayer.at, 0 -nextmail.ru, 0 nextmp.net, 0 -nexusenergia.com, 0 neytron.com, 0 nezavisne.com, 0 -nfc-tag-shop.de, 0 -nfls.com.cn, 0 nfmedia.com, 0 -nfo.so, 0 nfs.com.ru, 0 nfshost.com, 0 -nfsplanet.com, 0 ngaaron.com, 0 ngagelive.com, 0 ngame.cn, 0 -ngamew.com, 0 ngbit.com, 0 -ng-erp.com, 0 nginx.org, 0 -ngmk.uz, 0 ngmu.ru, 0 ngonline.cn, 0 -ngp-ua.info, 0 ngrok.cc, 0 ngrok.io, 0 -nh.ee, 0 niarela.net, 0 niazerooz.com, 0 nibs.ac.cn, 0 nicaifu.com, 0 nic.cz, 0 -nicdn.de, 0 -nicebnb.com, 0 -nicecotedazur.org, 0 nic.edu, 0 nicelabel.com, 0 -nic.gob.ar, 0 -nickstories.de, 0 -nicolawealth.com, 0 nicpars.ir, 0 -nic.tr, 0 -nicweb.net, 0 -nidami.com, 0 nie.edu.sg, 0 -night-ladies.ru, 0 -nightwolves.ru, 0 -nihaoshijie.com.cn, 0 nijiero-ch.com, 0 niji.fr, 0 nikan.ir, 0 nikonians.org, 0 niks.by, 0 -nilokala.com, 0 -nimaboke.com, 0 -nina.gov.pl, 0 -ninja250.org, 0 ninjamock.com, 0 ninjaromeo.com, 0 -nintendo.es, 0 -nip.io, 0 -nipkipro.ru, 0 nipne.ro, 0 -nippon-antenna.co.jp, 0 niracloud.com, 0 -nirhtu.ru, 0 -nirt.res.in, 0 nitec.kz, 0 nitecore.com, 0 nitk.ac.in, 0 -nitrokey.com, 0 nitroserv.com, 0 -niubide.com, 0 niuche.com, 0 -niu.cl, 0 -niume.com, 0 niva-club.net, 0 -niwi.nz, 0 -nixpro.by, 0 -nix.ru, 0 nixstore.ru, 0 -nj13z.cn, 0 njd1.com, 0 njit.edu.cn, 0 njmu.edu.cn, 0 n-joy.de, 0 -njucs-os.tk, 0 nju.edu.cn, 0 njust.edu.cn, 0 nkforex.com, 0 @@ -10113,22 +5677,14 @@ nl.ua, 0 nmdn.net, 0 nmedik.org, 0 -nmetau.edu.ua, 0 -nmg.gov.cn, 0 -nmm-hd.org, 0 nmn.tw, 0 nmzh.net, 0 -nnbbxx.net, 0 nng.com, 0 nnovosti.info, 0 -no1lounges.com, 0 no1muse.com, 0 noao.edu, 0 -nobleocarina.net, 0 no-bs.de, 0 nochi.com, 0 -nococoti.org, 0 -noda.me, 0 nodelog.cn, 0 nodevice.com, 0 nodevice.com.pt, 0 @@ -10136,93 +5692,58 @@ nodevice.fr, 0 nodevice.it, 0 nodevice.jp, 0 -nody.me, 0 -nohoobag.com, 0 no-ip.biz, 0 no-ip.ca, 0 no-ip.com, 0 noip.me, 0 no-ip.net, 0 -noisefm.ru, 0 nolog.com, 0 nomadit.co.uk, 0 -nomensa.com, 0 -nominic.ru, 0 -nomisma.it, 0 nomnomka.ru, 0 nomorelyrics.net, 0 -nonfiction.fr, 0 -noniu.com, 0 non.li, 0 -nonli.com, 0 -nonstop-recruitment.com, 0 noonbora.xyz, 0 noor.net, 0 noor-publishing.com, 0 -norakrolika.ru, 0 -norbar.com, 0 -norbit.ru, 0 nordstar.ru, 0 -nordvpn.com, 0 nordwindairlines.ru, 0 -norilsk-city.ru, 0 noringa.ru, 0 norma.uz, 0 -nornik.ru, 0 northghost.com, 0 norvik.eu, 0 no-shave.org, 0 -nostromo.io, 0 -nota11.com.br, 0 notaire.be, 0 notariat.ru, 0 notaris.be, 0 notebooksbilliger.de, 0 note-pad.net, 0 -noticiasx7.com, 0 notifyfox.com, 0 notifyninja.com, 0 notik.ru, 0 -notmuchmail.org, 0 -notre-siecle.com, 0 novabizz.com, 0 -novaenergia.net, 0 nova.net.cn, 0 -novatek.ru, 0 novatour.ru, 0 novayaopera.ru, 0 noveinzeraty.cz, 0 -novex.com.gt, 0 novgorod.ru, 0 -novline.ru, 0 novobyt.ru, 0 novonordisk.com, 0 novotelecom.ru, 0 novreg.ru, 0 nowcoder.com, 0 -nowecor.de, 0 now.im, 0 -nowlink.it, 0 noxue.com, 0 npc.gov.cn, 0 -np.gov.ua, 0 -npmcompare.com, 0 nps.edu, 0 nptu.edu.tw, 0 -npu.ac.th, 0 npu.gov.ua, 0 nqu.edu.tw, 0 -nrada.gov.ua, 0 nrcc.org, 0 -nrhh.org, 0 -ns48.pl, 0 -nsccsz.gov.cn, 0 nsc.ru, 0 nsfocus.com, 0 nsimg.net, 0 nsk.ru, 0 nsk.su, 0 -nsktarelka.ru, 0 nso.edu, 0 nso.ru, 0 nssm.cc, 0 @@ -10230,290 +5751,154 @@ nstu.ru, 0 nsu.edu.cn, 0 nsuem.ru, 0 -nsupdate.info, 0 nsw.edu.au, 0 nsw.gov.au, 0 -n-sysdes.co.jp, 0 ntbg.org, 0 ntbprov.go.id, 0 -ntex.tw, 0 ntk-intourist.ru, 0 -ntm.ir, 0 ntnu.edu.tw, 0 ntnu.no, 0 ntpc.edu.tw, 0 -ntp-servers.net, 0 ntrqq.net, 0 -ntrun.com, 0 ntt-it.co.jp, 0 -ntt.pl, 0 ntu.edu.tw, 0 ntv.ru, 0 -nu3.at, 0 nu3.ch, 0 -nu3.com, 0 nu3.de, 0 nu3.fr, 0 nuaa.edu.cn, 0 nuageapp.com, 0 nuance-nts.com, 0 -nucrf.ru, 0 nudt.edu.cn, 0 -nuestracasa.com.co, 0 nuevaeps.com.co, 0 -nugalis.com, 0 nuipogoda.ru, 0 nuk.edu.tw, 0 -nulling.space, 0 number2.com, 0 nung.edu.ua, 0 nurotan.kz, 0 nut.cc, 0 -nutspace.com, 0 nutz.cn, 0 -nuu.uz, 0 -nux.ro, 0 -nva-hk.com, 0 nvrnet.ru, 0 nw.ru, 0 -nwtc.edu, 0 -nwt.cz, 0 -nxlog.co, 0 nxrom.us, 0 -nyaki.ru, 0 nyaso.com, 0 -nyc.ny.us, 0 -nydusvpn.com.cn, 0 nyitvatartas24.hu, 0 -nysoftland.com.cn, 0 nyugat.hu, 0 -nyxcosmetic.com.ua, 0 nzb.cat, 0 -nzcompany.org, 0 n-z.jp, 0 -o12.pl, 0 o2.cz, 0 -o2label.ru, 0 o2switch.net, 0 oakandfort.ca, 0 oakandfort.com, 0 -oaklynschool.org, 0 -oaseatm.com.ar, 0 oasiscatalog.com, 0 -oat.ru, 0 -oball.ru, 0 obambu.com, 0 -obbtest.com, 0 -obd2-shop.eu, 0 -obiz.com.tw, 0 -obukhov.ru, 0 obyava.ua, 0 -ob-zor.ru, 0 -ocamlcore.org, 0 -oca.org, 0 -ocas.ca, 0 occ.com.mx, 0 -oceanfilmtour.com, 0 -oceanic.com.br, 0 -oceanoptics.cn, 0 oceanoptics.com, 0 -ocenschiki-i-eksperty.ru, 0 ochenprosto.ru, 0 ochkov.net, 0 oclaro.com, 0 -ocmax.sk, 0 -ocrking.com, 0 ocrosoft.com, 0 ocrsdk.com, 0 -ocry.com, 0 ocs.ru, 0 -oddle.me, 0 oddpi.com, 0 -oddsoddsodds.com, 0 odessa.gov.ua, 0 odessa-life.od.ua, 0 -odiaweb.in, 0 -odin.ru, 0 odisha.gov.in, 0 -od.no, 0 -odontosystem.com.br, 0 -odoo-community.org, 0 oe24.at, 0 -oeag.at, 0 -oefb.at, 0 oeh-wu.at, 0 oei.es, 0 oe.if.ua, 0 -oem-oil.com, 0 oevg-versteigerungen.at, 0 ofamni.com, 0 -ofb.uz, 0 ofcard.com, 0 ofertaschevrolet.com.br, 0 ofertasdeemprego.pt, 0 ofertasdetrabajosyempleos.com, 0 offcn.com, 0 office-4-sale.de, 0 -officeevolution.com, 0 officen.kr, 0 officeplus.cn, 0 -officetotalshop.com.br, 0 officeweb365.com, 0 -off.net.mk, 0 -offquattro.com, 0 ofigenno.com, 0 o-film.com, 0 -ofk18.ru, 0 oformi.net, 0 ofo.so, 0 ofoto.org, 0 -oftendining.com, 0 ogilvy.com.cn, 0 -ogilvy.it, 0 -oglaszamy24.pl, 0 ogmem.com, 0 -ogrn.ru, 0 ohgaki.net, 0 ohtuleht.ee, 0 -oichinote.com, 0 oicp.net, 0 -oieau.fr, 0 -oieau.org, 0 -oilchoice.ru, 0 -oitibs.com, 0 -okabashi.com, 0 -okair.net, 0 -okb1.ru, 0 okbuy.com, 0 ok-crimea.ru, 0 -okfun.org, 0 okhosting.com, 0 okidoki.ee, 0 -okidoki.ru, 0 -okoutris.gr, 0 oktawave.com, 0 -oktell.ru, 0 -okupdate.ru, 0 okwave.co.jp, 0 okwave.jp, 0 -okwoo.com, 0 -okwu.edu, 0 olark.com, 0 olay.com.tr, 0 -olaytv.com.tr, 0 -olcdn.net, 0 -oldbk.ru, 0 oldboyedu.com, 0 -old-games.ru, 0 -olico.it, 0 olimex.com, 0 olimpiada.ru, 0 -olimpt4.info, 0 olimp.us, 0 -ollbiz.com, 0 oll.tv, 0 -olympiaodos.gr, 0 olz.by, 0 om1.ru, 0 omadaalithias.gr, 0 -omct.org, 0 ome.tv, 0 -omgmobc.com, 0 omgpu.ru, 0 omgtu.ru, 0 -omk.ru, 0 omnia.online, 0 omnicomm.ru, 0 omnikportal.com, 0 omniscriptum.com, 0 -omnitron-systems.com, 0 omsk.com, 0 omskportal.ru, 0 omskzan.ru, 0 omsys.com.cn, 0 -omvapors.com, 0 on5.ir, 0 -onaft.edu.ua, 0 -onda.ma, 0 -ondonnedesnouvelles.com, 0 -onechina.xyz, 0 onego.ru, 0 -one.gov.hk, 0 oneinstack.com, 0 -oneland.su, 0 one-news.net, 0 -oneniceapp.com, 0 -onepiece.com.pl, 0 one.pl, 0 oneplus.cn, 0 -onepluscorp.cn, 0 -oneshield.com, 0 -onestic.com, 0 -onetrum.com, 0 -onevisionimaging.com, 0 -oneway.mobi, 0 -onfiles.me, 0 onion.to, 0 onligamez.ru, 0 online2pdf.com, 0 -online-apteka.com.ua, 0 -onlinecomics.ru, 0 online.cq.cn, 0 -onlinedizi.co, 0 onlinefilerepair.com, 0 online-go.com, 0 onlinehome-server.com, 0 onlinehome-server.info, 0 -online.kz, 0 onlinelabs.ir, 0 -onlinemizban.net, 0 -online-olimpiada.ru, 0 -onlinepatent.ru, 0 onlinepbx.ru, 0 -onlinepng.com, 0 onlineproxy.eu, 0 onlineservers.ir, 0 online.tm, 0 onlinetopgame.com, 0 -onlinetv.ru, 0 onlinewebfonts.com, 0 onloon.net, 0 -onlybird.com, 0 onlyfans.com, 0 onlyhot.net, 0 onlylady.com, 0 -onlymobiles.com, 0 onlymult.com, 0 onlysasta.com, 0 onmovie.ge, 0 on.net, 0 onnibus.com, 0 -onofis.com, 0 onpage.org, 0 ontariocolleges.ca, 0 ont.by, 0 -onthewifi.com, 0 -onyx-boox.ru, 0 oodii.com, 0 oo.gd, 0 ooi.moe, 0 -oomoe.moe, 0 oostende.be, 0 -opapopa.ru, 0 -opava.cz, 0 -op.cz, 0 -open4u.ru, 0 open.ac.uk, 0 openal.org, 0 openapis.org, 0 -openarch.nl, 0 -openasapp.net, 0 -openbadges.it, 0 -opencart2x.ru, 0 -opencartfrm.com, 0 opencart.ir, 0 -opencartmodul.net, 0 -opencpu.org, 0 opencsw.org, 0 opendaylight.org, 0 openlanguage.com, 0 @@ -10525,17 +5910,10 @@ opennet.ru, 0 opennicproject.org, 0 open-o.org, 0 -openpediatrics.org, 0 -openprocurement.org, 0 openproject.org, 0 -openproject-stage.com, 0 -open-real-estate.info, 0 -openreceptores.com, 0 opensignal.com, 0 -opensource-excellence.com, 0 openssource.info, 0 openstat.com, 0 -opentopcart.com, 0 opentown.org, 0 opentraintimes.com, 0 openttdcoop.org, 0 @@ -10543,53 +5921,29 @@ openvz.org, 0 openweb.co.za, 0 openwrt.org, 0 -opera-online.com, 0 opnfv.org, 0 opogame.com, 0 opole.pl, 0 opolskie.pl, 0 -oponylux.pl, 0 -oporaua.org, 0 oportuna.com, 0 oppo.com, 0 -opportunitynetwork.com, 0 opsteel.cn, 0 -opsview.com, 0 -optima.cz, 0 optimism.ru, 0 -optimoney.ru, 0 -optiopay.com, 0 -opus.co.jp, 0 -orange-business.ru, 0 orange.ci, 0 orange.jo, 0 orange-prem.com, 0 -orange-servicespace.com, 0 -orange-social.com, 0 -oraridiapertura24.it, 0 orbita.dn.ua, 0 -orderbird.com, 0 orderkleeneze.co.uk, 0 orderonline.cn, 0 -ordinec.ru, 0 oregonstudentaid.gov, 0 orel.ru, 0 orenu.co.il, 0 -orfeo-toolbox.org, 0 orfogrammka.ru, 0 -organicawater.com, 0 -orgprint.com, 0 -oriental-dreamworks.com, 0 -orientdienst.de, 0 orionnet.ru, 0 oriwiki.net, 0 ormansu.gov.tr, 0 -oroundo.com, 0 -orsk-adm.ru, 0 orsk.ru, 0 -ortaid.fr, 0 or.tl, 0 -ortn.edu, 0 orzdream.com, 0 orz.hm, 0 osaifu.com, 0 @@ -10597,50 +5951,28 @@ oschina.io, 0 oschina.net, 0 osd.at, 0 -osf-global.com, 0 -osirisshoes.com, 0 -osmbuildings.org, 0 osmocom.org, 0 osnova.tv, 0 os-scape.com, 0 -osstech.co.jp, 0 -osu.ru, 0 osvita.ua, 0 osx86.cn, 0 -osx.hk, 0 oszk.hu, 0 -otanice.com, 0 -otani.co, 0 otarikkoc.com, 0 -otdelkino.ru, 0 -otelrus.ru, 0 -otenko.com, 0 -otmechalka.com, 0 otpbank.com.ua, 0 otpbank.ro, 0 otr-files.de, 0 -otr-ratte.de, 0 otr.ru, 0 -ottino.com, 0 otyrar.kz, 0 oucnet.cn, 0 -ouistock.fr, 0 oum.ru, 0 -ouo.us, 0 oupeng.com, 0 -our-dream.cn, 0 ourgold.ru, 0 ourjnu.com, 0 -ourmind.ru, 0 ourocg.cn, 0 -oursays.com, 0 ourstage.com, 0 oursweb.net, 0 -ourutec.com, 0 -ourwalrus.com, 0 outdoorlife.com, 0 outdoorvoices.com, 0 -outfittery.ch, 0 outfittery.com, 0 outfittery.de, 0 outlook.cn, 0 @@ -10648,11 +5980,8 @@ ovdinfo.org, 0 overhear.club, 0 overnightprints.com, 0 -overstockart.com, 0 -overtechnologies.com, 0 overthewire.org, 0 overture.org, 0 -overwall.cc, 0 overwiki.ru, 0 ovh.ca, 0 ovh.net, 0 @@ -10660,128 +5989,71 @@ ovomedia.tv, 0 ovotv.com, 0 ow2.org, 0 -ow365.cn, 0 owen.ru, 0 -owk.cz, 0 -owox.com, 0 -ows.farm, 0 ox.ac.uk, 0 oxge.net, 0 oxy.edu, 0 -oyasu.info, 0 -oypo.nl, 0 -oyunlarim.com.tr, 0 -ozgrozer.com, 0 ozon.ru, 0 -p2bt.com, 0 -p2pnet.pl, 0 p2psearchers.com, 0 p30rank.ir, 0 -p7.de, 0 paci.gov.kw, 0 -pacogames.com, 0 -pacreception.com, 0 pactera.com, 0 -pactwork.com, 0 -paddez.com, 0 paddlepalace.com, 0 -paderno.com, 0 -pados.hu, 0 paetep.com, 0 -pagedmeble.pl, 0 -pages-24.fr, 0 pages24.mx, 0 -pages24.pl, 0 -page-weight.ru, 0 pagewizz.com, 0 paginesi.it, 0 -pagoda.com.cn, 0 pagostad.gob.ar, 0 pa.gov.br, 0 pagro.at, 0 pah.org.pl, 0 -paidui.com, 0 paiq.nl, 0 palemoon.org, 0 paleoforum.ru, 0 palettegear.com, 0 -palexpo.ch, 0 -palizafzar.com, 0 -palobby.com, 0 panc.cc, 0 panchemodan.ru, 0 -pancr.ru, 0 panda.tv, 0 pandatv.com, 0 pandemic-legion.pl, 0 -paneco.mx, 0 -pangora.com, 0 -panolapse360.com, 0 panono.com, 0 panqis.cn, 0 panypay.ir, 0 panzar.ru, 0 paoding.cc, 0 -pa-online.it, 0 paopaoche.net, 0 papapiqueetmamancoud.fr, 0 -papapt.com, 0 -paparazziuav.org, 0 papayamobile.com, 0 -papeleriaarte.com, 0 paperdl.com, 0 -paperhive.org, 0 paperpass.com, 0 -paperplane.io, 0 -paper-republic.org, 0 papersearch.net, 0 papersogay.com, 0 papierovetasky-vrecka.sk, 0 paradisep30.ir, 0 paragon-software.com, 0 -paralelnipolis.cz, 0 paran.com, 0 paraninfo.es, 0 -parano.be, 0 -paraplan.ru, 0 paratype.com, 0 -parcamarketim.com, 0 parcelapp.net, 0 parcelchina.co.uk, 0 -parcheggilowcost.it, 0 pardazmizban.com, 0 parenting.com.tw, 0 parents.org.gr, 0 -parfumerika.ru, 0 parfum-lider.ru, 0 -parfumuri-timisoara.ro, 0 -paristamil.com, 0 parks.org.il, 0 parmisit.com, 0 -parmismedia3.com, 0 parscanada.com, 0 parseapp.com, 0 -parsec.tv, 0 parsine.com, 0 -parsmags.com, 0 -parsregister.ir, 0 -pars-server.com, 0 -partkeepr.org, 0 part-kom.ru, 0 partnerchoice.co.uk, 0 partoserver.com, 0 parts66.ru, 0 -parts-kobo.com, 0 partsrunner.de, 0 -pasaiaport.eus, 0 -pasaz24.pl, 0 pasionfutbol.com, 0 pasona.com.tw, 0 -pas.org.my, 0 pasp.ru, 0 pass4sures.com, 0 -pass7.cf, 0 -pass.is, 0 passkit.com, 0 passportindex.org, 0 passwordrecoverytools.com, 0 @@ -10789,23 +6061,15 @@ pastaoyunu.com.tr, 0 pastebox.in, 0 patagames.com, 0 -pateks.info, 0 -patentamt.at, 0 pathfinder.gr, 0 patiotuerca.com, 0 patpat.com, 0 patriarchia.ru, 0 -patrimoniocultural.pt, 0 patronbase.com, 0 -patroneer.com, 0 patschool.com, 0 -pau.edu.ng, 0 pavilion.com.bd, 0 -pawnmail.com, 0 paxsz.com, 0 payad.me, 0 -payamkutah.com, 0 -payapal.ir, 0 paybao.com.tw, 0 paybone.cn, 0 paycheckcity.com, 0 @@ -10813,114 +6077,65 @@ paykeeper.ru, 0 payline.ir, 0 paymentwall.com, 0 -paymoon.com, 0 -payner.bg, 0 paypersale.ru, 0 -paypertrail.com, 0 -payrexx.com, 0 -payroll-taxes.com, 0 payscale.com, 0 paywithpoli.com, 0 pb86.net, 0 pb.gov.br, 0 pbplus.me, 0 -pbs-video.com, 0 pbvusd.net, 0 pbwiki.com, 0 pc1ads.com, 0 -pc2ads.com, 0 pc3ads.com, 0 pc6.com, 0 -pcask.ru, 0 pcauto.com.cn, 0 pcbaby.com.cn, 0 -pcfun.ro, 0 pcgames.com.cn, 0 pcgarage.ro, 0 -pcgho.com, 0 -pchelp.zone, 0 -pchome.com, 0 pchome.net, 0 pchouse.com.cn, 0 -pci-suntektech.com, 0 pcjoy.cn, 0 pclady.com.cn, 0 -pclender.com, 0 -pcmag.ru, 0 pcmarket.com.hk, 0 pcmax.jp, 0 -pcnala.com, 0 -pc-online.co.il, 0 pconline.com.cn, 0 pc-radio.ru, 0 pcradio.ru, 0 -pcsolottoresulttoday.com, 0 pcstore.com.tw, 0 pcvideo.com.cn, 0 -pcv.pt, 0 pcweek.ru, 0 pcworld.com.vn, 0 -pdaclub.pl, 0 pdalife.ru, 0 pdfm.net, 0 -pdlada.ru, 0 pdn.ac.lk, 0 -pecs.hu, 0 peergrade.io, 0 pegast.com.ua, 0 -pegastour.ru, 0 pegasus.de, 0 -pegasusknight.com, 0 -pegasusshop.de, 0 pegatroncorp.com, 0 pegitboard.com, 0 pe.hu, 0 -p-e.kr, 0 -pelago.events, 0 peliculas.cc, 0 -pelock.com, 0 pelotok.net, 0 -penflip.com, 0 penjualan.web.id, 0 -pensadordeapuestas.com, 0 -penshop.cz, 0 -pensioneram.info, 0 pentesterschool.ir, 0 -pentestit.ru, 0 -peo.hu, 0 peopleandconnection.com, 0 peopleandlaw.ru, 0 -pepperkoko.com, 0 -peralppay.com, 0 perevody-deneg.ru, 0 perfekto.ru, 0 performancehorizon.com, 0 performia.com, 0 -peristeri.gr, 0 permedu.ru, 0 -permprofi.ru, 0 -perqasje.com, 0 persiangig.com, 0 persiantools.com, 0 person.com, 0 personeelssysteem.nl, 0 -perspektiva-inva.ru, 0 -perssist.com, 0 pervouralsk.ru, 0 pesapal.com, 0 -pescms.com, 0 pesc.ru, 0 peshkupauje.com, 0 pes.spb.ru, 0 -petdesk.com, 0 -peterkin.com.au, 0 -petersen.org, 0 -petkusuri.com, 0 -petradiamonds.com, 0 petrimazepa.com, 0 petrokimia-gresik.com, 0 -petromap.ru, 0 -petroren.com, 0 petrsu.ru, 0 petsoftware.net, 0 petwellbeing.com, 0 @@ -10928,150 +6143,83 @@ peugeot.it, 0 peykasa.ir, 0 pfconcept.com, 0 -pf-enclave.org, 0 -pfsw.com, 0 pfthost.com, 0 -pgpru.com, 0 pgsha.ru, 0 -pgw.jp, 0 pgzs.com, 0 -phaistosnetworks.gr, 0 phalconphp.com, 0 -pharminnotech.com, 0 -pharosmaris.net, 0 phase-6.de, 0 phcorner.net, 0 -phdl.net, 0 phicomm.com, 0 philipp-plein.com, 0 -philmorehost.net, 0 philo.at, 0 -philofacile.com, 0 -phi-sci.com, 0 -phoenicis.com.ua, 0 -phoenix-dnr.ru, 0 -phoenixtree.com.cn, 0 photo-ac.com, 0 -photobox.com, 0 photocase.com, 0 photocase.de, 0 -photographers.ua, 0 photolemur.com, 0 -photonomy.ru, 0 photophoto.cn, 0 photoprocenter.ru, 0 photorank.me, 0 photosex.biz, 0 photoshop-master.ru, 0 -photo-toolbox.com, 0 photoworld.com.cn, 0 -php2.cc, 0 phpcaptcha.org, 0 phpclub.ru, 0 -phpdr.net, 0 -php-friends.de, 0 phpinfo.me, 0 phpmywind.com, 0 phpnet.us, 0 phps.kr, 0 -phpwind.me, 0 -phpxy.com, 0 -phtg.ch, 0 -phyks.me, 0 phystech.edu, 0 -phystech.international, 0 -pi3g.com, 0 picantecooking.com, 0 picclick.de, 0 -picload.org, 0 -picnic.ly, 0 picovico.com, 0 picovr.com, 0 -picowork.com, 0 picp.net, 0 pictureview.com, 0 pidak.cz, 0 pidgin.im, 0 pieas.edu.pk, 0 -piemex.net, 0 pierotofy.it, 0 pigcms.com, 0 -pikperfect.com, 0 piktab.com, 0 pilaipiwang.com, 0 pila.pl, 0 -piligrim.ua, 0 -pilotgroup.net, 0 -pilot-theatre.com, 0 piluli.ru, 0 pinakothek.de, 0 pine4.net, 0 -pine.fm, 0 ping-admin.ru, 0 pingan.com.cn, 0 pingan.com.hk, 0 pingpongx.com, 0 pingstart.com, 0 -pingvin.pro, 0 pingxx.com, 0 -pinkcasino.co.uk, 0 pinpool.ir, 0 -pinsmedical.com, 0 -pinzhi365.com, 0 pioneer-life.ir, 0 pios.gov.pl, 0 -pipi.cn, 0 -pippkro.ru, 0 piratebuhta.cc, 0 -pirateking.online, 0 piratenpad.de, 0 piratenpartei.de, 0 piratepay.ir, 0 -pirateproxy.club, 0 piratepublic.com, 0 -piratskastranka.si, 0 -pirobase.de, 0 -pirogov-dvorik.ru, 0 -pisofttech.com, 0 -pitbullguitars.com, 0 -pitchvision.com, 0 -pitersmoke.ru, 0 -pitupitu.pl, 0 -piuis.ru, 0 -pi-usa.us, 0 -pivnidenicek.cz, 0 pixabay.com, 0 pixelplus.ru, 0 pixi.eu, 0 pizzahut.be, 0 pizzahut.com.ph, 0 pizzamanager.eu, 0 -pjbc.gob.mx, 0 -pjeveracruz.gob.mx, 0 pji.co.kr, 0 pjn.gov.ar, 0 pjud.cl, 0 -pjw.io, 0 pkget.com, 0 -pkgh.edu.ru, 0 -pk.gov.pl, 0 pkm.gov.gr, 0 -pkmn.net, 0 -pkmnreborn.com, 0 -pkpai.com, 0 pkpai.kr, 0 pkr.com, 0 pks.id, 0 pku.edu.cn, 0 pkuh6.cn, 0 -placesrf.ru, 0 placla.cz, 0 plac-official.com, 0 plagiarism-detector.com, 0 -plagly.com, 0 plainjs.com, 0 -plainviewisd.org, 0 -plak.co.za, 0 plan1.ru, 0 planet3dnow.de, 0 planetakino.ua, 0 @@ -11080,166 +6228,84 @@ planetawrestling.com, 0 planetemu.net, 0 planete-zemlya.ru, 0 -planetkde.org, 0 -planet-kob.ru, 0 planet-mcpe.net, 0 planet.nl, 0 planetofhotels.com, 0 -planetvampire.com, 0 plan.io, 0 -planplus.cn, 0 planujemywesele.pl, 0 plarium.com, 0 -plasma-mobile.org, 0 -plasp.com, 0 -plasters.ru, 0 -plastics.ua, 0 -plastinka.com, 0 -plasway.com, 0 plates4less.co.uk, 0 -platformaofd.ru, 0 platon.sk, 0 -playa-games.com, 0 -playamedia.com, 0 -playgb.com, 0 -playgwent.cn, 0 playinitium.com, 0 playlist24.ru, 0 -playpass.be, 0 playsport.cc, 0 -playstation.com, 0 -playstation.com.hk, 0 -playstore-api.com, 0 -playtomax.com, 0 -playzhan.com, 0 plccenter.com, 0 plobalapps.com, 0 -plocan.eu, 0 pluie-solide.com, 0 -pluimen.nl, 0 -plumgrid.com, 0 plus.com, 0 -plusgsm.com.br, 0 -plusmaster.ir, 0 -plus-plus.tv, 0 ply.st, 0 -pm7.com, 0 pmail.idv.tw, 0 pmit.cn, 0 pmlp.gov.lv, 0 pndk.in, 0 -pneumax.ru, 0 -pnpapps.net, 0 pnu.edu.ru, 0 pnzreg.ru, 0 -pobedavkusa.ru, 0 pocketbook-int.com, 0 pocketdice.io, 0 pocketlive.tv, 0 -podarit.net, 0 podarit-prazdniki.ru, 0 -podari-zhizn.ru, 0 poda.tv, 0 podnikatel.cz, 0 -poems.co.id, 0 -poetrylabs.com, 0 pofu.ru, 0 pogazam.ru, 0 pogliad.ua, 0 pogovorim.net, 0 -poidem.ru, 0 -pointslab.org, 0 poisk.ru, 0 -pokatne.pl, 0 poke8.com, 0 pokebip.com, 0 -pokedextracker.com, 0 -pokegosurewin.net, 0 pokemoncardmarket.eu, 0 pokemongomap.live, 0 -pokemonworld.ru, 0 -pokerdiscover.com, 0 pokermatch.com, 0 -pokermoscow.ru, 0 pokevision.hk, 0 pokupo.ru, 0 poland.travel, 0 polarion.com, 0 -polar.org.cn, 0 polessu.by, 0 -polibr.com.br, 0 -police.gov.ua, 0 -poliklinika45.ru, 0 -polime.it, 0 politeka.net, 0 -politiadefrontiera.ro, 0 politics.co.uk, 0 polito.it, 0 -poliupg.ac.id, 0 polocai.com, 0 -poloskaos.com, 0 -polovinka.org, 0 -polscygracze.pl, 0 -polska.lu, 0 -polska.travel, 0 -poltava.info, 0 polus.com.ru, 0 polus.su, 0 -polycn.com, 0 polycomp.bg, 0 -polygongroup.com, 0 polyv.net, 0 -pomelloapp.com, 0 pomodoneapp.com, 0 pomogi.org, 0 pomorsu.ru, 0 pomotodo.com, 0 pomurec.com, 0 -ponosa.net, 0 ponroy.com, 0 p-on.ru, 0 pontosido.com, 0 pop136.com, 0 pop800.com, 0 popart.hk, 0 -popdg.com, 0 -popel-studio.com, 0 -popeyesdelivery.com.sg, 0 -popfax.com, 0 -popgo.space, 0 popmog.com, 0 -popmotor.ru, 0 -popname.cz, 0 -popphoto.com, 0 popsci.com, 0 popunder24.com, 0 popunder.net, 0 porn0sex.net, 0 -porn4you.xxx, 0 -pornbase.info, 0 pornfay.com, 0 pornhublive.com, 0 porno-gif.ru, 0 porno-sex-online.com, 0 pornvideos247.com, 0 -portail-familles.net, 0 -portaleperilcittadino.it, 0 -portal-preobrazenie.ru, 0 portaltvto.com, 0 portalwifi.com, 0 portaportal.com, 0 -portfoliofinancial.hu, 0 portfolio.hu, 0 -portodeimbituba.com.br, 0 -portoitapoa.com.br, 0 -portonave.com.br, 0 -portsdebalears.com, 0 -poshk.ru, 0 positivoinformatica.com.br, 0 -posn.or.th, 0 -pos-shop.ru, 0 postcalc.ru, 0 -postcross.me, 0 postech.ac.kr, 0 posteo.de, 0 postgrespro.ru, 0 @@ -11247,27 +6313,19 @@ postimees.ee, 0 post.kz, 0 postleitzahl.org, 0 -postmarket.kz, 0 posuta.com, 0 potemki.com, 0 -potokar.si, 0 potsdam.de, 0 potsdam.edu, 0 pouyanit.com, 0 povarenok.ru, 0 pow88.com, 0 powereasy.net, 0 -poweredbyclear.com, 0 -powerliftingiran.ir, 0 powernet.com.ru, 0 -pozapisi.ru, 0 poznan.pl, 0 pp100.com, 0 ppgame.com, 0 -ppm.cn, 0 -pptake.com, 0 pptfans.cn, 0 -pptmall.net, 0 ppt.ru, 0 pptv.com, 0 ppvke.com, 0 @@ -11275,133 +6333,68 @@ ppzuche.com, 0 praegnanz.de, 0 praktiker.hu, 0 -prala.pl, 0 -prankies.com, 0 -prasac.com.kh, 0 pravda.sk, 0 pravosudje.ba, 0 -pravsha.by, 0 -prawda2.info, 0 -prb.bg, 0 prcjx.cn, 0 -prefis.sk, 0 -prego-services.de, 0 prehraj.to, 0 preis24.de, 0 -preissuche24.info, 0 -preistalent.de, 0 premier-kladionica.com, 0 premiumy.pl, 0 -prepaidcard.com.mm, 0 -preparedpantry.com, 0 prepfactory.com, 0 preporucamo.com, 0 presidence.bj, 0 presidencia.gov.co, 0 -pressenews.fr, 0 prestigeflowers.co.uk, 0 prestigehampers.co.uk, 0 prestigio.com, 0 -presto-apps.com, 0 -pretenziy.ru, 0 prettyporno.net, 0 prettysecrets.com, 0 prezentacii.org, 0 -prezi-dent.ru, 0 pr.gov.br, 0 pricefx.eu, 0 pricett.com, 0 primacom.de, 0 -primaseller.com, 0 primat.cz, 0 primeapps.in, 0 -primeins.gr, 0 primeminister.kz, 0 primeton.com, 0 print100.com, 0 printer-spb.ru, 0 -printmod.ru, 0 print-post.com, 0 -printui.com, 0 -prinzeugen.net, 0 -priscillaelmusical.es, 0 prisonlegalnews.org, 0 -prissa.com.mx, 0 -priusfreunde.de, 0 privatedns.biz, 0 private-immobilienangebote.de, 0 privatelink.de, 0 -privatportal.sk, 0 privesc.eu, 0 privet.com, 0 -privoz.pl, 0 -prizel.ru, 0 -prizrenpost.com, 0 -prncloud.com, 0 -prnwatch.com, 0 -pro2e.com.tw, 0 proball.ru, 0 proberry.ru, 0 -pro-bike.ru, 0 -probiznesmen.ru, 0 procd.net, 0 process-one.net, 0 -proc.ru, 0 -procvetok.com, 0 prodaman.ru, 0 prodj.com.ua, 0 produccion.gob.ar, 0 -productimpossible.com, 0 profbuh8.ru, 0 -professionals-security.com, 0 -proffstore.com, 0 -profhariz.com, 0 profibeer.ru, 0 -proficredit.cz, 0 profile.ir, 0 -profine-group.com, 0 profitero.com, 0 -profitquery.com, 0 profi.travel, 0 profitserver.ru, 0 -profizoo.cz, 0 -profpoint.ru, 0 proftpd.org, 0 prog-8.com, 0 progamer.ru, 0 -proginov.fr, 0 proglas.cz, 0 prognoznazavtra.ru, 0 -prognoz.ru, 0 -pro-gorod.ru, 0 programcini.com, 0 -programmy.club, 0 -programster.org, 0 -progs-shool.ru, 0 -prohelvetia.ch, 0 proimei.info, 0 -projectagora.com, 0 projectfacts.de, 0 -projectfly.co.uk, 0 -projecthax.com, 0 -projectsatbangalore.com, 0 -projectsmd.in, 0 -proliancesurgeons.com, 0 -prologicwebdesign.com, 0 -promentconsulting.com, 0 -promodo.com, 0 promo.it, 0 -promosigratis.net, 0 promostore.de, 0 promptcloud.com, 0 -pronetdigital.com.br, 0 pronosticoextendido.net, 0 prontotour.com, 0 proofpoint.com, 0 -proofy.io, 0 -propertytorenovate.co.uk, 0 propertywala.com, 0 -property.works, 0 prophpbb.com, 0 pro-porno.net, 0 pro-psixology.ru, 0 @@ -11410,53 +6403,26 @@ prospective.ch, 0 prospero.ru, 0 prostitutkifor.me, 0 -prostitutkixxx.org, 0 prostovpn.org, 0 -prota4u.org, 0 -prota.info, 0 -prota.space, 0 -protect-software.com, 0 -protegetuordenador.com, 0 -protek.ru, 0 -protiprudu.org, 0 protolabs.com, 0 provadaordem.com.br, 0 -provectus.com, 0 proviasnac.gob.pe, 0 -provincia.biella.it, 0 -provinciasondrio.gov.it, 0 -proweb.kz, 0 proxmox.com, 0 proxy-base.com, 0 -proxy-base.org, 0 proxy-listen.de, 0 -proxylite.net, 0 -proxyssl.org, 0 -prsa.pl, 0 prusa3d.com, 0 prusa3d.cz, 0 -prusa3d.it, 0 prusaprinters.org, 0 -przemekz.pl, 0 -psa-photo.org, 0 psarips.com, 0 psati.ru, 0 -psbl.org, 0 ps-box.ru, 0 psd1.org, 0 -psd2htmlconverter.com, 0 psefan.com, 0 -psikologofisi.com, 0 -psim.us, 0 pskovedu.ru, 0 pskovline.ru, 0 -psmanaged.com, 0 -psne.jp, 0 psnine.com, 0 pspro.ir, 0 -pspx.ru, 0 psru.ac.th, 0 -ps-sale.ru, 0 pss.sk, 0 p-stats.com, 0 pstorage.space, 0 @@ -11467,242 +6433,135 @@ psu.ru, 0 psuti.ru, 0 psy525.cn, 0 -psylab.cc, 0 -psysovet.ru, 0 -pszone.fr, 0 -pte.hu, 0 -pthor.ch, 0 -pti.org.br, 0 ptsecurity.com, 0 -pttreader.com, 0 ptyxjy.com, 0 puahome.com, 0 -publbox.com, 0 -publiacqua.it, 0 publiccloud.com.br, 0 public-cyprus.com.cy, 0 public.gr, 0 -publicitas.ch, 0 publicitas.com, 0 publicvm.com, 0 -publishernews.ru, 0 -pubprosud.fr, 0 pub.ro, 0 pubyun.com, 0 -puc.edu, 0 puc-rio.br, 0 -pudding.cc, 0 pudong.gov.cn, 0 pu.edu.tw, 0 puet.edu.ua, 0 -pullywood.com, 0 -pulsar.guru, 0 -pulsepad.com.ua, 0 punchbaby.com, 0 punjab.gov.pk, 0 punto.ar, 0 punycoder.com, 0 -purchasebear.com, 0 purdue.edu, 0 -pure-ana.com, 0 -puredata.info, 0 pureftpd.org, 0 puregamemedia.fr, 0 -purepassion.ru, 0 -puretechltd.com, 0 -purgatoryresort.com, 0 puritys.me, 0 purnov.com, 0 -pushall.ru, 0 -pushclouds.cc, 0 put.ac.ir, 0 -putanastars.net, 0 putao.com, 0 -putihome.org, 0 -putler.com, 0 -puxbao.com, 0 pvision.ru, 0 -pvr8.ir, 0 -pwlab.com, 0 pwnz.org, 0 -pxgrids.com, 0 pycon.org, 0 pypa.io, 0 -pypi.org, 0 pythian.com, 0 pythonanywhere.com, 0 python.org, 0 pythontutor.com, 0 pyw.cn, 0 -pyyx.com, 0 -pzacademy.com, 0 pz.gov.ua, 0 pzoom.com, 0 -pzu.com.ua, 0 q1.com, 0 -q32.link, 0 q4yy.com, 0 -q9tech.com, 0 qapa.fr, 0 -qazit.com, 0 qbear.ru, 0 -qbsw.sk, 0 -qc.to, 0 -qdac.cc, 0 qdaily.com, 0 qdcdc.com, 0 -qdealit.com, 0 -qdgjj.com, 0 -qdingzhi.com, 0 qdu.edu.cn, 0 -qduoj.com, 0 qdxin.cn, 0 -qeeka.com, 0 qfang.com, 0 qfiz.win, 0 qhfz.edu.cn, 0 qhimg.com, 0 qhmsg.com, 0 -qiankunhaoche.com, 0 qianmi.com, 0 qianqian.com, 0 qichacha.com, 0 qichetong.com, 0 qida.com, 0 -qidaile.com, 0 -qidapp.cn, 0 -qierukou.com, 0 -qietu.cn, 0 -qiezzi.com, 0 qifu.me, 0 qihoo.net, 0 qihu.com, 0 -qijianvpnn.com, 0 -qikan.com, 0 qikoo.com, 0 qiku.com, 0 -qiling.org, 0 qilong.com, 0 qima-inc.com, 0 -qin27.com, 0 qing5.com, 0 qinggukeji.com, 0 -qingguo.com, 0 -qingk.cn, 0 qingningzi.com, 0 qingtaoke.com, 0 qingting.fm, 0 -qingyunvpn.com, 0 qingzhuyi.com, 0 qinqinbaby.com, 0 qinsmoon.com, 0 qinzhou.gov.cn, 0 qip.ru, 0 -qispine.com, 0 -qitt.ru, 0 qiushibaike.com, 0 -qizhao.com, 0 qlcl.edu.vn, 0 qlean.ru, 0 qlmoney.com, 0 -qls.com.au, 0 -qlu.edu.cn, 0 qnapclub.it, 0 -qnap.community, 0 qnbar.com, 0 -qnet.it, 0 qnoddns.org.cn, 0 qoop.me, 0 -qortex.com, 0 qov.tw, 0 qpolitical.com, 0 qqyou.com, 0 -qrcb.com.cn, 0 qrd.by, 0 -qrp-labs.com, 0 qrserver.com, 0 -qrz.ru, 0 -qsban.cn, 0 qsng.cn, 0 -qspfw.com, 0 qsrmagazine.com, 0 -qswoo.com, 0 -qtdev.org, 0 -qtech.ru, 0 -qth.spb.ru, 0 quadcept.com, 0 qualaroo.com, 0 qualiteconstruction.com, 0 -quality.co.jp, 0 -qualitytelecom.es, 0 quankan.tv, 0 quanmin.tv, 0 queeky.com, 0 queer.de, 0 queezie.com, 0 -queisser.ru, 0 -quentrix.com, 0 quepasada.cc, 0 -quepasanoticias.com, 0 -queromaisdicas.com.br, 0 querylist.cc, 0 questoria.ru, 0 qugirl.com, 0 -quickchange.cc, 0 -quickclickhosting.com, 0 quickim.co.il, 0 -quickmobile.com, 0 -quickqx.net, 0 quicktickets.ru, 0 -quik.ru, 0 quilt.idv.tw, 0 quintagroup.com, 0 quint.dk, 0 quirinale.it, 0 quitoque.fr, 0 quizgroup.com, 0 -quizofkings.com, 0 quizzclub.com, 0 quji.com, 0 -qumaiyao.com, 0 -qumi.com, 0 quna.com, 0 qunar.com, 0 -qunar.it, 0 -qunarzz.com, 0 qunhequnhe.com, 0 -qun.hk, 0 -qupai.me, 0 qupeiyin.cn, 0 -qupeiyin.com, 0 qutke.com, 0 -quumii.com, 0 quyiyuan.com, 0 quyundong.com, 0 qxiazai.com, 0 qycloud.com.cn, 0 qycn.com, 0 qydev.com, 0 -qyvideo.net, 0 qzzn.com, 0 -r23.ru, 0 r4ruby.com, 0 r52.ru, 0 -r99.no, 0 rabita.az, 0 -rabotakaliningrad.ru, 0 -rabota.tomsk.ru, 0 racco.com.br, 0 racedepartment.com, 0 racefornuts.com, 0 -rachelcruze.com, 0 -rachum.com, 0 -radarservices.com, 0 radec.com.mx, 0 rad.eu, 0 radia.sk, 0 -radicalphilosophy.com, 0 -radicasys.com, 0 radicenter.eu, 0 radikal.ru, 0 radimrehurek.com, 0 @@ -11710,56 +6569,30 @@ radinsan.com, 0 radio1.si, 0 radio5.com.pl, 0 -radioantena.si, 0 radio.cn, 0 -radioheart.ru, 0 radiojackie.com, 0 radiola.audio, 0 -radiolan.sk, 0 radiopotok.ru, 0 -radio-shop.ru, 0 -radioskonto.lv, 0 -radioson.ru, 0 -radiostudent.si, 0 -radiotrucker.com, 0 radioweb.jp, 0 rad-net.de, 0 radom.pl, 0 radpardazesh.com, 0 -raduga-ufa.ru, 0 -radver.ru, 0 -ra.ee, 0 -raf.edu.rs, 0 ragan.com, 0 ragazzeinvendita.com, 0 rageline.com, 0 rahvaraamat.ee, 0 -rahyarserver.com, 0 -raiffeisen.ru, 0 rai.it, 0 -rails365.net, 0 rainbow-ic.biz, 0 rainfly.cn, 0 -rainintl.com, 0 -rainyman.net, 0 rajagiritech.ac.in, 0 rajax.me, 0 rajveteranu.cz, 0 rallets.com, 0 -ranbot.hk, 0 rand.com, 0 randymc.de, 0 ranez.ru, 0 -rangde.org, 0 -raphaelhertzog.com, 0 rapida.ru, 0 -rapidomaine.biz, 0 rapidomaine.fr, 0 -rapidpich.ir, 0 -rapidshopper.ca, 0 -rapidsms.org, 0 -rapidswholesale.com, 0 -rapixel.com, 0 rara.jp, 0 raremaps.com, 0 rare-technologies.com, 0 @@ -11769,425 +6602,231 @@ rashtak.ir, 0 raskesider.no, 0 ratbv.ro, 0 -ratesphere.com, 0 -ratioform.de, 0 ratowealth.com, 0 ratpdev.com, 0 -raviplacement.com, 0 -ravnaqbank.uz, 0 rayaneh.com, 0 -rayanpack.com, 0 raybt.ru, 0 rayshobby.net, 0 -rayvision.com, 0 -razumei.ru, 0 -rbauto.ru, 0 -rbc.ch, 0 rbc.ua, 0 -rblive.de, 0 -rbrauto.ru, 0 rbru.ac.th, 0 rbt.asia, 0 rcf.it, 0 rcforum.ru, 0 rcfp.org, 0 -rcitsakha.ru, 0 -rcntec.com, 0 rcokoit.ru, 0 rcscomponents.kiev.ua, 0 -rcsearch.ru, 0 -rc-sme.ru, 0 rctw.net, 0 -rcxue.com, 0 rd-forum.ru, 0 rdf.ru, 0 rdfzcygj.cn, 0 -rdrom.ru, 0 -rdrop.com, 0 -reachoutandread.org, 0 -readfree.me, 0 readnotify.com, 0 readovka.ru, 0 reagent.com.cn, 0 -realblackfriday.ru, 0 realestate.ru, 0 -realeyz.de, 0 realfevr.com, 0 realgreenled.com, 0 realidadvenezolana.com, 0 -realistic.photos, 0 realschulebayern.de, 0 realsociedad.com, 0 -realtycalendar.ru, 0 realtyvision.ru, 0 -realweb.ru, 0 -reasondigital.com, 0 -reber.com, 0 rebex.net, 0 -rebooo.com, 0 -reca.ca, 0 -recaro-cs.com, 0 rechargedeal.in, 0 -redbook.tw, 0 redcafestore.com, 0 -redcom.ru, 0 -reddingo.com, 0 -redesul.com.br, 0 red-gate.com, 0 -redhome.cc, 0 redirectme.net, 0 -redmatter.com, 0 rednager.xyz, 0 -rednoise.org, 0 redserver.su, 0 redshift3d.com, 0 -redsign.ru, 0 redtubelive.com, 0 -redzoneaction.org, 0 -reedoun.com, 0 -reeleezee.nl, 0 refdb.ru, 0 -reflexplanning.com, 0 refog.com, 0 reformagkh.ru, 0 refurb.me, 0 -refurb-tracker.com, 0 regard.ru, 0 regel.it, 0 regenbogen.com, 0 regione.fvg.it, 0 regione.puglia.it, 0 regionoperator.ru, 0 -regionsanmartin.gob.pe, 0 regiontrud.ru, 0 -registrodirecto.es, 0 -registru.md, 0 registry.net.za, 0 regruhosting.ru, 0 -regtaim.ru, 0 -rehau-portal.ru, 0 reifensuche.com, 0 -reikartz.com, 0 reimu.net, 0 reincarnationics.com, 0 -reinforce.cn, 0 -reiseguiden.no, 0 reisenthel.com, 0 rekab.ir, 0 -rekini.lv, 0 -reklama-online.ru, 0 -relap.io, 0 remediobarato.com, 0 -remisesetprivileges.fr, 0 -remont3.ru, 0 -remora.cx, 0 -remorques-discount.com, 0 remotewebaccess.com, 0 rem.uz, 0 remzona.by, 0 -renate.cc, 0 renault.ru, 0 -renderfarming.net, 0 renderpeople.com, 0 -rendezvenyhelyszinek.hu, 0 -rendi.hu, 0 -renegades-ast.it, 0 -renegraeber.de, 0 renhe.cn, 0 renjk.com, 0 -rennsimulanten.de, 0 -renovolive.com, 0 renren66.com, 0 renren.com, 0 -renrencui.org, 0 renshuu.org, 0 rentacenter.com, 0 rentalhomes.com, 0 -rentbay.co.za, 0 rentbook.co.za, 0 -rentner-die-zocken.de, 0 -rentong.com.tw, 0 -renwey.com, 0 repaik.com, 0 repetiruem.ru, 0 -repetitors.info, 0 replaymod.com, 0 reportbee.com, 0 reportermagazin.cz, 0 -reportuk.org, 0 -researchcatalogue.net, 0 researchgateway.ac.nz, 0 researchmfg.com, 0 reseauenscene.fr, 0 reseguiden.se, 0 -resertrip.com, 0 reservationcounter.com, 0 reska.co.id, 0 -res-mods.ru, 0 -resmush.it, 0 -resortragaz.ch, 0 respondi.com, 0 restate.ru, 0 -restore.com.ua, 0 restore-iphone-data.com, 0 resto.ru, 0 restosducoeur.org, 0 -restostar.com, 0 -restr.net, 0 -resumegames.com, 0 -reteaste.tv, 0 -retently.com, 0 retouch-weblab.com, 0 -retrojeans.com, 0 retrovisionlatino.net, 0 ret.ru, 0 -revda-info.ru, 0 reveal-sound.com, 0 revell.de, 0 -reverse4you.org, 0 reviewtrackers.com, 0 -revision.co.zw, 0 revistamoi.com, 0 -revizto.com, 0 revolt.tv, 0 rewriteim.jp, 0 -reyhansoft.com, 0 rezeptwelt.de, 0 -rezo-zero.com, 0 rfchost.com, 0 rfei.ru, 0 -rfelements.com, 0 rf.gd, 0 rfgsi.com, 0 rficb.ru, 0 rfj.ch, 0 rfmeteo.ru, 0 -rgsu.ru, 0 -rgtfo-me.it, 0 rgups.ru, 0 -rgyan.com, 0 rgz.one, 0 rhbrasil.com.br, 0 rhcloud.com, 0 rhh520.cn, 0 -rhoen-klinikum-ag.com, 0 ria.com, 0 -ricercare-imprese.it, 0 -ridero.eu, 0 ridersdeal.com, 0 -riffle.be, 0 riftcat.com, 0 -rigaskarte.info, 0 rightathome.net, 0 rightknights.com, 0 -right-to-love.name, 0 rigol.com, 0 -rigpa.org, 0 -rii.kz, 0 rijigu.com, 0 rimi.lt, 0 -rincondelatecnologia.com, 0 -rings.ru, 0 riolis.ru, 0 -ripn.net, 0 ripost.hu, 0 -rippletek.com, 0 -risan-penza.ru, 0 risda.gov.my, 0 riseba.lv, 0 risenenergy.com, 0 rising-gods.de, 0 -risk.az, 0 -risparmiatelo.it, 0 riss.ru, 0 -riteforge.com, 0 -ritehite.com, 0 ritekit.com, 0 rite.ly, 0 -ritepush.com, 0 -ritetag.com, 0 ritlabs.com, 0 -ritmo.ir, 0 ritmonexx.ru, 0 -rivalfox.com, 0 rivalregions.com, 0 rixcloud.com, 0 rizhiyi.com, 0 rjb.ch, 0 rj.gov.br, 0 rjh.com.cn, 0 -rk1.ru, 0 rk.gov.ru, 0 rkiau.ac.ir, 0 rkomi.ru, 0 rlp.de, 0 rls.tv, 0 rlu.ru, 0 -rmc.edu.my, 0 rmis36.ru, 0 rmu.edu, 0 rmutsb.ac.th, 0 rmutsv.ac.th, 0 -rnarod.su, 0 rncb.ru, 0 rn.gov.br, 0 -rnids.rs, 0 rnp.br, 0 rnz.de, 0 roadoor.com, 0 -roadrules.com.ua, 0 -robfors.com, 0 -robodesk.biz, 0 -robofinist.ru, 0 -roboforex.ae, 0 -roboforex.co.id, 0 roboforex.com, 0 roboforex.ru, 0 -robom.ru, 0 -roboname.com, 0 -robot-trading.de, 0 robrobinette.com, 0 roche.com, 0 roche.de, 0 -rock-chips.com, 0 rocketbeans.tv, 0 -rocketchange.ru, 0 rocket-exp.com, 0 -rockhard.de, 0 -roc.nl, 0 rodina.tv, 0 roebx.com, 0 -roederer.fr, 0 rohan.co.uk, 0 -rohost.com, 0 -roidmi.com, 0 roiland.com, 0 roklen24.cz, 0 -rolecosplay.com, 0 -rolotec.ch, 0 -romana.ru, 0 roman.com.tr, 0 -romanrm.net, 0 -romeo1052.net, 0 -romhacking.ru, 0 -romme-palast.de, 0 ronasit.com, 0 roncoo.com, 0 -ronc.ru, 0 rongcapital.cn, 0 -ronghedai.com, 0 -rongkecloud.com, 0 -roninwear.com, 0 -root86.com, 0 -root9b.com, 0 root.bg, 0 root.cz, 0 -rootnerds.com, 0 -rootshell.be, 0 roov.org, 0 roowei.com, 0 -rooydad.org, 0 rooyeshnews.com, 0 -ropestore.com.br, 0 roposo.com, 0 rosalab.ru, 0 rosalinux.ru, 0 rosan.com, 0 rosario3.com, 0 -rosariocultura.gob.ar, 0 rosario.gov.ar, 0 -roscadastr.com, 0 roscosmos.ru, 0 roseltorg.ru, 0 rosen-group.com, 0 -rosinter.ru, 0 -rosix.ru, 0 -rosjb.com, 0 roskazna.ru, 0 -roskonkursy.ru, 0 rosminzdrav.ru, 0 -rosneft-lubricants.ru, 0 rosrealt.ru, 0 -rosreestr.ru, 0 -rossia.org, 0 rossiya-airlines.com, 0 rossoverdi.com, 0 rostec.ru, 0 -rosterbot.com, 0 rostobr.ru, 0 rostov-gorod.ru, 0 rostrud.ru, 0 -roszavod.ru, 0 -rotfront.su, 0 -rot-weiss-erfurt.de, 0 -routdata.com, 0 -routemobile.com, 0 -routeradar.nl, 0 routerclub.com, 0 rouxa365.gr, 0 royal-forest.org, 0 -royalkids.fr, 0 -royalquest.com, 0 royalquest.ru, 0 royalrobbins.com, 0 royaninstitute.org, 0 rozanehshop.ir, 0 rozhlas.cz, 0 rpg-city.de, 0 -rpicn.org, 0 rpn.gov.ru, 0 -rp.ru, 0 -rpsofts.com, 0 -rqbao.com, 0 rqnoj.cn, 0 rrabbit.cc, 0 rrc24.com, 0 -rrc.ru, 0 rrjc.com, 0 -rscc.ru, 0 rsc.org.uk, 0 rsmu.ru, 0 -rsnet.ru, 0 -rs.ro, 0 rsr-olymp.ru, 0 rs.ru, 0 rssi.ru, 0 r-stahl.com, 0 -rst.com.pl, 0 rstore.in, 0 -rtc.bt, 0 rte.ie, 0 -rtfund.com, 0 rt-mart.com.cn, 0 -rtn.ch, 0 -rtr.at, 0 rt.ru, 0 rt-thread.org, 0 rtv.rs, 0 rtvs.sk, 0 ru.ac.bd, 0 ruan8.com, 0 -ruanman.net, 0 ruanmei.com, 0 rubarius.ru, 0 -ruberi.ru, 0 -rubezh.ru, 0 rubhoz.com, 0 -rubikscube.info, 0 ru-board.com, 0 -rubot.ovh, 0 ruby-china.org, 0 ruby-doc.org, 0 ruby-forum.com, 0 -rubygroupe.jp, 0 -rucountry.ru, 0 -rudnikov.com, 0 -rugion.ru, 0 ruguoapp.com, 0 ruijie.com.cn, 0 ru.is, 0 rukzakoff.ru, 0 -rula.net, 0 rulaws.ru, 0 rummycircle.com, 0 runeapps.org, 0 @@ -12196,151 +6835,79 @@ runivers.ru, 0 runningquotient.com, 0 ruonu.com, 0 -ruooo.com, 0 -rupar.puglia.it, 0 -rusanu.com, 0 rusat.com, 0 rusdosug.com, 0 -ruselectronics.ru, 0 rusempire.ru, 0 rusevik.ru, 0 rusfolder.com, 0 -rusfont.ru, 0 rushydro.ru, 0 -rushy.fr, 0 rusnano.com, 0 -rusnavi.org, 0 ruspo.ru, 0 -rusreinfo.ru, 0 russian-belgium.be, 0 -russian.space, 0 russkaja-ohota.ru, 0 -rust1.ru, 0 -rustelekom.net, 0 rustest.ru, 0 rusticae.es, 0 rustorrents.info, 0 -rutracker.cr, 0 -rutracker.net, 0 -rutracker.org, 0 ruvape.club, 0 ruvr.ru, 0 -ruweber.ru, 0 -rvm.io, 0 r-v-s.su, 0 rvv.de, 0 rwth-aachen.de, 0 -ryady.ru, 0 rybbaby.com, 0 rybnik.pl, 0 -rynek-rolny.pl, 0 rz.com, 0 -rzd-bonus.ru, 0 rzeszow.pl, 0 rzgmu.ru, 0 s1homes.com, 0 s3d4.cn, 0 s4yy.com, 0 -saafi.com, 0 sabayon.org, 0 sabbuy.com, 0 -sabinahuang.com, 0 sac.net.cn, 0 -sac.org.ar, 0 -sad6sotok.ru, 0 -sadaf22.com, 0 -sadalestikls.lv, 0 sadc.int, 0 sadeco.ir, 0 -sadkomed.ru, 0 -sadlyunfriended.com, 0 -sadovnik.mobi, 0 sa.edu.au, 0 -saemes.fr, 0 saezlive.net, 0 safariran.ir, 0 safarme.com, 0 safc.com, 0 -safe2choose.org, 0 -safebridge.net, 0 safedog.cn, 0 -safegoldgroup.com, 0 -safelayer.com, 0 safer-networking.org, 0 -saferoadplus.com, 0 -safetree.com.cn, 0 safe-ws.eu, 0 -saguenay.ca, 0 sahamyab.com, 0 -sa-help.com, 0 sahra.org.za, 0 saibaba.org, 0 -saicgmac.com, 0 saic-gm.com, 0 saicmaxus.com, 0 -sai.co.za, 0 -saihs.edu.tw, 0 sailingworld.com, 0 -saimanet.kg, 0 -saimatelecom.kg, 0 saintpaul.edu, 0 -saintsouth.net, 0 saipujianshen.com, 0 saitama-u.ac.jp, 0 saitreport.ru, 0 saix.net, 0 -sakhalinenergy.ru, 0 sakhtafzarmag.com, 0 -sak.sk, 0 sakura.ne.jp, 0 -salairemoyen.com, 0 -salam.sch.ir, 0 -salatigakota.go.id, 0 -saldocuentarut.com, 0 saleshood.com, 0 -sallyq.com.tw, 0 -salmon.com, 0 -salomon.ro, 0 salon24.pl, 0 -salongweb.com, 0 -salonwith.com, 0 salto.bz, 0 saltwatersportsman.com, 0 -saludnqn.gob.ar, 0 salzburgerland.com, 0 -samaraintour.ru, 0 -sambaum.ch, 0 -samberi.com, 0 samedi.de, 0 samemes.com.br, 0 -samenblog.com, 0 sameroom.io, 0 samesound.ru, 0 -samgasu.ru, 0 -samgau.com, 0 samgups.ru, 0 samihost.com, 0 samohodoff.ru, 0 -samo.ru, 0 -sa-mp-servers.com, 0 samregion.ru, 0 samsung-fun.ru, 0 samuraj-cz.com, 0 -samvirkebryggeriet.no, 0 sandai.net, 0 -sandbox-immobilienscout24.de, 0 -sanderstechnology.com, 0 -sandilands.info, 0 -sandino.net, 0 -sandpay.com.cn, 0 sangfor.com, 0 sangfor.com.cn, 0 sangoma.com, 0 sangon.com, 0 -sanistaal.com, 0 sanjieke.cn, 0 -sankai.com, 0 -sanog.org, 0 sanquan.com, 0 sanstv.ru, 0 santaclaus-embassy.com, 0 @@ -12349,114 +6916,60 @@ sanwen8.cn, 0 sanwen.net, 0 sapagroup.com, 0 -sapient.com, 0 sapo.pt, 0 sarasavi.lk, 0 -sardex.net, 0 sarnovosti.ru, 0 -saro.me, 0 -sarrc.ru, 0 sarvserver.com, 0 sarvssl.com, 0 sasac.gov.cn, 0 saschina.org, 0 -sasek.tv, 0 -saske.sk, 0 -saskialund.de, 0 -sata.direct, 0 satc.edu.br, 0 -sat-chit-ananda.org, 0 -satellogic.com, 0 satel.pl, 0 -satisfaction-fnac.com, 0 -satka74.ru, 0 -satlyk.org, 0 -sat-online.ch, 0 -satterley.com.au, 0 saturn-r.ru, 0 satway.ru, 0 -saucontds.com, 0 -saudubna.ru, 0 -savage.ru, 0 savechange.ru, 0 -savehrolling.com, 0 -saverglass.com, 0 saveur.com, 0 savevpn.cc, 0 -savjee.be, 0 -sa-voice.com, 0 -savoir-inutile.com, 0 savvytime.com, 0 -sayamatravel.com, 0 saystory.co.kr, 0 sbar.com.cn, 0 -sbarjatiya.com, 0 sb-dji.com, 0 -sberbankaktivno.ru, 0 sberbank-ast.ru, 0 sberbank.ua, 0 -sberinsurance-online.ru, 0 -sbk-studio.de, 0 sbras.ru, 0 sbrf.com.ua, 0 sbroker.de, 0 sbro.me, 0 sbsart.com, 0 sbs.edu.cn, 0 -sbsub.com, 0 sbwml.cn, 0 -sbx-media.com, 0 -scala-ffb.de, 0 scalebay.ru, 0 -scaleforum.ru, 0 scalp-trading.com, 0 -scam.su, 0 -scanadu.com, 0 -scanbot.io, 0 -scand.com, 0 -scbn.org, 0 scenedownloads.pw, 0 scga.gov.cn, 0 sc.gov.cn, 0 -schaeferhunde.de, 0 -schaffenburg.org, 0 -schaffner.com, 0 -schafkopf-palast.de, 0 schieb.de, 0 -schlemann.com, 0 schneider-electric.cn, 0 schneider-electric.com, 0 schneidersladen.de, 0 -schnick-schnack-schnuck.net, 0 -schokokeks.org, 0 school2100.com, 0 -schooldeskus.com, 0 school.nz, 0 schoolofhaskell.com, 0 schoolpal.cn, 0 school-scout.de, 0 schoolsoft.com, 0 -schornsteinfabrik.de, 0 -schule.de, 0 schullv.de, 0 schul-webportal.de, 0 schwarzkopf.de, 0 schweizmobil.ch, 0 sci99.com, 0 science-education.ru, 0 -science.ma, 0 -scienceontheweb.net, 0 scientificrussia.ru, 0 -scientology.net, 0 sci-hub.ac, 0 sci-nnov.ru, 0 -scloud.ru, 0 -scmcc.com.cn, 0 -sc-nm.si, 0 scoffoni.net, 0 scoop.co.nz, 0 scoop.it, 0 -scoop.ng, 0 scorecloud.com, 0 scotthelme.co.uk, 0 scottlogic.com, 0 @@ -12464,68 +6977,43 @@ scout.org.hk, 0 scoutwiki.org, 0 scrabble-word-finder.com, 0 -scrcu.com.cn, 0 -screen9.com, 0 screenbid.com, 0 screencastify.com, 0 -screenshotlink.ru, 0 -screenstore.tk, 0 scriptbuy.ir, 0 -scriptmania.com, 0 scriptux.ir, 0 -scrunch.com, 0 scryde.ru, 0 scsb.com.tw, 0 -scs-laboutique.com, 0 scssoft.com, 0 -sctu.edu.cn, 0 sctv.com, 0 scubadiving.com, 0 scu.edu.cn, 0 scut.edu.cn, 0 sdada.edu.cn, 0 sde.ru, 0 -sdewt.com, 0 -sdf.org, 0 sdi.bg, 0 sdk.cn, 0 sdl.com, 0 -sdln.net, 0 sdnu.edu.cn, 0 -sdska.ru, 0 sdsmt.edu, 0 -sdsz.com.cn, 0 sd.ua, 0 sdu.edu.cn, 0 sdvor.com, 0 -sdwfhrss.gov.cn, 0 -sdw.org, 0 -sd-xbmc.org, 0 sdyunban.com, 0 -se7enkills.net, 0 se7en.ws, 0 seacadets.org, 0 -sea.com.ua, 0 seafile.com, 0 -sea-group.org, 0 seamwork.com, 0 searates.com, 0 -searchanise.com, 0 -searchevolution.com, 0 search-for-it.com, 0 -searchmedia.ws, 0 searchx.ch, 0 searu.org, 0 seasiaconsulting.com, 0 seasone.ru, 0 -seaters.com, 0 seattle.gov, 0 seatwave.com, 0 -seatwave.de, 0 seatwave.es, 0 seatwave.ie, 0 seatwave.it, 0 -seayo.com, 0 sebastian.expert, 0 sebraemg.com.br, 0 sec.gob.mx, 0 @@ -12534,47 +7022,26 @@ second24.ru, 0 secp.gov.pk, 0 secpulse.com, 0 -secretescapes.com, 0 secureauthservice.com, 0 -securehost.ir, 0 -securelink.be, 0 -securenowindia.com, 0 -secureordering.com, 0 -secureprofile.ru, 0 -securerwsoft.de, 0 secureserver.net, 0 securitasdirect.fr, 0 securitythinkerz.com, 0 secutix.com, 0 -secv.com, 0 sec-wiki.com, 0 secye.com, 0 -sedittyhair.com, 0 sedmitza.ru, 0 -sedns.cn, 0 seec.com.tw, 0 seeed.cc, 0 -seeleit.com, 0 seemallorca.com, 0 seetv.tv, 0 seeyon.com, 0 -seezislab.com, 0 se.gov.br, 0 seg-social.pt, 0 -segurancajato.com.br, 0 seibert-media.net, 0 -seidal.com, 0 seidensticker.com, 0 seis.ac.cn, 0 seiyon.net, 0 -sejdemse.net, 0 -sekorm.com, 0 -sektaschool.ru, 0 seldatdirect.com, 0 -selectedrecs.com, 0 -selenic.com, 0 -selestial.com, 0 -selfhost.bz, 0 selfhost.de, 0 selfhost.eu, 0 selfhtml.org, 0 @@ -12583,22 +7050,16 @@ selfip.net, 0 selfip.org, 0 selfmadetrip.com, 0 -selfnation.ch, 0 -selfrance.org, 0 sellercloud.com, 0 sellercloudlocal.com, 0 sellercube.com, 0 sellerlabs.com, 0 sellermania.com, 0 -seller-online.com, 0 sellfile.ir, 0 selpics.com, 0 selzir.com, 0 -sem-bw.org, 0 semesteratsea.org, 0 semiaccurate.com, 0 -semicvetic.com, 0 -semilab.hu, 0 seminuevos.com, 0 semmel.de, 0 sem-tem.ru, 0 @@ -12606,81 +7067,53 @@ senai.br, 0 sendpulse.com, 0 sendsay.ru, 0 -sendsms.az, 0 -sendyit.com, 0 sengled.com, 0 sense.com, 0 -sensorika.uz, 0 -sensorytechnologies.com, 0 sentres.com, 0 seodollars.com, 0 seofangfa.com, 0 seolib.ru, 0 -seomon.com, 0 -seo-protools.com, 0 -seopult.pro, 0 seopult.ru, 0 seo-summary.de, 0 seoul.co.kr, 0 seo-united.de, 0 seowhy.com, 0 sepidwebhost.com, 0 -septgame.com, 0 -seresco.es, 0 serg-casper.ru, 0 -sergeisokolov.com, 0 -serifgungor.com, 0 serj.ws, 0 -sertification.org, 0 -servebbs.com, 0 servebeer.com, 0 -serveftp.com, 0 serveftp.net, 0 serveftp.org, 0 servegame.com, 0 servehttp.com, 0 servel.cl, 0 -serveminecraft.net, 0 -server4u.cz, 0 server4you.de, 0 server4you.net, 0 -serverdale.com, 0 server-he.de, 0 server.ir, 0 serveriran.net, 0 -server-it.net, 0 -servernesia.com, 0 servernews.ru, 0 serveromat.com, 0 serverprofi24.com, 0 serverprofi24.de, 0 -serverprofi24.net, 0 server-sponsoring.com, 0 service-schematics.ru, 0 servispckupka.cz, 0 servisvk.ru, 0 servyou.com.cn, 0 sestosg.net, 0 -setca.org, 0 -setia.pl, 0 setmore.com, 0 -setonhill.edu, 0 setti.info, 0 seu.edu.cn, 0 se-unsa.org, 0 sevaft.cn, 0 sevastopol.press, 0 -sev-eishockey.de, 0 seven-sky.net, 0 -severstalgroup.com, 0 -sevidi.ru, 0 sevpolitforum.ru, 0 -sevsu.ru, 0 sevt.cz, 0 sexacg.com, 0 sexchats.ru, 0 sexhotgames.com, 0 -sexkompas.me, 0 sexlikereal.com, 0 seznamzbozi.cz, 0 sfacg.com, 0 @@ -12688,24 +7121,16 @@ sfe8.com, 0 sfedu.ru, 0 sf-express.com, 0 -sff.gr, 0 sfgame.cz, 0 sfgame.de, 0 sfgame.es, 0 sfgame.fr, 0 -sfgame.gr, 0 sfgame.hu, 0 -sfgame.it, 0 sfgame.net, 0 sfgame.pl, 0 -sfgame.ru, 0 -sfgame.sk, 0 sfgame.us, 0 -sfgame.web.tr, 0 sf-helper.com, 0 sflep.com, 0 -sf-misis.ru, 0 -sformat.ru, 0 sfs.gov.ua, 0 sfuh.tk, 0 sfu-kras.ru, 0 @@ -12713,44 +7138,29 @@ sfy.ru, 0 sg-autorepondeur.com, 0 sgcc.com.cn, 0 -sgcc.uz, 0 sgd.de, 0 sgeb.bg, 0 sglgroup.com, 0 sgmw.com.cn, 0 -sgroshi.com.ua, 0 sguo.com, 0 sg-video.com, 0 -sgyy.com.cn, 0 shab.ch, 0 shade3d.jp, 0 -shadeyouvpn.com, 0 -shadowcraft.ru, 0 shadowfly.org, 0 shadowpad.jp, 0 -shadowsky.site, 0 shadowsock.club, 0 -shadowsocks.im, 0 shahinsoft.ir, 0 shahroodut.ac.ir, 0 -shairart.com, 0 -shallmap.com, 0 shamana.co, 0 shanbay.com, 0 shandongair.com.cn, 0 shanghaidisneyresort.com, 0 -shanghai-electric.com, 0 shanghaitech.edu.cn, 0 shantou.gov.cn, 0 shaogood.com, 0 -shaozi.info, 0 shapingrain.com, 0 -sharaland.ru, 0 -sharcnet.ca, 0 -shardsonline.com, 0 sharedbox.com, 0 shareinstock.com, 0 -shareitforpcdl.com, 0 sharengo.it, 0 sharepoint.cn, 0 sharesdk.cn, 0 @@ -12758,89 +7168,48 @@ shatel.ir, 0 shatelland.com, 0 shatura.com, 0 -shatura.ru, 0 shayuvpnn.com, 0 shdf.gov.cn, 0 -shd.ru, 0 shebaoonline.com, 0 sheedantivirus.ir, 0 sheencity.com, 0 -shengcaijinrong.com, 0 -shengchifoundation.org, 0 -shengjingvip.com, 0 -shengri.cn, 0 shengyeji.com, 0 shenzhan.in, 0 -shenzhenware.com, 0 shenzhong.net, 0 sherbrooke.qc.ca, 0 sheridanc.on.ca, 0 sherlock-holm.es, 0 sherweb.com, 0 -shetabha.com, 0 -shgb.gov.cn, 0 -shgcx.org, 0 sh.gov.cn, 0 -shhyolkovo.ru, 0 shiep.edu.cn, 0 shiftelearning.com, 0 -shiftinglight.com, 0 shiftphones.com, 0 shikimori.org, 0 -shimadzu.com.cn, 0 shina.ru, 0 -shineon.cc, 0 shinezone.com, 0 -shintorg48.ru, 0 shippable.com, 0 shipxy.com, 0 -shiqichan.com, 0 -shiqichuban.com, 0 shirazwebhost.com, 0 -shirazwebhost.ir, 0 shitou.com, 0 -shlyahten.ru, 0 -shmarathon.com, 0 shmh.gov.cn, 0 shmtu.edu.cn, 0 shmu.sk, 0 -shockmodels.su, 0 shoe.org, 0 shoessale.com.ua, 0 -shomaresaz.ir, 0 shom.fr, 0 shooshmall.com, 0 shooter.cn, 0 -shoot-n-joy.ru, 0 shopandroid.com, 0 shop-apotheke.com, 0 -shopbuilder.cz, 0 -shopbuilder.hr, 0 shopbuilder.ro, 0 -shopbuilder.sk, 0 -shopcar.ir, 0 -shopdutyfree.eu, 0 shop.hu, 0 -shopinamerica.am, 0 -shoplex.com, 0 -shop-lining.com, 0 shop-logistics.ru, 0 shopmania.bg, 0 shopmania.biz, 0 -shopmania.com, 0 -shopmania.com.br, 0 -shopmania.com.mx, 0 -shopmania.co.uk, 0 -shopmania.co.za, 0 -shopmania.de, 0 shopmania.es, 0 -shopmania.fr, 0 -shopmania.hr, 0 shopmania.hu, 0 shopmania.in, 0 shopmania.it, 0 -shopmania.nl, 0 -shopmania.pl, 0 shopmania.pt, 0 shopmania.ro, 0 shopmania.rs, 0 @@ -12848,71 +7217,46 @@ shopnctest.com, 0 shopozz.ru, 0 shoppal.in, 0 -shoptimize.in, 0 shop.unas.hu, 0 shopvote.de, 0 shorten.id, 0 -short.id, 0 shost.ca, 0 -shoujichahao.com, 0 -shoujiduoduo.com, 0 -shouqianba.com, 0 shouqu.me, 0 shoushang.com, 0 shouyeren.org, 0 showapi.com, 0 showjet.ru, 0 -showpark.info, 0 showradyo.com.tr, 0 -shox.hu, 0 -shpt188.com, 0 shrinktheweb.com, 0 -shtorm.com, 0 shtrih-m.ru, 0 -shtukishop.ru, 0 shuaigay.top, 0 shuax.com, 0 shufe.edu.cn, 0 shunde.gov.cn, 0 shunwang.com, 0 shunxingkeji.com, 0 -shupl.edu.cn, 0 -shurup.net.ua, 0 shuxuejia.com, 0 -shwebook.com, 0 -shwilling.com, 0 shyaway.com, 0 -shyling.com, 0 siamchart.com, 0 siaranku.com, 0 sia.ru, 0 siasun.com, 0 -siava.ru, 0 -siberianet.ru, 0 sibername.com, 0 -sibintek.ru, 0 -sibpsa.ru, 0 sibsau.ru, 0 sibstrin.ru, 0 sibsutis.ru, 0 -sibvaleo.tv, 0 sicau.edu.cn, 0 sickoo.com, 0 sicofi.com.mx, 0 -sidechef.com, 0 sidex.ru, 0 sidsavara.com, 0 siedlce.pl, 0 siedle.de, 0 -sielok.hu, 0 -sigaretnik.ru, 0 sigfox.com, 0 -sigmabeauty.com, 0 sigmasport.com, 0 signfiles.com, 0 sigsiu.net, 0 sihaidiaoyu.com, 0 -sikoauktioner.se, 0 silagames.com, 0 silamp.it, 0 silextimes.com, 0 @@ -12920,26 +7264,14 @@ silijiren.info, 0 silk.co, 0 silkenowak.de, 0 -sil.org.pg, 0 siluyuncang.com, 0 -silverspoons.ru, 0 -sim-auf-reisen.de, 0 -simm.ac.cn, 0 -simpatias.org, 0 simple-aja.info, 0 simplefx.com, 0 -simplemachines.ru, 0 simplementegenial.cc, 0 simpleminecraft.ru, 0 -simplenetkeeper.com, 0 -simplesite.com, 0 -simpleso.gr, 0 simple-talk.com, 0 -simplewebrtc.com, 0 simplix.info, 0 -simplix.ks.ua, 0 simplytest.me, 0 -simpress.com.br, 0 simuwang.com, 0 sinaapp.com, 0 sina.com.cn, 0 @@ -12951,287 +7283,136 @@ sininonton.com, 0 sinochem.com, 0 sinofsx.com, 0 -sinonimus.ru, 0 sinopec.com, 0 -sinopharm.com, 0 sinosig.com, 0 sinosoft.info, 0 sintagespareas.gr, 0 -sintek-nn.ru, 0 sinyi.com.tw, 0 sioeye.cn, 0 -sioeye.com, 0 sipac.gov.cn, 0 sipo.gov.cn, 0 -sipsolutions.net, 0 -sipwise.com, 0 sirvoy.com, 0 -sisalu.com.br, 0 si-shell.net, 0 -sistel.es, 0 -sistemagorod.ru, 0 -sistemdestekuzmani.com, 0 -sisustusweb.ee, 0 site40.net, 0 site88.net, 0 -siteclinic.ru, 0 -siteencore.com, 0 siteguarding.com, 0 -sitelement.sk, 0 -siterobot.com, 0 -site.ua, 0 sito.ir, 0 -situstarget.com, 0 -siwatcher.ru, 0 -siwe.com.cn, 0 sixsenses.com, 0 -sixtea.com, 0 sjcamhd.com, 0 -sjc.edu.hk, 0 -sjedu.cn, 0 sjtu.cn, 0 sjtu.edu.cn, 0 -sjz.io, 0 -sk3w.se, 0 skalnik.pl, 0 skat-palast.de, 0 -skat-ups.ru, 0 skauting.cz, 0 skbank.com.tw, 0 -skechers.cn, 0 sketchengine.co.uk, 0 sketchpark.ru, 0 -skierniewice.pl, 0 skifmusic.ru, 0 skinak.ir, 0 skincrates.com, 0 -skinpay.com, 0 skinrenewal.co.za, 0 -skiosvetimany.cz, 0 -skiprefer.com, 0 sk.kz, 0 skn1.com, 0 sknt.ru, 0 -skobbler.com, 0 -skobeeff.ru, 0 skoda.com.cn, 0 -skoda.lv, 0 skokie68.org, 0 skoltech.ru, 0 -skr.de, 0 skritter.com, 0 -skrivanek.cz, 0 sktelecom.com, 0 skuonline.ru, 0 -sky4buy.com, 0 skyany.com, 0 -skybuy.ru, 0 -skycenter.aero, 0 -skydreamer.fr, 0 -skydreamer.info, 0 -skyf-host.com, 0 -skyfox.org, 0 skygear.ru, 0 skyinsurance.co.uk, 0 -skyluxtravel.com, 0 -skynetonline.solutions, 0 skyocean.com, 0 -skyprep.com, 0 -skyrim-online.com, 0 -skytells.net, 0 skywayinvestgroup.com, 0 slack.com, 0 slack-files.com, 0 slack-imgs.com, 0 slack-redir.net, 0 -slacky.eu, 0 -slatarow.de, 0 slaters.co.uk, 0 -slav-dom.ru, 0 -slavia.by, 0 -slavyansk2.ru, 0 slavyanskaya-kultura.ru, 0 -sldc.eu, 0 -sleep-calculator.com, 0 slevadne.cz, 0 -slevhouse.cz, 0 -slicedinvoices.com, 0 -slidego.com, 0 slide-life.ru, 0 -slinuxer.com, 0 -slio.cn, 0 -slitheriogameplay.com, 0 -slotboss.co.uk, 0 -slotboss.se, 0 -sloty-besplatno.net, 0 slovodel.com, 0 slunecnice.cz, 0 -slv.cz, 0 -small.kz, 0 smarket.net.cn, 0 -smarp.com, 0 -smarpshare.com, 0 smartafisha.ru, 0 -smartapps.fr, 0 -smartdollar.com, 0 -smartdot.com, 0 -smartdrugsforcollege.com, 0 -smarterdeal.co.uk, 0 -smartflowsheet.com, 0 -smarthosts.org, 0 -smarthoverboarder.fr, 0 -smarthoverboarder.it, 0 smartisan.com, 0 smartjobboard.com, 0 -smartlab.co.za, 0 -smartland.am, 0 smartlog.jp, 0 -smartmedia.ws, 0 -smartmetrics.co, 0 smart.net.ly, 0 -smartnweb.de, 0 smartserials.com, 0 -smarttbot.com, 0 smarty.cz, 0 smartytoys.ru, 0 smash.com, 0 sma.so, 0 smasurf.com, 0 -smath.info, 0 -sm.de, 0 -smec-cn.com, 0 smed.ru, 0 smetnoedelo.ru, 0 -smeup.com, 0 -sm.gov.cn, 0 -sm.gov.ua, 0 smh.re, 0 -smi2.ru, 0 sm-komandor.ru, 0 -smmplanner.com, 0 smokepack.ru, 0 smokingirl.org, 0 smoothscroll.net, 0 smotreshka.tv, 0 smotri.com, 0 -smotriuchis.ru, 0 smow.de, 0 smsbrana.cz, 0 -smsdengi.com, 0 -smshare.fr, 0 -smshosting.it, 0 smsmoney.ee, 0 smspinigai.lt, 0 -sms-track.ru, 0 -smstronic.com, 0 -smter.ru, 0 -sm.ua, 0 smuc.ac.kr, 0 smvdu.ac.in, 0 smxe.cn, 0 -smydh.cn, 0 smyl.es, 0 -snacksbazzar.com, 0 -snacktools.net, 0 -snaga.si, 0 -snap2sex.nl, 0 snapapp.com, 0 -snapchatonlineloginz.com, 0 snapgene.com, 0 snappii.com, 0 snh48.com, 0 -snips.ai, 0 -snoska.ru, 0 -snowsports.org, 0 -snowtrails.com, 0 -snpmarket.com, 0 -snptc.com, 0 -snrt.ma, 0 snssdk.com, 0 snu.ac.kr, 0 -snugr.be, 0 -snv.sk, 0 soargames.com, 0 -sobi.pro, 0 -sobs.com.au, 0 sobt5.org, 0 sobug.com, 0 -soccer-plaza.jp, 0 -sociafluence.com, 0 -social-health.net, 0 -social-net.me, 0 socialquantum.ru, 0 -socialssap.org, 0 -socialsweethearts.de, 0 -socialtheater.com, 0 socialtools.ru, 0 -social-touch.com, 0 societe.com, 0 -socionet.ru, 0 so.com, 0 -sodrk.ru, 0 -soe.com.ua, 0 -sofa-framework.org, 0 -sofotos.org, 0 softconf.com, 0 -softether.net, 0 softkey.ru, 0 -softline.com.pl, 0 softlinegroup.com, 0 softmath.com, 0 -softonit.ru, 0 -softros.com, 0 softserveinc.com, 0 -softwareschmiede.org, 0 -softwaresystems.com, 0 -software.travel, 0 -sog-ict.nl, 0 -sogo.com.tw, 0 sogou.com, 0 so.gov.pl, 0 sohucs.com, 0 -soireejumpin.fr, 0 soiro.ru, 0 sojson.com, 0 sojump.cn, 0 sojump.com, 0 sojump.hk, 0 -sokka.cn, 0 sokolniki.com, 0 sokolov.ru, 0 soku.com, 0 solarcentury.com, 0 solarianprogrammer.com, 0 solarmanpv.com, 0 -solax-portal.com, 0 solestruck.com, 0 -solidapps.co.uk, 0 solidot.org, 0 solid-profit.com, 0 soloaffitti.it, 0 -solonetwork.com.br, 0 solvege.net, 0 -solvvy.com, 0 somebox.ru, 0 -somitel.pt, 0 somonair.com, 0 sonapresse.com, 0 -songo.com, 0 sonikelf.ru, 0 sonnenstaatland.com, 0 soonnet.org, 0 -soorati.com, 0 -soorensystem.ir, 0 sopot.pl, 0 soprasteria.com, 0 -soroki.com, 0 -sorucevapla.com, 0 sorz.org, 0 sosista.com, 0 sosobta.cn, 0 sosobtc.com, 0 -sosowifi.com, 0 -sos.pl, 0 sostronk.com, 0 sotel.de, 0 soti.net, 0 @@ -13240,107 +7421,59 @@ soujuw.com, 0 soujuw.net, 0 soulkeepers.eu, 0 -soundcloudgroups.com, 0 soundcream.net, 0 soundgasm.net, 0 -so-ups.ru, 0 sourcefabric.org, 0 -sourceguardian.ir, 0 soushiti.com, 0 -southernexposure.com, 0 -southernfund.com, 0 southmoney.com, 0 southplainscollege.edu, 0 -souyidai.com, 0 -souz-m.ru, 0 sov5.com, 0 sovkusom.ru, 0 sovtime.ru, 0 soyoung.com, 0 sp2all.ru, 0 sp2.org, 0 -spacebagel.com, 0 -spacedock.info, 0 spaceinvasion.info, 0 spacem.cn, 0 -spaceorigin.fr, 0 spaces.ru, 0 -spaceweb.hu, 0 -spac.me, 0 spagobi.org, 0 -spagoworld.org, 0 -spanishprograms.com, 0 -spankwiki.org, 0 spankwirecams.com, 0 -spanwords.info, 0 -spar.ch, 0 -sparcs.org, 0 spar-dich-schlau.de, 0 -sparinc.com, 0 sparkasse-landshut.de, 0 spark.ru, 0 -sparrowsms.com, 0 spawtz.com, 0 -spaziorc.net, 0 -spbappo.ru, 0 spbgasu.ru, 0 -spbgut.ru, 0 spbstu.ru, 0 spb.su, 0 spbu.ru, 0 spbvedomosti.ru, 0 spca.org.hk, 0 -spddl.de, 0 spdns.de, 0 spdns.org, 0 -speak-up.com, 0 specialist.ru, 0 spec-komp.com, 0 -specregion.ru, 0 -speech-guru.com, 0 speechpad.pw, 0 speechpad.ru, 0 speedify.com, 0 -speedinvoice3.net, 0 -speedx.co, 0 speedyshare.com, 0 -speeed.cn, 0 speiyou.cn, 0 speiyou.com, 0 -sperasoft.com, 0 spesifikasiharga.com, 0 -spfu.gov.ua, 0 sp.gov.br, 0 sphero.com, 0 -spi0n.com, 0 spigit.com, 0 -spihk.com, 0 -spikcompany.ru, 0 -spiketime.de, 0 -spinbackup.com, 0 -spir.fr, 0 -spitalspiridon.ro, 0 -spi.uz, 0 spk.ru, 0 -splatterladder.com, 0 -splento.com, 0 spl.info, 0 splio.com, 0 splitmetrics.com, 0 -splius.lt, 0 spoilertime.com, 0 spolo.org, 0 spongepowered.org, 0 sponsorpay.com, 0 sportbedarf.de, 0 sportbro.cc, 0 -sportcity74.ru, 0 sportdiver.com, 0 sportfishingmag.com, 0 -sportfort.ru, 0 -sporthit.ru, 0 -sportourism.id, 0 -sportovnidum.cz, 0 sportovnivozy.cz, 0 sportplayer.io, 0 sportrider.com, 0 @@ -13349,29 +7482,16 @@ sportsbetting.ag, 0 sportsbikeshop.co.uk, 0 sportsboom.tv, 0 -sportse.ru, 0 sportspar.de, 0 sports.ru, 0 sportvision.rs, 0 spot.im, 0 -spotsoon.com, 0 sprashivai.ru, 0 -spravka333333.ru, 0 spravka-mdv.ru, 0 spravkatver.ru, 0 -spray.pk, 0 -spring96.org, 0 springstreetads.com, 0 sprintground.com, 0 -sprintinet.ru, 0 sprit.org, 0 -sprucemeadows.com, 0 -spruethmagers.com, 0 -sprut.ru, 0 -spsdmasna.cz, 0 -spsd.net, 0 -spsejecna.cz, 0 -spsostrov.cz, 0 spsr.ru, 0 spurssh.com, 0 sputnikipogrom.com, 0 @@ -13381,228 +7501,128 @@ sqli.com, 0 sqlitebrowser.org, 0 sqlservercentral.com, 0 -s-quad.com, 0 squick.me, 0 -squidge.org, 0 -squiresgardencentres.co.uk, 0 squirt.org, 0 -squnity.com, 0 -sqybus.fr, 0 sram.com, 0 srb2.org, 0 srcf.net, 0 -srgame.cc, 0 -srh-hochschule-berlin.de, 0 -srlabs.de, 0 srovnanicen.cz, 0 srt.gob.ar, 0 srvgame.ru, 0 sscat.cn, 0 ssdax.com, 0 ssd-life.com, 0 -ssd-life.ru, 0 sse.com.cn, 0 -sseinfo.com, 0 -ssh91.net, 0 sshida.com, 0 s-shot.ru, 0 -ssig33.com, 0 -ssjoy.org, 0 ssjsq.net, 0 -sskaje.me, 0 -ssl-brn.de, 0 ssllabs.com, 0 -sslpost.com, 0 sslunblocker.com, 0 -ssm.gob.mx, 0 ssmu.ru, 0 ssn.gob.ar, 0 ssorz.com, 0 -sspaas.com, 0 -sspanda.com, 0 ssrj.com, 0 -ssr-russia.ru, 0 ssspeed.net, 0 -sstl.co.uk, 0 -ssuu.org, 0 ssvpn.vip, 0 ssw.com.au, 0 ss.wtf, 0 stac.co.ao, 0 stackage.org, 0 -stacktile.io, 0 stadium.ru, 0 -stadtfeuerwehr-weiz.at, 0 -stadt-helmstedt.de, 0 stadtmobil.de, 0 -stadttheater-giessen.de, 0 staffpoint.fi, 0 -staforceteam.ru, 0 -stagend.com, 0 -stahl.de, 0 -stairways.com, 0 -stalcraft.ru, 0 stalker.land, 0 -stalker-shop.ru, 0 -stamboomforum.nl, 0 stample.co, 0 stampsy.com, 0 -standa.lt, 0 -standardfacile.com, 0 stanford.edu, 0 stanfy.com, 0 stanmus.ru, 0 staradworld.com, 0 -staramba.com, 0 staraya-moneta.ru, 0 starchefs.com, 0 star-citizens.de, 0 -starduster.me, 0 starfandom.com, 0 -star-force.com, 0 stargard.pl, 0 -stargatesys.com, 0 -starislandgames.com, 0 -starleaf.com, 0 starline-online.ru, 0 -starlink.ru, 0 -starmediafilm.com, 0 -stars-cloud.com, 0 starship.xyz, 0 -startcomca.com, 0 -startcom.org, 0 startdedicated.com, 0 startdedicated.de, 0 -startdedicated.net, 0 startsearch.org, 0 startsmile.ru, 0 startssl.com, 0 startss.today, 0 -startus.cc, 0 -state.ak.us, 0 state-of-mind.de, 0 state.or.us, 0 -statfuse.com, 0 statgrad.org, 0 -status301.net, 0 -statusmoto.ru, 0 stat.uz, 0 staubli.com, 0 -stavregion.ru, 0 stayfriends.de, 0 stayge.net, 0 stays.io, 0 stb.com.mk, 0 st-clair.net, 0 stcn.com, 0 -stealthy.co, 0 -steam.az, 0 -steambroker.com, 0 -steammoney.com, 0 steamrepcn.com, 0 steam-trader.com, 0 steelalborz.com, 0 -steelorse.com, 0 stefanini.com, 0 steinberg.de, 0 steinberg.fr, 0 steinberg.net, 0 steinigke.de, 0 -stelderverspeek.com, 0 stellenticket.de, 0 stepan.com, 0 -stepclub.ru, 0 -stephencleary.com, 0 -stephenwebster.com, 0 -sterlinginfosystems.com, 0 -stetsom.com.br, 0 -stevecookhealth.com, 0 stevejenkins.com, 0 stewardship.com, 0 stfalcon.com, 0 -stforex.com, 0 -sth.ac.at, 0 stickyadstv.com, 0 stiesia.ac.id, 0 stirileprotv.ro, 0 stiripesurse.ro, 0 stis.ac.id, 0 -st-link.com.cn, 0 stlouisfed.org, 0 stluke.com.ph, 0 sto.cc, 0 -stockfuse.com, 0 -stockinthechannel.com, 0 stockinthechannel.co.uk, 0 sto.cn, 0 stolle.ru, 0 stoloto.ru, 0 -stomatorg.ru, 0 stom.ru, 0 storeapps.org, 0 storemags.com, 0 -storii.com, 0 stormss.us, 0 -stormway.ru, 0 -stor.re, 0 -storymixmedia.com, 0 -storyworth.com, 0 stradeanas.it, 0 -strafbuch.de, 0 strangled.net, 0 strategya.com, 0 strategyanalytics.com, 0 -strategy-p.co.jp, 0 stratoserver.net, 0 stray.love, 0 str.by, 0 -streamatehelp.com, 0 streamatemodels.com, 0 streamcatcher.de, 0 streamcraft.net, 0 -streamenergybilling.com, 0 -streamify.me, 0 -streamingtank.com, 0 streamjar.tv, 0 streampub.net, 0 streeetchypants.com, 0 -streetbank.com, 0 streetmeatasia.com, 0 strelkacard.ru, 0 stressfree.pl, 0 -strmama.ru, 0 -stroeerdigitalpublishing.de, 0 -stroi-baza.ru, 0 -stroi-ka.by, 0 stroitelstvosovety.ru, 0 -strollup.in, 0 stronazen.pl, 0 -stronger.se, 0 stroygigant.ru, 0 stroylandiya.ru, 0 stroysvoimirukami.ru, 0 strunz.com, 0 -sts-niendorf.de, 0 -studierenplus.de, 0 -studio-fashion.com, 0 studiorent.ru, 0 -studio-seo.org, 0 studybay.com, 0 -studystays.com.au, 0 -stu.edu.vn, 0 stuffio.com, 0 stuq.org, 0 -sturmtools.ru, 0 stusz.com, 0 -stuttcars.com, 0 stylingandroid.com, 0 -stylished.de, 0 su0.ru, 0 -suanfazu.com, 0 subfactory.fr, 0 sublinet.com, 0 submail.cn, 0 -subnets.ru, 0 suche6.ch, 0 sudact.ru, 0 suda.edu.cn, 0 @@ -13613,58 +7633,35 @@ su.edu, 0 sues.edu.cn, 0 sufficientvelocity.com, 0 -suffieldacademy.org, 0 -sugon.com, 0 suitaweb.net, 0 -suiyueyule.com, 0 -suketiawan.com, 0 -sukl.sk, 0 sulinet.hu, 0 sulrevendas.com.br, 0 -sumanet.cz, 0 sumaou.com, 0 -sumavision.com, 0 sumdu.edu.ua, 0 -summa-prefis.com, 0 sumochka.com, 0 -sumpay.cn, 0 sumtel.ru, 0 sunagesh.com, 0 -sunallies.com, 0 sunbox.cc, 0 suncco.com, 0 -sundaynews.co.zw, 0 sundray.com.cn, 0 sundukup.ru, 0 sunfar.com.tw, 0 suninfo.com, 0 suning.cn, 0 suning.com, 0 -suninian.com, 0 -sunkei.edu.hk, 0 sunland.org.cn, 0 sunlands.com, 0 -sunmnet.com, 0 -sunny-dessous.de, 0 -sunnyos.com, 0 -sunrav.ru, 0 sunrise74.com, 0 sunshine-live.de, 0 sunskypars.ir, 0 -suntech-power.com, 0 -suntektech.com, 0 sunwenqi.cn, 0 suonuo.net, 0 supaprice.co.uk, 0 supardi.net, 0 -supbiotech.fr, 0 -supcon.com, 0 superb.net, 0 superbotanik.net, 0 -super-cena.rs, 0 superguiaargentina.com.ar, 0 superhosting.cz, 0 -supermagnete.at, 0 supermagnete.ch, 0 supermagnete.de, 0 supermagnete.es, 0 @@ -13672,94 +7669,50 @@ supermagnete.it, 0 supermap.com, 0 supernano.com, 0 -superpedestrian.com, 0 superphysique.org, 0 -supersoused.cz, 0 -supersyntages.gr, 0 -supertelahd.com, 0 -supertransporte.gov.co, 0 -supervia.com.br, 0 super-warez.net, 0 -superweibu.com, 0 supl.biz, 0 suplementosbrasil.org, 0 suppore.cn, 0 -sura.ru, 0 -surbtc.com, 0 -surebak.com, 0 sureserver.com, 0 suresupport.com, 0 -surfingbird.com, 0 -surfingbird.ru, 0 -surlybrewing.com, 0 -surong360.com, 0 -suroot.com, 0 -surpk.ru, 0 surplussales.com, 0 -surprizim.net, 0 surtime.com, 0 -surveylegend.com, 0 survivaldub.com, 0 sushishop.ru, 0 sustc.edu.cn, 0 sust.edu.cn, 0 susu.ru, 0 sut.ru, 0 -suuntoshop.ir, 0 suwalki.pl, 0 suwon.ac.kr, 0 -suws.org.uk, 0 -suxilog.com, 0 suzlon.com, 0 suzuki-china.com, 0 sv98.de, 0 svadbagolik.ru, 0 svadebka.ws, 0 svarecky-obchod.cz, 0 -svarforum.cz, 0 -svastour.ru, 0 -svcc.edu, 0 -sv.co, 0 sven.de, 0 -svenskenergi.se, 0 sverbihina.com, 0 svetofor.info, 0 svetosila.ru, 0 s-vfu.ru, 0 -svgc.ru, 0 -svicenter.com, 0 svijet-medija.hr, 0 -svirel.org, 0 svlfg.de, 0 -svmed.spb.ru, 0 svobodni.cz, 0 -svoy-golos.ru, 0 svp-team.com, 0 -svsbb.sk, 0 svyaznoy.ru, 0 -svyturioarena.lt, 0 svzt.ru, 0 swagbucks.com, 0 -swagelok.com.cn, 0 -swamiji.tv, 0 -swannetoscar.com, 0 swan.sk, 0 swcszx.com, 0 sweatband.com, 0 -sweek.com, 0 sweet211.ru, 0 -swfmax.com, 0 swfr.de, 0 -swidnik.pl, 0 -swiftirc.net, 0 swiftzer.net, 0 -swi.mx, 0 -swis.cn, 0 swissgolden.com, 0 swissmedical.com.ar, 0 -swjoy.com, 0 swjtu.edu.cn, 0 -swoop.com, 0 swpu.edu.cn, 0 sws.cz, 0 swsu.org, 0 @@ -13767,8 +7720,6 @@ swu.edu.cn, 0 swufe.edu.cn, 0 swust.edu.cn, 0 -sxcert.com, 0 -sxchfz.com, 0 sxe-injected.com, 0 sxrczx.com, 0 syau.edu.cn, 0 @@ -13776,45 +7727,31 @@ sygic.com, 0 sygnity.pl, 0 syischina.com, 0 -symmetry.com, 0 symphonic-net.com, 0 -symptoma.com, 0 synchronkartei.de, 0 synchronoss.com, 0 syncis.com, 0 syncthing.net, 0 sync-video.com, 0 -syndriver.com, 0 synergize.co, 0 synevo.by, 0 -synlab.org.cn, 0 synology.me, 0 -syronex.com, 0 sysadmin.ru, 0 -sys-advisor.com, 0 sys-con.com, 0 sysfx.com, 0 syslinux.org, 0 syssel.net, 0 -systech.hu, 0 -systec.ru, 0 -systena.co.jp, 0 -systextil.com.br, 0 -systtech.ru, 0 systutorials.com, 0 sysucc.org.cn, 0 sysu.edu.cn, 0 sytes.net, 0 -syure.com, 0 sz12333.gov.cn, 0 sz189.cn, 0 szaic.gov.cn, 0 szamlakozpont.hu, 0 szcredit.com.cn, 0 szcredit.org.cn, 0 -szeged.hu, 0 szft.gov.cn, 0 -szgaj.cn, 0 szgalaxy.com, 0 sz.gov.cn, 0 szgs.gov.cn, 0 @@ -13827,56 +7764,38 @@ szm.com, 0 szmqs.gov.cn, 0 szn-ural.ru, 0 -szone-online.net, 0 szone-online.so, 0 -szpilot.com.cn, 0 -szrtc.cn, 0 -szsce.si, 0 szscjg.gov.cn, 0 szse.cn, 0 szsi.gov.cn, 0 szsti.gov.cn, 0 sztb.gov.cn, 0 szu.edu.cn, 0 -szvc.com.cn, 0 szweb.cn, 0 szweiflr.cn, 0 -sz-ybbs.ac.at, 0 szybko.pl, 0 szzfgjj.com, 0 t2bot.ru, 0 -t2cksec.net, 0 t4vps.eu, 0 t4-wiki.de, 0 -table.co, 0 tablepress.org, 0 tabletki.ua, 0 -tablette-store.com, 0 tabloidpulsa.co.id, 0 tabnak.ir, 0 -tabris.ru, 0 tabsbook.ru, 0 tabstabs.com, 0 -tacr.cz, 0 tactileo.fr, 0 ta.de, 0 tado.com, 0 -tagancity.ru, 0 -tagan.ru, 0 tagplus.com.br, 0 tagul.com, 0 taifedu.gov.sa, 0 -taifungbank.com, 0 tailtarget.com, 0 taimen.com, 0 -taimyr24.ru, 0 taipeifubon.com.tw, 0 -taipit.ru, 0 taizhou.gov.cn, 0 tajinfo.org, 0 takcloud.com, 0 -takeeateasy.be, 0 -takeeateasy.fr, 0 takibu.com, 0 taknet.ir, 0 takprosto.cc, 0 @@ -13884,164 +7803,86 @@ taktaserver.ir, 0 takufile.com, 0 talicai.com, 0 -talkabroad.com, 0 -talkfunnel.com, 0 talkingcoder.com, 0 talkingdata.com, 0 -talkmate.com, 0 -taller.su, 0 tallynine.com, 0 talon.by, 0 tamasha.ir, 0 -tamera.org, 0 -tamilrockers.in, 0 -tangrui.wang, 0 tangtao.net.cn, 0 -tanteng.me, 0 tanzpol.org, 0 -taobao-0.com, 0 -taobaokhv.ru, 0 taoche.com, 0 taocrm.com, 0 taodaxiang.com, 0 taofl.cn, 0 taokezhushou.com, 0 taomee.com, 0 -taoqian123.com, 0 taoqueqiao.com, 0 -taoshijie.com, 0 taotaosou.com, 0 -taozj.org, 0 -tapgerine.com, 0 -tapki.com, 0 -ta.pl, 0 tapochek.net, 0 -tappx.com, 0 tarelki.com.ua, 0 targethunter.net, 0 -tarlogic.com, 0 -tarr.hu, 0 -taschibra.com.br, 0 tas-ix.net, 0 taskobox.com, 0 -taskrow.com, 0 -tasnim.co, 0 -tataelxsi.co.in, 0 tatar-inform.ru, 0 tatar.ru, 0 tatenergosbyt.ru, 0 tatler.ru, 0 tatneft.ru, 0 tattelecom.ru, 0 -tattoomaster-shop.ru, 0 -tatukgis.com, 0 -tauernspakaprun.com, 0 tavanir.org.ir, 0 taxfreeshops.jp, 0 -taximaxim.com, 0 taxisaturn.ru, 0 -taxnet.ru, 0 -taxo-parei-sto-kranio.com, 0 -taydoo-photographic.de, 0 -tayfunozer.com, 0 taylors.edu.my, 0 -tazablog.com, 0 -tazzobikes.com, 0 -tbsign.cn, 0 -tca.com.br, 0 -tcc-clan.de, 0 -tcc.com.ua, 0 -tcdn.co, 0 tc.edu.tw, 0 tcgolestan.ir, 0 tchkcdn.com, 0 -tci-dm.jp, 0 tcl.com, 0 tclkuyu.com, 0 -tczew.pl, 0 -tdf.fr, 0 tdk.com, 0 tdmu.edu.ua, 0 tdx.com.cn, 0 tdyun.com, 0 -teacher-of-russia.ru, 0 teachersammy.com, 0 teachers.io, 0 -teachfirst.de, 0 teachvideo.ru, 0 -team29.org, 0 teambition.net, 0 -teammelli.ir, 0 teamshub.com, 0 -teamspeak-connection.de, 0 team-ulm.de, 0 -teamxlink.co.uk, 0 -teanazar.com, 0 teasermedia.net, 0 -teatrviktuka.ru, 0 -tecadmin.net, 0 -tecart.de, 0 teccart.qc.ca, 0 techglimpse.com, 0 -techloop.io, 0 -techmart.ir, 0 -techmeme.com, 0 -techno4ever.fm, 0 -technoblood.com, 0 technocity.ru, 0 -techno-co.ru, 0 technodom.kz, 0 -techold.ru, 0 -tech-on-air.com, 0 techprom.ru, 0 techraptor.net, 0 techshot.ir, 0 -techwarelabs.com, 0 techytalk.info, 0 tecnoandroid.it, 0 -tecnohardclan.com, 0 tecnolegis.com, 0 tecno-mobile.com, 0 -tecnova.com.br, 0 tecpt.com, 0 -tecsanpedro.edu.mx, 0 tedliou.com, 0 tedox.de, 0 -teflexpress.co.uk, 0 -teg.cn, 0 -tehiku.nz, 0 -tehnika4u.ru, 0 tehnocentr.ru, 0 tehnoland.lv, 0 tehnomaks.ru, 0 -tehnomarket-ural.ru, 0 -tehnomir.com.ua, 0 -tehnorama.ru, 0 tehnosila.ru, 0 tehnoskarb.com.ua, 0 tehprime.ru, 0 tehrannews.ir, 0 tekirdagnethaber.com, 0 -tekken-net.kr, 0 -teknic.com, 0 -teknikbilimler.net, 0 -teknokrat.ac.id, 0 teknomobil.org, 0 -teknostation.net, 0 tekscan.com, 0 tekzen.com.tr, 0 -telconet.net, 0 tele2.kz, 0 telecable.es, 0 telecamera.ru, 0 telecentro.com.ar, 0 telecom.by, 0 -telecomjs.com, 0 telecom.kz, 0 telefen.com, 0 telefonica.de, 0 telegraf.uz, 0 -telegramfriends.com, 0 telekarta.tv, 0 telekom.com, 0 telekritika.ua, 0 @@ -14050,18 +7891,14 @@ telenet.ru, 0 telenor.dk, 0 teleos.ru, 0 -tele-plus.ru, 0 teleport.org, 0 -teleschau.de, 0 teletal.hu, 0 teletrade-asia.com, 0 teletrade-dj.com, 0 teletrade.ru, 0 telin.co.id, 0 telkomsel.com, 0 -tellefsen.net, 0 telonko.com, 0 -telsome.es, 0 teltec.de, 0 template-help.com, 0 templatemonster.com, 0 @@ -14069,154 +7906,78 @@ tempodisconti.it, 0 temptationgifts.com, 0 tencent.click, 0 -tendata.cn, 0 tenddata.com, 0 tenderplan.ru, 0 tengrinews.kz, 0 -tennis-classim.net, 0 -tennisplayer.net, 0 -tenpointcrossbows.com, 0 -tensquaregames.com, 0 tentorium.ru, 0 tenvis.com, 0 -tera-byte.com, 0 -teralytics.net, 0 -teraserver.ir, 0 -tercihkitabevi.com, 0 -terema.com.br, 0 teremok.ru, 0 terra.im, 0 -terra.org, 0 terrapinn.com, 0 -terredepeche.com, 0 tesbuys.com, 0 teshehui.com, 0 -tesli.com, 0 tesoon.com, 0 tesser.ru, 0 -testberichte.de, 0 -testdebit.info, 0 testerhome.com, 0 testforhost.com, 0 testfreaks.com, 0 -test-hf.su, 0 -testkrok.org.ua, 0 -testomato.com, 0 testvelocidad.eu, 0 testwo.com, 0 -tetimes.com, 0 -tetranet.com.ua, 0 tet.tv, 0 -teutloff-bs.de, 0 -texnoera.com, 0 text-compare.com, 0 -textgears.com, 0 -textory.io, 0 text.ru, 0 tezign.com, 0 tf2mart.net, 0 tfb.ru, 0 -tfedu.net, 0 tfm.ro, 0 tfreeca2.com, 0 tfshops.com, 0 -tfzq.com, 0 tga-arsh.ir, 0 tgl.ru, 0 tgram.ru, 0 th7.cn, 0 -thaiadpoint.com, 0 -thaibulksms.com, 0 -thaicsgo.com, 0 -thaigovno.com, 0 -thajsky-raj.cz, 0 thalesgroup.com, 0 -thalia.hu, 0 thali.ch, 0 thanks-shine.com, 0 thatvidieu.com, 0 the5fire.com, 0 -thebeautyeffect.com, 0 -thebeautyplace.com, 0 -thebeerplanet.com.br, 0 thebigchoice.com, 0 thebigplans.ru, 0 theblueprint.ru, 0 -thebreakroom.org, 0 -the-bride.ru, 0 -thecheat.co.kr, 0 thecodecampus.de, 0 -thecoffeecompass.com, 0 -thecompletewebhosting.com, 0 thecryptochat.net, 0 thecus.com, 0 thecustomizewindows.com, 0 -thedoschool.org, 0 -thedrakehotel.ca, 0 -theearthawaits.com, 0 -thefirstgive.com, 0 -thegeeksalive.com, 0 theidentitypages.com, 0 the-impish-ink.de, 0 -theindependentsf.com, 0 -thejesuitpost.org, 0 -thekcs.net, 0 the-ken.com, 0 -thekua.com, 0 thelibrarystore.com, 0 -thelife.com, 0 thelongdark.ru, 0 themaclife.com, 0 -themall.bg, 0 themall.it, 0 themefarmer.com, 0 themient.com, 0 themill.com, 0 themusic.today, 0 -thenct.org.za, 0 thenews.kz, 0 theparkingspot.com, 0 -theprayerbook.info, 0 theqarena.com, 0 therange.co.uk, 0 -therealistictrader.com, 0 -therme.sk, 0 thermomix.com, 0 -thesecretsofyoga.com, 0 -thesocietea.org, 0 -thesparxitsolutions.com, 0 thestar.com.my, 0 thestation.ru, 0 thesycon.de, 0 theteenboy.com, 0 -thewaiting-room.net, 0 thewalrus.ru, 0 -thewatchtv.com, 0 -thewebtemplate.com, 0 -thg-kiel.de, 0 -thiememeulenhoff.nl, 0 -thinformatics.com, 0 thinkingstorm.com, 0 thinklocal.co.za, 0 -thinkmobiles.com, 0 -thinstuff.com, 0 thirtymall.com, 0 thisismyjam.com, 0 -thmmy.gr, 0 -thngs.co, 0 -thosmos.org, 0 threema.ch, 0 thruhere.net, 0 -thtf.com.cn, 0 -thuis.nl, 0 -thumbalizr.com, 0 thumbnail-download.com, 0 -thunderforest.com, 0 thunderquote.com, 0 -thunderstorm.pw, 0 thus.ch, 0 -thuthuatvoz.com, 0 -ti8m.ch, 0 tiancity.com, 0 tianhong.cn, 0 tianjinwe.com, 0 @@ -14225,243 +7986,153 @@ tianti.io, 0 tianyabagua.cn, 0 tianyancha.com, 0 -tibame.com, 0 ticka.it, 0 -tickeos.de, 0 ticketflap.com, 0 ticketgo.com.tw, 0 tickets.az, 0 tickets.com.tr, 0 -tickets.co.th, 0 tickets.kz, 0 tickets.pl, 0 tickets.ru, 0 tickets.ua, 0 tickmill.com, 0 -tickmill.co.uk, 0 ticp.net, 0 -ticsystem.co, 0 ticwear.com, 0 tidbits.com, 0 tiendatiger.es, 0 -tienve.org, 0 tierschutz-shop.de, 0 tiff.net, 0 -tigase.org, 0 tigergaming.com, 0 -tigra66.ru, 0 tigrimigri.com, 0 -tilaa.com, 0 -tilab.com, 0 timeface.cn, 0 -timeledger.com, 0 -timemanagement.es, 0 -time-master.ru, 0 timepill.net, 0 time.sc, 0 -timetoact.de, 0 -timetotrade.com, 0 -timios.com, 0 timr.com, 0 tingyun.com, 0 tinkerpatch.com, 0 -tinned-software.net, 0 -tinohempel.de, 0 tinper.org, 0 -tinycammonitor.com, 0 -tion.ru, 0 -tipdm.com, 0 tiplanet.org, 0 tipplap.hu, 0 tipsport.sk, 0 tiseagles.com, 0 -tiskarik.cz, 0 tiss.edu, 0 -tiszacipo.hu, 0 tita.com, 0 titanic-magazin.de, 0 -titanix.net, 0 titanpad.com, 0 -titans-servers.com, 0 titrari.ro, 0 titus.de, 0 tixforgigs.com, 0 tiyubisai.com, 0 tizen.org, 0 -tjfdc.com.cn, 0 tjms.jus.br, 0 -tjmt.jus.br, 0 tjosm.com, 0 -tjournal.ru, 0 tjpa.jus.br, 0 tjto.jus.br, 0 tju.edu.cn, 0 tkbbank.ru, 0 -tk-chel.ru, 0 tkgorod.ru, 0 tl50.com, 0 -tlgrm.es, 0 tlgrm.eu, 0 tlgrm.ru, 0 tlinx.cn, 0 t-l.ru, 0 tlushim.co.il, 0 -tmcaz.com, 0 tmcnet.com, 0 tmea.org, 0 tmetric.com, 0 tmg.nl, 0 -tmm-express.com, 0 tmon.co.kr, 0 tmoncorp.com, 0 tmp.com, 0 -tmpyh.com, 0 tmsf.com, 0 tms.pl, 0 tmweb.ru, 0 -tmy123.com, 0 tn.edu.tw, 0 tn.kz, 0 tnpu.edu.ua, 0 -tns.lv, 0 tns-ua.com, 0 tntmusic.ru, 0 -tntrade.sk, 0 -tny.im, 0 tobacco.com.cn, 0 tobaccofreekids.org, 0 -tobem.jp, 0 tobitcoin.biz, 0 tochka.net, 0 -tocpeople.com, 0 tode.cz, 0 todoautos.com.pe, 0 -todogrowled.com, 0 todojuguete.es, 0 tofour.net, 0 -togas.com, 0 -togojoy.com, 0 to.gov.br, 0 tohkalove.com, 0 toi-moi.com, 0 -toislam.ws, 0 -tokaweb.ir, 0 -tokheim.com, 0 -tokiohotel-fanclub.de, 0 -toko.edu.tw, 0 -tokotoukan.com, 0 tokyo-city.ru, 0 tokyo.jp, 0 tokyonothot.com, 0 tokyotower.co.jp, 0 -tolk-a.com, 0 -tol.org, 0 tomato.it, 0 tomica.ru, 0 -tomintech.ru, 0 -tomoon.cn, 0 tom.ru, 0 -tomsarkgh.am, 0 tomsk.gov.ru, 0 -ton.eu, 0 tongbu.com, 0 tongda2000.com, 0 tonghuacun.com, 0 tongji.cn, 0 tongji.edu.cn, 0 -tonusclub.ru, 0 -tonyhead.com, 0 tonytemplates.com, 0 toobug.net, 0 toontownrewritten.com, 0 toorot.com, 0 tootoo.cn, 0 -top1game.com, 0 top54.city, 0 top55.info, 0 top-channel.tv, 0 topchrono.biz, 0 topease.net, 0 -topfiles.ws, 0 tophouse.ru, 0 -topide.com, 0 -top-inspector.ru, 0 -topkeren.com, 0 -toplist.cz, 0 -toplist.sk, 0 -topmedia.uz, 0 -topmovies31.xyz, 0 topschool.com, 0 -top-shop.ru, 0 top.st, 0 top-technologies.ru, 0 topthink.com, 0 -topwatch.ru, 0 topzone.pw, 0 torah-box.com, 0 torchystacos.com, 0 toread.com.cn, 0 -torgpit.ru, 0 torhub.net, 0 torquato.de, 0 torrentbit.net, 0 -torrento.org, 0 torrentsafe.com, 0 torrentsgame.net, 0 torrent-tv.in.ua, 0 -torshovsport.no, 0 torun.pl, 0 tosunkaya.com, 0 -totalk12.com, 0 totaltele.com, 0 -toteme.com, 0 totheglory.im, 0 totogaming.am, 0 -touch-device.ru, 0 -touhou-online.net, 0 touki.ru, 0 -tour-box.ru, 0 touricoholidays.com, 0 tourismthailand.org, 0 tourister.ru, 0 -tourolib.org, 0 toutapprendre.com, 0 toutemonannee.com, 0 toutrix.com, 0 touzi.com, 0 -tovid.io, 0 -towerhamlets.sch.uk, 0 -toyota.si, 0 -toyshop.cz, 0 toysperiod.com, 0 -tpay.me, 0 tpg.ua, 0 tplaboratorioquimico.com, 0 tplink.com, 0 -tp-link.com.cn, 0 tpprf.ru, 0 tproger.ru, 0 -tpsgv.be, 0 tpu.ru, 0 tq.cn, 0 trabzonspor.org.tr, 0 -trackglobe.com, 0 trackingmore.com, 0 trackmanic.com, 0 -trackntrade.com, 0 trackofthewolf.com, 0 trackpadmagic.com, 0 trackvia.com, 0 tractorpoint.com, 0 -tracuuhoso.com, 0 trade-groups.ru, 0 trademachines.com, 0 trademachines.de, 0 -trademachines.es, 0 trademe.co.nz, 0 -traderacademy.ru, 0 -traderguide.in, 0 -tradesmax.com, 0 tradesystemjp.com, 0 traditio.wiki, 0 tradzone.net, 0 @@ -14469,67 +8140,36 @@ traffic.ru, 0 trafficstore.com, 0 traficantes.net, 0 -trafi.com, 0 -trailerloop.de, 0 trainpix.org, 0 tramitesadistancia.gob.ar, 0 -trandent.com, 0 transantiago.cl, 0 -transelectrica.ro, 0 transformaniatime.com, 0 -transformify.org, 0 -transgd.com.cn, 0 transindex.ro, 0 -translatesong.com, 0 transmissionbt.com, 0 -transparencytoolkit.org, 0 -transportes.gov.br, 0 -transposh.org, 0 -transvilles.com, 0 trantect.com, 0 travelata.ru, 0 travelbook.de, 0 travelclub.es, 0 travelcodex.com, 0 -travelsim.com, 0 -travelsim.ua, 0 -traystatus.com, 0 -trc.com, 0 -tre-al.jus.br, 0 treasury.govt.nz, 0 -treatstock.com, 0 trecnutrition.com, 0 -trecone.com, 0 treds.co.uk, 0 -trendmagazin.ch, 0 trendsideas.com, 0 -trenino-rosso-bernina.it, 0 treolan.ru, 0 tresorit.com, 0 tretyakovgallery.ru, 0 -trexle.com, 0 -trialssherpabot.net, 0 trian.net, 0 -trianz.com, 0 triblio.com, 0 tribuna.com, 0 trifork.com, 0 -trinitigame.com, 0 -trinitydesktop.org, 0 trinity-parts.ru, 0 trioo.com, 0 -tripinview.com, 0 -tripplus.cc, 0 tripsecrets.ru, 0 tripsta.com, 0 tripsta.net, 0 trishara.com, 0 -tritiumnet.org, 0 triumf.ca, 0 triya.ru, 0 -tri-z.ru, 0 -trkraduga.ru, 0 -troi.de, 0 trojmiasto.pl, 0 trollhattan.se, 0 trovamoda.com, 0 @@ -14540,47 +8180,28 @@ trt24.jus.br, 0 trtworld.com, 0 truba.com, 0 -trucksale.ru, 0 trucnet.com, 0 trud.bg, 0 trueconf.com, 0 -truefitness.com, 0 true.io, 0 -truelaunchbar.com, 0 -truffls.de, 0 -trusek.com, 0 trus-tech.com, 0 -trust-holod.ru, 0 trustie.net, 0 trustpay.eu, 0 trustutn.org, 0 -tryndex.kz, 0 -trystack.cn, 0 -trytek.ru, 0 -ts3.cloud, 0 -tsagi.ru, 0 tsargrad.tv, 0 tsb.kz, 0 -tsci.com.cn, 0 ts-coach.com, 0 -tseaudio.com, 0 tse.moe, 0 tsemporium.com, 0 tsf.org.tr, 0 -tsign.cn, 0 -tsinetwork.ca, 0 tsinghua.edu.cn, 0 ts.kg, 0 -tsk-praha.cz, 0 tsn.at, 0 tsn.ua, 0 tspu.ru, 0 tssgroup.sk, 0 -tstn.ru, 0 tsu.ac.th, 0 tsu.edu, 0 -ttdoc.cn, 0 -ttdyy.tv, 0 tthd.org, 0 ttkd.cn, 0 ttkdex.com, 0 @@ -14588,70 +8209,41 @@ ttl.tj, 0 tts.lt, 0 ttwanda.com, 0 -ttyplus.com, 0 ttz.com, 0 ttzx.tv, 0 tuan800.com, 0 tuanche.com, 0 -tuanimg.com, 0 tuars.com, 0 tubeadvertising.eu, 0 -tubemate-download.com, 0 -tubeshopitalia.it, 0 tuchuang.org, 0 tucson-club.ru, 0 tudelft.nl, 0 -tudip.com, 0 -tudor.lu, 0 tudou.com, 0 -tuggle.co, 0 tugraz.at, 0 -tuhocmang.com, 0 tuigirl.com, 0 tuit.uz, 0 -tu.koszalin.pl, 0 -tularegion.org, 0 -tulipsport.com, 0 tuliu.com, 0 tulotero.es, 0 tuluoluo.com, 0 -tumar.fm, 0 -tumba.ch, 0 -tumix.ru, 0 -tunayachting.com.tr, 0 -tuneeca.com, 0 tunestotube.com, 0 -tungee.com, 0 tuningblog.eu, 0 tunisietelecom.tn, 0 tuntron.com, 0 tuputech.com, 0 -turboconsult.cz, 0 turbojetbooking.com, 0 -turbo-tec.eu, 0 -turchese.it, 0 turiba.lv, 0 turkegitimsen.org.tr, 0 turkiyeburslari.gov.tr, 0 turkiye.gov.tr, 0 -turku.center, 0 turris.cz, 0 tursvodka.ru, 0 -turtleacademy.com, 0 -tusdk.com, 0 -tushev.org, 0 tus.si, 0 tusur.ru, 0 -tutanota.com, 0 tutanota.de, 0 -tutor.cz, 0 -tuttocollezioni.com, 0 tuttoformazione.com, 0 tutuapp.com, 0 tutuapp.vip, 0 -tu-varna.bg, 0 tuv.com, 0 -tuwlab.com, 0 tuxedocomputers.com, 0 tv189.com, 0 tv5.zp.ua, 0 @@ -14660,86 +8252,49 @@ tvcom.cz, 0 tvdom.tv, 0 tvfeed.in, 0 -tvfinternational.com, 0 -tv-impulse.ru, 0 tvk6.ru, 0 tv-nasha.ru, 0 tvoe.ru, 0 -tvoi-instrument.com, 0 -tvoysad.ru, 0 tvpublica.com.ar, 0 -tvsale.ru, 0 tvservice.org, 0 -tvtune.net, 0 tw1.ru, 0 twbbs.org, 0 twc.edu.hk, 0 -tweakboxapp.com, 0 tweepsmap.com, 0 -twgg.org, 0 twgogo.org, 0 -twickets.co.uk, 0 twicopy.org, 0 -twistedmatrix.com, 0 -twitteroauth.com, 0 twomini.com, 0 twotiger.com, 0 twrx.ru, 0 -twt.de, 0 twzoa.info, 0 -txhack.cn, 0 txiaohe.cn, 0 -txslicai.com, 0 -txslicai.com.cn, 0 -txvpn.top, 0 -txvpn.wang, 0 tyc.edu.tw, 0 tychy.pl, 0 -tynsoe.org, 0 -tyntec.com, 0 -typcn.com, 0 typecho.me, 0 -typecodes.com, 0 typhon.net, 0 typo3.org, 0 -typografos.gr, 0 -typtest.ru, 0 -tyresystem.de, 0 -tyr.gift, 0 tysa.ru, 0 -tyumedia.ru, 0 tzbao.com, 0 tzit.cn, 0 tzqby.xyz, 0 tzrl.com, 0 tzyee.com, 0 -u9yy.com, 0 uabc.mx, 0 uade.edu.ar, 0 -uaes.com, 0 -ua.fm, 0 ua.gov.tr, 0 uakino.net, 0 ualinux.com, 0 -uama.com.cn, 0 -uamaster.com, 0 uapa.ru, 0 -uapeer.eu, 0 uatoday.tv, 0 ubejournal.biz, 0 uberchord.com, 0 -uberfacil.com, 0 uberspace.de, 0 ubiobio.cl, 0 -uboachan.net, 0 ub.ua, 0 -ubuntu-gr.org, 0 ubuntukylin.com, 0 uc.ac.id, 0 ucasal.edu.ar, 0 -ucbuyco.com, 0 uc.cl, 0 -ucdok.com, 0 uc.edu, 0 uce.edu.ec, 0 uchat.co.kr, 0 @@ -14747,7 +8302,6 @@ uchil.net, 0 uchiuroki.ru, 0 uci.cu, 0 -uciran.ir, 0 uclv.cu, 0 uclv.edu.cu, 0 ucoin.net, 0 @@ -14758,20 +8312,11 @@ ucpaas.com, 0 uc.pt, 0 ucptt.com, 0 -ucw.cz, 0 -uczc.cn, 0 udg.edu, 0 -udg.mx, 0 -udinra.com, 0 -udi.pl, 0 udmprof.ru, 0 -u-doktora.ru, 0 -uds18.ru, 0 uedsc.com, 0 -uef.edu.vn, 0 ueh.edu.vn, 0 uel.br, 0 -uelzener.de, 0 uem.mz, 0 ueq.com, 0 uer.ca, 0 @@ -14780,19 +8325,12 @@ uestc.edu.cn, 0 ueuo.com, 0 ufa1.ru, 0 -ufa.ie, 0 ufanet.ru, 0 -ufcfan.org, 0 -ufg.br, 0 ufh.com.cn, 0 -ufibox.com, 0 ufight.gr, 0 ufmg.br, 0 ufms.br, 0 ufmt.br, 0 -ufoots.com, 0 -ufosend.com, 0 -ufpa.br, 0 ufpb.br, 0 ufrr.br, 0 ufs.br, 0 @@ -14801,35 +8339,19 @@ uft.edu.br, 0 ufu.br, 0 ufvjm.edu.br, 0 -ugg2nd.de, 0 ugirls.com, 0 ugm.ac.id, 0 ugmk-telecom.ru, 0 -ugranow.ru, 0 -ugx-mods.com, 0 -uhc.gg, 0 uhdog.com, 0 -uhrforum.de, 0 ui001.com, 0 -uia.org, 0 -uilim.ru, 0 uji.es, 0 -ujipin.com, 0 ujs.edu.cn, 0 -uk2group.com, 0 -ukbiz.top, 0 -ukc.gov.ua, 0 ukdefencejournal.org.uk, 0 ukim.edu.mk, 0 ukim.mk, 0 -ukipme.com, 0 u-kor.cn, 0 ukravto.ua, 0 -ukrdc.net, 0 -ukrdomen.com, 0 -ukrmap.biz, 0 ukrmedia.center, 0 -ukroboronprom.com.ua, 0 ukrstat.gov.ua, 0 ukrtelecom.ua, 0 uk.to, 0 @@ -14839,26 +8361,18 @@ ulpgc.es, 0 ultiboss.jp, 0 ultimate-community.de, 0 -ultimedecathlon.com, 0 ultradox.com, 0 ulugov.uz, 0 -ulyaoth.net, 0 umail.uz, 0 -umanis.com, 0 umantis.com, 0 umbro.com.br, 0 umc.br, 0 umich.mx, 0 uminho.pt, 0 -umkbw.de, 0 umnieroditeli.ru, 0 -umpay.com, 0 -umukunzi.rw, 0 umu.se, 0 -umweltinstitut.org, 0 um.wroc.pl, 0 unacar.mx, 0 -unachi.ac.pa, 0 unam.edu.ar, 0 unam.mx, 0 unand.ac.id, 0 @@ -14867,23 +8381,16 @@ unas.hu, 0 unasus.gov.br, 0 unblockall.com, 0 -unblockbook.biz, 0 -unblockcn.com, 0 unca.edu, 0 unctv.org, 0 -undelete-file.ru, 0 undiksha.ac.id, 0 undip.ac.id, 0 -undo.it, 0 unecon.ru, 0 uned.es, 0 unesp.br, 0 unet.by, 0 -unet.cz, 0 unet.edu.ve, 0 unexplainablestore.com, 0 -ung.si, 0 -uni-altai.ru, 0 unian.info, 0 unian.net, 0 unian.ua, 0 @@ -14891,16 +8398,13 @@ uni-augsburg.de, 0 uniba.it, 0 uniba.sk, 0 -unibratec.edu.br, 0 unic.ac.cy, 0 unicamp.br, 0 -unicard.ge, 0 unic.edu.ru, 0 unicef-irc.org, 0 unicen.edu.ar, 0 uniconf.ru, 0 unideb.hu, 0 -unident.se, 0 uni.edu.ni, 0 unifemm.edu.br, 0 unifenas.br, 0 @@ -14908,73 +8412,45 @@ uniforminsignia.org, 0 uni-frankfurt.de, 0 uni-freiburg.de, 0 -unigroup.com.cn, 0 uni-heidelberg.de, 0 unihost.com, 0 uni-kassel.de, 0 -unila.edu.mx, 0 unilever.com, 0 -unilever.com.cn, 0 uni-lj.si, 0 unimagdalena.edu.co, 0 uni-mainz.de, 0 unimal.ac.id, 0 uni-mb.si, 0 -unimedmaringa.com.br, 0 -unimednatal.com.br, 0 -unimedribeirao.net, 0 unimedrio.com.br, 0 unimontes.br, 0 uni-mysore.ac.in, 0 -uni-net.com.tw, 0 unionesarda.it, 0 unionpay.com, 0 unionpayintl.com, 0 unipdu.ac.id, 0 unipus.cn, 0 -uniqa.ro, 0 unisi.it, 0 uni-sofia.bg, 0 -unisonserver.com, 0 -unistroyrf.ru, 0 unitbv.ro, 0 unitconverterpro.com, 0 -unitech-mo.ru, 0 unitedbank.cn, 0 united-host.de, 0 -unitequipment.com, 0 unitins.br, 0 -unitraklub.pl, 0 unium.ru, 0 univadis.de, 0 -univap.br, 0 -universal-job.ch, 0 universal.se, 0 -universiada.eu, 0 universitego.com, 0 -university.kg, 0 -universityofsantamonica.edu, 0 -universtudio.ru, 0 univertv.org, 0 uniview.com, 0 univille.edu.br, 0 -uni-weimar.de, 0 -unix4lyfe.org, 0 unixstorm.org, 0 uniyar.ac.ru, 0 -unlimitedworld.de, 0 unlp.edu.ar, 0 -unmo.ba, 0 -unode50.com, 0 unoentrerios.com.ar, 0 -unpa.me, 0 unq.edu.ar, 0 unr.edu.ar, 0 -unrulydude.com, 0 -unsa.org, 0 untan.ac.id, 0 unternehmertum.de, 0 -untis.at, 0 unybook.com, 0 unyoo.com, 0 unyp.cz, 0 @@ -14982,72 +8458,44 @@ uooc.online, 0 uop.edu.jo, 0 uoradea.ro, 0 -up3d.com, 0 upaep.mx, 0 -upagge.com, 0 upaiyun.com, 0 upb.edu.co, 0 upc.edu.cn, 0 upchina.com, 0 -upclinic.ru, 0 -upclve.com, 0 -upcomingcons.com, 0 -updressed.com, 0 upendo.tv, 0 -upenny.cn, 0 upessencia.com.br, 0 -upg-ploiesti.ro, 0 -upit.ro, 0 -uplab.ru, 0 upla.cl, 0 upl.uz, 0 -upm.my, 0 upp.edu.mx, 0 uprav.ru, 0 uprm.edu, 0 -upromania.ro, 0 upr.si, 0 -upservers.net, 0 upsrv.ru, 0 upward.org, 0 upxin.net, 0 uqer.io, 0 uralairlines.ru, 0 -ural.net, 0 uralplit.ru, 0 uralpolit.ru, 0 -uran.ua, 0 urban3p.ru, 0 urbanterror.info, 0 urbaonline.com, 0 -urbistat.it, 0 urc.ac.ru, 0 -ur.de, 0 -ureport.in, 0 urfu.ru, 0 -urgent-curier.ro, 0 url.ph, 0 url.tw, 0 urmia.ir, 0 -urokidoma.org, 0 -ursprung.at, 0 -urssaf.fr, 0 urss.ru, 0 -urwork.cn, 0 usabilitytools.com, 0 -usa.cc, 0 usach.cl, 0 usaedu.net, 0 -usaip.eu, 0 usc.edu, 0 -usc.edu.cn, 0 useed.fr, 0 usefulblogging.com, 0 -useley.com, 0 usembassy.gov, 0 usens.com, 0 userbase.be, 0 -userful.com, 0 usermd.net, 0 users.pub, 0 useso.com, 0 @@ -15056,27 +8504,18 @@ uslugi.mosreg.ru, 0 uspard.com, 0 usp.br, 0 -usports.ru, 0 -ustalk.com, 0 ustc.edu.cn, 0 ustclug.org, 0 -ustcsoft.com, 0 us.to, 0 u-strasbg.fr, 0 -ustrotting.com, 0 usu.edu, 0 usuhs.edu, 0 usurt.ru, 0 -usx.edu.cn, 0 -utags.edu.mx, 0 utaipei.edu.tw, 0 uta-net.com, 0 utazom.com, 0 utazzitthon.hu, 0 -utb.ru, 0 -utbs.ws, 0 utgjiu.ro, 0 -uticanational.com, 0 utmn.ru, 0 utn.edu.ar, 0 utorrent.info, 0 @@ -15088,26 +8527,16 @@ utwente.nl, 0 uulian.com, 0 uuoobe.kr, 0 -uurun.com, 0 uuu.com.tw, 0 uvanet.br, 0 uv.cl, 0 uvm.cl, 0 -uwdress.com, 0 -uwebdesign.ru, 0 uwec.edu, 0 uwewe.com, 0 -uwm.edu.pl, 0 uwow.biz, 0 -uwowhead.ru, 0 -uxiaor.com, 0 -uxin.com, 0 -uxinuxin.com, 0 -uxuejiaoyu.cc, 0 uxuejiaoyu.com, 0 uybor.uz, 0 uyun.cn, 0 -uzasne-darky.cz, 0 uzbekenergo.uz, 0 uzcard.uz, 0 uzer.me, 0 @@ -15115,145 +8544,73 @@ uzfor.net, 0 uzh.ch, 0 uzinfocom.uz, 0 -uznature.uz, 0 uztelecom.uz, 0 -uztor.net, 0 v1.cn, 0 v1game.cn, 0 v1.ru, 0 -v1.spb.ru, 0 -v2v.net, 0 v5cg.com, 0 v5kf.com, 0 vaecn.com, 0 -vagas.pro, 0 vahdeals.com, 0 vainahtelecom.ru, 0 -valahia.ro, 0 -vala-network.eu, 0 valetudo.ru, 0 -vallexm.ru, 0 valsun.cn, 0 valuehost.ru, 0 -vam.ac.uk, 0 -vanet.eu.com, 0 vanfun.com, 0 -vansfans.cn, 0 vapez.ro, 0 vapteke.ru, 0 vardex.ru, 0 -variable.pp.ua, 0 -variety-store.ru, 0 variflight.com, 0 -varton.ru, 0 varus.ua, 0 vasco.com, 0 -vasco.eu, 0 vashgorod.ru, 0 -vatrus.info, 0 -vatti.com.cn, 0 vavato.com, 0 -vavruska.info, 0 -v-avto.ru, 0 -vayaentradas.com, 0 vaz.ru, 0 vbg.de, 0 vbill.cn, 0 -vbordele.org, 0 -vbs-hobby.fr, 0 -vbuddisme.ru, 0 -vbz.hr, 0 -vc4a.com, 0 vc-enable.co.uk, 0 vcfboard.com, 0 vclhk.com, 0 vc.ru, 0 -vctms.co.uk, 0 -vdongchina.com, 0 -vdv-kavkaz.ru, 0 -vedanta.org, 0 -veeam.com, 0 veekn.com, 0 veeseo.com, 0 -veeshop.ro, 0 veestro.com, 0 -veganisme.org, 0 vegeweb.org, 0 vehicle-rent.com, 0 -vejska.cz, 0 -veka.ru, 0 -vekrosta.ru, 0 velex.ir, 0 velosite.ru, 0 -veloxnet.hu, 0 -venco.com.pl, 0 -vendev.info, 0 vendor.kz, 0 -venetolavoro.it, 0 -venez.fr, 0 venganzasdelpasado.com.ar, 0 -venompvp.org, 0 vent-al.ru, 0 vente-privee.com, 0 -vento.ru, 0 venturesafrica.com, 0 -verbinet.com, 0 verbraucherschutz.de, 0 -verbraucherzentrale.it, 0 -verespg.hu, 0 -vergleichen-und-sparen.de, 0 -vericant.com, 0 -verifiedinvesting.com, 0 verifiedvolunteers.com, 0 -veripark.com, 0 -versand-status.de, 0 -version6.ru, 0 verybank.ru, 0 verycloud.cn, 0 verygames.net, 0 veschichka.com, 0 vestacp.com, 0 vesti.kz, 0 -vestiprim.ru, 0 vestum.ru, 0 -vexer.ru, 0 veyseloglu.az, 0 -vfavk.net, 0 -vfe.cc, 0 vfl.ru, 0 -v-front.de, 0 -vgg.ru, 0 -vgn.at, 0 vhall.com, 0 -vhod.cc, 0 vhostgo.com, 0 -vhost.wf, 0 -viacep.com.br, 0 via.de, 0 -viadurini.it, 0 -viaflats.com, 0 -viajas.com, 0 viaprinto.de, 0 -vibease.com, 0 vibus.de, 0 vic.edu.au, 0 vic.gov.au, 0 vicp.cc, 0 vicp.io, 0 vicp.net, 0 -victorz.ru, 0 -vidanet.hu, 0 -vidapositiva.com, 0 -vide-greniers.org, 0 videoboom.cc, 0 videochaty.ru, 0 -videociety.de, 0 videoforme.ru, 0 videogamesawesome.com, 0 videoigr.net, 0 -videojatekbolt.hu, 0 videojj.com, 0 -videolist.am, 0 video-nvidia.com, 0 videoplusfrance.com, 0 videoregforum.ru, 0 @@ -15262,46 +8619,26 @@ videostir.com, 0 videvo.net, 0 vidido.ua, 0 -vidmatedownloadapp.com, 0 -vidonme.cn, 0 vidown.cn, 0 vidproxy.com, 0 vidri.com.sv, 0 vid.ru, 0 -viemar.com.br, 0 vietget.net, 0 -vietmap.vn, 0 -vietpn.com, 0 viewdns.net, 0 -viewlayer.cn, 0 viewnetcam.com, 0 -vifnet.pl, 0 vigodnee.ru, 0 -viis.lv, 0 vikingco.com, 0 -vikingcruises.com, 0 vikingrivercruises.com, 0 vilavi.com, 0 vilaviniteca.es, 0 villacarte.com, 0 villamariavivo.com, 0 -ville-courbevoie.fr, 0 -ville-gennevilliers.fr, 0 vilniausenergija.lt, 0 -vilynx.com, 0 -vimcar.com, 0 -vimcar.de, 0 vimentis.ch, 0 vimp.com, 0 -vinamsolutions.com, 0 -vinastar.net, 0 -vincross.com, 0 -viniti.ru, 0 -vin.li, 0 vipautoliker.com, 0 vipbaiduyun.com, 0 vipc.cn, 0 -v-ipc.ru, 0 vipedp2.com, 0 vipfreepremium.com, 0 vipgaming.ru, 0 @@ -15310,88 +8647,49 @@ vipmro.net, 0 vipreading.com, 0 vipshop.com, 0 -vipsmt.com, 0 -vipspravka.org, 0 -vipvpn.racing, 0 vip-weapon.ru, 0 vip-wifi.com, 0 vipwifi.com, 0 vira20.ir, 0 -virag.si, 0 viral-alert.com, 0 viralsection.com, 0 virink.com, 0 -virnet.co.za, 0 virten.net, 0 virt-manager.org, 0 -virt-mir.ru, 0 virtual-college.co.uk, 0 virtuallyboring.com, 0 virtualsoccer.ru, 0 virtuemart.net, 0 virtuosgames.com, 0 virtuozzo.com, 0 -virus-removal-guide.com, 0 -virus-removal-guide.net, 0 -visaszales.lv, 0 -visicom.com, 0 vision.com.tw, 0 -visitantalya.com, 0 visitporno.net, 0 -vismedia.ru, 0 vistula.edu.pl, 0 visual3d.cn, 0 visualead.com, 0 visualwatermark.com, 0 vitacom.ro, 0 vitalia.cz, 0 -vitalitygames.com, 0 -vitamax.ru, 0 vitaminking.com.au, 0 vitek.ru, 0 -vitnik.com, 0 -vitreum.lv, 0 -viva.com.do, 0 vivasexe.com, 0 -vivavivu.com, 0 -vivaxis.com, 0 vivendi.com, 0 viventor.com, 0 vivo.xyz, 0 -vivt.ru, 0 vizio.com, 0 vizzlo.com, 0 -vjiangyin.net, 0 -vkernel.ro, 0 -v-key.com, 0 vkfake.ru, 0 -vki.at, 0 vkjust.com, 0 vko.cn, 0 vkonline.ru, 0 -vkreg.ru, 0 vladislav.ua, 0 -vladis.ru, 0 vladmama.ru, 0 -vlc.de, 0 -vlc-forum.de, 0 -vlion.cn, 0 -vludus.com, 0 vluki.ru, 0 -vmcsubastas.com, 0 -vmmo.ru, 0 -vmoe.info, 0 -vmou.ac.in, 0 -vmovier.cc, 0 vnc.biz, 0 -vn.cz, 0 vnebo.mobi, 0 vnet.cn, 0 vnmu.edu.ua, 0 -vnutri.org, 0 -vobile.cn, 0 voc.com.cn, 0 -vocier.com, 0 vodafone.it, 0 vodjk.com, 0 vodokanal.kiev.ua, 0 @@ -15400,35 +8698,21 @@ vogue.ru, 0 voicecloud.cn, 0 voiceofgreaterassam.com, 0 -voice-server.ru, 0 -voipgateapi.com, 0 -voipgate.com, 0 volgadmin.ru, 0 -volga-dnepr.com, 0 volganet.ru, 0 -volgaspot.ru, 0 volksbuehne-berlin.de, 0 -volksschauspiele.de, 0 volkswagen.de, 0 -volkszaehler.org, 0 -volleyball-verband.de, 0 volnistye.ru, 0 volnorez.com, 0 -volosfull.ru, 0 -voltmarket.ru, 0 -voltra.by, 0 vonvon.me, 0 -vooc.net, 0 voodoo.com, 0 voodoo.community, 0 voprosoff.net, 0 voriginale.tv, 0 vorlagen.de, 0 vorwaerts.de, 0 -vorwerk.at, 0 vorwerk.com, 0 vorwerk.co.uk, 0 -vorwerk.cz, 0 vorwerk.de, 0 vorwerk.es, 0 vorwerk.fr, 0 @@ -15437,101 +8721,53 @@ votobo.com, 0 votonia.ru, 0 votrube.ru, 0 -voubs.bg, 0 voxbone.com, 0 -voximplant.com, 0 voxygen.fr, 0 voyhoy.com, 0 voz48.xyz, 0 -vp.gov.lv, 0 vpndaquan.net.cn, 0 -vpngatecn.com, 0 -vpnhot.com, 0 -vpnmaster.cn, 0 vpnme.me, 0 vpnxx.net, 0 -vpo.ca, 0 vpphoangha.vn, 0 vprka.com, 0 vps-10.com, 0 vpsgroups.com, 0 -vpsi.cloud, 0 vpsps.com, 0 vpsville.ru, 0 vqs.com, 0 vrach42.ru, 0 -vrame.org, 0 vrheads.com, 0 vrn.ru, 0 vrsa.lt, 0 -v-running.com, 0 vsactivity.com, 0 vsadu.ru, 0 -vsathletics.com, 0 vsbt174.ru, 0 -vsdaria.com, 0 vse.cz, 0 -vse.fm, 0 -vsehristiane.com, 0 vsei.ua, 0 vsekroham.ru, 0 -vseloterei.com, 0 vsemayki.com, 0 -vsem.cz, 0 -vsemetri.com, 0 -vsepro1s.ru, 0 vserpg.ru, 0 -vserver.de, 0 -vsesorta.ru, 0 vsestudent.cz, 0 -vshabakeh.com, 0 -vsibiri.info, 0 -vsim.lt, 0 -vslg.cz, 0 -vslu.ru, 0 vsopen.ru, 0 vso-software.fr, 0 -vspp.cz, 0 vsu.by, 0 vsu.ru, 0 vtambove.ru, 0 vtb.az, 0 -vtb-bank.by, 0 -vtb-bank.kz, 0 -vtbnpf.ru, 0 vtech.com, 0 vtechda.com, 0 vt.edu, 0 vten.ru, 0 -vtkbank.ru, 0 vtrhome.net, 0 -vtrois.com, 0 -vtrspeed.com, 0 -vtrspeed.net, 0 vtrus.net, 0 -vttl.be, 0 vtt.ru, 0 -vtverdohleb.org.ua, 0 -vucdjursland.dk, 0 vucke.sk, 0 vuze.camera, 0 -vv881.com, 0 vvic.com, 0 vvo.aero, 0 -vvoso.com, 0 vvsu.ru, 0 -vvwall.com, 0 -vw-bus.ru, 0 vwr.com, 0 vxianchang.cn, 0 -vydy.net, 0 -vyos.io, 0 -vyos.net, 0 -vzlomcheats.com, 0 -vzlomcheatshack.com, 0 -vzlom-igr.com, 0 -w1.fi, 0 -w3cboy.com, 0 w3template.ir, 0 w69b.com, 0 wacai.com, 0 @@ -15545,23 +8781,16 @@ waiqin365.com, 0 waitalone.cn, 0 waitsun.com, 0 -waixingrenlc.com, 0 -wakeboardingmag.com, 0 wakku.to, 0 walatao.com, 0 -walibi.nl, 0 -walkclass.com, 0 wallbox.ru, 0 -wall.cz, 0 wallegro.ru, 0 wallpai.com, 0 wallpaperfusion.com, 0 wallpapers.pub, 0 -wally.me, 0 wan5d.com, 0 wanadev.fr, 0 wanchongchong.com, 0 -wancom.net.pk, 0 wanderland.ch, 0 wandoujia.com, 0 wanfangdata.com.cn, 0 @@ -15570,9 +8799,6 @@ wangfz.com, 0 wang-guanjia.com, 0 wanghailin.cn, 0 -wanghualang.com, 0 -wangjubao.com, 0 -wangjunfeng.com, 0 wangye.org, 0 wanhu.com.cn, 0 wankr.com.cn, 0 @@ -15580,9 +8806,6 @@ wanxiaohong.cn, 0 wanzi.tv, 0 waqu.com, 0 -warabi.or.jp, 0 -warcis.com, 0 -wardahshop.com, 0 warez-bb.org, 0 warlegend.net, 0 warmen.cc, 0 @@ -15590,248 +8813,140 @@ wartapost.com, 0 warwick.ac.uk, 0 wasai.org, 0 -washabich.de, 0 -wa-sta.net, 0 wasu.com, 0 watches.ru, 0 -watchhyper.com, 0 watchrecon.com, 0 -waterskimag.com, 0 watsons.com.tw, 0 watsons.ua, 0 -watsupafrica.com, 0 wave.io, 0 -waww.ir, 0 waylens.com, 0 waysofhistory.com, 0 wazizu.com, 0 -wb21.com, 0 wb-community.com, 0 wb-fernstudium.de, 0 wbiao.cn, 0 wciu.com, 0 -wdj168.com, 0 wdw88.com, 0 wdwd.com, 0 we7.cc, 0 wealthnavi.com, 0 -wearemarketing.com, 0 weaver.com.cn, 0 -web4008.com, 0 -web4.hu, 0 -webads.eu, 0 webalfa.net, 0 -web-alpha.com, 0 webanetlabs.net, 0 webanketa.com, 0 webartex.ru, 0 webassign.com, 0 -webassign.net, 0 webbankir.com, 0 webb-site.com, 0 webcamfuck.me, 0 webceo.com, 0 -webdavsystem.com, 0 webdesign.org, 0 webd.pl, 0 -webdux.com, 0 webeden.co.uk, 0 webei.cn, 0 -web-entity.com, 0 webernetz.net, 0 -web-experiment.info, 0 webfoss.com, 0 webfungame.com, 0 webhop.me, 0 webhop.net, 0 webhostbox.net, 0 -webhostingdiscussion.net, 0 webid-gateway.de, 0 -webid-solutions.de, 0 webim.ru, 0 webinar.fm, 0 -webin.info, 0 -weblap-keszites.co.hu, 0 webmaster.kitchen, 0 -webmaster-ucoz.ru, 0 weborama.com, 0 weborama.fr, 0 webpass.net, 0 -webpixeltechnologies.com, 0 webplatform.org, 0 webpro.co.jp, 0 webptt.com, 0 -webraketa.com, 0 web-republic.de, 0 we.bs, 0 -webscore.ru, 0 webseiten.cc, 0 -webseo.com, 0 websequencediagrams.com, 0 -web-service4u.de, 0 -websistent.com, 0 website.tk, 0 -websmsapp.com, 0 webspacecontrol.com, 0 webstarterz.com, 0 -webstrane.info, 0 -webstream.eu, 0 -webtatic.com, 0 -webtechub.com, 0 webtemp.no, 0 webterren.com, 0 web-tinker.com, 0 webtm.ru, 0 webtransfer.com, 0 -webtre.com, 0 -webtrn.cn, 0 webtropia.com, 0 webuntis.com, 0 -weclassroom.com, 0 weclick.ir, 0 -weco.net, 0 weddywood.ru, 0 -wedgewoodbanquet.com, 0 wednet.edu, 0 wedos.com, 0 wedos.net, 0 -weeaboo.com, 0 -weeazy.com, 0 weekdone.com, 0 -weeker.jp, 0 -weflow.io, 0 weibo.cn, 0 weiboyi.com, 0 -weichai.com, 0 weicps.cn, 0 -weidian.com, 0 -weiguda.com, 0 weijuju.com, 0 weimi.cc, 0 -weiosx.com, 0 weiphone.com, 0 weiphone.net, 0 weismarkets.com, 0 weitaming.com, 0 -weixinshu.com, 0 -weiyin.cc, 0 -wejherowo.pl, 0 wek.ru, 0 welcomechile.com, 0 -welcomeuruguay.com, 0 welfulloutdoors.com, 0 welian.com, 0 -welldonesoft.com, 0 wellgames.com, 0 wellingtoncdsb.ca, 0 -wellnessfitnessnutritionstore.com, 0 welovedance.ru, 0 -wendashi.cc, 0 wenidc.com, 0 -wenjf.com, 0 wenjuan.com, 0 wenjuan.net, 0 wenming.cn, 0 -wenzelnet.de, 0 -wenzhanghui.com, 0 -werkswelt.de, 0 -weru.de, 0 -wesmirch.com, 0 westcall.net, 0 -westcall.spb.ru, 0 westend.hu, 0 westhome.spb.ru, 0 westland.ru, 0 westsib.ru, 0 -westtown.edu, 0 westwin.com, 0 -west.xyz, 0 -wettforum.info, 0 wetu.com, 0 weyes.cn, 0 -weyes.com.cn, 0 -wffuture.ru, 0 wfu.edu, 0 wg263.com, 0 -wget.ca, 0 wghostk.com, 0 -wg-volunteers.ru, 0 -wgwinto.com, 0 wh1.su, 0 -whalevpn.cc, 0 whaley.cn, 0 whaller.com, 0 -whatled.com, 0 whatpulse.org, 0 -whatshelp.io, 0 whhd.gov.cn, 0 -whir.net, 0 -whiskybase.com, 0 -whitelabelwebserver.com, 0 -whitetown.com, 0 -whmcsadmintheme.com, 0 whnet.edu.cn, 0 -whois7.ru, 0 wholikesu.net, 0 -whoneedstv.com, 0 -wh.to, 0 whu.edu.cn, 0 -whyun.com, 0 wiaa.com, 0 wiair.com, 0 -wiconnect.fr, 0 wicp.net, 0 wicwuzhen.cn, 0 wide.ad.jp, 0 widoobiz.com, 0 widuu.com, 0 -wienit.at, 0 -wifimapper.com, 0 wifispc.com, 0 -wig-supplier.com, 0 wigwam.com, 0 wiidatabase.de, 0 -wiipu.com, 0 -wikem.org, 0 wik-end.com, 0 wiki8.com, 0 wikiart.org, 0 wikimart.ru, 0 -wikimonde.com, 0 wikin.cn, 0 -wikiscan.org, 0 -wikishoper.ru, 0 wikium.ru, 0 -wildbags.ru, 0 -wilddogapp.com, 0 wildo.ru, 0 williamlong.info, 0 -winasdaq.com, 0 -winbo.cn, 0 -winbo.top, 0 -wincatalog.com, 0 wincomi.com, 0 -windobona.at, 0 -windows10screensavers.net, 0 windowsazure.cn, 0 -windowsbox.hu, 0 windowscentral.com, 0 windowsforum.kr, 0 -windows-phone.su, 0 -windows-security.org, 0 -windows-soft.ru, 0 windscribe.com, 0 -wineselectors.com.au, 0 winesou.com, 0 winestreet.ru, 0 wingoads.com, 0 -wingroad.ru, 0 -wingsofart.ru, 0 wingtech.com, 0 -winhelp.us, 0 winhong.com, 0 -winneryun.com, 0 -winnetnews.com, 0 winni.in, 0 winployee.com, 0 wintalent.cn, 0 @@ -15839,16 +8954,9 @@ winyer.cn, 0 wiscom.com.cn, 0 wisconsinhistory.org, 0 -wise2c.com, 0 -wisecrm.com, 0 wisemedia.cn, 0 wisenjoy.com, 0 wishmindr.com, 0 -withmybaby.com, 0 -wittur.com.cn, 0 -wittycircle.com, 0 -witze-charts.de, 0 -wizardfox.net, 0 wizardofodds.com, 0 wizardofvegas.com, 0 wizzley.com, 0 @@ -15858,111 +8966,68 @@ wko.at, 0 wktk.so, 0 wkzuche.com, 0 -wlcpu.com, 0 wlwx.cn, 0 wmasteru.org, 0 -wmd.ru, 0 -wmrs.ru, 0 -wm.ru, 0 wmv-dresden.de, 0 wnmu.edu, 0 -wnp.com.hk, 0 -woax-it.com, 0 -woca.club, 0 -wodzislaw.pl, 0 wogibtswas.de, 0 woheni.de, 0 -wolfpaulus.com, 0 wolf.ua, 0 wolterskluwer.de, 0 womanadvice.ru, 0 woman.ru, 0 womenonweb.org, 0 -womenshairlossproject.com, 0 wondershare.cn, 0 wonsterscript.com, 0 woodgears.ca, 0 -woodward.edu, 0 wooplus.com, 0 wordassociations.net, 0 -work28.com, 0 workaround.org, 0 workingmother.com, 0 -worklohas.com, 0 -work-microwave.com, 0 workout-italia.it, 0 worksection.com, 0 work-way.com, 0 worldcubeassociation.org, 0 worldoftrucks.ru, 0 -worldserial.info, 0 worldskills.ru, 0 worldtravelserver.com, 0 -world-xxx.com, 0 woshidai.com, 0 wosign.com, 0 wo.tc, 0 wotcase.ru, 0 -wotreplays.ru, 0 -wots.com.ua, 0 -wovn.io, 0 wowdsgn.com, 0 wowgirls.com, 0 wow-impulse.net, 0 wowtrack.org, 0 -wowtv.sx, 0 -wowworks.ru, 0 wowzonegc.ir, 0 woyun.la, 0 -woy-wo.uz, 0 wpcp.org, 0 wpdesigner.ir, 0 -wpiao.cn, 0 wpmayor.com, 0 -wppage.ru, 0 wpscdn.cn, 0 wps.cn, 0 wp-statistics.com, 0 -wpweb.com, 0 wpweixin.net, 0 -wpzhiku.com, 0 -wpzt.cn, 0 wrealu24.pl, 0 wrestling-infos.de, 0 wroclaw.pl, 0 -wrps.org, 0 -wsdltophp.com, 0 wsgf.org, 0 wsgjp.com.cn, 0 wsgvet.com, 0 -wsisp.net, 0 wsloan.com, 0 wsms.ru, 0 -wso.wroc.pl, 0 wstvb.com, 0 -wszuie.pl, 0 -wtfismyip.com, 0 wtigga.com, 0 -wtsolutions.cn, 0 wtu.edu.cn, 0 wuage.com, 0 -wuestenrot.sk, 0 -wug.cz, 0 -wulian.cc, 0 wumart.com, 0 wuminhao.com, 0 -wunderkarten.de, 0 wunschimmo.de, 0 -wunschkuechen24.de, 0 wusa5.com, 0 wust.edu.cn, 0 wusunyinyue.cn, 0 -wutnews.net, 0 wuyatv.com, 0 -wuzhicms.com, 0 wvo-dbg.de, 0 -wware.org, 0 -www.astrakhan.ru, 0 www.chita.ru, 0 www.gov.lk, 0 www.uz, 0 @@ -15972,11 +9037,7 @@ wxliu.com, 0 wxrrd.com, 0 wxwgood.com, 0 -wycliffe.org.au, 0 wykxsw.com, 0 -wyscout.com, 0 -wzhrss.gov.cn, 0 -x25.pl, 0 x431.com, 0 x4jdm.com, 0 x5aa.com, 0 @@ -15985,86 +9046,46 @@ xaau.edu.cn, 0 xacbank.com, 0 xaecong.com, 0 -xakfor.net, 0 -xalapa.gob.mx, 0 -xalkiadakis.gr, 0 -xalqbank.az, 0 -xanlosch.de, 0 xap.com, 0 xarakiri.ru, 0 xbls.ninja, 0 xbmc-kodi.cz, 0 xbpmo.com, 0 -xbsafe.cn, 0 xchange.cc, 0 -xcloud.cc, 0 xcloudgame.com, 0 xd.com, 0 -xdevs.com, 0 xdf.cn, 0 -x-diesel.com, 0 xdjd.cn, 0 -xeenho.com, 0 -xenderdownloadapp.com, 0 xenderdownloads.com, 0 xenforo.rocks, 0 -xenics.com, 0 xenos.org, 0 -xf315.org, 0 -xfce.org, 0 -xfile.ro, 0 xfplay.com, 0 xfsub.com, 0 -xfxb.net, 0 -xg1.li, 0 -xgate.com.hk, 0 -xgen.hu, 0 xgimi.com, 0 xgm.guru, 0 -xhecom.com, 0 -xhmart.com, 0 xhu.edu.cn, 0 -xialuoli.com, 0 xiamenair.com, 0 xiangha.com, 0 -xiangjins.com, 0 -xiangta.cc, 0 -xiangzhan.com, 0 -xianrou.com, 0 xianyugame.com, 0 -xiaobingss.com, 0 xiaodao.la, 0 -xiaoduotech.com, 0 -xiaoheiban.cn, 0 xiaoji001.com, 0 xiaokakeji.com, 0 xiaokaxiu.com, 0 -xiaolaoer.com, 0 -xiaomilaile.com, 0 xiaomishu.com, 0 -xiaopinjuben.com, 0 xiaoyaoji.com.cn, 0 xiaoying.tv, 0 -xiaoyoucai.com, 0 xiaozhu.com, 0 xiaoz.me, 0 xiashu.cc, 0 xiazai3.net, 0 xiazaidown.com, 0 -xibao100.com, 0 -xibaoxiao.com, 0 -xici.com, 0 xici.net, 0 -xicp.cn, 0 xicp.net, 0 xidorn.com, 0 ximalaya.com, 0 xincheping.com, 0 -xinchou.com, 0 xin.com, 0 -xinedome.de, 0 xineurope.com, 0 -xinfuka.net, 0 xingk.cc, 0 xingshulin.com, 0 xingyun.net, 0 @@ -16077,129 +9098,70 @@ xiniugushi.com, 0 xinmin.cn, 0 xinqixi.com, 0 -xinshangshangxin.com, 0 -xinux.net, 0 xinxindai.com, 0 xiph.org, 0 xitieba.com, 0 xiu8.com, 0 xiu.com, 0 xixi123.com, 0 -xiyoucn.com, 0 xizi.com, 0 -xjatc.com, 0 xjnu.edu.cn, 0 -xjtag.com, 0 xjtlu.edu.cn, 0 xjtu.edu.cn, 0 xju.edu.cn, 0 xjy.cn, 0 xkb.com.cn, 0 -xlm.pl, 0 -xl.pt, 0 -xlzd.me, 0 xmcimg.com, 0 xmeye.net, 0 xmisp.com, 0 -xmjl.com, 0 -xmjydj.com, 0 xmmandarinonline.com, 0 xm-n-tax.gov.cn, 0 xmp.net, 0 -xmpp.jp, 0 -xmpp.org, 0 xmt.cn, 0 xmusik.me, 0 xmyuzhou.com.cn, 0 -xn--12c4db3b2bb9h.net, 0 xn--1-btbl6aqcj8hc.xn--p1ai, 0 -xn--2i0b10rwthi7fqvp1hd.com, 0 xn--41a.ws, 0 -xn------7cdbxfuat6afkbmmhefunjo4bs9u.xn--p1ai, 0 -xn----7sbabalf0fh7h4b.xn--p1ai, 0 xn--80aaaac8algcbgbck3fl0q.xn--p1ai, 0 -xn--80aaej4apiv2bzg.xn--p1ai, 0 -xn--80abemlex2i.xn--p1ai, 0 -xn--80accn9dh.xn--90ais, 0 -xn--80aealaaatcuj2bbdbr2agjd6hzh.xn--p1ai, 0 -xn--80aeopmfjx.xn--80aswg, 0 xn--80ahclcbajtrv5ae6c.xn--p1ai, 0 xn----8sbbilafpyxcf8a.xn--p1ai, 0 -xn--90agc8a6d.xn--d1acj3b, 0 xn--90agrrk8e.xn--p1ai, 0 -xn--b1a3bf.xn--p1ai, 0 -xn--b1acdcqi5ci.xn--p1ai, 0 -xn--c1acndtdamdoc1ib.xn--p1ai, 0 xn--c1afjenhpy1e1a.xn--p1ai, 0 xn--c1arjr.xn--p1ai, 0 -xn--c1avg.xn--p1ai, 0 -xn--d1acnqm.xn--j1amh, 0 xn----dtbofgvdd5ah.xn--p1ai, 0 xn--e1agfw6a0bt.xn--p1ai, 0 -xn--e1apcdqc2g.xn--p1ai, 0 xn--f1ae4a2b.xn--p1ai, 0 xn--i2ru8q2qg.com, 0 -xnw.com, 0 -xn----ymcba3adxu7lezvuj.sa.com, 0 -xocka.ru, 0 -x-omics.org, 0 xopom.com, 0 xosobinhduong.com.vn, 0 xpg.com.br, 0 xpir.ru, 0 -xpsss.com, 0 xquartz.org, 0 xrea.com, 0 -xrnm.com, 0 -xrule34.com, 0 xs4all.nl, 0 -xsdzq.cn, 0 -xskygames.pl, 0 xsph.ru, 0 xssec.org, 0 xsteach.com, 0 -xsunucu.com, 0 xtbg.ac.cn, 0 xtcrm.com, 0 xtern.ru, 0 xthor.bz, 0 xtion.net, 0 xtrade.com, 0 -xtrance.info, 0 -xtreme.pt, 0 -xtrim.ru, 0 -xtrlarge.com, 0 -xtronics.com, 0 -xuanlove.net, 0 -xuanruanjian.com, 0 xuanwo.org, 0 xubiji.com, 0 xueda.com, 0 -xueshandai.com, 0 xujc.com, 0 -xuni99.com, 0 xunjiepdf.com, 0 xunleiyy.com, 0 xunyou.com, 0 -xura.com, 0 -xuri.me, 0 -xuulm.com, 0 -xuuue.cn, 0 -xvhost.com, 0 xvid.com, 0 xvideoslive.com, 0 -xwall.pro, 0 xweb.cn, 0 -xwhosp.com.cn, 0 -xwiki.com, 0 -xwiki.org, 0 -xwis.net, 0 -xwjr.com, 0 xwsd.com, 0 xxshe.com, 0 xxt.cn, 0 xxx3tube.com, 0 -xxxooo.link, 0 xyaz.cn, 0 xydeyou.com, 0 xyfunds.com.cn, 0 @@ -16207,8 +9169,6 @@ xyu.tv, 0 xyy001.com, 0 xyzq.com.cn, 0 -xzcblog.com, 0 -xz.gov.cn, 0 xzmc.edu.cn, 0 xzn.ir, 0 y3600.com, 0 @@ -16216,157 +9176,94 @@ yabumi.cc, 0 yachtbooker.com, 0 yachtingmagazine.com, 0 -yachtsys.com, 0 -yaduo.com, 0 yagla.ru, 0 yaguo.ru, 0 -yahooeu.org, 0 yahooeu.ru, 0 -yaidu.ru, 0 yakitoriya.ru, 0 yalova.edu.tr, 0 yamaha-motor.co.th, 0 yamobi.ru, 0 -yanagou.com, 0 yanfabu.com, 0 -yangchangxi.com, 0 -yangcong345.com, 0 yangshitianqi.com, 0 yangtuner.com, 0 yangzhou.gov.cn, 0 -yanimsoft.ir, 0 yanke.info, 0 -yanny.link, 0 yanue.net, 0 yaociyuan.com, 0 -yaoex.com, 0 -yaomaitong.cn, 0 yaostrov.ru, 0 yaou369.com, 0 yaozh.com, 0 -ya-pluss.ru, 0 -yarcom.ru, 0 -yar-edudep.ru, 0 -yarik-sat.ru, 0 -yastaff.ru, 0 yat-net.com, 0 yatong.info, 0 yatta.de, 0 yavix.ru, 0 yavuz-selim.com, 0 yazuo.com, 0 -ybook.vn, 0 ybren.com, 0 -ybtcard.com, 0 ybu.edu.cn, 0 yburlan.ru, 0 ycgame.com, 0 -ydidc.top, 0 ydniu.com, 0 -ydy7.com, 0 ydybt.net, 0 yeahka.com, 0 yealink.com, 0 yeastar.com, 0 -yeeyi.com, 0 yeezon.com, 0 yeezyboost750sale.net, 0 -yeezytrainers.net, 0 -yeint.ru, 0 -yellowdog.co, 0 -yephy.com, 0 -yepster.me, 0 yerevan.am, 0 -yeshigeek.com, 0 yesilgazete.org, 0 yesmywine.com, 0 -yestae.com, 0 yeti.com, 0 -yfcloud.com, 0 yfdxs.com, 0 ygopro.co, 0 -ygqq.com, 0 ygyhg.com, 0 -yhcd.net, 0 yht.co.jp, 0 -yhz66.com, 0 -yibei.com, 0 yibizi.com, 0 yicai.com, 0 yiche.com, 0 -yicp.io, 0 yidai.com, 0 yidianda.com, 0 yifile.com, 0 -yifufaka.com, 0 yigoonet.com, 0 yiguo.com, 0 yihu.cn, 0 yiiframework.com.ua, 0 -yijiakan.com, 0 -yikuaiqu.com, 0 -yilingshop.com, 0 -yilingsj.com, 0 -yilushang.net, 0 -yiminbang.com, 0 yimishiji.com, 0 yimu100.com, 0 yingxiong.com, 0 -yingyanso.com, 0 yinhu.com, 0 yiqifa.com, 0 yiqiniu.com, 0 -yiran.com, 0 -yishu.com, 0 -yisi148.com, 0 yiso.me, 0 yit.com, 0 yithemes.com, 0 yiyult.com, 0 -yiyunbaby.cn, 0 yizhihongxing.com, 0 yjc.ir, 0 -yjk.im, 0 yjsnpi.nu, 0 ylc.edu.tw, 0 -ylsoftware.com, 0 -ymanz.com, 0 ymg360.com, 0 -ymq365.com, 0 ynairport.com, 0 -ynet.com, 0 -ynet.sk, 0 yngou.com, 0 yngs.gov.cn, 0 ynjy.cn, 0 -ynlib.cn, 0 ynnu.edu.cn, 0 ynot.com, 0 -ynszlyy.com, 0 ynu.edu.cn, 0 -yo-ad.cn, 0 yoga.com, 0 -yoga-masters.com, 0 yohotour.com, 0 yokogawa.com, 0 yoncu.com, 0 yongche.org, 0 -yonghappy.com, 0 yonghui.cn, 0 yongjinbao.com.cn, 0 yonyou.com, 0 -yonyouup.com, 0 -yoochoose.com, 0 -yoochoose.net, 0 yooooo.us, 0 yooread.com, 0 -yooz.fr, 0 yotuku.cn, 0 -youchew.net, 0 youdao.com, 0 youdian.in, 0 yougou.com, 0 -youguoquan.com, 0 youhack.ru, 0 youhaosuda.com, 0 youhaovip.com, 0 @@ -16374,200 +9271,121 @@ youidraw.com, 0 youjizzlive.com, 0 youkeshu.com, 0 -youkeyun.com, 0 youku.com, 0 you-mp3.net, 0 youngwriterssociety.com, 0 -youread.me, 0 yourmechanic.com, 0 your-pictionary.com, 0 -yoursafe.cn, 0 your-server.de, 0 -yourski.ru, 0 yourtion.com, 0 youscan.io, 0 youss.co, 0 youtubers.me, 0 youwager.eu, 0 youweather.com, 0 -youxia.org, 0 youxi.com, 0 youxiniao.com, 0 -youyuanapp.com, 0 youzhuan.com, 0 yovole.com, 0 yoya.com, 0 yoyi.com.cn, 0 -yoytourdumonde.fr, 0 -ypc.edu.cn, 0 yper.co, 0 -ypfbtransporte.com, 0 ypmate.com, 0 -ypt.or.id, 0 yq24.net, 0 -yrce.cn, 0 -yrom.net, 0 ys137.com, 0 ys7.com, 0 -yscredit.com, 0 ysepay.com, 0 -ysmu.ru, 0 -ysn.ru, 0 ysu.edu.cn, 0 ytdestek.com, 0 ytvpn.net.cn, 0 yu0123456.com, 0 -yuadon.com, 0 yuanbao365.com, 0 yuanlai521.com, 0 -yubaibaii.com, 0 yueing.org, 0 -yuejiadai.com, 0 -yueus.com, 0 yuewen.com, 0 -yufan.me, 0 yugcontract.ua, 0 yugiohcardmarket.eu, 0 yugiohgameonline.com.br, 0 -yuhong.com.cn, 0 yui-nya.com, 0 yulong.com, 0 yumama.com, 0 yunaq.com, 0 -yunaw.com, 0 yunbore.com, 0 yuncaijing.com, 0 yundun.cn, 0 yundun.com, 0 yuneec.cn, 0 yunhou.com, 0 -yunifang.com, 0 -yunjiazheng.com, 0 yunjiweidian.com, 0 yunpan.cn, 0 yunserver.com, 0 yunshanmeicai.com, 0 yuntech.edu.tw, 0 -yuntoo.com, 0 yunyichong.com, 0 yunyuejuan.net, 0 yunyy.cc, 0 yunzhijia.com, 0 yusen-logistics.com, 0 -yushuangqi.com, 0 -yusupov-palace.ru, 0 yutong.com, 0 yuuby.com, 0 -yuugames.com.cn, 0 -yuying360.com, 0 -yuyue.com.cn, 0 yuzhoutuofu.com, 0 -ywhuo.com, 0 ywtywt.com, 0 -ywu.cn, 0 yxlady.com, 0 -yxsvpn.com, 0 yy4480.org, 0 yy6080.org, 0 -yybei.cn, 0 -yywkt.org, 0 -yznu.cn, 0 z0download.com, 0 z3news.com, 0 zaba.hr, 0 zabedu.ru, 0 -zabi.cz, 0 -zaixiaoren.com, 0 -zajecaronline.com, 0 zakka.com.tw, 0 zakonyprolidi.cz, 0 zakopane.pl, 0 -zamel.pl, 0 zampdsp.com, 0 -zankhakasia.ru, 0 zaodula.com, 0 zaoshu.io, 0 zapable.com, 0 zap-hosting.com, 0 za.pl, 0 -zap.md, 0 -zapr.in, 0 -zapster.it, 0 zapster.ru, 0 zapto.org, 0 -zarayef.com, 0 zarfund.com, 0 -zargaripour.com, 0 zarinp.al, 0 -zarovi.cz, 0 -zarulem.by, 0 zastavok.net, 0 -zatlanka.cz, 0 zatunen.com, 0 -zavod.co.rs, 0 zaymer.ru, 0 zaymiprosto.ru, 0 zbgl.net, 0 zbj.com, 0 -zbytb.com, 0 -zc8hr.com, 0 -zcckj.com, 0 zcmu.edu.cn, 0 zczj.com, 0 zdfans.com, 0 -zdomo.com, 0 -zdorov.li, 0 -zdraivery.ru, 0 zdrav26.ru, 0 -zdrav36.ru, 0 -zdrav.spb.ru, 0 zdrojak.cz, 0 zdsoft.com, 0 -zdw.krakow.pl, 0 ze.am, 0 -zebrablinds.ca, 0 zebraboss.com, 0 -zeeandco.co.uk, 0 -zeemono.com, 0 -zeitnitz.eu, 0 zelenaya.net, 0 zelluloza.ru, 0 zen.co.uk, 0 zenden.ru, 0 -zendmin.com, 0 zeneakademia.hu, 0 zengram.ru, 0 zenhotels.com, 0 zenitel.com, 0 -zenius.net, 0 zenmate.com, 0 zenpage.cn, 0 -zenserv.fr, 0 zentaizone.com, 0 zephyrproject.org, 0 -zepire.com, 0 zepo.ir, 0 zerobest.net, 0 -zerohour-productions.net, 0 -zero.kz, 0 -zetail.com.tw, 0 -zetes.com, 0 -zeto.com.ua, 0 zfilm-hd.net, 0 -zf-projects.ru, 0 -zgboke.com, 0 zggtxhw.com, 0 -zgny.com.cn, 0 zgpingshu.com, 0 zh30.com, 0 zhacker.net, 0 -zhaishuge.com, 0 zhanad.com, 0 zhangge.net, 0 -zhangziran.com, 0 zhaodl.xyz, 0 -zhaoj.in, 0 -zhaokeli.com, 0 zhaopin.com, 0 zhaorannote.cn, 0 zhaoshangdai.com, 0 @@ -16578,21 +9396,12 @@ zhenai.com, 0 zhenfund.com, 0 zhengjie.com, 0 -zhengxianjun.com, 0 -zhibs.net, 0 -zhidx.com, 0 zhihedongfang.com, 0 -zhiku8.com, 0 -zhimei360.com, 0 -zhique.com, 0 zhisheji.com, 0 -zhitanska.com, 0 zhitouwang.cn, 0 zhiwei.li, 0 zhiwo.com, 0 -zhiyanblog.com, 0 zhizaoyun.com, 0 -zhizishe.com, 0 zhiziyun.com, 0 zhizuobiao.com, 0 zhjtong.com, 0 @@ -16600,52 +9409,36 @@ zhongan.com, 0 zhonganonline.com, 0 zhongguowangshi.com, 0 -zhongjiu.cn, 0 zhongye.net, 0 zhongziso.com, 0 -zhou92.com, 0 -zhoulujun.cn, 0 zhovner.com, 0 zhuang.ba, 0 zhuankezhijia.com, 0 zhuanyejun.com, 0 -zhuanyejun.net, 0 zhuatieba.com, 0 zhubaoleyuan.com, 0 -zhufaner.com, 0 -zhujike.com, 0 zhujiwu.me, 0 zhuna.cn, 0 zhushou001.com, 0 zhuwei.me, 0 zhuzi.me, 0 zhyk.ru, 0 -ziferblat.net, 0 zige.la, 0 ziguangcn.com, 0 -zigzag.kr, 0 -zijilai.com.cn, 0 zik.ua, 0 -zilanhua.com, 0 zilingo.com, 0 -zinceuro.sk, 0 -zionrd.com, 0 zip-anime.xyz, 0 -zip-area.com, 0 zipbob.net, 0 zip.ch, 0 ziping.ir, 0 zipy.co.il, 0 zitian.cn, 0 -ziwork.com, 0 -ziy.cc, 0 ziyonet.uz, 0 ziyoufang.com, 0 ziyuanmao.com, 0 zj.com, 0 zjds.gov.cn, 0 zjjt365.com, 0 -zjjw.com, 0 zjmax.com, 0 zjport.gov.cn, 0 zjsafety.gov.cn, 0 @@ -16655,103 +9448,59 @@ zju.tools, 0 zjzwfw.gov.cn, 0 zkteco.com, 0 -zkungfu.com, 0 -zlatmax.ru, 0 zlavadna.sk, 0 zlfund.cn, 0 -zlqh.com, 0 zlx3323.top, 0 zm123.com, 0 -zmap.io, 0 zmirrordemo.com, 0 zmodo.com, 0 -znakomstva.ru, 0 znaxyar.ru, 0 znds.com, 0 -znojmo.cz, 0 zntec.cn, 0 -zockerbuden.community, 0 -zoc-max.sk, 0 zodgame.us, 0 -zodio.com, 0 zol.com.cn, 0 -zomake.com, 0 zomro.com, 0 zonakz.net, 0 zonazvuka.ru, 0 zone-game.info, 0 -zoobax.com, 0 -zoo-bazar.com, 0 zoodshoor.com, 0 zoo.gr, 0 -zoolnews.com, 0 zoomlion.com, 0 zoomsquare.com, 0 -zoomsquare.de, 0 zoossoft.cn, 0 zori.pt, 0 zor.uz, 0 -zoublog.com, 0 -zoznamrealit.sk, 0 -zoznamtovaru.sk, 0 z-payment.com, 0 -z-payment.info, 0 zph.com.cn, 0 -zproxy.de, 0 -zpua.com.ua, 0 zqgame.com, 0 zqu.edu.cn, 0 zqzhibo.com, 0 -zrbao.com, 0 -zrss.si, 0 zryhyy.com.cn, 0 -zsben.cz, 0 zsedu.net, 0 zs.gov.cn, 0 zsnet.com, 0 -zsnso.ru, 0 zt.com, 0 ztedevice.com, 0 -z-telecom.net, 0 -z-terra.ru, 0 ztgame.com, 0 ztmao.com, 0 ztm.poznan.pl, 0 -ztydata.cn, 0 zuadr.com, 0 -zuanbank.com, 0 zu.edu.ua, 0 -zug4.me, 0 zugunder.com, 0 zuimc.com, 0 zun.com, 0 zupoec.com, 0 -zurich.at, 0 zust.edu.cn, 0 zveronline.ru, 0 -zvuk.me, 0 -zwettl.at, 0 -zwwysoft.com, 0 -zxcnw.com, 0 -zxc.science, 0 zxdl.pw, 0 -zxerp.com, 0 zx-pk.ru, 0 zxtsg.com, 0 -zxzxzx.info, 0 -zy127.com, 0 zycao.com, 0 -zychal.net, 0 zyctd.com, 0 -zye.cc, 0 zygames.com, 0 -zylsl.com, 0 -zyns.com, 0 zype.com, 0 zyq108.com, 0 -zyxel.by, 0 zyxr.com, 0 -zzidc.com, 0 zz.vc, 0 zzy.cn, 0 zzz.com.ua, 0
diff --git a/net/disk_cache/cache_util.cc b/net/disk_cache/cache_util.cc index 51ec95b..b71c1b46 100644 --- a/net/disk_cache/cache_util.cc +++ b/net/disk_cache/cache_util.cc
@@ -12,8 +12,8 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/task_scheduler/post_task.h" #include "base/threading/thread_restrictions.h" -#include "base/threading/worker_pool.h" namespace { @@ -136,8 +136,13 @@ return false; } - base::WorkerPool::PostTask( - FROM_HERE, base::Bind(&CleanupCallback, path, name_str), true); + base::PostTaskWithTraits( + FROM_HERE, base::TaskTraits() + .MayBlock() + .WithPriority(base::TaskPriority::BACKGROUND) + .WithShutdownBehavior( + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN), + base::Bind(&CleanupCallback, path, name_str)); return true; }
diff --git a/net/http2/hpack/decoder/hpack_block_decoder_test.cc b/net/http2/hpack/decoder/hpack_block_decoder_test.cc index 566963d..37e33da 100644 --- a/net/http2/hpack/decoder/hpack_block_decoder_test.cc +++ b/net/http2/hpack/decoder/hpack_block_decoder_test.cc
@@ -90,8 +90,7 @@ HpackEntryType::kIndexedLiteralHeader, false, "custom-key", false, "custom-header")); }; - EXPECT_TRUE( - DecodeHpackExampleAndValidateSeveralWays(R"( + const char hpack_example[] = R"( 40 | == Literal indexed == 0a | Literal name (len = 10) 6375 7374 6f6d 2d6b 6579 | custom-key @@ -99,8 +98,9 @@ 6375 7374 6f6d 2d68 6561 6465 72 | custom-header | -> custom-key: | custom-header - )", - ValidateDoneAndEmpty(do_check))); + )"; + EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays( + hpack_example, ValidateDoneAndEmpty(do_check))); EXPECT_TRUE(do_check()); } @@ -110,16 +110,16 @@ VERIFY_AND_RETURN_SUCCESS(collector_.ValidateSoleLiteralValueHeader( HpackEntryType::kUnindexedLiteralHeader, 4, false, "/sample/path")); }; - EXPECT_TRUE( - DecodeHpackExampleAndValidateSeveralWays(R"( + const char hpack_example[] = R"( 04 | == Literal not indexed == | Indexed name (idx = 4) | :path 0c | Literal value (len = 12) 2f73 616d 706c 652f 7061 7468 | /sample/path | -> :path: /sample/path - )", - ValidateDoneAndEmpty(do_check))); + )"; + EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays( + hpack_example, ValidateDoneAndEmpty(do_check))); EXPECT_TRUE(do_check()); } @@ -130,16 +130,16 @@ HpackEntryType::kNeverIndexedLiteralHeader, false, "password", false, "secret")); }; - EXPECT_TRUE( - DecodeHpackExampleAndValidateSeveralWays(R"( + const char hpack_example[] = R"( 10 | == Literal never indexed == 08 | Literal name (len = 8) 7061 7373 776f 7264 | password 06 | Literal value (len = 6) 7365 6372 6574 | secret | -> password: secret - )", - ValidateDoneAndEmpty(do_check))); + )"; + EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays( + hpack_example, ValidateDoneAndEmpty(do_check))); EXPECT_TRUE(do_check()); } @@ -148,13 +148,13 @@ NoArgValidator do_check = [this]() { VERIFY_AND_RETURN_SUCCESS(collector_.ValidateSoleIndexedHeader(2)); }; - EXPECT_TRUE( - DecodeHpackExampleAndValidateSeveralWays(R"( + const char hpack_example[] = R"( 82 | == Indexed - Add == | idx = 2 | -> :method: GET - )", - ValidateDoneAndEmpty(do_check))); + )"; + EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays( + hpack_example, ValidateDoneAndEmpty(do_check))); EXPECT_TRUE(do_check()); } // http://httpwg.org/specs/rfc7541.html#rfc.section.C.3.1
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc index cc842818..501eeb0 100644 --- a/net/nqe/network_quality_estimator.cc +++ b/net/nqe/network_quality_estimator.cc
@@ -20,6 +20,7 @@ #include "base/rand_util.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_tick_clock.h" @@ -154,12 +155,12 @@ return metric; } -void RecordRTTAccuracy(const char* prefix, +void RecordRTTAccuracy(base::StringPiece prefix, int32_t metric, base::TimeDelta measuring_duration, base::TimeDelta observed_rtt) { const std::string histogram_name = - base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix, + base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix.data(), metric >= 0 ? "Positive" : "Negative", static_cast<int32_t>(measuring_duration.InSeconds()), GetHistogramSuffixObservedRTT(observed_rtt)); @@ -345,6 +346,9 @@ // remain in sync with the suffixes specified in // tools/metrics/histograms/histograms.xml. accuracy_recording_intervals_.push_back(base::TimeDelta::FromSeconds(15)); + + for (int i = 0; i < STATISTIC_LAST; ++i) + http_rtt_at_last_main_frame_[i] = nqe::internal::InvalidRTT(); } void NetworkQualityEstimator::ObtainOperatingParams( @@ -425,6 +429,13 @@ effective_connection_type_at_last_main_frame_ = effective_connection_type_; estimated_quality_at_last_main_frame_ = network_quality_; + // Record the HTTP at the last main frame for experimental statistics. + for (int i = 0; i < STATISTIC_LAST; ++i) { + http_rtt_at_last_main_frame_[i] = GetRTTEstimateInternal( + disallowed_observation_sources_for_http_, base::TimeTicks(), + static_cast<Statistic>(i), 50); + } + // Post the tasks which will run in the future and record the estimation // accuracy based on the observations received between now and the time of // task execution. Posting the task at different intervals makes it @@ -515,6 +526,25 @@ return; base::TimeDelta recent_http_rtt; + + // Record the HTTP prediction accuracy for experimental statistics. + for (int i = 0; i < STATISTIC_LAST; ++i) { + recent_http_rtt = GetRTTEstimateInternal( + disallowed_observation_sources_for_http_, last_main_frame_request_, + static_cast<Statistic>(i), 50); + if (recent_http_rtt != nqe::internal::InvalidRTT() && + http_rtt_at_last_main_frame_[i] != nqe::internal::InvalidRTT()) { + int estimated_observed_diff_milliseconds = + http_rtt_at_last_main_frame_[i].InMilliseconds() - + recent_http_rtt.InMilliseconds(); + + std::string histogram_name = + base::StringPrintf("NQE.%s.Accuracy.HttpRTT", GetNameForStatistic(i)); + RecordRTTAccuracy(histogram_name, estimated_observed_diff_milliseconds, + measuring_duration, recent_http_rtt); + } + } + if (!GetRecentHttpRTT(last_main_frame_request_, &recent_http_rtt)) recent_http_rtt = nqe::internal::InvalidRTT(); @@ -850,6 +880,10 @@ if (!ReadCachedNetworkQualityEstimate()) AddDefaultEstimates(); estimated_quality_at_last_main_frame_ = nqe::internal::NetworkQuality(); + + for (int i = 0; i < STATISTIC_LAST; ++i) + http_rtt_at_last_main_frame_[i] = nqe::internal::InvalidRTT(); + throughput_analyzer_->OnConnectionTypeChanged(); MaybeComputeEffectiveConnectionType(); } @@ -908,8 +942,9 @@ // Add the remaining percentile values. static const int kPercentiles[] = {0, 10, 90, 100}; for (size_t i = 0; i < arraysize(kPercentiles); ++i) { - rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_, - base::TimeTicks(), kPercentiles[i]); + rtt = GetRTTEstimateInternal( + disallowed_observation_sources_for_http_, base::TimeTicks(), + base::Optional<Statistic>(), kPercentiles[i]); rtt_percentile = GetHistogram( "RTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", @@ -927,9 +962,9 @@ // Add the remaining percentile values. static const int kPercentiles[] = {0, 10, 90, 100}; for (size_t i = 0; i < arraysize(kPercentiles); ++i) { - rtt = - GetRTTEstimateInternal(disallowed_observation_sources_for_transport_, - base::TimeTicks(), kPercentiles[i]); + rtt = GetRTTEstimateInternal( + disallowed_observation_sources_for_transport_, base::TimeTicks(), + base::Optional<Statistic>(), kPercentiles[i]); transport_rtt_percentile = GetHistogram( "TransportRTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", @@ -1010,6 +1045,16 @@ effective_connection_type_histogram->Add( effective_connection_type_at_last_main_frame_); + + // Record the HTTP RTT at the main frames for experimental statistics. + for (int i = 0; i < STATISTIC_LAST; ++i) { + if (http_rtt_at_last_main_frame_[i] != nqe::internal::InvalidRTT()) { + base::HistogramBase* rtt_histogram = base::Histogram::FactoryGet( + base::StringPrintf("NQE.%s.MainFrame.RTT", GetNameForStatistic(i)), 1, + 10 * 1000, 50, base::HistogramBase::kUmaTargetedHistogramFlag); + rtt_histogram->Add(http_rtt_at_last_main_frame_[i].InMilliseconds()); + } + } } void NetworkQualityEstimator::ComputeEffectiveConnectionType() { @@ -1285,7 +1330,7 @@ base::TimeDelta* rtt) const { DCHECK(thread_checker_.CalledOnValidThread()); *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_, - start_time, 50); + start_time, base::Optional<Statistic>(), 50); return (*rtt != nqe::internal::InvalidRTT()); } @@ -1294,7 +1339,7 @@ base::TimeDelta* rtt) const { DCHECK(thread_checker_.CalledOnValidThread()); *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_transport_, - start_time, 50); + start_time, base::Optional<Statistic>(), 50); return (*rtt != nqe::internal::InvalidRTT()); } @@ -1309,19 +1354,46 @@ base::TimeDelta NetworkQualityEstimator::GetRTTEstimateInternal( const std::vector<NetworkQualityObservationSource>& disallowed_observation_sources, - const base::TimeTicks& start_time, + base::TimeTicks start_time, + const base::Optional<Statistic>& statistic, int percentile) const { DCHECK(thread_checker_.CalledOnValidThread()); // RTT observations are sorted by duration from shortest to longest, thus // a higher percentile RTT will have a longer RTT than a lower percentile. base::TimeDelta rtt = nqe::internal::InvalidRTT(); - if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt, - percentile, - disallowed_observation_sources)) { - return nqe::internal::InvalidRTT(); + + if (!statistic) { + // Use default statistic algorithm. + if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt, + percentile, + disallowed_observation_sources)) { + return nqe::internal::InvalidRTT(); + } + return rtt; } - return rtt; + + switch (statistic.value()) { + case STATISTIC_LAST: + NOTREACHED(); + return nqe::internal::InvalidRTT(); + case STATISTIC_WEIGHTED_AVERAGE: + if (!rtt_observations_.GetWeightedAverage( + start_time, signal_strength_dbm_, disallowed_observation_sources, + &rtt)) { + return nqe::internal::InvalidRTT(); + } + return rtt; + case STATISTIC_UNWEIGHTED_AVERAGE: + if (!rtt_observations_.GetUnweightedAverage( + start_time, signal_strength_dbm_, disallowed_observation_sources, + &rtt)) { + return nqe::internal::InvalidRTT(); + } + return rtt; + } + NOTREACHED(); + return nqe::internal::InvalidRTT(); } int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal( @@ -1730,4 +1802,19 @@ ComputeEffectiveConnectionType(); } +const char* NetworkQualityEstimator::GetNameForStatistic(int i) const { + Statistic statistic = static_cast<Statistic>(i); + switch (statistic) { + case STATISTIC_WEIGHTED_AVERAGE: + return "WeightedAverage"; + case STATISTIC_UNWEIGHTED_AVERAGE: + return "UnweightedAverage"; + case STATISTIC_LAST: + NOTREACHED(); + return ""; + } + NOTREACHED(); + return ""; +} + } // namespace net
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h index e003654b..696e9b0 100644 --- a/net/nqe/network_quality_estimator.h +++ b/net/nqe/network_quality_estimator.h
@@ -17,6 +17,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +#include "base/optional.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "net/base/net_export.h" @@ -320,6 +321,15 @@ bool add_default_platform_observations, const NetLogWithSource& net_log); + // Different experimental statistic algorithms that can be used for computing + // the predictions. + enum Statistic { + STATISTIC_WEIGHTED_AVERAGE = 0, + STATISTIC_UNWEIGHTED_AVERAGE = 1, + // Last statistic. Not to be used. + STATISTIC_LAST = 2 + }; + // NetworkChangeNotifier::ConnectionTypeObserver implementation: void OnConnectionTypeChanged( NetworkChangeNotifier::ConnectionType type) override; @@ -385,6 +395,27 @@ void OnUpdatedRTTAvailable(SocketPerformanceWatcherFactory::Protocol protocol, const base::TimeDelta& rtt); + // Returns an estimate of network quality at the specified |percentile|. + // |disallowed_observation_sources| is the list of observation sources that + // should be excluded when computing the percentile. + // Only the observations later than |start_time| are taken into account. + // |percentile| must be between 0 and 100 (both inclusive) with higher + // percentiles indicating less performant networks. For example, if + // |percentile| is 90, then the network is expected to be faster than the + // returned estimate with 0.9 probability. Similarly, network is expected to + // be slower than the returned estimate with 0.1 probability. |statistic| + // is the statistic that should be used for computing the estimate. If unset, + // the default statistic is used. Virtualized for testing. + virtual base::TimeDelta GetRTTEstimateInternal( + const std::vector<NetworkQualityObservationSource>& + disallowed_observation_sources, + base::TimeTicks start_time, + const base::Optional<Statistic>& statistic, + int percentile) const; + int32_t GetDownlinkThroughputKbpsEstimateInternal( + const base::TimeTicks& start_time, + int percentile) const; + private: FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, AdaptiveRecomputationEffectiveConnectionType); @@ -483,24 +514,6 @@ // current connection type to the observation buffer. void AddDefaultEstimates(); - // Returns an estimate of network quality at the specified |percentile|. - // |disallowed_observation_sources| is the list of observation sources that - // should be excluded when computing the percentile. - // Only the observations later than |start_time| are taken into account. - // |percentile| must be between 0 and 100 (both inclusive) with higher - // percentiles indicating less performant networks. For example, if - // |percentile| is 90, then the network is expected to be faster than the - // returned estimate with 0.9 probability. Similarly, network is expected to - // be slower than the returned estimate with 0.1 probability. - base::TimeDelta GetRTTEstimateInternal( - const std::vector<NetworkQualityObservationSource>& - disallowed_observation_sources, - const base::TimeTicks& start_time, - int percentile) const; - int32_t GetDownlinkThroughputKbpsEstimateInternal( - const base::TimeTicks& start_time, - int percentile) const; - // Returns the current network ID checking by calling the platform APIs. // Virtualized for testing. virtual nqe::internal::NetworkID GetCurrentNetworkID() const; @@ -606,6 +619,8 @@ const nqe::internal::NetworkID& network_id, const nqe::internal::CachedNetworkQuality& cached_network_quality); + const char* GetNameForStatistic(int i) const; + // Determines if the requests to local host can be used in estimating the // network quality. Set to true only for tests. bool use_localhost_requests_; @@ -689,6 +704,10 @@ nqe::internal::NetworkQuality estimated_quality_at_last_main_frame_; EffectiveConnectionType effective_connection_type_at_last_main_frame_; + // Estimated RTT at HTTP layer when the last main frame transaction was + // started. Computed using different statistics. + base::TimeDelta http_rtt_at_last_main_frame_[STATISTIC_LAST]; + // Estimated network quality obtained from external estimate provider when the // external estimate provider was last queried. nqe::internal::NetworkQuality external_estimate_provider_quality_;
diff --git a/net/nqe/network_quality_estimator_test_util.cc b/net/nqe/network_quality_estimator_test_util.cc index 000df14..dc8e28b 100644 --- a/net/nqe/network_quality_estimator_test_util.cc +++ b/net/nqe/network_quality_estimator_test_util.cc
@@ -182,6 +182,19 @@ kbps); } +base::TimeDelta TestNetworkQualityEstimator::GetRTTEstimateInternal( + const std::vector<NetworkQualityObservationSource>& + disallowed_observation_sources, + base::TimeTicks start_time, + const base::Optional<NetworkQualityEstimator::Statistic>& statistic, + int percentile) const { + if (rtt_estimate_internal_) + return rtt_estimate_internal_.value(); + + return NetworkQualityEstimator::GetRTTEstimateInternal( + disallowed_observation_sources, start_time, statistic, percentile); +} + void TestNetworkQualityEstimator::SetAccuracyRecordingIntervals( const std::vector<base::TimeDelta>& accuracy_recording_intervals) { accuracy_recording_intervals_set_ = true;
diff --git a/net/nqe/network_quality_estimator_test_util.h b/net/nqe/network_quality_estimator_test_util.h index 64770daf5f..4718a477 100644 --- a/net/nqe/network_quality_estimator_test_util.h +++ b/net/nqe/network_quality_estimator_test_util.h
@@ -168,6 +168,20 @@ bool GetRecentDownlinkThroughputKbps(const base::TimeTicks& start_time, int32_t* kbps) const override; + // Returns the recent HTTP RTT value that was set using + // |set_rtt_estimate_internal|. If it has not been set, then the base + // implementation is called. + base::TimeDelta GetRTTEstimateInternal( + const std::vector<NetworkQualityObservationSource>& + disallowed_observation_sources, + base::TimeTicks start_time, + const base::Optional<NetworkQualityEstimator::Statistic>& statistic, + int percentile) const override; + + void set_rtt_estimate_internal(base::TimeDelta value) { + rtt_estimate_internal_ = value; + } + void SetAccuracyRecordingIntervals( const std::vector<base::TimeDelta>& accuracy_recording_intervals); @@ -234,6 +248,9 @@ base::Optional<int32_t> start_time_null_downlink_throughput_kbps_; base::Optional<int32_t> recent_downlink_throughput_kbps_; + // If set, GetRTTEstimateInternal() would return the set value. + base::Optional<base::TimeDelta> rtt_estimate_internal_; + double rand_double_; LocalHttpTestServer embedded_test_server_;
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc index 55e3825..4c68ae0 100644 --- a/net/nqe/network_quality_estimator_unittest.cc +++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -18,6 +18,7 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_samples.h" +#include "base/optional.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/histogram_tester.h" @@ -300,6 +301,8 @@ // Verify that metrics are logged correctly on main-frame requests. histogram_tester.ExpectTotalCount("NQE.MainFrame.RTT.Percentile50", 1); + histogram_tester.ExpectTotalCount("NQE.WeightedAverage.MainFrame.RTT", 1); + histogram_tester.ExpectTotalCount("NQE.UnweightedAverage.MainFrame.RTT", 1); histogram_tester.ExpectTotalCount("NQE.MainFrame.RTT.Percentile50.Unknown", 1); histogram_tester.ExpectTotalCount("NQE.MainFrame.TransportRTT.Percentile50", @@ -546,8 +549,7 @@ context.set_network_quality_estimator(&estimator); context.Init(); - // Push more observations than the maximum buffer size. - const size_t kMaxObservations = 1000; + const size_t kMaxObservations = 10; for (size_t i = 0; i < kMaxObservations; ++i) { std::unique_ptr<URLRequest> request(context.CreateRequest( estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate)); @@ -579,8 +581,9 @@ NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC); EXPECT_EQ(nqe::internal::InvalidRTT(), - estimator.GetRTTEstimateInternal(disallowed_observation_sources, - base::TimeTicks(), 100)); + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + base::Optional<NetworkQualityEstimator::Statistic>(), 100)); EXPECT_EQ(nqe::internal::kInvalidThroughput, estimator.GetDownlinkThroughputKbpsEstimateInternal( base::TimeTicks(), 100)); @@ -590,8 +593,7 @@ context.set_network_quality_estimator(&estimator); context.Init(); - // Number of observations are more than the maximum buffer size. - for (size_t i = 0; i < 1000U; ++i) { + for (size_t i = 0; i < 10U; ++i) { std::unique_ptr<URLRequest> request(context.CreateRequest( estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate)); request->Start(); @@ -603,8 +605,9 @@ EXPECT_GT(estimator.GetDownlinkThroughputKbpsEstimateInternal( base::TimeTicks(), i), 0); - EXPECT_LT(estimator.GetRTTEstimateInternal(disallowed_observation_sources, - base::TimeTicks(), i), + EXPECT_LT(estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + base::Optional<NetworkQualityEstimator::Statistic>(), i), base::TimeDelta::Max()); if (i != 0) { @@ -614,11 +617,30 @@ estimator.GetDownlinkThroughputKbpsEstimateInternal( base::TimeTicks(), i - 1)); + // Weighted average statistic should be computed correctly. + EXPECT_NE(nqe::internal::InvalidRTT(), + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i)); + + // Weighted average statistic should disregard the value of the percentile + // argument. + EXPECT_EQ( + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i), + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i - 1)); + // RTT percentiles are in increasing order. - EXPECT_GE(estimator.GetRTTEstimateInternal(disallowed_observation_sources, - base::TimeTicks(), i), - estimator.GetRTTEstimateInternal(disallowed_observation_sources, - base::TimeTicks(), i - 1)); + EXPECT_GE( + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + base::Optional<NetworkQualityEstimator::Statistic>(), i), + estimator.GetRTTEstimateInternal( + disallowed_observation_sources, base::TimeTicks(), + base::Optional<NetworkQualityEstimator::Statistic>(), i - 1)); } } } @@ -2299,6 +2321,7 @@ // Network was predicted to be slow and actually was slow. estimator.set_start_time_null_http_rtt(test.rtt); estimator.set_recent_http_rtt(test.recent_rtt); + estimator.set_rtt_estimate_internal(test.recent_rtt); estimator.set_start_time_null_transport_rtt(test.rtt); estimator.set_recent_transport_rtt(test.recent_rtt); estimator.set_start_time_null_downlink_throughput_kbps( @@ -2394,6 +2417,21 @@ rtt_sign_suffix_with_zero_samples + "." + interval_value + ".300_620", 0); + + // All samples are recorded in bucket 0 because recent HTTP RTT and + // HTTP RTT are equal when weighted or unweighted average algorithms are + // used. + histogram_tester.ExpectUniqueSample( + "NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff." + "Positive." + + interval_value + ".300_620", + 0, 1); + histogram_tester.ExpectUniqueSample( + "NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff." + "Positive." + + interval_value + ".300_620", + 0, 1); + histogram_tester.ExpectUniqueSample( "NQE.Accuracy.TransportRTT.EstimatedObservedDiff." + rtt_sign_suffix_with_one_sample + "." + interval_value +
diff --git a/net/quic/core/congestion_control/windowed_filter.h b/net/quic/core/congestion_control/windowed_filter.h index 4511649..0d56cfd 100644 --- a/net/quic/core/congestion_control/windowed_filter.h +++ b/net/quic/core/congestion_control/windowed_filter.h
@@ -90,7 +90,14 @@ if (Compare()(new_sample, estimates_[1].sample)) { estimates_[1] = Sample(new_sample, new_time); estimates_[2] = estimates_[1]; +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-overflow" +#endif } else if (Compare()(new_sample, estimates_[2].sample)) { +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif estimates_[2] = Sample(new_sample, new_time); }
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index 69c4a21..9315364 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -481,33 +481,33 @@ scoped_refptr<X509Certificate> SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const { - // DER-encode the chain and convert to a platform certificate handle. - std::vector<std::string> chain; - chain.reserve(sk_X509_num(openssl_chain_.get())); - for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { - X509* x = sk_X509_value(openssl_chain_.get(), i); - // Note: This intentionally avoids using x509_util::GetDER(), which may - // cache the encoded DER on |x|, as |x| is shared with the underlying - // socket (SSL*) this chain belongs to. As the DER will only be used - // once in //net, within this code, this avoids needlessly caching - // additional data. See https://crbug.com/642082 - int len = i2d_X509(x, nullptr); - if (len < 0) - return nullptr; - std::string cert; - uint8_t* ptr = reinterpret_cast<uint8_t*>(base::WriteInto(&cert, len + 1)); - len = i2d_X509(x, &ptr); - if (len < 0) { - NOTREACHED(); - return nullptr; - } - chain.push_back(std::move(cert)); +#if defined(USE_OPENSSL_CERTS) + // When OSCertHandle is typedef'ed to X509, this implementation does a short + // cut to avoid converting back and forth between DER and the X509 struct. + X509Certificate::OSCertHandles intermediates; + for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) { + X509* cert = sk_X509_value(openssl_chain_.get(), i); + DCHECK(cert->buf); + intermediates.push_back(cert); } - std::vector<base::StringPiece> stringpiece_chain; - for (const auto& cert : chain) - stringpiece_chain.push_back(cert); - return X509Certificate::CreateFromDERCertChain(stringpiece_chain); + X509* leaf = sk_X509_value(openssl_chain_.get(), 0); + DCHECK(leaf->buf); + return X509Certificate::CreateFromHandle(leaf, intermediates); +#else + // Convert the certificate chains to a platform certificate handle. + std::vector<base::StringPiece> der_chain; + der_chain.reserve(sk_X509_num(openssl_chain_.get())); + for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { + X509* cert = sk_X509_value(openssl_chain_.get(), i); + DCHECK(cert->buf); + base::StringPiece der; + if (!x509_util::GetDER(cert, &der)) + return nullptr; + der_chain.push_back(der); + } + return X509Certificate::CreateFromDERCertChain(der_chain); +#endif } // static
diff --git a/remoting/host/security_key/fake_security_key_ipc_server.cc b/remoting/host/security_key/fake_security_key_ipc_server.cc index 561ed31..e47ff23 100644 --- a/remoting/host/security_key/fake_security_key_ipc_server.cc +++ b/remoting/host/security_key/fake_security_key_ipc_server.cc
@@ -130,7 +130,7 @@ ipc_server_map_[connection_id] = fake_ipc_server->AsWeakPtr(); - return fake_ipc_server; + return std::move(fake_ipc_server); } base::WeakPtr<FakeSecurityKeyIpcServer>
diff --git a/skia/ext/skia_utils_base.cc b/skia/ext/skia_utils_base.cc index c56730b..041c4c7 100644 --- a/skia/ext/skia_utils_base.cc +++ b/skia/ext/skia_utils_base.cc
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "skia/ext/skia_utils_base.h" + #include <stdint.h> -#include "skia/ext/skia_utils_base.h" -#include "third_party/skia/include/core/SkFontLCDConfig.h" +#include "base/pickle.h" namespace skia { @@ -76,30 +77,4 @@ pickle->WriteUInt16(style.slant()); } -SkPixelGeometry ComputeDefaultPixelGeometry() { - SkFontLCDConfig::LCDOrder order = SkFontLCDConfig::GetSubpixelOrder(); - if (SkFontLCDConfig::kNONE_LCDOrder == order) { - return kUnknown_SkPixelGeometry; - } - - // Bit0 is RGB(0), BGR(1) - // Bit1 is H(0), V(1) - const SkPixelGeometry gGeo[] = { - kRGB_H_SkPixelGeometry, - kBGR_H_SkPixelGeometry, - kRGB_V_SkPixelGeometry, - kBGR_V_SkPixelGeometry, - }; - int index = 0; - if (SkFontLCDConfig::kBGR_LCDOrder == order) { - index |= 1; - } - if (SkFontLCDConfig::kVertical_LCDOrientation == - SkFontLCDConfig::GetSubpixelOrientation()) { - index |= 2; - } - return gGeo[index]; -} - } // namespace skia -
diff --git a/skia/ext/skia_utils_base.h b/skia/ext/skia_utils_base.h index 6af5cf74..82da02b2 100644 --- a/skia/ext/skia_utils_base.h +++ b/skia/ext/skia_utils_base.h
@@ -5,9 +5,12 @@ #ifndef SKIA_EXT_SKIA_UTILS_BASE_H_ #define SKIA_EXT_SKIA_UTILS_BASE_H_ -#include "base/pickle.h" #include "third_party/skia/include/ports/SkFontConfigInterface.h" -#include "third_party/skia/include/core/SkSurfaceProps.h" + +namespace base { +class Pickle; +class PickleIterator; +} namespace skia { @@ -35,10 +38,6 @@ // Return true if str can be written into the request pickle. SK_API bool WriteSkFontStyle(base::Pickle* pickle, SkFontStyle style); -// Determine the default pixel geometry (for LCD) by querying the font host -SK_API SkPixelGeometry ComputeDefaultPixelGeometry(); - } // namespace skia #endif // SKIA_EXT_SKIA_UTILS_BASE_H_ -
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 770e11d..4f74778b 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -1201,6 +1201,9 @@ "test": "chrome_junit_tests" }, { + "test": "components_gcm_driver_junit_tests" + }, + { "test": "components_invalidation_impl_junit_tests" }, { @@ -2445,6 +2448,9 @@ "test": "chrome_junit_tests" }, { + "test": "components_gcm_driver_junit_tests" + }, + { "test": "components_invalidation_impl_junit_tests" }, {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index c5a6d2c..fd088c3 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -320,6 +320,10 @@ "label": "//components:components_browsertests", "type": "windowed_test_launcher", }, + "components_gcm_driver_junit_tests": { + "label": "//components/gcm_driver/android:components_gcm_driver_junit_tests", + "type": "junit_test", + }, "components_invalidation_impl_junit_tests": { "label": "//components/invalidation/impl:components_invalidation_impl_junit_tests", "type": "junit_test",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py index 3312cdd..3c617688 100755 --- a/testing/buildbot/manage.py +++ b/testing/buildbot/manage.py
@@ -160,6 +160,7 @@ # These are listed in Builders that are skipped for other reasons. 'chrome_junit_tests', + 'components_gcm_driver_junit_tests', 'components_invalidation_impl_junit_tests', 'components_policy_junit_tests', 'components_variations_junit_tests',
diff --git a/testing/libfuzzer/tests/fuzzer_launcher_test.cc b/testing/libfuzzer/tests/fuzzer_launcher_test.cc index 625a821..bd7cbc3 100644 --- a/testing/libfuzzer/tests/fuzzer_launcher_test.cc +++ b/testing/libfuzzer/tests/fuzzer_launcher_test.cc
@@ -23,7 +23,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd({{launcher_path, "test_dict_only.options"}}); + base::CommandLine cmd( + std::vector<std::string>({launcher_path, "test_dict_only.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString( @@ -43,7 +44,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd({{launcher_path, "test_config_only.options"}}); + base::CommandLine cmd( + std::vector<std::string>({launcher_path, "test_config_only.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString( @@ -64,7 +66,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd({{launcher_path, "test_config_and_dict.options"}}); + base::CommandLine cmd(std::vector<std::string>( + {launcher_path, "test_config_and_dict.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString( @@ -87,8 +90,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd( - {{launcher_path, "test_config_and_seed_corpus.options"}}); + base::CommandLine cmd(std::vector<std::string>( + {launcher_path, "test_config_and_seed_corpus.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString( @@ -103,8 +106,8 @@ launcher_path = exe_path.DirName().Append("check_seed_corpus_archive.py").value(); - cmd = base::CommandLine( - {{launcher_path, "test_config_and_seed_corpus_seed_corpus.zip"}}); + cmd = base::CommandLine(std::vector<std::string>( + {launcher_path, "test_config_and_seed_corpus_seed_corpus.zip"})); success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> seed_corpus_info = base::SplitString( @@ -123,8 +126,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd( - {{launcher_path, "test_config_and_seed_corpuses.options"}}); + base::CommandLine cmd(std::vector<std::string>( + {launcher_path, "test_config_and_seed_corpuses.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString( @@ -139,8 +142,8 @@ launcher_path = exe_path.DirName().Append("check_seed_corpus_archive.py").value(); - cmd = base::CommandLine( - {{launcher_path, "test_config_and_seed_corpuses_seed_corpus.zip"}}); + cmd = base::CommandLine(std::vector<std::string>( + {launcher_path, "test_config_and_seed_corpuses_seed_corpus.zip"})); success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> seed_corpus_info = base::SplitString( @@ -159,7 +162,8 @@ exe_path.DirName().Append("check_fuzzer_config.py").value(); std::string output; - base::CommandLine cmd({{launcher_path, "test_dict_from_subdir.options"}}); + base::CommandLine cmd(std::vector<std::string>( + {launcher_path, "test_dict_from_subdir.options"})); bool success = base::GetAppOutputAndError(cmd, &output); EXPECT_TRUE(success); std::vector<std::string> fuzzer_args = base::SplitString(
diff --git a/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html b/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html index 99122ff9..52f83d5 100644 --- a/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html +++ b/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html
@@ -1,45 +1,59 @@ -<html> -<head> - -<style> -.editing { - border: 2px solid red; - padding: 12px; - font-size: 24px; -} -</style> -<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script> - +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> <script> +test(() => assert_selection( + [ + '<div contenteditable>', + 'One', + '<div>', + '|Two<br>', + '<div>Three<br></div>', + '</div>', + 'Four', + '</div>' + ].join(''), + 'delete', + [ + '<div contenteditable>', + 'One|Two', + '<div>', + '<div>Three<br></div>', + '</div>', + 'Four', + '</div>' + ].join('')), 'First merge'); -function editingTest() { - for (i = 0; i < 4; i++) - moveSelectionForwardByCharacterCommand(); - deleteCommand(); - for (i = 0; i < 4; i++) - moveSelectionForwardByCharacterCommand(); - deleteCommand(); - for (i = 0; i < 6; i++) - moveSelectionForwardByCharacterCommand(); - deleteCommand(); -} +test(() => assert_selection( + [ + '<div contenteditable>', + 'OneTwo', + '<div>', + '<div>|Three<br></div>', + '</div>', + 'Four', + '</div>' + ].join(''), + 'delete', + [ + '<div contenteditable>', + 'OneTwo|Three<br>', + 'Four', + '</div>' + ].join('')), 'Second merge'); +test(() => assert_selection( + [ + '<div contenteditable>', + 'OneTwoThree<br>', + '|Four', + '</div>' + ].join(''), + 'delete', + [ + '<div contenteditable>', + 'OneTwoThree|Four', + '</div>' + ].join('')), 'Third merge'); </script> - -<title>Editing Test</title> -</head> -<body> -<div contenteditable id="root" class="editing"> -<div id="test"> -One -<div>Two<br><div>Three<br></div></div> -Four -</div> -</div> - -<script> -runEditingTest(); -</script> - -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html index 325c68bf0..65c3adc 100644 --- a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html +++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html
@@ -1,35 +1,24 @@ -<html> -<head> - -<style> -.editing { - border: 2px solid red; - padding: 12px; - font-size: 24px; -} -</style> -<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script> - +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> <script> - -function editingTest() { - for (i = 0; i < 2; i++) - moveSelectionForwardByCharacterCommand(); - typeCharacterCommand(); -} - +test(() => assert_selection( + [ + '<div contenteditable>', + 'a', + '<span class="Apple-tab-span" style="white-space:pre"> | </span>', + 'z', + '</div>' + ].join(''), + 'insertText x', + [ + '<div contenteditable>', + 'a', + '<span class="Apple-tab-span" style="white-space:pre"> </span>', + 'x|', + '<span class="Apple-tab-span" style="white-space:pre"> </span>', + 'z', + '</div>' + ].join('')), 'Insert text in tabspan'); </script> - -<title>Editing Test</title> -</head> -<body style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "> -<div contenteditable id="root" class="editing"> -<span id="test">a<span class="Apple-tab-span" style="white-space:pre"> </span>z</span> -</div> - -<script> -runEditingTest(); -</script> - -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt deleted file mode 100644 index f265278..0000000 --- a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification - -You should see a\tax\t\tz below: -| " -" -| <span> -| id="test" -| "a" -| <span> -| class="Apple-tab-span" -| style="white-space:pre" -| " " -| "ax<#selection-caret>" -| <span> -| class="Apple-tab-span" -| style="white-space:pre" -| " " -| "z" -| " -"
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html index b2b847b2..679908e 100644 --- a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html +++ b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html
@@ -1,29 +1,33 @@ -<!DOCTYPE html> -<html> -<body style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "> -<div contenteditable id="root" style="border: 2px solid red; padding: 12px; font-size: 24px"> -<span id="test">a<span class="Apple-tab-span" style="white-space:pre"> </span>z</span> -</div> -<script src="../editing.js"></script> -<script src="../../resources/dump-as-markup.js"></script> +<!doctype html> +<head> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> <script> +test(() => { + assert_not_equals(window.internals, undefined, + 'This test requires clipboard access'); -var test = document.getElementById('test'); -test.focus(); -window.getSelection().collapse(test, 0); - -if (window.testRunner) - testRunner.dumpEditingCallbacks(); - -extendSelectionForwardByCharacterCommand(); -copyCommand(); -for (i = 0; i < 2; i++) - moveSelectionForwardByCharacterCommand(); -pasteCommand(); -typeCharacterCommand(); - -Markup.dump('root', 'You should see a\\tax\\t\\tz below'); - + assert_selection( + [ + '<div contenteditable>', + 'a', + '<span class="Apple-tab-span" style="white-space:pre"> | </span>', + 'z', + '</div>' + ].join(''), + selection => { + selection.setClipboardData('a'); + selection.document.execCommand('paste'); + }, + [ + '<div contenteditable>', + 'a', + '<span class="Apple-tab-span" style="white-space:pre"> </span>', + 'a|', + '<span class="Apple-tab-span" style="white-space:pre"> </span>', + 'z', + '</div>' + ].join('')); +}, 'Paste text in tabspan'); </script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html b/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html index 05fe9f1..bff2f4c 100644 --- a/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html +++ b/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html
@@ -1,19 +1,15 @@ +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> <script> -if (window.testRunner) - testRunner.dumpEditingCallbacks(); -</script> -<body> -<p>This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into. You should see "Hello[black box] World!" below.</p> -<div id="test" contenteditable="true">Hello World!</div> -</body> - -<script> -if (window.internals) - internals.settings.setEditingBehavior('mac'); -var s = window.getSelection(); -s.collapse(document.getElementById("test"), 0); - -s.modify("move", "forward", "word"); - -document.execCommand("InsertHTML", false, "<object style='border: 1px solid #aaa;'></object>"); +test(() => assert_selection( + '<div contenteditable>Hello| World!</div>', + 'insertHTML <object style="border: 1px solid #aaa;"></object>', + [ + '<div contenteditable>', + 'Hello<object style="border: 1px solid #aaa;"></object>|\u00A0World!', + '</div>' + ].join('')), + 'Paste object'); </script>
diff --git a/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html b/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html new file mode 100644 index 0000000..537b68bd --- /dev/null +++ b/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html
@@ -0,0 +1,20 @@ +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> +<script> +test(() => assert_selection( + [ + '<div contenteditable>', + 'here is <i>^some</i> text<br>', + 'here| is some more text', + '</div>' + ].join(''), + 'bold', + [ + '<div contenteditable>', + 'here is <b><i>^some</i> text<br>', + 'here|</b> is some more text', + '</div>' + ].join('')), 'Bold with itatic and line break'); +</script>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt b/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt deleted file mode 100644 index 1a5be74..0000000 --- a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt +++ /dev/null
@@ -1,29 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -here is some text -here is some more text -execBoldCommand: <span id="test">here is <b><i>some</i> text<br>here</b> is some more text</span>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html b/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html deleted file mode 100644 index 8d47caa93..0000000 --- a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html +++ /dev/null
@@ -1,38 +0,0 @@ -<html> -<head> -<style> -.editing { - border: 2px solid red; - padding: 12px; - font-size: 24px; -} -</style> -<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script> - -<script> - -function editingTest() { - for (i = 0; i < 8; i++) { - moveSelectionForwardByCharacterCommand(); - } - for (i = 0; i < 14; i++) { - extendSelectionForwardByCharacterCommand(); - } - execBoldCommand(); -} - -</script> - -<title>Editing Test</title> -</head> -<body> -<div contenteditable id="root" class="editing"> -<span id="test">here is <i>some</i> text<br>here is some more text</span> -</div> - -<script> -runDumpAsTextEditingTest(true); -</script> - -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html b/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html deleted file mode 100644 index 845fee1..0000000 --- a/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html +++ /dev/null
@@ -1,70 +0,0 @@ -<html> -<head> - -<style> -.editing { - border: 2px solid red; -} -.explanation { - border: 2px solid blue; - padding: 12px; - font-size: 24px; - margin-bottom: 24px; -} -.scenario { margin-bottom: 16px;} -.scenario:first-line { font-weight: bold; margin-bottom: 16px;} -.expected-results:first-line { font-weight: bold } -</style> -<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script> - -<script> -if (window.internals) - internals.settings.setEditingBehavior('mac'); - -function editingTest() { - moveSelectionForwardByLineCommand(); - boldCommand(); - typeCharacterCommand(' '); - typeCharacterCommand('f'); - typeCharacterCommand('o'); - typeCharacterCommand('u'); - typeCharacterCommand('r'); - moveSelectionBackwardByLineCommand(); - extendSelectionForwardByWordCommand(); - copyCommand(); - moveSelectionForwardByWordCommand(); - moveSelectionForwardByWordCommand(); - moveSelectionForwardByWordCommand(); - pasteCommand(); -} - -</script> - -<title>Editing Test</title> -</head> -<body> - -<div class="explanation"> -<div class="scenario"> -Tests: -<br> -Pasting at style boundary does not crash or produce empty style span(s). -</div> -<div class="expected-results"> -Expected Results: -<br> -Should see this content in the red box below: -<br><div>one two three <b>four</b>one</div> -</div> -</div> - -<div contenteditable id="root"> -<div id="test" class="editing">one two three</div> -</div> - -<script> -runEditingTest(); -</script> - -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style_boundary.html b/third_party/WebKit/LayoutTests/editing/style/style_boundary.html index ec063ff..57ecf59e 100644 --- a/third_party/WebKit/LayoutTests/editing/style/style_boundary.html +++ b/third_party/WebKit/LayoutTests/editing/style/style_boundary.html
@@ -61,4 +61,25 @@ '</div>' ].join('')), 'B element should not spread beyond DIV'); + + test(() => { + assert_not_equals(window.internals, undefined, + 'This test requires clipboard access'); + + assert_selection( + [ + '<div contenteditable>', + 'one two three<b>\u00A0four|</b>', + '</div>' + ].join(''), + selection => { + selection.setClipboardData('one'); + selection.document.execCommand('paste'); + }, + [ + '<div contenteditable>', + 'one two three<b>\u00A0four</b>one|', + '</div>' + ].join('')); + }, 'Pasting at style boundary does not crash or produce empty style span(s)'); </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js index 38e24885..1f0b4947 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js +++ b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js
@@ -2,8 +2,21 @@ InspectorTest.preloadModule("coverage"); -InspectorTest.sourceDecorated = async function(source) { +InspectorTest.startCoverage = function() +{ + UI.viewManager.showView("coverage"); + var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); + coverageView._startRecording(); +} +InspectorTest.stopCoverage = function() +{ + var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); + return coverageView._stopRecording(); +} + +InspectorTest.sourceDecorated = async function(source) +{ await UI.inspectorView.showPanel("sources"); var decoratePromise = InspectorTest.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, "decorate"); await new Promise(fulfill => InspectorTest.showScriptSource(source, fulfill));
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html index 22f232b..f11289e 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html +++ b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html
@@ -2,38 +2,28 @@ <head> <script src="../../http/tests/inspector/inspector-test.js"></script> <script src="../../http/tests/inspector/elements-test.js"></script> +<script src="coverage-test.js"></script> <script src="resources/coverage.js"></script> <link rel="stylesheet" type="text/css" href="resources/highlight-in-source.css"> <script> - -var initialize_CoverageTest = function() { - InspectorTest.preloadModule("coverage"); -} - async function test() { - var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); - InspectorTest.addSniffer(coverageView._listView, "update", displayResults); - - UI.viewManager.showView("coverage"); - coverageView._toggleRecording(true); + InspectorTest.startCoverage(); await InspectorTest.evaluateInPagePromise("performActions()"); - coverageView._toggleRecording(false); + await InspectorTest.stopCoverage(); - function displayResults() - { - var dataGrid = coverageView._listView._dataGrid; - for (var child of dataGrid.rootNode().children) { - var data = child._coverageInfo; - var url = InspectorTest.formatters.formatAsURL(data.url); - if (url.endsWith("-test.js") || url.endsWith(".html")) - continue; - InspectorTest.addResult(`${url} used: ${data.usedSize} unused: ${data.unusedSize} total: ${data.size}`); - } - InspectorTest.completeTest(); + var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); + var dataGrid = coverageView._listView._dataGrid; + for (var child of dataGrid.rootNode().children) { + var data = child._coverageInfo; + var url = InspectorTest.formatters.formatAsURL(data.url); + if (url.endsWith("-test.js") || url.endsWith(".html")) + continue; + InspectorTest.addResult(`${url} used: ${data.usedSize} unused: ${data.unusedSize} total: ${data.size}`); } + InspectorTest.completeTest(); } </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html index 135fde3..a50976a 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html +++ b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html
@@ -3,67 +3,36 @@ <script src="../../http/tests/inspector/inspector-test.js"></script> <script src="../../http/tests/inspector/debugger-test.js"></script> <script src="../../http/tests/inspector/sources-test.js"></script> +<script src="coverage-test.js"></script> <link rel="stylesheet" type="text/css" href="resources/decorations-after-inplace-formatter.css"> + <script> - -var initialize_CoverageTest = function() { - InspectorTest.preloadModule("coverage"); -} - -function test() +async function test() { - var scriptFormatter; + InspectorTest.startCoverage(); + await InspectorTest.evaluateInPagePromise("performActions()"); + await InspectorTest.stopCoverage(); + await UI.inspectorView.showPanel("sources"); + var formatter = await inplaceFormatter(); + await InspectorTest.sourceDecorated("decorations-after-inplace-formatter.css"); + var decoratorPromise = InspectorTest.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, "decorate"); + formatter._formatSourceInPlace(); + await decoratorPromise; - var tracker = self.runtime.sharedInstance(Coverage.CoverageView); - InspectorTest.addSniffer(Coverage.CoverageView.prototype, "_updateGutter", onTracingFinished); + var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"), + e => e.parentElement.previousSibling.textContent); + InspectorTest.addResult("Formatted line numbers of rules that were not used:"); + InspectorTest.addResult(lines); + InspectorTest.completeTest(); - tracker._toggleRecording(true); - UI.viewManager.showView("coverage"); - tracker._toggleRecording(false); - - function onTracingFinished() + async function inplaceFormatter() { - UI.inspectorView.showPanel("sources").then(formatterSetup); - } - function formatterSetup() - { - inplaceFormatter().then(function(sf) { - scriptFormatter = sf; - showSource(); - }); - } - function showSource() - { - InspectorTest.addSniffer(Coverage.CoverageView.LineDecorator.prototype, "decorate", formatSource); - InspectorTest.showScriptSource("decorations-after-inplace-formatter.css"); - } - - function formatSource(frame) - { - InspectorTest.addSniffer(Coverage.CoverageView.LineDecorator.prototype, "decorate", uiSourceCodeScriptFormatted); - scriptFormatter._formatSourceInPlace(); - } - - function uiSourceCodeScriptFormatted() - { - var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"), - e => e.parentElement.previousSibling.textContent); - - InspectorTest.addResult("Formatted line numbers of rules that were not used:"); - InspectorTest.addResult(lines); - InspectorTest.completeTest(); - } - - function inplaceFormatter() - { - return self.runtime.allInstances(Sources.SourcesView.EditorAction).then(function(editorActions) { - for (var i = 0; i < editorActions.length; ++i) { - if (editorActions[i] instanceof Sources.InplaceFormatterEditorAction) - return editorActions[i]; - } - return null; - }); + var editorActions = await self.runtime.allInstances(Sources.SourcesView.EditorAction); + for (var i = 0; i < editorActions.length; ++i) { + if (editorActions[i] instanceof Sources.InplaceFormatterEditorAction) + return editorActions[i]; + } } } </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html index 5e47ec8..95df6a4 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html +++ b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html
@@ -14,12 +14,9 @@ async function test() { - var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); - - coverageView._toggleRecording(true); - UI.viewManager.showView("coverage"); - coverageView._toggleRecording(false); - await InspectorTest.addSnifferPromise(Coverage.CoverageView.prototype, "_updateGutter"); + InspectorTest.startCoverage(); + await InspectorTest.evaluateInPagePromise("performActions()"); + await InspectorTest.stopCoverage(); await InspectorTest.sourceDecorated("highlight-in-source.css"); var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html index c72a3524..cc11606 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html +++ b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html
@@ -10,13 +10,9 @@ async function test() { - var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); - - UI.viewManager.showView("coverage"); - coverageView._toggleRecording(true); + InspectorTest.startCoverage(); await InspectorTest.evaluateInPagePromise("performActions()"); - coverageView._toggleRecording(false); - await InspectorTest.addSnifferPromise(Coverage.CoverageView.prototype, "_updateGutter"); + await InspectorTest.stopCoverage(); await InspectorTest.sourceDecorated("coverage.js"); var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png deleted file mode 100644 index 77bbb7a..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt deleted file mode 100644 index 2b7a67f1..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] - LayoutBlockFlow {DIV} at (14,14) size 756x28 - LayoutText {#text} at (0,0) size 140x27 - text run at (0,0) width 140: "OneTwoThree" - LayoutText {#text} at (139,0) size 46x27 - text run at (139,0) width 46: "Four" -caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png deleted file mode 100644 index f093785a..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt deleted file mode 100644 index 7c98246..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] - LayoutInline {SPAN} at (0,0) size 155x27 - LayoutText {#text} at (14,14) size 11x27 - text run at (14,14) width 11: "a" - LayoutInline {SPAN} at (0,0) size 37x27 - LayoutText {#text} at (25,14) size 37x27 - text run at (25,14) width 37: "\x{9}" - LayoutText {#text} at (62,14) size 12x27 - text run at (62,14) width 12: "x" - LayoutInline {SPAN} at (0,0) size 84x27 - LayoutText {#text} at (74,14) size 84x27 - text run at (74,14) width 84: "\x{9}\x{9}" - LayoutText {#text} at (158,14) size 11x27 - text run at (158,14) width 11: "z" - LayoutText {#text} at (0,0) size 0x0 -caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png deleted file mode 100644 index 57dc868..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt deleted file mode 100644 index ee800d6d..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 - LayoutText {#text} at (0,0) size 757x39 - text run at (0,0) width 757: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into." - text run at (0,20) width 316: "You should see \"Hello[black box] World!\" below." - LayoutBlockFlow {DIV} at (0,56) size 784x157 - LayoutText {#text} at (0,137) size 35x19 - text run at (0,137) width 35: "Hello" - LayoutText {#text} at (337,137) size 48x19 - text run at (337,137) width 48: " World!" -layer at (43,64) size 302x152 - LayoutEmbeddedObject {OBJECT} at (35,0) size 302x152 [border: (1px solid #AAAAAA)] -caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png deleted file mode 100644 index c9ed79c..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt deleted file mode 100644 index ef6ce29..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt +++ /dev/null
@@ -1,58 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x182 [border: (2px solid #0000FF)] - LayoutBlockFlow {DIV} at (14,14) size 756x55 - LayoutText {#text} at (0,0) size 65x26 - text run at (0,0) width 65: "Tests: " - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,27) size 698x27 - text run at (0,27) width 698: "Pasting at style boundary does not crash or produce empty style span(s)." - LayoutBlockFlow {DIV} at (14,85) size 756x83 - LayoutBlockFlow (anonymous) at (0,0) size 756x55 - LayoutText {#text} at (0,0) size 189x26 - text run at (0,0) width 189: "Expected Results: " - LayoutBR {BR} at (189,21) size 0x0 - LayoutText {#text} at (0,27) size 442x27 - text run at (0,27) width 442: "Should see this content in the red box below: " - LayoutBR {BR} at (442,48) size 0x0 - LayoutBlockFlow {DIV} at (0,55) size 756x28 - LayoutText {#text} at (0,0) size 138x27 - text run at (0,0) width 138: "one two three " - LayoutInline {B} at (0,0) size 44x26 - LayoutText {#text} at (138,0) size 44x26 - text run at (138,0) width 44: "four" - LayoutText {#text} at (182,0) size 35x27 - text run at (182,0) width 35: "one" - LayoutBlockFlow {DIV} at (0,206) size 784x24 - LayoutBlockFlow {DIV} at (0,0) size 784x24 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 86x19 - text run at (2,2) width 86: "one two three" - LayoutInline {B} at (0,0) size 33x19 - LayoutText {#text} at (88,2) size 33x19 - text run at (88,2) width 33: " four" - LayoutText {#text} at (121,2) size 23x19 - text run at (121,2) width 23: "one" -caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png deleted file mode 100644 index eb796c7..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt deleted file mode 100644 index 356dcdb2..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] - LayoutBlockFlow {DIV} at (14,14) size 756x28 - LayoutText {#text} at (0,0) size 139x28 - text run at (0,0) width 139: "OneTwoThree" - LayoutText {#text} at (138,0) size 46x28 - text run at (138,0) width 46: "Four" -caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png deleted file mode 100644 index 64e74769..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt deleted file mode 100644 index 670c1761..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] - LayoutInline {SPAN} at (0,0) size 155x28 - LayoutText {#text} at (14,14) size 11x28 - text run at (14,14) width 11: "a" - LayoutInline {SPAN} at (0,0) size 38x28 - LayoutText {#text} at (24,14) size 38x28 - text run at (24,14) width 38: "\x{9}" - LayoutText {#text} at (62,14) size 12x28 - text run at (62,14) width 12: "x" - LayoutInline {SPAN} at (0,0) size 84x28 - LayoutText {#text} at (74,14) size 84x28 - text run at (74,14) width 84: "\x{9}\x{9}" - LayoutText {#text} at (158,14) size 11x28 - text run at (158,14) width 11: "z" - LayoutText {#text} at (0,0) size 0x0 -caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png deleted file mode 100644 index 3b69247..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt deleted file mode 100644 index 12ea543..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 - LayoutText {#text} at (0,0) size 775x36 - text run at (0,0) width 775: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into." - text run at (0,18) width 318: "You should see \"Hello[black box] World!\" below." - LayoutBlockFlow {DIV} at (0,52) size 784x156 - LayoutText {#text} at (0,138) size 36x18 - text run at (0,138) width 36: "Hello" - LayoutText {#text} at (337,138) size 50x18 - text run at (337,138) width 50: " World!" -layer at (44,60) size 302x152 - LayoutEmbeddedObject {OBJECT} at (35.55,0) size 302x152 [border: (1px solid #AAAAAA)] -caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png deleted file mode 100644 index 8afe3ec7..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt deleted file mode 100644 index dcce3b3..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt +++ /dev/null
@@ -1,58 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x184 [border: (2px solid #0000FF)] - LayoutBlockFlow {DIV} at (14,14) size 756x56 - LayoutText {#text} at (0,0) size 66x28 - text run at (0,0) width 66: "Tests: " - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,28) size 694x28 - text run at (0,28) width 694: "Pasting at style boundary does not crash or produce empty style span(s)." - LayoutBlockFlow {DIV} at (14,86) size 756x84 - LayoutBlockFlow (anonymous) at (0,0) size 756x56 - LayoutText {#text} at (0,0) size 190x28 - text run at (0,0) width 190: "Expected Results: " - LayoutBR {BR} at (189,22) size 1x0 - LayoutText {#text} at (0,28) size 438x28 - text run at (0,28) width 438: "Should see this content in the red box below: " - LayoutBR {BR} at (437,50) size 1x0 - LayoutBlockFlow {DIV} at (0,56) size 756x28 - LayoutText {#text} at (0,0) size 137x28 - text run at (0,0) width 137: "one two three " - LayoutInline {B} at (0,0) size 45x28 - LayoutText {#text} at (136,0) size 45x28 - text run at (136,0) width 45: "four" - LayoutText {#text} at (180,0) size 36x28 - text run at (180,0) width 36: "one" - LayoutBlockFlow {DIV} at (0,208) size 784x22 - LayoutBlockFlow {DIV} at (0,0) size 784x22 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 88x18 - text run at (2,2) width 88: "one two three" - LayoutInline {B} at (0,0) size 34x18 - LayoutText {#text} at (89,2) size 34x18 - text run at (89,2) width 34: " four" - LayoutText {#text} at (122,2) size 24x18 - text run at (122,2) width 24: "one" -caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png deleted file mode 100644 index a0733d9..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt deleted file mode 100644 index d948065..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)] - LayoutBlockFlow {DIV} at (14,14) size 756x27 - LayoutText {#text} at (0,0) size 139x26 - text run at (0,0) width 139: "OneTwoThree" - LayoutText {#text} at (138,0) size 46x26 - text run at (138,0) width 46: "Four" -caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png deleted file mode 100644 index 738d306..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt deleted file mode 100644 index 15cb964..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)] - LayoutInline {SPAN} at (0,0) size 155x26 - LayoutText {#text} at (14,14) size 11x26 - text run at (14,14) width 11: "a" - LayoutInline {SPAN} at (0,0) size 38x26 - LayoutText {#text} at (24,14) size 38x26 - text run at (24,14) width 38: "\x{9}" - LayoutText {#text} at (62,14) size 12x26 - text run at (62,14) width 12: "x" - LayoutInline {SPAN} at (0,0) size 84x26 - LayoutText {#text} at (74,14) size 84x26 - text run at (74,14) width 84: "\x{9}\x{9}" - LayoutText {#text} at (158,14) size 11x26 - text run at (158,14) width 11: "z" - LayoutText {#text} at (0,0) size 0x0 -caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png deleted file mode 100644 index 06a5ce8a5..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt deleted file mode 100644 index 542955d..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 - LayoutText {#text} at (0,0) size 775x35 - text run at (0,0) width 775: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into." - text run at (0,18) width 318: "You should see \"Hello[black box] World!\" below." - LayoutBlockFlow {DIV} at (0,52) size 784x156 - LayoutText {#text} at (0,138) size 36x17 - text run at (0,138) width 36: "Hello" - LayoutText {#text} at (337,138) size 50x17 - text run at (337,138) width 50: " World!" -layer at (44,60) size 302x152 - LayoutEmbeddedObject {OBJECT} at (35.55,0) size 302x152 [border: (1px solid #AAAAAA)] -caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png deleted file mode 100644 index b4b87f43..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt deleted file mode 100644 index ac86bb5..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt +++ /dev/null
@@ -1,58 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x179 [border: (2px solid #0000FF)] - LayoutBlockFlow {DIV} at (14,14) size 756x54 - LayoutText {#text} at (0,0) size 66x26 - text run at (0,0) width 66: "Tests: " - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,27) size 694x26 - text run at (0,27) width 694: "Pasting at style boundary does not crash or produce empty style span(s)." - LayoutBlockFlow {DIV} at (14,84) size 756x81 - LayoutBlockFlow (anonymous) at (0,0) size 756x54 - LayoutText {#text} at (0,0) size 190x26 - text run at (0,0) width 190: "Expected Results: " - LayoutBR {BR} at (189,21) size 1x0 - LayoutText {#text} at (0,27) size 438x26 - text run at (0,27) width 438: "Should see this content in the red box below: " - LayoutBR {BR} at (437,48) size 1x0 - LayoutBlockFlow {DIV} at (0,54) size 756x27 - LayoutText {#text} at (0,0) size 137x26 - text run at (0,0) width 137: "one two three " - LayoutInline {B} at (0,0) size 45x26 - LayoutText {#text} at (136,0) size 45x26 - text run at (136,0) width 45: "four" - LayoutText {#text} at (180,0) size 36x26 - text run at (180,0) width 36: "one" - LayoutBlockFlow {DIV} at (0,203) size 784x22 - LayoutBlockFlow {DIV} at (0,0) size 784x22 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 88x17 - text run at (2,2) width 88: "one two three" - LayoutInline {B} at (0,0) size 34x17 - LayoutText {#text} at (89,2) size 34x17 - text run at (89,2) width 34: " four" - LayoutText {#text} at (122,2) size 24x17 - text run at (122,2) width 24: "one" -caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index af3524a1..2c49d32 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1298,6 +1298,8 @@ "layout/compositing/CompositingReasonFinderTest.cpp", "layout/line/InlineBoxTest.cpp", "layout/line/InlineTextBoxTest.cpp", + "layout/ng/geometry/ng_logical_offset_test.cc", + "layout/ng/geometry/ng_physical_rect_test.cc", "layout/ng/ng_absolute_utils_test.cc", "layout/ng/ng_block_child_iterator_test.cc", "layout/ng/ng_block_layout_algorithm_test.cc",
diff --git a/third_party/WebKit/Source/core/css/MediaValues.cpp b/third_party/WebKit/Source/core/css/MediaValues.cpp index 4b00df2f..c35e294 100644 --- a/third_party/WebKit/Source/core/css/MediaValues.cpp +++ b/third_party/WebKit/Source/core/css/MediaValues.cpp
@@ -9,7 +9,6 @@ #include "core/css/MediaValuesDynamic.h" #include "core/dom/Document.h" #include "core/dom/Element.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" @@ -46,8 +45,8 @@ } int MediaValues::calculateDeviceWidth(LocalFrame* frame) { - ASSERT(frame && frame->view() && frame->settings() && frame->host()); - blink::WebScreenInfo screenInfo = frame->host()->chromeClient().screenInfo(); + DCHECK(frame && frame->view() && frame->settings() && frame->page()); + blink::WebScreenInfo screenInfo = frame->page()->chromeClient().screenInfo(); int deviceWidth = screenInfo.rect.width; if (frame->settings()->getReportScreenSizeInPhysicalPixelsQuirk()) deviceWidth = lroundf(deviceWidth * screenInfo.deviceScaleFactor); @@ -55,8 +54,8 @@ } int MediaValues::calculateDeviceHeight(LocalFrame* frame) { - ASSERT(frame && frame->view() && frame->settings() && frame->host()); - blink::WebScreenInfo screenInfo = frame->host()->chromeClient().screenInfo(); + DCHECK(frame && frame->view() && frame->settings() && frame->page()); + blink::WebScreenInfo screenInfo = frame->page()->chromeClient().screenInfo(); int deviceHeight = screenInfo.rect.height; if (frame->settings()->getReportScreenSizeInPhysicalPixelsQuirk()) deviceHeight = lroundf(deviceHeight * screenInfo.deviceScaleFactor); @@ -75,17 +74,17 @@ int MediaValues::calculateColorBitsPerComponent(LocalFrame* frame) { ASSERT(frame && frame->page() && frame->page()->mainFrame()); if (!frame->page()->mainFrame()->isLocalFrame() || - frame->host()->chromeClient().screenInfo().isMonochrome) + frame->page()->chromeClient().screenInfo().isMonochrome) return 0; - return frame->host()->chromeClient().screenInfo().depthPerComponent; + return frame->page()->chromeClient().screenInfo().depthPerComponent; } int MediaValues::calculateMonochromeBitsPerComponent(LocalFrame* frame) { ASSERT(frame && frame->page() && frame->page()->mainFrame()); if (!frame->page()->mainFrame()->isLocalFrame() || - !frame->host()->chromeClient().screenInfo().isMonochrome) + !frame->page()->chromeClient().screenInfo().isMonochrome) return 0; - return frame->host()->chromeClient().screenInfo().depthPerComponent; + return frame->page()->chromeClient().screenInfo().depthPerComponent; } int MediaValues::calculateDefaultFontSize(LocalFrame* frame) { @@ -142,14 +141,14 @@ } DisplayShape MediaValues::calculateDisplayShape(LocalFrame* frame) { - DCHECK(frame && frame->host()); - return frame->host()->chromeClient().screenInfo().displayShape; + DCHECK(frame && frame->page()); + return frame->page()->chromeClient().screenInfo().displayShape; } ColorSpaceGamut MediaValues::calculateColorGamut(LocalFrame* frame) { - DCHECK(frame && frame->host()); + DCHECK(frame && frame->page()); return ColorSpaceUtilities::getColorSpaceGamut( - frame->host()->chromeClient().screenInfo()); + frame->page()->chromeClient().screenInfo()); } bool MediaValues::computeLengthImpl(double value,
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 39cc41e..8a5abde 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -2525,9 +2525,8 @@ if (m_focusedElement.get()) { Element* oldFocusedElement = m_focusedElement; m_focusedElement = nullptr; - if (frameHost()) - frameHost()->chromeClient().focusedNodeChanged(oldFocusedElement, - nullptr); + if (page()) + page()->chromeClient().focusedNodeChanged(oldFocusedElement, nullptr); } m_sequentialFocusNavigationStartingPoint = nullptr; @@ -3574,7 +3573,7 @@ void Document::updateViewportDescription() { if (frame() && frame()->isMainFrame()) { - frameHost()->chromeClient().dispatchViewportPropertiesDidChange( + page()->chromeClient().dispatchViewportPropertiesDidChange( viewportDescription()); } } @@ -4139,9 +4138,10 @@ newFocusedElement); } - if (!focusChangeBlocked && frameHost()) - frameHost()->chromeClient().focusedNodeChanged(oldFocusedElement, - m_focusedElement.get()); + if (!focusChangeBlocked && page()) { + page()->chromeClient().focusedNodeChanged(oldFocusedElement, + m_focusedElement.get()); + } SetFocusedElementDone: updateStyleAndLayoutTree();
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp index be4e5a0..0647e19 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp +++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
@@ -35,6 +35,8 @@ #include "core/editing/Editor.h" #include "core/editing/commands/TypingCommand.h" #include "core/editing/markers/DocumentMarkerController.h" +#include "core/editing/state_machines/BackwardCodePointStateMachine.h" +#include "core/editing/state_machines/ForwardCodePointStateMachine.h" #include "core/events/CompositionEvent.h" #include "core/frame/LocalFrame.h" #include "core/html/HTMLInputElement.h" @@ -185,6 +187,75 @@ return element->fastGetAttribute(HTMLNames::inputmodeAttr).lower(); } +constexpr int invalidDeletionLength = -1; +constexpr bool isInvalidDeletionLength(const int length) { + return length == invalidDeletionLength; +} + +int calculateBeforeDeletionLengthsInCodePoints( + const String& text, + const int beforeLengthInCodePoints, + const int selectionStart) { + DCHECK_GE(beforeLengthInCodePoints, 0); + DCHECK_GE(selectionStart, 0); + DCHECK_LE(selectionStart, static_cast<int>(text.length())); + + const UChar* uText = text.characters16(); + BackwardCodePointStateMachine backwardMachine; + int counter = beforeLengthInCodePoints; + int deletionStart = selectionStart; + while (counter > 0 && deletionStart > 0) { + const TextSegmentationMachineState state = + backwardMachine.feedPrecedingCodeUnit(uText[deletionStart - 1]); + // According to Android's InputConnection spec, we should do nothing if + // |text| has invalid surrogate pair in the deletion range. + if (state == TextSegmentationMachineState::Invalid) + return invalidDeletionLength; + + if (backwardMachine.atCodePointBoundary()) + --counter; + --deletionStart; + } + if (!backwardMachine.atCodePointBoundary()) + return invalidDeletionLength; + + const int offset = backwardMachine.getBoundaryOffset(); + DCHECK_EQ(-offset, selectionStart - deletionStart); + return -offset; +} + +int calculateAfterDeletionLengthsInCodePoints(const String& text, + const int afterLengthInCodePoints, + const int selectionEnd) { + DCHECK_GE(afterLengthInCodePoints, 0); + DCHECK_GE(selectionEnd, 0); + const int length = text.length(); + DCHECK_LE(selectionEnd, length); + + const UChar* uText = text.characters16(); + ForwardCodePointStateMachine forwardMachine; + int counter = afterLengthInCodePoints; + int deletionEnd = selectionEnd; + while (counter > 0 && deletionEnd < length) { + const TextSegmentationMachineState state = + forwardMachine.feedFollowingCodeUnit(uText[deletionEnd]); + // According to Android's InputConnection spec, we should do nothing if + // |text| has invalid surrogate pair in the deletion range. + if (state == TextSegmentationMachineState::Invalid) + return invalidDeletionLength; + + if (forwardMachine.atCodePointBoundary()) + --counter; + ++deletionEnd; + } + if (!forwardMachine.atCodePointBoundary()) + return invalidDeletionLength; + + const int offset = forwardMachine.getBoundaryOffset(); + DCHECK_EQ(offset, deletionEnd - selectionEnd); + return offset; +} + } // anonymous namespace InputMethodController* InputMethodController::create(LocalFrame& frame) { @@ -904,6 +975,47 @@ setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); } +void InputMethodController::deleteSurroundingTextInCodePoints(int before, + int after) { + DCHECK_GE(before, 0); + DCHECK_GE(after, 0); + if (!editor().canEdit()) + return; + const PlainTextRange selectionOffsets(getSelectionOffsets()); + if (selectionOffsets.isNull()) + return; + Element* const rootEditableElement = + frame().selection().rootEditableElementOrDocumentElement(); + if (!rootEditableElement) + return; + + const TextIteratorBehavior& behavior = + TextIteratorBehavior::Builder() + .setEmitsObjectReplacementCharacter(true) + .build(); + const String& text = plainText( + EphemeralRange::rangeOfContents(*rootEditableElement), behavior); + + // 8-bit characters are Latin-1 characters, so the deletion lengths are + // trivial. + if (text.is8Bit()) + return deleteSurroundingText(before, after); + + const int selectionStart = static_cast<int>(selectionOffsets.start()); + const int selectionEnd = static_cast<int>(selectionOffsets.end()); + + const int beforeLength = + calculateBeforeDeletionLengthsInCodePoints(text, before, selectionStart); + if (isInvalidDeletionLength(beforeLength)) + return; + const int afterLength = + calculateAfterDeletionLengthsInCodePoints(text, after, selectionEnd); + if (isInvalidDeletionLength(afterLength)) + return; + + return deleteSurroundingText(beforeLength, afterLength); +} + WebTextInputInfo InputMethodController::textInputInfo() const { WebTextInputInfo info; if (!isAvailable())
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.h b/third_party/WebKit/Source/core/editing/InputMethodController.h index 035b9cd..36ad6116 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodController.h +++ b/third_party/WebKit/Source/core/editing/InputMethodController.h
@@ -101,6 +101,7 @@ int end, size_t textLength) const; void deleteSurroundingText(int before, int after); + void deleteSurroundingTextInCodePoints(int before, int after); WebTextInputInfo textInputInfo() const; WebTextInputType textInputType() const;
diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp index 322e836..03f0071 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp +++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
@@ -746,6 +746,125 @@ EXPECT_EQ(2u, controller().getSelectionOffsets().end()); } +TEST_F(InputMethodControllerTest, + DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheLeft) { + HTMLInputElement* input = + toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample")); + + // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text (U+0E01 + // "ka kai" + U+0E49 "mai tho"). + // A "black star" is 1 grapheme cluster. It has 1 code point, and its length + // is 1 (abbreviated as [1,1,1]). A "trophy": [1,1,2]. The composed text: + // [1,2,2]. + input->setValue(String::fromUTF8( + "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89")); + document().updateStyleAndLayout(); + // The cursor is at the end of the text. + controller().setEditableSelectionOffsets(PlainTextRange(8, 8)); + + controller().deleteSurroundingTextInCodePoints(2, 0); + EXPECT_STREQ("a\xE2\x98\x85 \xF0\x9F\x8F\x86 ", input->value().utf8().data()); + controller().deleteSurroundingTextInCodePoints(4, 0); + EXPECT_STREQ("a", input->value().utf8().data()); + + // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text + input->setValue(String::fromUTF8( + "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89")); + document().updateStyleAndLayout(); + // The cursor is at the end of the text. + controller().setEditableSelectionOffsets(PlainTextRange(8, 8)); + + // TODO(yabinh): We should only delete 1 code point instead of the entire + // grapheme cluster (2 code points). The root cause is that we adjust the + // selection by grapheme cluster in deleteSurroundingText(). + controller().deleteSurroundingTextInCodePoints(1, 0); + EXPECT_STREQ("a\xE2\x98\x85 \xF0\x9F\x8F\x86 ", input->value().utf8().data()); +} + +TEST_F(InputMethodControllerTest, + DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheRight) { + HTMLInputElement* input = + toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample")); + + // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text + input->setValue(String::fromUTF8( + "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89")); + document().updateStyleAndLayout(); + controller().setEditableSelectionOffsets(PlainTextRange(0, 0)); + + controller().deleteSurroundingTextInCodePoints(0, 5); + EXPECT_STREQ("\xE0\xB8\x81\xE0\xB9\x89", input->value().utf8().data()); + + controller().deleteSurroundingTextInCodePoints(0, 1); + // TODO(yabinh): Same here. We should only delete 1 code point. + EXPECT_STREQ("", input->value().utf8().data()); +} + +TEST_F(InputMethodControllerTest, + DeleteSurroundingTextInCodePointsWithMultiCodeTextOnBothSides) { + HTMLInputElement* input = + toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample")); + + // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text + input->setValue(String::fromUTF8( + "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89")); + document().updateStyleAndLayout(); + controller().setEditableSelectionOffsets(PlainTextRange(3, 3)); + controller().deleteSurroundingTextInCodePoints(2, 2); + EXPECT_STREQ("a\xE0\xB8\x81\xE0\xB9\x89", input->value().utf8().data()); +} + +TEST_F(InputMethodControllerTest, DeleteSurroundingTextInCodePointsWithImage) { + Element* div = insertHTMLElement( + "<div id='sample' contenteditable>aaa" + "<img src='empty.png'>bbb</div>", + "sample"); + + controller().setEditableSelectionOffsets(PlainTextRange(4, 4)); + controller().deleteSurroundingTextInCodePoints(1, 1); + EXPECT_STREQ("aaabb", div->innerText().utf8().data()); + EXPECT_EQ(3u, controller().getSelectionOffsets().start()); + EXPECT_EQ(3u, controller().getSelectionOffsets().end()); +} + +TEST_F(InputMethodControllerTest, + DeleteSurroundingTextInCodePointsWithInvalidSurrogatePair) { + HTMLInputElement* input = + toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample")); + + // 'a' + high surrogate of "trophy" + "black star" + low surrogate of "trophy" + // + SPACE + const UChar uText[] = {'a', 0xD83C, 0x2605, 0xDFC6, ' ', '\0'}; + const String& text = String(uText); + + input->setValue(text); + document().updateStyleAndLayout(); + // The invalid high surrogate is encoded as '\xED\xA0\xBC', and invalid low + // surrogate is encoded as '\xED\xBF\x86'. + EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86 ", + input->value().utf8().data()); + + controller().setEditableSelectionOffsets(PlainTextRange(5, 5)); + // Delete a SPACE. + controller().deleteSurroundingTextInCodePoints(1, 0); + EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86", + input->value().utf8().data()); + // Do nothing since there is an invalid surrogate in the requested range. + controller().deleteSurroundingTextInCodePoints(2, 0); + EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86", + input->value().utf8().data()); + + controller().setEditableSelectionOffsets(PlainTextRange(0, 0)); + // Delete 'a'. + controller().deleteSurroundingTextInCodePoints(0, 1); + EXPECT_STREQ("\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86", + input->value().utf8().data()); + // Do nothing since there is an invalid surrogate in the requested range. + controller().deleteSurroundingTextInCodePoints(0, 2); + EXPECT_STREQ("\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86", + input->value().utf8().data()); +} + TEST_F(InputMethodControllerTest, SetCompositionForInputWithNewCaretPositions) { HTMLInputElement* input = toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp index a3f78b1f..756813b 100644 --- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -52,7 +52,6 @@ #include "core/editing/serializers/Serialization.h" #include "core/editing/spellcheck/SpellChecker.h" #include "core/events/Event.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" @@ -63,6 +62,7 @@ #include "core/layout/LayoutBox.h" #include "core/page/ChromeClient.h" #include "core/page/EditorClient.h" +#include "core/page/Page.h" #include "platform/Histogram.h" #include "platform/KillRing.h" #include "platform/UserGestureIndicator.h" @@ -1546,10 +1546,10 @@ Event*, EditorCommandSource, const String&) { - FrameHost* host = frame.host(); - if (!host) + Page* page = frame.page(); + if (!page) return false; - return host->chromeClient().print(&frame); + return page->chromeClient().print(&frame); } static bool executeRedo(LocalFrame& frame,
diff --git a/third_party/WebKit/Source/core/frame/BarProp.cpp b/third_party/WebKit/Source/core/frame/BarProp.cpp index e403c7c..95c97573 100644 --- a/third_party/WebKit/Source/core/frame/BarProp.cpp +++ b/third_party/WebKit/Source/core/frame/BarProp.cpp
@@ -28,9 +28,9 @@ #include "core/frame/BarProp.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" namespace blink { @@ -44,19 +44,19 @@ bool BarProp::visible() const { if (!frame()) return false; - DCHECK(frame()->host()); + DCHECK(frame()->page()); switch (m_type) { case Locationbar: case Personalbar: case Toolbar: - return frame()->host()->chromeClient().toolbarsVisible(); + return frame()->page()->chromeClient().toolbarsVisible(); case Menubar: - return frame()->host()->chromeClient().menubarVisible(); + return frame()->page()->chromeClient().menubarVisible(); case Scrollbars: - return frame()->host()->chromeClient().scrollbarsVisible(); + return frame()->page()->chromeClient().scrollbarsVisible(); case Statusbar: - return frame()->host()->chromeClient().statusbarVisible(); + return frame()->page()->chromeClient().statusbarVisible(); } NOTREACHED();
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.cpp b/third_party/WebKit/Source/core/frame/BrowserControls.cpp index 88ed3d4..762ebc7 100644 --- a/third_party/WebKit/Source/core/frame/BrowserControls.cpp +++ b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
@@ -4,11 +4,13 @@ #include "core/frame/BrowserControls.h" +#include <algorithm> // for std::min and std::max + #include "core/frame/FrameHost.h" #include "core/frame/VisualViewport.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/geometry/FloatSize.h" -#include <algorithm> // for std::min and std::max namespace blink { @@ -86,7 +88,7 @@ return; m_shownRatio = shownRatio; - m_frameHost->chromeClient().didUpdateBrowserControls(); + m_frameHost->page().chromeClient().didUpdateBrowserControls(); } void BrowserControls::updateConstraintsAndState( @@ -123,7 +125,7 @@ m_height = height; m_shrinkViewport = shrinkViewport; - m_frameHost->chromeClient().didUpdateBrowserControls(); + m_frameHost->page().chromeClient().didUpdateBrowserControls(); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp index 527414b..a9b0fc8 100644 --- a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp +++ b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
@@ -213,19 +213,19 @@ bool hasActiveHandlers) { switch (handlerClass) { case ScrollEvent: - m_frameHost->chromeClient().setHasScrollEventHandlers(frame, - hasActiveHandlers); + m_frameHost->page().chromeClient().setHasScrollEventHandlers( + frame, hasActiveHandlers); break; case WheelEventBlocking: case WheelEventPassive: - m_frameHost->chromeClient().setEventListenerProperties( + m_frameHost->page().chromeClient().setEventListenerProperties( frame, WebEventListenerClass::MouseWheel, webEventListenerProperties(hasEventHandlers(WheelEventBlocking), hasEventHandlers(WheelEventPassive))); break; case TouchStartOrMoveEventBlocking: case TouchStartOrMoveEventPassive: - m_frameHost->chromeClient().setEventListenerProperties( + m_frameHost->page().chromeClient().setEventListenerProperties( frame, WebEventListenerClass::TouchStartOrMove, webEventListenerProperties( hasEventHandlers(TouchStartOrMoveEventBlocking), @@ -233,7 +233,7 @@ break; case TouchEndOrCancelEventBlocking: case TouchEndOrCancelEventPassive: - m_frameHost->chromeClient().setEventListenerProperties( + m_frameHost->page().chromeClient().setEventListenerProperties( frame, WebEventListenerClass::TouchEndOrCancel, webEventListenerProperties( hasEventHandlers(TouchEndOrCancelEventBlocking),
diff --git a/third_party/WebKit/Source/core/frame/FrameHost.cpp b/third_party/WebKit/Source/core/frame/FrameHost.cpp index 104d7b1..af75ed7 100644 --- a/third_party/WebKit/Source/core/frame/FrameHost.cpp +++ b/third_party/WebKit/Source/core/frame/FrameHost.cpp
@@ -74,14 +74,6 @@ return *m_page; } -ChromeClient& FrameHost::chromeClient() { - return m_page->chromeClient(); -} - -const ChromeClient& FrameHost::chromeClient() const { - return m_page->chromeClient(); -} - UseCounter& FrameHost::useCounter() { return m_page->useCounter(); }
diff --git a/third_party/WebKit/Source/core/frame/FrameHost.h b/third_party/WebKit/Source/core/frame/FrameHost.h index f9471fd..e04f2b9 100644 --- a/third_party/WebKit/Source/core/frame/FrameHost.h +++ b/third_party/WebKit/Source/core/frame/FrameHost.h
@@ -74,9 +74,6 @@ Page& page(); const Page& page() const; - ChromeClient& chromeClient(); - const ChromeClient& chromeClient() const; - UseCounter& useCounter(); const UseCounter& useCounter() const;
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index a2e0bdb..ab03ea6 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -4020,7 +4020,7 @@ void FrameView::didChangeScrollOffset() { frame().loader().client()->didChangeScrollOffset(); if (frame().isMainFrame()) - frame().host()->chromeClient().mainFrameScrollOffsetChanged(); + frame().page()->chromeClient().mainFrameScrollOffsetChanged(); } void FrameView::clearScrollAnchor() { @@ -4935,7 +4935,7 @@ // The compositor will "defer commits" for the main frame until we // explicitly request them. if (frame().isMainFrame()) - frame().host()->chromeClient().beginLifecycleUpdates(); + frame().page()->chromeClient().beginLifecycleUpdates(); } void FrameView::setInitialViewportSize(const IntSize& viewportSize) {
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp index ff0d2e0..7182d79 100644 --- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -537,11 +537,11 @@ int LocalDOMWindow::orientation() const { ASSERT(RuntimeEnabledFeatures::orientationEventEnabled()); - if (!frame() || !frame()->host()) + if (!frame() || !frame()->page()) return 0; int orientation = - frame()->host()->chromeClient().screenInfo().orientationAngle; + frame()->page()->chromeClient().screenInfo().orientationAngle; // For backward compatibility, we want to return a value in the range of // [-90; 180] instead of [0; 360[ because window.orientation used to behave // like that in WebKit (this is a WebKit proprietary API). @@ -704,8 +704,8 @@ if (!frame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; if (scriptState && @@ -722,7 +722,7 @@ UseCounter::CrossOriginWindowPrint); m_shouldPrintWhenFinishedLoading = false; - host->chromeClient().print(frame()); + page->chromeClient().print(frame()); } void LocalDOMWindow::stop() { @@ -771,14 +771,14 @@ document()->updateStyleAndLayoutTree(); - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; UseCounter::countCrossOriginIframe(*document(), UseCounter::CrossOriginWindowAlert); - host->chromeClient().openJavaScriptAlert(frame(), message); + page->chromeClient().openJavaScriptAlert(frame(), message); } bool LocalDOMWindow::confirm(ScriptState* scriptState, const String& message) { @@ -821,14 +821,14 @@ document()->updateStyleAndLayoutTree(); - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return false; UseCounter::countCrossOriginIframe(*document(), UseCounter::CrossOriginWindowConfirm); - return host->chromeClient().openJavaScriptConfirm(frame(), message); + return page->chromeClient().openJavaScriptConfirm(frame(), message); } String LocalDOMWindow::prompt(ScriptState* scriptState, @@ -873,12 +873,12 @@ document()->updateStyleAndLayoutTree(); - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return String(); String returnValue; - if (host->chromeClient().openJavaScriptPrompt(frame(), message, defaultValue, + if (page->chromeClient().openJavaScriptPrompt(frame(), message, defaultValue, returnValue)) return returnValue; @@ -1098,11 +1098,11 @@ if (!frame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - host->chromeClient().setStatusbarText(m_status); + page->chromeClient().setStatusbarText(m_status); } void LocalDOMWindow::setDefaultStatus(const String& string) { @@ -1111,11 +1111,11 @@ if (!frame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - host->chromeClient().setStatusbarText(m_defaultStatus); + page->chromeClient().setStatusbarText(m_defaultStatus); } Document* LocalDOMWindow::document() const { @@ -1288,58 +1288,58 @@ if (!frame() || !frame()->isMainFrame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - IntRect windowRect = host->chromeClient().rootWindowRect(); + IntRect windowRect = page->chromeClient().rootWindowRect(); windowRect.saturatedMove(x, y); // Security check (the spec talks about UniversalBrowserWrite to disable this // check...) - host->chromeClient().setWindowRectWithAdjustment(windowRect, *frame()); + page->chromeClient().setWindowRectWithAdjustment(windowRect, *frame()); } void LocalDOMWindow::moveTo(int x, int y) const { if (!frame() || !frame()->isMainFrame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - IntRect windowRect = host->chromeClient().rootWindowRect(); + IntRect windowRect = page->chromeClient().rootWindowRect(); windowRect.setLocation(IntPoint(x, y)); // Security check (the spec talks about UniversalBrowserWrite to disable this // check...) - host->chromeClient().setWindowRectWithAdjustment(windowRect, *frame()); + page->chromeClient().setWindowRectWithAdjustment(windowRect, *frame()); } void LocalDOMWindow::resizeBy(int x, int y) const { if (!frame() || !frame()->isMainFrame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - IntRect fr = host->chromeClient().rootWindowRect(); + IntRect fr = page->chromeClient().rootWindowRect(); IntSize dest = fr.size() + IntSize(x, y); IntRect update(fr.location(), dest); - host->chromeClient().setWindowRectWithAdjustment(update, *frame()); + page->chromeClient().setWindowRectWithAdjustment(update, *frame()); } void LocalDOMWindow::resizeTo(int width, int height) const { if (!frame() || !frame()->isMainFrame()) return; - FrameHost* host = frame()->host(); - if (!host) + Page* page = frame()->page(); + if (!page) return; - IntRect fr = host->chromeClient().rootWindowRect(); + IntRect fr = page->chromeClient().rootWindowRect(); IntSize dest = IntSize(width, height); IntRect update(fr.location(), dest); - host->chromeClient().setWindowRectWithAdjustment(update, *frame()); + page->chromeClient().setWindowRectWithAdjustment(update, *frame()); } int LocalDOMWindow::requestAnimationFrame(FrameRequestCallback* callback) {
diff --git a/third_party/WebKit/Source/core/frame/Navigator.cpp b/third_party/WebKit/Source/core/frame/Navigator.cpp index 14c6ec1d..117da44 100644 --- a/third_party/WebKit/Source/core/frame/Navigator.cpp +++ b/third_party/WebKit/Source/core/frame/Navigator.cpp
@@ -25,13 +25,13 @@ #include "bindings/core/v8/ScriptController.h" #include "core/dom/Document.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/frame/NavigatorID.h" #include "core/frame/Settings.h" #include "core/loader/CookieJar.h" #include "core/loader/FrameLoader.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/Language.h" namespace blink { @@ -76,12 +76,12 @@ Vector<String> Navigator::languages() { Vector<String> languages; - if (!frame() || !frame()->host()) { + if (!frame() || !frame()->page()) { languages.push_back(defaultLanguage()); return languages; } - String acceptLanguages = frame()->host()->chromeClient().acceptLanguages(); + String acceptLanguages = frame()->page()->chromeClient().acceptLanguages(); acceptLanguages.split(',', languages); // Sanitizing tokens. We could do that more extensively but we should assume
diff --git a/third_party/WebKit/Source/core/frame/Screen.cpp b/third_party/WebKit/Source/core/frame/Screen.cpp index 530c0bb..d61ba45 100644 --- a/third_party/WebKit/Source/core/frame/Screen.cpp +++ b/third_party/WebKit/Source/core/frame/Screen.cpp
@@ -28,7 +28,6 @@ #include "core/frame/Screen.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" @@ -68,17 +67,17 @@ } unsigned Screen::colorDepth() const { - if (!frame() || !frame()->host()) + if (!frame() || !frame()->page()) return 0; return static_cast<unsigned>( - frame()->host()->chromeClient().screenInfo().depth); + frame()->page()->chromeClient().screenInfo().depth); } unsigned Screen::pixelDepth() const { if (!frame()) return 0; return static_cast<unsigned>( - frame()->host()->chromeClient().screenInfo().depth); + frame()->page()->chromeClient().screenInfo().depth); } int Screen::availLeft() const {
diff --git a/third_party/WebKit/Source/core/frame/VisualViewport.cpp b/third_party/WebKit/Source/core/frame/VisualViewport.cpp index d8fa942e..9be42a68 100644 --- a/third_party/WebKit/Source/core/frame/VisualViewport.cpp +++ b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
@@ -254,7 +254,7 @@ if (scale != m_scale) { m_scale = scale; valuesChanged = true; - frameHost().chromeClient().pageScaleFactorChanged(); + frameHost().page().chromeClient().pageScaleFactorChanged(); enqueueResizeEvent(); } @@ -296,8 +296,8 @@ const FloatPoint& anchor) { const float oldPageScale = scale(); const float newPageScale = - frameHost().chromeClient().clampPageScaleFactorToLimits(magnifyDelta * - oldPageScale); + frameHost().page().chromeClient().clampPageScaleFactorToLimits( + magnifyDelta * oldPageScale); if (newPageScale == oldPageScale) return false; if (!mainFrame() || !mainFrame()->view()) @@ -502,7 +502,7 @@ } HostWindow* VisualViewport::getHostWindow() const { - return &frameHost().chromeClient(); + return &frameHost().page().chromeClient(); } bool VisualViewport::shouldUseIntegerScrollOffset() const {
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp index 09b1894..7250165 100644 --- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -27,7 +27,6 @@ #include "core/editing/EditingUtilities.h" #include "core/events/KeyboardEvent.h" #include "core/events/MouseEvent.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrameClient.h" #include "core/frame/Settings.h" #include "core/frame/UseCounter.h" @@ -37,6 +36,7 @@ #include "core/loader/FrameLoadRequest.h" #include "core/loader/PingLoader.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/network/NetworkHints.h" #include "platform/weborigin/SecurityPolicy.h" #include "public/platform/WebNavigationHintType.h" @@ -177,7 +177,7 @@ if (isFocusable() && Element::supportsFocus()) return HTMLElement::isKeyboardFocusable(); - if (isLink() && !document().frameHost()->chromeClient().tabsToLinks()) + if (isLink() && !document().page()->chromeClient().tabsToLinks()) return false; return HTMLElement::isKeyboardFocusable(); }
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp index b520cb0..5b1e0afa 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
@@ -42,7 +42,6 @@ #include "core/dom/ExceptionCode.h" #include "core/dom/TaskRunnerHelper.h" #include "core/fileapi/File.h" -#include "core/frame/FrameHost.h" #include "core/frame/ImageBitmap.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" @@ -1450,7 +1449,7 @@ // frame-less HTML canvas's document is reparenting under another frame. // See crbug.com/683172. if (frame) { - layerTreeView = frame->host()->chromeClient().getWebLayerTreeView(frame); + layerTreeView = frame->page()->chromeClient().getWebLayerTreeView(frame); m_surfaceLayerBridge = WTF::wrapUnique(new CanvasSurfaceLayerBridge(this, layerTreeView)); // Creates a placeholder layer first before Surface is created.
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp index 50a1339..c0e8404 100644 --- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -50,7 +50,6 @@ #include "core/events/MouseEvent.h" #include "core/events/ScopedEventQueue.h" #include "core/frame/Deprecation.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/frame/UseCounter.h" @@ -70,6 +69,7 @@ #include "core/layout/LayoutObject.h" #include "core/layout/LayoutTheme.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/Language.h" #include "platform/RuntimeEnabledFeatures.h" #include "platform/text/PlatformLocale.h" @@ -338,7 +338,7 @@ LocalFrame* frame = document().frame(); frame->spellChecker().didEndEditingOnTextField(this); - frame->host()->chromeClient().didEndEditingOnTextField(*this); + frame->page()->chromeClient().didEndEditingOnTextField(*this); } void HTMLInputElement::handleFocusEvent(Element* oldFocusedElement,
diff --git a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp index fe352c53..63e0e8c 100644 --- a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
@@ -49,7 +49,6 @@ #include "core/events/KeyboardEvent.h" #include "core/events/MouseEvent.h" #include "core/events/ScopedEventQueue.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/html/FormData.h" @@ -1921,7 +1920,7 @@ void HTMLSelectElement::showPopup() { if (popupIsVisible()) return; - if (document().frameHost()->chromeClient().hasOpenedPopup()) + if (document().page()->chromeClient().hasOpenedPopup()) return; if (!layoutObject() || !layoutObject()->isMenuList()) return; @@ -1929,7 +1928,7 @@ return; if (!m_popup) - m_popup = document().frameHost()->chromeClient().openPopupMenu( + m_popup = document().page()->chromeClient().openPopupMenu( *document().frame(), *this); m_popupIsVisible = true; observeTreeMutation();
diff --git a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp index a3d83420..c85a2a35 100644 --- a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
@@ -39,7 +39,6 @@ #include "core/editing/spellcheck/SpellChecker.h" #include "core/events/BeforeTextInsertedEvent.h" #include "core/events/Event.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/frame/UseCounter.h" #include "core/html/FormData.h" @@ -49,6 +48,7 @@ #include "core/html/shadow/TextControlInnerElements.h" #include "core/layout/LayoutTextControlMultiLine.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/text/PlatformLocale.h" #include "wtf/StdLibExtras.h" #include "wtf/text/StringBuilder.h" @@ -300,7 +300,7 @@ calculateAndAdjustDirectionality(); DCHECK(document().isActive()); - document().frameHost()->chromeClient().didChangeValueInTextField(*this); + document().page()->chromeClient().didChangeValueInTextField(*this); } void HTMLTextAreaElement::handleBeforeTextInsertedEvent(
diff --git a/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp b/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp index 26e8be5d..b163f9a 100644 --- a/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp +++ b/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp
@@ -28,10 +28,10 @@ #include "bindings/core/v8/ExceptionState.h" #include "core/dom/Document.h" #include "core/dom/shadow/ShadowRoot.h" -#include "core/frame/FrameHost.h" #include "core/html/HTMLDivElement.h" #include "core/html/HTMLInputElement.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "platform/UserGestureIndicator.h" namespace blink { @@ -73,7 +73,7 @@ if (!element().setupDateTimeChooserParameters(parameters)) return; m_dateTimeChooser = - element().document().frameHost()->chromeClient().openDateTimeChooser( + element().document().page()->chromeClient().openDateTimeChooser( this, parameters); }
diff --git a/third_party/WebKit/Source/core/html/forms/InputType.cpp b/third_party/WebKit/Source/core/html/forms/InputType.cpp index c833c9c..5f1485d 100644 --- a/third_party/WebKit/Source/core/html/forms/InputType.cpp +++ b/third_party/WebKit/Source/core/html/forms/InputType.cpp
@@ -28,6 +28,8 @@ #include "core/html/forms/InputType.h" +#include <memory> + #include "bindings/core/v8/ExceptionMessages.h" #include "bindings/core/v8/ExceptionState.h" #include "core/InputTypeNames.h" @@ -37,7 +39,6 @@ #include "core/events/KeyboardEvent.h" #include "core/events/ScopedEventQueue.h" #include "core/fileapi/FileList.h" -#include "core/frame/FrameHost.h" #include "core/html/FormData.h" #include "core/html/HTMLFormElement.h" #include "core/html/HTMLInputElement.h" @@ -68,12 +69,12 @@ #include "core/html/parser/HTMLParserIdioms.h" #include "core/inspector/ConsoleMessage.h" #include "core/layout/LayoutTheme.h" +#include "core/page/Page.h" #include "platform/RuntimeEnabledFeatures.h" #include "platform/json/JSONValues.h" #include "platform/text/PlatformLocale.h" #include "platform/text/TextBreakIterator.h" #include "wtf/PtrUtil.h" -#include <memory> namespace blink { @@ -430,8 +431,8 @@ } ChromeClient* InputType::chromeClient() const { - if (FrameHost* host = element().document().frameHost()) - return &host->chromeClient(); + if (Page* page = element().document().page()) + return &page->chromeClient(); return nullptr; }
diff --git a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp index 5bd3ebd..1893fdf 100644 --- a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp +++ b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
@@ -40,7 +40,6 @@ #include "core/events/BeforeTextInsertedEvent.h" #include "core/events/KeyboardEvent.h" #include "core/events/TextEvent.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/html/FormData.h" #include "core/html/HTMLInputElement.h" @@ -50,6 +49,7 @@ #include "core/layout/LayoutTextControlSingleLine.h" #include "core/layout/LayoutTheme.h" #include "core/page/ChromeClient.h" +#include "core/page/Page.h" #include "core/paint/PaintLayer.h" #include "platform/EventDispatchForbiddenScope.h" #include "wtf/text/WTFString.h" @@ -86,7 +86,7 @@ return; HTMLInputElement* host = hostInput(); if (host && !host->isDisabledOrReadOnly()) { - document().frameHost()->chromeClient().openTextDataListChooser(*host); + document().page()->chromeClient().openTextDataListChooser(*host); event->setDefaultHandled(); } }
diff --git a/third_party/WebKit/Source/core/layout/BUILD.gn b/third_party/WebKit/Source/core/layout/BUILD.gn index d69ef7283..cea809c 100644 --- a/third_party/WebKit/Source/core/layout/BUILD.gn +++ b/third_party/WebKit/Source/core/layout/BUILD.gn
@@ -280,6 +280,18 @@ "line/RootInlineBox.cpp", "line/TrailingObjects.cpp", "line/TrailingObjects.h", + "ng/geometry/ng_logical_offset.cc", + "ng/geometry/ng_logical_offset.h", + "ng/geometry/ng_logical_size.cc", + "ng/geometry/ng_logical_size.h", + "ng/geometry/ng_physical_location.cc", + "ng/geometry/ng_physical_location.h", + "ng/geometry/ng_physical_offset.cc", + "ng/geometry/ng_physical_offset.h", + "ng/geometry/ng_physical_rect.cc", + "ng/geometry/ng_physical_rect.h", + "ng/geometry/ng_physical_size.cc", + "ng/geometry/ng_physical_size.h", "ng/layout_ng_block_flow.cc", "ng/layout_ng_block_flow.h", "ng/ng_absolute_utils.cc",
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc new file mode 100644 index 0000000..5c7edf0b --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc
@@ -0,0 +1,109 @@ +// 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 "core/layout/ng/geometry/ng_logical_offset.h" + +#include "core/layout/ng/geometry/ng_physical_offset.h" +#include "core/layout/ng/geometry/ng_physical_size.h" +#include "wtf/text/WTFString.h" + +namespace blink { + +NGPhysicalOffset NGLogicalOffset::ConvertToPhysical( + NGWritingMode mode, + TextDirection direction, + NGPhysicalSize outer_size, + NGPhysicalSize inner_size) const { + switch (mode) { + case kHorizontalTopBottom: + if (direction == TextDirection::kLtr) + return NGPhysicalOffset(inline_offset, block_offset); + else + return NGPhysicalOffset( + outer_size.width - inline_offset - inner_size.width, block_offset); + case kVerticalRightLeft: + case kSidewaysRightLeft: + if (direction == TextDirection::kLtr) + return NGPhysicalOffset( + outer_size.width - block_offset - inner_size.width, inline_offset); + else + return NGPhysicalOffset( + outer_size.width - block_offset - inner_size.width, + outer_size.height - inline_offset - inner_size.height); + case kVerticalLeftRight: + if (direction == TextDirection::kLtr) + return NGPhysicalOffset(block_offset, inline_offset); + else + return NGPhysicalOffset( + block_offset, + outer_size.height - inline_offset - inner_size.height); + case kSidewaysLeftRight: + if (direction == TextDirection::kLtr) + return NGPhysicalOffset( + block_offset, + outer_size.height - inline_offset - inner_size.height); + else + return NGPhysicalOffset(block_offset, inline_offset); + default: + ASSERT_NOT_REACHED(); + return NGPhysicalOffset(); + } +} + +bool NGLogicalOffset::operator==(const NGLogicalOffset& other) const { + return std::tie(other.inline_offset, other.block_offset) == + std::tie(inline_offset, block_offset); +} + +NGLogicalOffset NGLogicalOffset::operator+(const NGLogicalOffset& other) const { + NGLogicalOffset result; + result.inline_offset = this->inline_offset + other.inline_offset; + result.block_offset = this->block_offset + other.block_offset; + return result; +} + +NGLogicalOffset& NGLogicalOffset::operator+=(const NGLogicalOffset& other) { + *this = *this + other; + return *this; +} + +bool NGLogicalOffset::operator>(const NGLogicalOffset& other) const { + return inline_offset > other.inline_offset && + block_offset > other.block_offset; +} + +bool NGLogicalOffset::operator>=(const NGLogicalOffset& other) const { + return inline_offset >= other.inline_offset && + block_offset >= other.block_offset; +} + +bool NGLogicalOffset::operator<(const NGLogicalOffset& other) const { + return inline_offset < other.inline_offset && + block_offset < other.block_offset; +} + +bool NGLogicalOffset::operator<=(const NGLogicalOffset& other) const { + return inline_offset <= other.inline_offset && + block_offset <= other.block_offset; +} + +NGLogicalOffset NGLogicalOffset::operator-(const NGLogicalOffset& other) const { + return NGLogicalOffset{this->inline_offset - other.inline_offset, + this->block_offset - other.block_offset}; +} + +NGLogicalOffset& NGLogicalOffset::operator-=(const NGLogicalOffset& other) { + *this = *this - other; + return *this; +} + +String NGLogicalOffset::ToString() const { + return String::format("%dx%d", inline_offset.toInt(), block_offset.toInt()); +} + +std::ostream& operator<<(std::ostream& os, const NGLogicalOffset& value) { + return os << value.ToString(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h new file mode 100644 index 0000000..c27a569 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h
@@ -0,0 +1,61 @@ +// 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 NGLogicalOffset_h +#define NGLogicalOffset_h + +#include "core/CoreExport.h" +#include "core/layout/ng/ng_writing_mode.h" +#include "platform/LayoutUnit.h" +#include "platform/text/TextDirection.h" + +namespace blink { + +struct NGPhysicalOffset; +struct NGPhysicalSize; + +// NGLogicalOffset is the position of a rect (typically a fragment) relative to +// its parent rect in the logical coordinate system. +struct CORE_EXPORT NGLogicalOffset { + NGLogicalOffset() {} + NGLogicalOffset(LayoutUnit inline_offset, LayoutUnit block_offset) + : inline_offset(inline_offset), block_offset(block_offset) {} + + LayoutUnit inline_offset; + LayoutUnit block_offset; + + // Converts a logical offset to a physical offset. See: + // https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical + // PhysicalOffset will be the physical top left point of the rectangle + // described by offset + inner_size. Setting inner_size to 0,0 will return + // the same point. + // @param outer_size the size of the rect (typically a fragment). + // @param inner_size the size of the inner rect (typically a child fragment). + NGPhysicalOffset ConvertToPhysical(NGWritingMode, + TextDirection, + NGPhysicalSize outer_size, + NGPhysicalSize inner_size) const; + + bool operator==(const NGLogicalOffset& other) const; + + NGLogicalOffset operator+(const NGLogicalOffset& other) const; + NGLogicalOffset& operator+=(const NGLogicalOffset& other); + + NGLogicalOffset operator-(const NGLogicalOffset& other) const; + NGLogicalOffset& operator-=(const NGLogicalOffset& other); + + bool operator>(const NGLogicalOffset& other) const; + bool operator>=(const NGLogicalOffset& other) const; + + bool operator<(const NGLogicalOffset& other) const; + bool operator<=(const NGLogicalOffset& other) const; + + String ToString() const; +}; + +CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGLogicalOffset&); + +} // namespace blink + +#endif // NGLogicalOffset_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc new file mode 100644 index 0000000..cce157a --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc
@@ -0,0 +1,74 @@ +// 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 "core/layout/ng/geometry/ng_logical_offset.h" +#include "core/layout/ng/geometry/ng_physical_offset.h" +#include "core/layout/ng/geometry/ng_physical_size.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +namespace { + +TEST(NGGeometryUnitsTest, ConvertLogicalOffsetToPhysicalOffset) { + NGLogicalOffset logical_offset(LayoutUnit(20), LayoutUnit(30)); + NGPhysicalSize outer_size(LayoutUnit(300), LayoutUnit(400)); + NGPhysicalSize inner_size(LayoutUnit(5), LayoutUnit(65)); + NGPhysicalOffset offset; + + offset = logical_offset.ConvertToPhysical( + kHorizontalTopBottom, TextDirection::kLtr, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(20), offset.left); + EXPECT_EQ(LayoutUnit(30), offset.top); + + offset = logical_offset.ConvertToPhysical( + kHorizontalTopBottom, TextDirection::kRtl, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(275), offset.left); + EXPECT_EQ(LayoutUnit(30), offset.top); + + offset = logical_offset.ConvertToPhysical( + kVerticalRightLeft, TextDirection::kLtr, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(265), offset.left); + EXPECT_EQ(LayoutUnit(20), offset.top); + + offset = logical_offset.ConvertToPhysical( + kVerticalRightLeft, TextDirection::kRtl, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(265), offset.left); + EXPECT_EQ(LayoutUnit(315), offset.top); + + offset = logical_offset.ConvertToPhysical( + kSidewaysRightLeft, TextDirection::kLtr, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(265), offset.left); + EXPECT_EQ(LayoutUnit(20), offset.top); + + offset = logical_offset.ConvertToPhysical( + kSidewaysRightLeft, TextDirection::kRtl, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(265), offset.left); + EXPECT_EQ(LayoutUnit(315), offset.top); + + offset = logical_offset.ConvertToPhysical( + kVerticalLeftRight, TextDirection::kLtr, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(30), offset.left); + EXPECT_EQ(LayoutUnit(20), offset.top); + + offset = logical_offset.ConvertToPhysical( + kVerticalLeftRight, TextDirection::kRtl, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(30), offset.left); + EXPECT_EQ(LayoutUnit(315), offset.top); + + offset = logical_offset.ConvertToPhysical( + kSidewaysLeftRight, TextDirection::kLtr, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(30), offset.left); + EXPECT_EQ(LayoutUnit(315), offset.top); + + offset = logical_offset.ConvertToPhysical( + kSidewaysLeftRight, TextDirection::kRtl, outer_size, inner_size); + EXPECT_EQ(LayoutUnit(30), offset.left); + EXPECT_EQ(LayoutUnit(20), offset.top); +} + +} // namespace + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc new file mode 100644 index 0000000..bdfd7ad --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc
@@ -0,0 +1,26 @@ +// 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 "core/layout/ng/geometry/ng_logical_size.h" + +#include "core/layout/ng/geometry/ng_physical_size.h" +#include "platform/text/TextDirection.h" + +namespace blink { + +NGPhysicalSize NGLogicalSize::ConvertToPhysical(NGWritingMode mode) const { + return mode == kHorizontalTopBottom ? NGPhysicalSize(inline_size, block_size) + : NGPhysicalSize(block_size, inline_size); +} + +bool NGLogicalSize::operator==(const NGLogicalSize& other) const { + return std::tie(other.inline_size, other.block_size) == + std::tie(inline_size, block_size); +} + +std::ostream& operator<<(std::ostream& stream, const NGLogicalSize& value) { + return stream << value.inline_size << "x" << value.block_size; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h new file mode 100644 index 0000000..2102165 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h
@@ -0,0 +1,38 @@ +// 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 NGLogicalSize_h +#define NGLogicalSize_h + +#include "core/CoreExport.h" +#include "core/layout/ng/ng_writing_mode.h" +#include "platform/LayoutUnit.h" + +namespace blink { + +struct NGPhysicalSize; + +// NGLogicalSize is the size of rect (typically a fragment) in the logical +// coordinate system. +struct CORE_EXPORT NGLogicalSize { + NGLogicalSize() {} + NGLogicalSize(LayoutUnit inline_size, LayoutUnit block_size) + : inline_size(inline_size), block_size(block_size) {} + + LayoutUnit inline_size; + LayoutUnit block_size; + + NGPhysicalSize ConvertToPhysical(NGWritingMode mode) const; + bool operator==(const NGLogicalSize& other) const; + + bool IsEmpty() const { + return inline_size == LayoutUnit() || block_size == LayoutUnit(); + } +}; + +CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGLogicalSize&); + +} // namespace blink + +#endif // NGLogicalSize_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc new file mode 100644 index 0000000..20b916c --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc
@@ -0,0 +1,19 @@ +// 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 "core/layout/ng/geometry/ng_physical_location.h" + +#include "wtf/text/WTFString.h" + +namespace blink { + +bool NGPhysicalLocation::operator==(const NGPhysicalLocation& other) const { + return other.left == left && other.top == top; +} + +String NGPhysicalLocation::ToString() const { + return String::format("%dx%d", left.toInt(), top.toInt()); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h new file mode 100644 index 0000000..2b40c5e8 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h
@@ -0,0 +1,34 @@ +// 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 NGPhysicalLocation_h +#define NGPhysicalLocation_h + +#include "core/CoreExport.h" + +#include "platform/LayoutUnit.h" + +namespace blink { + +// NGPhysicalLocation is the position of a rect (typically a fragment) relative +// to the root document. +struct CORE_EXPORT NGPhysicalLocation { + NGPhysicalLocation() {} + NGPhysicalLocation(LayoutUnit left, LayoutUnit top) : left(left), top(top) {} + LayoutUnit left; + LayoutUnit top; + + bool operator==(const NGPhysicalLocation& other) const; + + String ToString() const; +}; + +CORE_EXPORT inline std::ostream& operator<<(std::ostream& os, + const NGPhysicalLocation& value) { + return os << value.ToString(); +} + +} // namespace blink + +#endif // NGPhysicalLocation_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc new file mode 100644 index 0000000..9ccba021 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
@@ -0,0 +1,43 @@ +// 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 "core/layout/ng/geometry/ng_physical_offset.h" + +#include "wtf/text/WTFString.h" + +namespace blink { + +NGPhysicalOffset NGPhysicalOffset::operator+( + const NGPhysicalOffset& other) const { + return NGPhysicalOffset{this->left + other.left, this->top + other.top}; +} + +NGPhysicalOffset& NGPhysicalOffset::operator+=(const NGPhysicalOffset& other) { + *this = *this + other; + return *this; +} + +NGPhysicalOffset NGPhysicalOffset::operator-( + const NGPhysicalOffset& other) const { + return NGPhysicalOffset{this->left - other.left, this->top - other.top}; +} + +NGPhysicalOffset& NGPhysicalOffset::operator-=(const NGPhysicalOffset& other) { + *this = *this - other; + return *this; +} + +bool NGPhysicalOffset::operator==(const NGPhysicalOffset& other) const { + return other.left == left && other.top == top; +} + +String NGPhysicalOffset::ToString() const { + return String::format("%dx%d", left.toInt(), top.toInt()); +} + +std::ostream& operator<<(std::ostream& os, const NGPhysicalOffset& value) { + return os << value.ToString(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h new file mode 100644 index 0000000..5c4818cc --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
@@ -0,0 +1,38 @@ +// 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 NGPhysicalOffset_h +#define NGPhysicalOffset_h + +#include "core/CoreExport.h" + +#include "platform/LayoutUnit.h" + +namespace blink { + +// NGPhysicalOffset is the position of a rect (typically a fragment) relative to +// its parent rect in the physical coordinate system. +struct CORE_EXPORT NGPhysicalOffset { + NGPhysicalOffset() {} + NGPhysicalOffset(LayoutUnit left, LayoutUnit top) : left(left), top(top) {} + + LayoutUnit left; + LayoutUnit top; + + NGPhysicalOffset operator+(const NGPhysicalOffset& other) const; + NGPhysicalOffset& operator+=(const NGPhysicalOffset& other); + + NGPhysicalOffset operator-(const NGPhysicalOffset& other) const; + NGPhysicalOffset& operator-=(const NGPhysicalOffset& other); + + bool operator==(const NGPhysicalOffset& other) const; + + String ToString() const; +}; + +CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalOffset&); + +} // namespace blink + +#endif // NGPhysicalOffset_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc new file mode 100644 index 0000000..e91c5c45 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc
@@ -0,0 +1,36 @@ +// 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 "core/layout/ng/geometry/ng_physical_rect.h" + +#include "wtf/text/WTFString.h" + +namespace blink { + +NGPixelSnappedPhysicalRect NGPhysicalRect::SnapToDevicePixels() const { + NGPixelSnappedPhysicalRect snappedRect; + snappedRect.left = roundToInt(location.left); + snappedRect.top = roundToInt(location.top); + snappedRect.width = snapSizeToPixel(size.width, location.left); + snappedRect.height = snapSizeToPixel(size.height, location.top); + + return snappedRect; +} + +bool NGPhysicalRect::operator==(const NGPhysicalRect& other) const { + return other.location == location && other.size == size; +} + +String NGPhysicalRect::ToString() const { + return String::format("%s,%s %sx%s", location.left.toString().ascii().data(), + location.top.toString().ascii().data(), + size.width.toString().ascii().data(), + size.height.toString().ascii().data()); +} + +std::ostream& operator<<(std::ostream& os, const NGPhysicalRect& value) { + return os << value.ToString(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h new file mode 100644 index 0000000..fc90621e --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h
@@ -0,0 +1,47 @@ +// 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 NGPhysicalRect_h +#define NGPhysicalRect_h + +#include "core/CoreExport.h" +#include "core/layout/ng/geometry/ng_physical_location.h" +#include "core/layout/ng/geometry/ng_physical_size.h" +#include "platform/LayoutUnit.h" + +namespace blink { + +// NGPixelSnappedPhysicalRect is the position and size of a rect relative to the +// root document snapped to device pixels. +struct CORE_EXPORT NGPixelSnappedPhysicalRect { + int top; + int left; + int width; + int height; +}; + +// NGPhysicalRect is the position and size of a rect (typically a fragment) +// relative to the root document. +struct CORE_EXPORT NGPhysicalRect { + NGPhysicalRect(); + NGPhysicalRect(const NGPhysicalLocation& location, const NGPhysicalSize& size) + : location(location), size(size) {} + + NGPhysicalLocation Location() const { return location; } + NGPhysicalSize Size() const { return size; } + NGPixelSnappedPhysicalRect SnapToDevicePixels() const; + + NGPhysicalLocation location; + NGPhysicalSize size; + + bool operator==(const NGPhysicalRect& other) const; + + String ToString() const; +}; + +CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalRect&); + +} // namespace blink + +#endif // NGPhysicalRect_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc new file mode 100644 index 0000000..8a224a6 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc
@@ -0,0 +1,49 @@ +// Copyright 2017 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 "core/layout/ng/geometry/ng_physical_rect.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +namespace { + +TEST(NGGeometryUnitsTest, SnapToDevicePixels) { + NGPhysicalRect rect(NGPhysicalLocation(LayoutUnit(4.5), LayoutUnit(9.5)), + NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5))); + NGPixelSnappedPhysicalRect snappedRect = rect.SnapToDevicePixels(); + EXPECT_EQ(5, snappedRect.left); + EXPECT_EQ(10, snappedRect.top); + EXPECT_EQ(10, snappedRect.width); + EXPECT_EQ(11, snappedRect.height); + + rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(4), LayoutUnit(9)), + NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5))); + snappedRect = rect.SnapToDevicePixels(); + EXPECT_EQ(4, snappedRect.left); + EXPECT_EQ(9, snappedRect.top); + EXPECT_EQ(11, snappedRect.width); + EXPECT_EQ(12, snappedRect.height); + + rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.3), LayoutUnit(1.6)), + NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3))); + snappedRect = rect.SnapToDevicePixels(); + EXPECT_EQ(1, snappedRect.left); + EXPECT_EQ(2, snappedRect.top); + EXPECT_EQ(6, snappedRect.width); + EXPECT_EQ(4, snappedRect.height); + + rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.6), LayoutUnit(1.3)), + NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3))); + snappedRect = rect.SnapToDevicePixels(); + EXPECT_EQ(2, snappedRect.left); + EXPECT_EQ(1, snappedRect.top); + EXPECT_EQ(5, snappedRect.width); + EXPECT_EQ(5, snappedRect.height); +} + +} // namespace + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc new file mode 100644 index 0000000..798362b --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc
@@ -0,0 +1,29 @@ +// 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 "core/layout/ng/geometry/ng_physical_size.h" + +#include "core/layout/ng/geometry/ng_logical_size.h" +#include "wtf/text/WTFString.h" + +namespace blink { + +bool NGPhysicalSize::operator==(const NGPhysicalSize& other) const { + return std::tie(other.width, other.height) == std::tie(width, height); +} + +NGLogicalSize NGPhysicalSize::ConvertToLogical(NGWritingMode mode) const { + return mode == kHorizontalTopBottom ? NGLogicalSize(width, height) + : NGLogicalSize(height, width); +} + +String NGPhysicalSize::ToString() const { + return String::format("%dx%d", width.toInt(), height.toInt()); +} + +std::ostream& operator<<(std::ostream& os, const NGPhysicalSize& value) { + return os << value.ToString(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h new file mode 100644 index 0000000..a6f75a8 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h
@@ -0,0 +1,37 @@ +// 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 NGPhysicalSize_h +#define NGPhysicalSize_h + +#include "core/CoreExport.h" +#include "core/layout/ng/ng_writing_mode.h" +#include "platform/LayoutUnit.h" + +namespace blink { + +struct NGLogicalSize; + +// NGPhysicalSize is the size of a rect (typically a fragment) in the physical +// coordinate system. +struct CORE_EXPORT NGPhysicalSize { + NGPhysicalSize() {} + NGPhysicalSize(LayoutUnit width, LayoutUnit height) + : width(width), height(height) {} + + LayoutUnit width; + LayoutUnit height; + + NGLogicalSize ConvertToLogical(NGWritingMode mode) const; + + bool operator==(const NGPhysicalSize& other) const; + + String ToString() const; +}; + +CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalSize&); + +} // namespace blink + +#endif // NGPhysicalSize_h
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units.cc b/third_party/WebKit/Source/core/layout/ng/ng_units.cc index b77f9b3..4eafda9c 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_units.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_units.cc
@@ -16,24 +16,6 @@ return min_content == other.min_content && max_content == other.max_content; } -NGPhysicalSize NGLogicalSize::ConvertToPhysical(NGWritingMode mode) const { - return mode == kHorizontalTopBottom ? NGPhysicalSize(inline_size, block_size) - : NGPhysicalSize(block_size, inline_size); -} - -bool NGLogicalSize::operator==(const NGLogicalSize& other) const { - return std::tie(other.inline_size, other.block_size) == - std::tie(inline_size, block_size); -} - -bool NGPhysicalSize::operator==(const NGPhysicalSize& other) const { - return std::tie(other.width, other.height) == std::tie(width, height); -} - -NGLogicalSize NGPhysicalSize::ConvertToLogical(NGWritingMode mode) const { - return mode == kHorizontalTopBottom ? NGLogicalSize(width, height) - : NGLogicalSize(height, width); -} bool NGLogicalRect::IsEmpty() const { // TODO(layout-dev): equality check shouldn't allocate an object each time. @@ -59,131 +41,6 @@ size.block_size.toString().ascii().data()); } -NGPixelSnappedPhysicalRect NGPhysicalRect::SnapToDevicePixels() const { - NGPixelSnappedPhysicalRect snappedRect; - snappedRect.left = roundToInt(location.left); - snappedRect.top = roundToInt(location.top); - snappedRect.width = snapSizeToPixel(size.width, location.left); - snappedRect.height = snapSizeToPixel(size.height, location.top); - - return snappedRect; -} - -NGPhysicalOffset NGLogicalOffset::ConvertToPhysical( - NGWritingMode mode, - TextDirection direction, - NGPhysicalSize outer_size, - NGPhysicalSize inner_size) const { - switch (mode) { - case kHorizontalTopBottom: - if (direction == TextDirection::kLtr) - return NGPhysicalOffset(inline_offset, block_offset); - else - return NGPhysicalOffset( - outer_size.width - inline_offset - inner_size.width, block_offset); - case kVerticalRightLeft: - case kSidewaysRightLeft: - if (direction == TextDirection::kLtr) - return NGPhysicalOffset( - outer_size.width - block_offset - inner_size.width, inline_offset); - else - return NGPhysicalOffset( - outer_size.width - block_offset - inner_size.width, - outer_size.height - inline_offset - inner_size.height); - case kVerticalLeftRight: - if (direction == TextDirection::kLtr) - return NGPhysicalOffset(block_offset, inline_offset); - else - return NGPhysicalOffset( - block_offset, - outer_size.height - inline_offset - inner_size.height); - case kSidewaysLeftRight: - if (direction == TextDirection::kLtr) - return NGPhysicalOffset( - block_offset, - outer_size.height - inline_offset - inner_size.height); - else - return NGPhysicalOffset(block_offset, inline_offset); - default: - ASSERT_NOT_REACHED(); - return NGPhysicalOffset(); - } -} - -bool NGLogicalOffset::operator==(const NGLogicalOffset& other) const { - return std::tie(other.inline_offset, other.block_offset) == - std::tie(inline_offset, block_offset); -} - -NGLogicalOffset NGLogicalOffset::operator+(const NGLogicalOffset& other) const { - NGLogicalOffset result; - result.inline_offset = this->inline_offset + other.inline_offset; - result.block_offset = this->block_offset + other.block_offset; - return result; -} - -NGLogicalOffset& NGLogicalOffset::operator+=(const NGLogicalOffset& other) { - *this = *this + other; - return *this; -} - -bool NGLogicalOffset::operator>(const NGLogicalOffset& other) const { - return inline_offset > other.inline_offset && - block_offset > other.block_offset; -} - -bool NGLogicalOffset::operator>=(const NGLogicalOffset& other) const { - return inline_offset >= other.inline_offset && - block_offset >= other.block_offset; -} - -bool NGLogicalOffset::operator<(const NGLogicalOffset& other) const { - return inline_offset < other.inline_offset && - block_offset < other.block_offset; -} - -bool NGLogicalOffset::operator<=(const NGLogicalOffset& other) const { - return inline_offset <= other.inline_offset && - block_offset <= other.block_offset; -} - -NGLogicalOffset NGLogicalOffset::operator-(const NGLogicalOffset& other) const { - return NGLogicalOffset{this->inline_offset - other.inline_offset, - this->block_offset - other.block_offset}; -} - -NGLogicalOffset& NGLogicalOffset::operator-=(const NGLogicalOffset& other) { - *this = *this - other; - return *this; -} - -String NGLogicalOffset::ToString() const { - return String::format("%dx%d", inline_offset.toInt(), block_offset.toInt()); -} - -NGPhysicalOffset NGPhysicalOffset::operator+( - const NGPhysicalOffset& other) const { - return NGPhysicalOffset{this->left + other.left, this->top + other.top}; -} - -NGPhysicalOffset& NGPhysicalOffset::operator+=(const NGPhysicalOffset& other) { - *this = *this + other; - return *this; -} - -NGPhysicalOffset NGPhysicalOffset::operator-( - const NGPhysicalOffset& other) const { - return NGPhysicalOffset{this->left - other.left, this->top - other.top}; -} - -NGPhysicalOffset& NGPhysicalOffset::operator-=(const NGPhysicalOffset& other) { - *this = *this - other; - return *this; -} - -bool NGPhysicalOffset::operator==(const NGPhysicalOffset& other) const { - return other.left == left && other.top == top; -} bool NGBoxStrut::IsEmpty() const { return *this == NGBoxStrut();
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units.h b/third_party/WebKit/Source/core/layout/ng/ng_units.h index 53b898a..58c9257 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_units.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_units.h
@@ -6,6 +6,12 @@ #define NGUnits_h #include "core/CoreExport.h" +#include "core/layout/ng/geometry/ng_logical_offset.h" +#include "core/layout/ng/geometry/ng_logical_size.h" +#include "core/layout/ng/geometry/ng_physical_location.h" +#include "core/layout/ng/geometry/ng_physical_offset.h" +#include "core/layout/ng/geometry/ng_physical_rect.h" +#include "core/layout/ng/geometry/ng_physical_size.h" #include "core/layout/ng/ng_writing_mode.h" #include "platform/LayoutUnit.h" #include "platform/text/TextDirection.h" @@ -13,11 +19,7 @@ namespace blink { -class LayoutUnit; -struct NGPhysicalOffset; -struct NGPhysicalSize; struct NGBoxStrut; -struct NGPixelSnappedPhysicalRect; #define NGSizeIndefinite LayoutUnit(-1) @@ -33,143 +35,6 @@ return stream << "(" << value.min_content << ", " << value.max_content << ")"; } -struct NGLogicalSize { - NGLogicalSize() {} - NGLogicalSize(LayoutUnit inline_size, LayoutUnit block_size) - : inline_size(inline_size), block_size(block_size) {} - - LayoutUnit inline_size; - LayoutUnit block_size; - - NGPhysicalSize ConvertToPhysical(NGWritingMode mode) const; - bool operator==(const NGLogicalSize& other) const; - - bool IsEmpty() const { - return inline_size == LayoutUnit() || block_size == LayoutUnit(); - } -}; - -inline std::ostream& operator<<(std::ostream& stream, - const NGLogicalSize& value) { - return stream << value.inline_size << "x" << value.block_size; -} - -// NGLogicalOffset is the position of a rect (typically a fragment) relative to -// its parent rect in the logical coordinate system. -struct NGLogicalOffset { - NGLogicalOffset() {} - NGLogicalOffset(LayoutUnit inline_offset, LayoutUnit block_offset) - : inline_offset(inline_offset), block_offset(block_offset) {} - - LayoutUnit inline_offset; - LayoutUnit block_offset; - - // Converts a logical offset to a physical offset. See: - // https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical - // PhysicalOffset will be the physical top left point of the rectangle - // described by offset + inner_size. Setting inner_size to 0,0 will return - // the same point. - // @param outer_size the size of the rect (typically a fragment). - // @param inner_size the size of the inner rect (typically a child fragment). - CORE_EXPORT NGPhysicalOffset - ConvertToPhysical(NGWritingMode, - TextDirection, - NGPhysicalSize outer_size, - NGPhysicalSize inner_size) const; - - bool operator==(const NGLogicalOffset& other) const; - - NGLogicalOffset operator+(const NGLogicalOffset& other) const; - NGLogicalOffset& operator+=(const NGLogicalOffset& other); - - NGLogicalOffset operator-(const NGLogicalOffset& other) const; - NGLogicalOffset& operator-=(const NGLogicalOffset& other); - - bool operator>(const NGLogicalOffset& other) const; - bool operator>=(const NGLogicalOffset& other) const; - - bool operator<(const NGLogicalOffset& other) const; - bool operator<=(const NGLogicalOffset& other) const; - - String ToString() const; -}; - -CORE_EXPORT inline std::ostream& operator<<(std::ostream& os, - const NGLogicalOffset& value) { - return os << value.ToString(); -} - -// NGPhysicalOffset is the position of a rect (typically a fragment) relative to -// its parent rect in the physical coordinate system. -struct CORE_EXPORT NGPhysicalOffset { - NGPhysicalOffset() {} - NGPhysicalOffset(LayoutUnit left, LayoutUnit top) : left(left), top(top) {} - - LayoutUnit left; - LayoutUnit top; - - NGPhysicalOffset operator+(const NGPhysicalOffset& other) const; - NGPhysicalOffset& operator+=(const NGPhysicalOffset& other); - - NGPhysicalOffset operator-(const NGPhysicalOffset& other) const; - NGPhysicalOffset& operator-=(const NGPhysicalOffset& other); - - bool operator==(const NGPhysicalOffset& other) const; - - String ToString() const { - return String::format("%dx%d", left.toInt(), top.toInt()); - } -}; - -CORE_EXPORT inline std::ostream& operator<<(std::ostream& os, - const NGPhysicalOffset& value) { - return os << value.ToString(); -} - -struct CORE_EXPORT NGPhysicalSize { - NGPhysicalSize() {} - NGPhysicalSize(LayoutUnit width, LayoutUnit height) - : width(width), height(height) {} - - LayoutUnit width; - LayoutUnit height; - - NGLogicalSize ConvertToLogical(NGWritingMode mode) const; - - bool operator==(const NGPhysicalSize& other) const; - - String ToString() const { - return String::format("%dx%d", width.toInt(), height.toInt()); - } -}; - -inline std::ostream& operator<<(std::ostream& stream, - const NGPhysicalSize& value) { - return stream << value.ToString(); -} - -// NGPhysicalLocation is the position of a rect (typically a fragment) relative -// to the root document. -struct NGPhysicalLocation { - NGPhysicalLocation() {} - NGPhysicalLocation(LayoutUnit left, LayoutUnit top) : left(left), top(top) {} - LayoutUnit left; - LayoutUnit top; -}; - -struct CORE_EXPORT NGPhysicalRect { - NGPhysicalRect(); - NGPhysicalRect(const NGPhysicalLocation& location, const NGPhysicalSize& size) - : location(location), size(size) {} - - NGPhysicalLocation Location() const { return location; } - NGPhysicalSize Size() const { return size; } - NGPixelSnappedPhysicalRect SnapToDevicePixels() const; - - NGPhysicalLocation location; - NGPhysicalSize size; -}; - // TODO(glebl): move to a separate file in layout/ng/units. struct CORE_EXPORT NGLogicalRect { NGLogicalRect() {} @@ -262,12 +127,6 @@ void Add(const NGExclusion& exclusion); }; -struct NGPixelSnappedPhysicalRect { - int top; - int left; - int width; - int height; -}; // Struct to store physical dimensions, independent of writing mode and // direction.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc index bf6684ac..cd9b9318 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc
@@ -10,63 +10,6 @@ namespace { -TEST(NGUnitsTest, ConvertLogicalOffsetToPhysicalOffset) { - NGLogicalOffset logical_offset(LayoutUnit(20), LayoutUnit(30)); - NGPhysicalSize outer_size(LayoutUnit(300), LayoutUnit(400)); - NGPhysicalSize inner_size(LayoutUnit(5), LayoutUnit(65)); - NGPhysicalOffset offset; - - offset = logical_offset.ConvertToPhysical( - kHorizontalTopBottom, TextDirection::kLtr, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(20), offset.left); - EXPECT_EQ(LayoutUnit(30), offset.top); - - offset = logical_offset.ConvertToPhysical( - kHorizontalTopBottom, TextDirection::kRtl, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(275), offset.left); - EXPECT_EQ(LayoutUnit(30), offset.top); - - offset = logical_offset.ConvertToPhysical( - kVerticalRightLeft, TextDirection::kLtr, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(265), offset.left); - EXPECT_EQ(LayoutUnit(20), offset.top); - - offset = logical_offset.ConvertToPhysical( - kVerticalRightLeft, TextDirection::kRtl, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(265), offset.left); - EXPECT_EQ(LayoutUnit(315), offset.top); - - offset = logical_offset.ConvertToPhysical( - kSidewaysRightLeft, TextDirection::kLtr, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(265), offset.left); - EXPECT_EQ(LayoutUnit(20), offset.top); - - offset = logical_offset.ConvertToPhysical( - kSidewaysRightLeft, TextDirection::kRtl, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(265), offset.left); - EXPECT_EQ(LayoutUnit(315), offset.top); - - offset = logical_offset.ConvertToPhysical( - kVerticalLeftRight, TextDirection::kLtr, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(30), offset.left); - EXPECT_EQ(LayoutUnit(20), offset.top); - - offset = logical_offset.ConvertToPhysical( - kVerticalLeftRight, TextDirection::kRtl, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(30), offset.left); - EXPECT_EQ(LayoutUnit(315), offset.top); - - offset = logical_offset.ConvertToPhysical( - kSidewaysLeftRight, TextDirection::kLtr, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(30), offset.left); - EXPECT_EQ(LayoutUnit(315), offset.top); - - offset = logical_offset.ConvertToPhysical( - kSidewaysLeftRight, TextDirection::kRtl, outer_size, inner_size); - EXPECT_EQ(LayoutUnit(30), offset.left); - EXPECT_EQ(LayoutUnit(20), offset.top); -} - // Ideally, this would be tested by NGBoxStrut::ConvertToPhysical, but // this has not been implemented yet. TEST(NGUnitsTest, ConvertPhysicalStrutToLogical) { @@ -116,40 +59,6 @@ EXPECT_EQ(LayoutUnit(200), sizes.ShrinkToFit(LayoutUnit(100))); } -TEST(NGUnitsTest, SnapToDevicePixels) { - NGPhysicalRect rect(NGPhysicalLocation(LayoutUnit(4.5), LayoutUnit(9.5)), - NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5))); - NGPixelSnappedPhysicalRect snappedRect = rect.SnapToDevicePixels(); - EXPECT_EQ(5, snappedRect.left); - EXPECT_EQ(10, snappedRect.top); - EXPECT_EQ(10, snappedRect.width); - EXPECT_EQ(11, snappedRect.height); - - rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(4), LayoutUnit(9)), - NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5))); - snappedRect = rect.SnapToDevicePixels(); - EXPECT_EQ(4, snappedRect.left); - EXPECT_EQ(9, snappedRect.top); - EXPECT_EQ(11, snappedRect.width); - EXPECT_EQ(12, snappedRect.height); - - rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.3), LayoutUnit(1.6)), - NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3))); - snappedRect = rect.SnapToDevicePixels(); - EXPECT_EQ(1, snappedRect.left); - EXPECT_EQ(2, snappedRect.top); - EXPECT_EQ(6, snappedRect.width); - EXPECT_EQ(4, snappedRect.height); - - rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.6), LayoutUnit(1.3)), - NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3))); - snappedRect = rect.SnapToDevicePixels(); - EXPECT_EQ(2, snappedRect.left); - EXPECT_EQ(1, snappedRect.top); - EXPECT_EQ(5, snappedRect.width); - EXPECT_EQ(5, snappedRect.height); -} - } // namespace } // namespace blink
diff --git a/third_party/WebKit/Source/core/page/CreateWindow.cpp b/third_party/WebKit/Source/core/page/CreateWindow.cpp index 0945a6c4..0d649a0d 100644 --- a/third_party/WebKit/Source/core/page/CreateWindow.cpp +++ b/third_party/WebKit/Source/core/page/CreateWindow.cpp
@@ -28,7 +28,6 @@ #include "core/dom/Document.h" #include "core/frame/FrameClient.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" #include "core/inspector/ConsoleMessage.h" @@ -56,11 +55,11 @@ if (Frame* frame = lookupFrame.findFrameForNavigation(frameName, activeFrame)) { if (frameName != "_self") { - if (FrameHost* host = frame->host()) { - if (host == activeFrame.host()) - frame->page()->focusController().setFocusedFrame(frame); + if (Page* page = frame->page()) { + if (page == activeFrame.page()) + page->focusController().setFocusedFrame(frame); else - host->chromeClient().focus(); + page->chromeClient().focus(); } } return frame; @@ -74,15 +73,14 @@ const WindowFeatures& features, NavigationPolicy policy, bool& created) { - FrameHost* oldHost = openerFrame.host(); - if (!oldHost) + Page* oldPage = openerFrame.page(); + if (!oldPage) return nullptr; - Page* page = oldHost->chromeClient().createWindow(&openerFrame, request, + Page* page = oldPage->chromeClient().createWindow(&openerFrame, request, features, policy); if (!page) return nullptr; - FrameHost* host = &page->frameHost(); ASSERT(page->mainFrame()); LocalFrame& frame = *toLocalFrame(page->mainFrame()); @@ -90,14 +88,14 @@ if (request.frameName() != "_blank") frame.tree().setName(request.frameName()); - host->chromeClient().setWindowFeatures(features); + page->chromeClient().setWindowFeatures(features); // 'x' and 'y' specify the location of the window, while 'width' and 'height' // specify the size of the viewport. We can only resize the window, so adjust // for the difference between the window size and the viewport size. - IntRect windowRect = host->chromeClient().rootWindowRect(); - IntSize viewportSize = host->chromeClient().pageRect().size(); + IntRect windowRect = page->chromeClient().rootWindowRect(); + IntSize viewportSize = page->chromeClient().pageRect().size(); if (features.xSet) windowRect.setX(features.x); @@ -110,8 +108,8 @@ windowRect.setHeight(features.height + (windowRect.height() - viewportSize.height())); - host->chromeClient().setWindowRectWithAdjustment(windowRect, frame); - host->chromeClient().show(policy); + page->chromeClient().setWindowRectWithAdjustment(windowRect, frame); + page->chromeClient().show(policy); if (openerFrame.document()->isSandboxed( SandboxPropagatesToAuxiliaryBrowsingContexts))
diff --git a/third_party/WebKit/Source/core/page/NetworkStateNotifier.h b/third_party/WebKit/Source/core/page/NetworkStateNotifier.h index c0bf4b6..9a04c7c 100644 --- a/third_party/WebKit/Source/core/page/NetworkStateNotifier.h +++ b/third_party/WebKit/Source/core/page/NetworkStateNotifier.h
@@ -44,6 +44,15 @@ USING_FAST_MALLOC(NetworkStateNotifier); public: + struct NetworkState { + static const int kInvalidMaxBandwidth = -1; + bool onLineInitialized = false; + bool onLine = true; + bool connectionInitialized = false; + WebConnectionType type = WebConnectionTypeOther; + double maxBandwidthMbps = kInvalidMaxBandwidth; + }; + class NetworkStateObserver { public: // Will be called on the task runner that is passed in add*Observer. @@ -129,16 +138,6 @@ Vector<size_t> zeroedObservers; // Indices in observers that are 0. }; - struct NetworkState { - static const int kInvalidMaxBandwidth = -1; - bool onLineInitialized = false; - bool onLine = true; - bool connectionInitialized = false; - WebConnectionType type = WebConnectionTypeOther; - double maxBandwidthMbps = kInvalidMaxBandwidth; - }; - friend CrossThreadCopier<NetworkStateNotifier::NetworkState>; - // This helper scope issues required notifications when mutating the state if // something has changed. It's only possible to mutate the state on the main // thread. Note that ScopedNotifier must be destroyed when not holding a lock
diff --git a/third_party/WebKit/Source/core/page/Page.h b/third_party/WebKit/Source/core/page/Page.h index ee746b9..53fbb15 100644 --- a/third_party/WebKit/Source/core/page/Page.h +++ b/third_party/WebKit/Source/core/page/Page.h
@@ -119,6 +119,7 @@ static void platformColorsChanged(); + // TODO(sashab): Remove this. FrameHost& frameHost() const { return *m_frameHost; } void setNeedsRecalcStyleInAllFrames();
diff --git a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp index 270b7c55..412c44b 100644 --- a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp +++ b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
@@ -198,7 +198,7 @@ return; // Let the compositor-side counterpart know about this change. - m_frameHost->chromeClient().registerViewportLayers(); + m_frameHost->page().chromeClient().registerViewportLayers(); } void TopDocumentRootScrollerController::didDisposeScrollableArea(
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp b/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp index ca5eb027..9f5199c 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp
@@ -40,7 +40,7 @@ INSTANTIATE_TEST_CASE_P(All, PaintLayerClipperTest, - ::testing::ValuesIn({false, true})); + ::testing::ValuesIn(std::vector<bool>{false, true})); TEST_P(PaintLayerClipperTest, LayoutSVGRoot) { setBodyInnerHTML(
diff --git a/third_party/WebKit/Source/core/svg/SVGAElement.cpp b/third_party/WebKit/Source/core/svg/SVGAElement.cpp index a3283c6..a4e7c547 100644 --- a/third_party/WebKit/Source/core/svg/SVGAElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGAElement.cpp
@@ -30,7 +30,6 @@ #include "core/editing/EditingUtilities.h" #include "core/events/KeyboardEvent.h" #include "core/events/MouseEvent.h" -#include "core/frame/FrameHost.h" #include "core/frame/LocalFrame.h" #include "core/html/HTMLAnchorElement.h" #include "core/html/HTMLFormElement.h" @@ -199,7 +198,7 @@ bool SVGAElement::isKeyboardFocusable() const { if (isFocusable() && Element::supportsFocus()) return SVGElement::isKeyboardFocusable(); - if (isLink() && !document().frameHost()->chromeClient().tabsToLinks()) + if (isLink() && !document().page()->chromeClient().tabsToLinks()) return false; return SVGElement::isKeyboardFocusable(); }
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js index e8dee8b..5c40b1e 100644 --- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js +++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js
@@ -21,10 +21,9 @@ var toolbarContainer = this.contentElement.createChild('div', 'coverage-toolbar-container'); var topToolbar = new UI.Toolbar('coverage-toolbar', toolbarContainer); - this._recordButton = - new UI.ToolbarToggle(Common.UIString('Start recording'), 'largeicon-resume', 'largeicon-pause'); - this._recordButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._toggleRecording(!this._isRecording)); - topToolbar.appendToolbarItem(this._recordButton); + this._toggleRecordAction = + /** @type {!UI.Action }*/ (UI.actionRegistry.action('coverage.toggle-recording')); + topToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction)); var clearButton = new UI.ToolbarButton(Common.UIString('Clear all'), 'largeicon-clear'); clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._reset.bind(this)); @@ -36,8 +35,6 @@ this._statusToolbarElement = this.contentElement.createChild('div', 'coverage-toolbar-summary'); this._statusMessageElement = this._statusToolbarElement.createChild('div', 'coverage-message'); - - this._isRecording = false; } _reset() { @@ -52,17 +49,10 @@ this._statusMessageElement.textContent = ''; } - /** - * @param {boolean} enable - */ - _toggleRecording(enable) { - if (enable === this._isRecording) - return; + _toggleRecording() { + var enable = !this._toggleRecordAction.toggled(); - this._isRecording = enable; - this._recordButton.setToggled(this._isRecording); - - if (this._isRecording) + if (enable) this._startRecording(); else this._stopRecording(); @@ -76,7 +66,7 @@ var cssModel = mainTarget.model(SDK.CSSModel); if (!cssModel) return; - this._recordButton.setTitle(Common.UIString('Stop recording')); + this._toggleRecordAction.setToggled(true); cssModel.startRuleUsageTracking(); mainTarget.profilerAgent().startPreciseCoverage(); @@ -84,7 +74,7 @@ } async _stopRecording() { - this._recordButton.setTitle(Common.UIString('Start recording')); + this._toggleRecordAction.setToggled(false); this._progressElement.textContent = Common.UIString('Fetching results...'); var cssCoverageInfoPromise = this._stopCSSCoverage(); @@ -353,3 +343,23 @@ }; Coverage.CoverageView.LineDecorator.type = 'coverage'; + +/** + * @implements {UI.ActionDelegate} + */ +Coverage.CoverageView.RecordActionDelegate = class { + /** + * @override + * @param {!UI.Context} context + * @param {string} actionId + * @return {boolean} + */ + handleAction(context, actionId) { + var coverageViewId = 'coverage'; + UI.viewManager.showView(coverageViewId) + .then(() => UI.viewManager.view(coverageViewId).widget()) + .then(widget => /** @type !Coverage.CoverageView} */ (widget)._toggleRecording()); + + return true; + } +}; \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/module.json b/third_party/WebKit/Source/devtools/front_end/coverage/module.json index 2998cd7..f1e0575 100644 --- a/third_party/WebKit/Source/devtools/front_end/coverage/module.json +++ b/third_party/WebKit/Source/devtools/front_end/coverage/module.json
@@ -14,6 +14,26 @@ "type": "@SourceFrame.UISourceCodeFrame.LineDecorator", "className": "Coverage.CoverageView.LineDecorator", "decoratorType": "coverage" + }, + { + "type": "@UI.ActionDelegate", + "actionId": "coverage.toggle-recording", + "iconClass": "largeicon-start-recording", + "toggledIconClass": "largeicon-stop-recording", + "toggleWithRedColor": true, + "className": "Coverage.CoverageView.RecordActionDelegate", + "category": "Performance", + "experiment": "cssTrackerPanel", + "options": [ + { + "value": true, + "title": "Instrument coverage" + }, + { + "value": false, + "title": "Stop instrumenting coverage and show results" + } + ] } ], "dependencies": [
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 142b6f77..12c82662e 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -99,7 +99,7 @@ Runtime.experiments.register('blackboxJSFramesOnTimeline', 'Blackbox JavaScript frames on Timeline', true); Runtime.experiments.register('continueToLocationMarkers', 'Continue to location markers', true); Runtime.experiments.register('colorContrastRatio', 'Contrast ratio line in color picker', true); - Runtime.experiments.register('cssTrackerPanel', 'Panel that tracks the usage of CSS rules.'); + Runtime.experiments.register('cssTrackerPanel', 'Coverage support'); Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping'); Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true); Runtime.experiments.register('liveSASS', 'Live SASS');
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp index d5eb971..54a4376d 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp
@@ -7,7 +7,6 @@ #include "core/dom/Document.h" #include "core/dom/TaskRunnerHelper.h" #include "core/events/Event.h" -#include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/page/ChromeClient.h" @@ -85,8 +84,8 @@ void ScreenOrientationControllerImpl::updateOrientation() { DCHECK(m_orientation); DCHECK(frame()); - DCHECK(frame()->host()); - ChromeClient& chromeClient = frame()->host()->chromeClient(); + DCHECK(frame()->page()); + ChromeClient& chromeClient = frame()->page()->chromeClient(); WebScreenInfo screenInfo = chromeClient.screenInfo(); WebScreenOrientationType orientationType = screenInfo.orientationType; if (orientationType == WebScreenOrientationUndefined) { @@ -120,12 +119,12 @@ return; DCHECK(frame()); - DCHECK(frame()->host()); + DCHECK(frame()->page()); // The orientation type and angle are tied in a way that if the angle has // changed, the type must have changed. unsigned short currentAngle = - frame()->host()->chromeClient().screenInfo().orientationAngle; + frame()->page()->chromeClient().screenInfo().orientationAngle; // FIXME: sendOrientationChangeEvent() currently send an event all the // children of the frame, so it should only be called on the frame on
diff --git a/third_party/WebKit/Source/web/InspectorOverlay.cpp b/third_party/WebKit/Source/web/InspectorOverlay.cpp index b7d9e4c..8faf981d 100644 --- a/third_party/WebKit/Source/web/InspectorOverlay.cpp +++ b/third_party/WebKit/Source/web/InspectorOverlay.cpp
@@ -395,7 +395,7 @@ FrameView* view = m_frameImpl->frameView(); LocalFrame* frame = m_frameImpl->frame(); if (view && frame) - frame->host()->chromeClient().scheduleAnimation(view); + frame->page()->chromeClient().scheduleAnimation(view); } void InspectorOverlay::rebuildOverlayPage() { @@ -495,7 +495,7 @@ LocalFrame* frame = m_frameImpl->frame(); if (!frame) return 1.0f; - return frame->host()->chromeClient().windowToViewportScalar(1.0f); + return frame->page()->chromeClient().windowToViewportScalar(1.0f); } Page* InspectorOverlay::overlayPage() { @@ -510,7 +510,7 @@ fillWithEmptyClients(pageClients); DCHECK(!m_overlayChromeClient); m_overlayChromeClient = InspectorOverlayChromeClient::create( - m_frameImpl->frame()->host()->chromeClient(), *this); + m_frameImpl->frame()->page()->chromeClient(), *this); pageClients.chromeClient = m_overlayChromeClient.get(); m_overlayPage = Page::create(pageClients); @@ -594,7 +594,7 @@ m_frameImpl->frame()->host()->visualViewport().scale()); IntRect viewportInScreen = - m_frameImpl->frame()->host()->chromeClient().viewportToScreen( + m_frameImpl->frame()->page()->chromeClient().viewportToScreen( IntRect(IntPoint(), viewportSize), m_frameImpl->frame()->view()); resetData->setObject("viewportSize", buildObjectForSize(viewportInScreen.size()));
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp index 4c58568..f1a7f26 100644 --- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp +++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
@@ -75,8 +75,7 @@ .visualViewport() .visibleRect() .location()); - overscrollOffset = - rootView->page()->frameHost().chromeClient().elasticOverscroll(); + overscrollOffset = rootView->page()->chromeClient().elasticOverscroll(); } } return FloatPoint(
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index 2a170a5..a95f10f 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1296,6 +1296,22 @@ frame()->inputMethodController().deleteSurroundingText(before, after); } +void WebLocalFrameImpl::deleteSurroundingTextInCodePoints(int before, + int after) { + TRACE_EVENT0("blink", "WebLocalFrameImpl::deleteSurroundingTextInCodePoints"); + if (WebPlugin* plugin = focusedPluginIfInputMethodSupported()) { + plugin->deleteSurroundingTextInCodePoints(before, after); + return; + } + + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); + + frame()->inputMethodController().deleteSurroundingTextInCodePoints(before, + after); +} + void WebLocalFrameImpl::setCaretVisible(bool visible) { frame()->selection().setCaretVisible(visible); }
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.h b/third_party/WebKit/Source/web/WebLocalFrameImpl.h index 6765b0c..68980612 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.h +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
@@ -202,6 +202,7 @@ const WebVector<WebCompositionUnderline>& underlines) override; void extendSelectionAndDelete(int before, int after) override; void deleteSurroundingText(int before, int after) override; + void deleteSurroundingTextInCodePoints(int before, int after) override; void setCaretVisible(bool) override; int printBegin(const WebPrintParams&, const WebNode& constrainToNode) override;
diff --git a/third_party/WebKit/Source/web/tests/data/input_field_populated.html b/third_party/WebKit/Source/web/tests/data/input_field_populated.html index 15c4b0e5..ba540cb 100644 --- a/third_party/WebKit/Source/web/tests/data/input_field_populated.html +++ b/third_party/WebKit/Source/web/tests/data/input_field_populated.html
@@ -1,5 +1,7 @@ <input id="sample" value='0123456789abcdefghijklmnopqrstuvwxyz'/> <div id="inputEvent">none</div> +<!- "ab" + trophy + space + "cdef" + trophy + space + "gh"> +<input id="sample2" value='ab🏆 cdef🏆 gh'/> <script> document.getElementById('sample').addEventListener('input', function() { document.getElementById('inputEvent').textContent = 'got';
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h index 7f51aa1..6d1beee 100644 --- a/third_party/WebKit/public/web/WebLocalFrame.h +++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -340,8 +340,15 @@ // Replaces the selection with the input string. virtual void replaceSelection(const WebString&) = 0; // Deletes text before and after the current cursor position, excluding the - // selection. + // selection. The lengths are supplied in UTF-16 Code Unit, not in code points + // or in glyphs. virtual void deleteSurroundingText(int before, int after) = 0; + // A variant of deleteSurroundingText(int, int). Major differences are: + // 1. The lengths are supplied in code points, not in UTF-16 Code Unit or in + // glyphs. + // 2. This method does nothing if there are one or more invalid surrogate + // pairs in the requested range. + virtual void deleteSurroundingTextInCodePoints(int before, int after) = 0; virtual void extractSmartClipData(WebRect rectInViewport, WebString& clipText,
diff --git a/third_party/WebKit/public/web/WebPlugin.h b/third_party/WebKit/public/web/WebPlugin.h index c57596b..8d2078b 100644 --- a/third_party/WebKit/public/web/WebPlugin.h +++ b/third_party/WebKit/public/web/WebPlugin.h
@@ -195,8 +195,14 @@ // before and after the selection or caret. virtual void extendSelectionAndDelete(int before, int after) {} // Deletes text before and after the current cursor position, excluding the - // selection. + // selection. The lengths are supplied in UTF-16 Code Unit, not in code points + // or in glyphs. virtual void deleteSurroundingText(int before, int after) {} + // Deletes text before and after the current cursor position, excluding the + // selection. The lengths are supplied in code points, not in UTF-16 Code Unit + // or in glyphs. Do nothing if there are one or more invalid surrogate pairs + // in the requested range. + virtual void deleteSurroundingTextInCodePoints(int before, int after) {} // If the given position is over a link, returns the absolute url. // Otherwise an empty url is returned. virtual WebURL linkAtPosition(const WebPoint& position) const {
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json index d87760d..977ad9d 100644 --- a/third_party/polymer/v1_0/bower.json +++ b/third_party/polymer/v1_0/bower.json
@@ -5,7 +5,7 @@ "font-roboto": "PolymerElements/font-roboto#1.0.1", "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1.0.5", "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1.1.9", - "iron-a11y-keys": "PolymerElements/iron-a11y-keys#1.0.6", + "iron-a11y-keys": "PolymerElements/iron-a11y-keys#1.0.7", "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#1.0.13", "iron-behaviors": "PolymerElements/iron-behaviors#1.0.17", "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1.0.5", @@ -60,7 +60,7 @@ "paper-toggle-button": "PolymerElements/paper-toggle-button#1.3.0", "paper-toolbar": "PolymerElements/paper-toolbar#1.1.6", "paper-tooltip": "PolymerElements/paper-tooltip#1.1.3", - "polymer": "Polymer/polymer#1.6.1", + "polymer": "Polymer/polymer#1.8.1", "web-animations-js": "web-animations/web-animations-js#2.2.2" } }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json index 79c18c5..b8221fe 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
@@ -1,6 +1,6 @@ { "name": "iron-a11y-keys", - "version": "1.0.6", + "version": "1.0.7", "description": "A basic element implementation of iron-a11y-keys-behavior, matching the legacy core-a11y-keys.", "keywords": [ "web-components",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js index 46f0ffc..eff16dd 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js
@@ -97,7 +97,7 @@ on-keys-pressed="increment"></iron-a11y-keys> <iron-a11y-keys target="[[target]]" keys="home" on-keys-pressed="setMin"></iron-a11y-keys> - <iron-a11y-keys target=""[[target]] keys="end" + <iron-a11y-keys target="[[target]]" keys="end" on-keys-pressed="setMax"></iron-a11y-keys> The `target` properties must evaluate to a node. See the basic usage
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html index 0952980..d82c9f3 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html
@@ -1,11 +1,11 @@ <!-- @license Copyright (c) 2015 The Polymer Project Authors. All rights reserved. -This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE -The complete set of authors may be found at http://polymer.github.io/AUTHORS -The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also -subject to an additional IP rights grant found at http://polymer.github.io/PATENTS +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><html><head><link rel="import" href="../polymer/polymer.html"> <link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/bower.json b/third_party/polymer/v1_0/components-chromium/polymer/bower.json index f0b22f0..41962a4 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/bower.json +++ b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
@@ -1,6 +1,6 @@ { "name": "polymer", - "version": "1.6.1", + "version": "1.8.1", "main": [ "polymer.html", "polymer-mini.html", @@ -25,7 +25,7 @@ "url": "https://github.com/Polymer/polymer.git" }, "dependencies": { - "webcomponentsjs": "^0.7.20" + "webcomponentsjs": "^0.7.24" }, "devDependencies": { "web-component-tester": "*",
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js index cc3286d..0a223a3 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
@@ -1,9 +1,11 @@ +(function () { Polymer.nar = []; +var disableUpgradeEnabled = Polymer.Settings.disableUpgradeEnabled; Polymer.Annotations = { -parseAnnotations: function (template) { +parseAnnotations: function (template, stripWhiteSpace) { var list = []; var content = template._content || template.content; -this._parseNodeAnnotations(content, list, template.hasAttribute('strip-whitespace')); +this._parseNodeAnnotations(content, list, stripWhiteSpace || template.hasAttribute('strip-whitespace')); return list; }, _parseNodeAnnotations: function (node, list, stripWhiteSpace) { @@ -114,7 +116,10 @@ while (node) { var next = node.nextSibling; if (node.localName === 'template' && !node.hasAttribute('preserve-content')) { -this._parseTemplate(node, i, list, annote); +this._parseTemplate(node, i, list, annote, stripWhiteSpace); +} +if (node.localName == 'slot') { +node = this._replaceSlotWithContent(node); } if (node.nodeType === Node.TEXT_NODE) { var n = next; @@ -141,9 +146,26 @@ } } }, -_parseTemplate: function (node, index, list, parent) { +_replaceSlotWithContent: function (slot) { +var content = slot.ownerDocument.createElement('content'); +while (slot.firstChild) { +content.appendChild(slot.firstChild); +} +var attrs = slot.attributes; +for (var i = 0; i < attrs.length; i++) { +var attr = attrs[i]; +content.setAttribute(attr.name, attr.value); +} +var name = slot.getAttribute('name'); +if (name) { +content.setAttribute('select', '[slot=\'' + name + '\']'); +} +slot.parentNode.replaceChild(content, slot); +return content; +}, +_parseTemplate: function (node, index, list, parent, stripWhiteSpace) { var content = document.createDocumentFragment(); -content._notes = this.parseAnnotations(node); +content._notes = this.parseAnnotations(node, stripWhiteSpace); content.appendChild(node.content); list.push({ bindings: Polymer.nar, @@ -188,6 +210,9 @@ if (node.localName === 'input' && origName === 'value') { node.setAttribute(origName, ''); } +if (disableUpgradeEnabled && origName === 'disable-upgrade$') { +node.setAttribute(name, ''); +} node.removeAttribute(origName); var propertyName = Polymer.CaseMap.dashToCamelCase(name); if (kind === 'property') { @@ -215,7 +240,8 @@ return root; } } -};(function () { +}; +}());(function () { function resolveCss(cssText, ownerDocument) { return cssText.replace(CSS_URL_RX, function (m, pre, url, post) { return pre + '\'' + resolve(url.replace(/["']/g, ''), ownerDocument) + '\'' + post; @@ -255,7 +281,7 @@ return resolve(url, tempDoc); } function getUrlResolver(ownerDocument) { -return ownerDocument.__urlResolver || (ownerDocument.__urlResolver = ownerDocument.createElement('a')); +return ownerDocument.body.__urlResolver || (ownerDocument.body.__urlResolver = ownerDocument.createElement('a')); } var CSS_URL_RX = /(url\()([^)]*)(\))/g; var URL_ATTRS = { @@ -274,7 +300,30 @@ resolveAttrs: resolveAttrs, resolveUrl: resolveUrl }; -}());Polymer.Base._addFeature({ +}());Polymer.Path = { +root: function (path) { +var dotIndex = path.indexOf('.'); +if (dotIndex === -1) { +return path; +} +return path.slice(0, dotIndex); +}, +isDeep: function (path) { +return path.indexOf('.') !== -1; +}, +isAncestor: function (base, path) { +return base.indexOf(path + '.') === 0; +}, +isDescendant: function (base, path) { +return path.indexOf(base + '.') === 0; +}, +translate: function (base, newBase, path) { +return newBase + path.slice(base.length); +}, +matches: function (base, wildcard, path) { +return base === path || this.isAncestor(base, path) || Boolean(wildcard) && this.isDescendant(base, path); +} +};Polymer.Base._addFeature({ _prepAnnotations: function () { if (!this._template) { this._notes = []; @@ -304,7 +353,7 @@ if (signature) { p.signature = signature; } else { -p.model = this._modelForPath(p.value); +p.model = Polymer.Path.root(p.value); } } } @@ -475,8 +524,10 @@ var bl = hbl.get(target); if (!bl) { bl = {}; +if (!Polymer.Settings.isIE || target != window) { hbl.set(target, bl); } +} var key = this._boundListenerKey(eventName, methodName); bl[key] = handler; }, @@ -548,6 +599,19 @@ return false; } }(); +var SUPPORTS_PASSIVE = false; +(function () { +try { +var opts = Object.defineProperty({}, 'passive', { +get: function () { +SUPPORTS_PASSIVE = true; +} +}); +window.addEventListener('test', null, opts); +window.removeEventListener('test', null, opts); +} catch (e) { +} +}()); var IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/); var mouseCanceller = function (mouseEvent) { var sc = mouseEvent.sourceCapabilities; @@ -567,8 +631,9 @@ } }; function setupTeardownMouseCanceller(setup) { -for (var i = 0, en; i < MOUSE_EVENTS.length; i++) { -en = MOUSE_EVENTS[i]; +var events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS; +for (var i = 0, en; i < events.length; i++) { +en = events[i]; if (setup) { document.addEventListener(en, mouseCanceller, true); } else { @@ -576,10 +641,7 @@ } } } -function ignoreMouse() { -if (IS_TOUCH_ONLY) { -return; -} +function ignoreMouse(ev) { if (!POINTERSTATE.mouse.mouseIgnoreJob) { setupTeardownMouseCanceller(true); } @@ -588,6 +650,7 @@ POINTERSTATE.mouse.target = null; POINTERSTATE.mouse.mouseIgnoreJob = null; }; +POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget; POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT); } function hasLeftMouseButton(ev) { @@ -654,6 +717,7 @@ stateObj.movefn = null; stateObj.upfn = null; } +document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? { passive: true } : false); var Gestures = { gestures: {}, recognizers: [], @@ -703,10 +767,6 @@ Gestures.handleTouchAction(ev); } } -if (type === 'touchend') { -POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget; -ignoreMouse(); -} } } handled = ev[HANDLED_OBJ]; @@ -772,7 +832,7 @@ } for (var i = 0, dep, gd; i < deps.length; i++) { dep = deps[i]; -if (IS_TOUCH_ONLY && MOUSE_EVENTS.indexOf(dep) > -1) { +if (IS_TOUCH_ONLY && MOUSE_EVENTS.indexOf(dep) > -1 && dep !== 'click') { continue; } gd = gobj[dep]; @@ -1322,20 +1382,22 @@ var cached = list[link.href]; var imprt = cached || link; var self = this; -if (onload) { var loadListener = function (e) { e.target.__firedLoad = true; e.target.removeEventListener('load', loadListener); +e.target.removeEventListener('error', errorListener); return onload.call(self, e); }; -imprt.addEventListener('load', loadListener); -} -if (onerror) { var errorListener = function (e) { e.target.__firedError = true; +e.target.removeEventListener('load', loadListener); e.target.removeEventListener('error', errorListener); return onerror.call(self, e); }; +if (onload) { +imprt.addEventListener('load', loadListener); +} +if (onerror) { imprt.addEventListener('error', errorListener); } if (cached) { @@ -1396,7 +1458,7 @@ this.fire(event, { value: value }, { bubbles: false, cancelable: false, -_useCache: true +_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE }); }, _propertySetter: function (property, value, effects, fromAbove) { @@ -1431,7 +1493,7 @@ }, _clearPath: function (path) { for (var prop in this.__data__) { -if (prop.indexOf(path + '.') === 0) { +if (Polymer.Path.isDescendant(path, prop)) { this.__data__[prop] = undefined; } } @@ -1508,7 +1570,7 @@ if (!model._bindListeners) { model._bindListeners = []; } -var fn = this._notedListenerFactory(property, path, this._isStructured(path), negated); +var fn = this._notedListenerFactory(property, path, Polymer.Path.isDeep(path), negated); var eventName = event || Polymer.CaseMap.camelToDashCase(property) + '-changed'; model._bindListeners.push({ index: index, @@ -1518,16 +1580,14 @@ event: eventName }); }, -_isStructured: function (path) { -return path.indexOf('.') > 0; -}, _isEventBogus: function (e, target) { return e.path && e.path[0] !== target; }, _notedListenerFactory: function (property, path, isStructured, negated) { return function (target, value, targetPath) { if (targetPath) { -this._notifyPath(this._fixPath(path, property, targetPath), value); +var newPath = Polymer.Path.translate(property, path, targetPath); +this._notifyPath(newPath, value); } else { value = target[property]; if (negated) { @@ -1558,7 +1618,7 @@ return context._notifyListener(changedFn, e); }); } -};Polymer.Base.extend(Polymer.Bind, { +};Polymer.Base.mixin(Polymer.Bind, { _shouldAddListener: function (effect) { return effect.name && effect.kind != 'attribute' && effect.kind != 'text' && !effect.isCompound && effect.parts[0].mode === '{'; }, @@ -1649,7 +1709,7 @@ return; } if (arg.wildcard) { -var matches = path.indexOf(name + '.') === 0; +var matches = Polymer.Path.isAncestor(path, name); values[i] = { path: matches ? path : name, value: matches ? value : v, @@ -1876,8 +1936,8 @@ break; } if (!a.literal) { -a.model = this._modelForPath(arg); -a.structured = arg.indexOf('.') > 0; +a.model = Polymer.Path.root(arg); +a.structured = Polymer.Path.isDeep(arg); if (a.structured) { a.wildcard = arg.slice(-2) == '.*'; if (a.wildcard) { @@ -1904,7 +1964,7 @@ if (pinfo && pinfo.readOnly) { return; } -this.__setProperty(property, value, false, node); +this.__setProperty(property, value, Polymer.Settings.suppressBindingNotifications, node); } }, _computeFinalAnnotationValue: function (node, property, value, info) { @@ -1933,6 +1993,7 @@ } });(function () { var usePolyfillProto = Polymer.Settings.usePolyfillProto; +var avoidInstanceProperties = Boolean(Object.getOwnPropertyDescriptor(document.documentElement, 'properties')); Polymer.Base._addFeature({ _setupConfigure: function (initialConfig) { this._config = {}; @@ -1970,7 +2031,7 @@ for (var i = 0; i < this.behaviors.length; i++) { this._configureProperties(this.behaviors[i].properties, config); } -this._configureProperties(this.properties, config); +this._configureProperties(avoidInstanceProperties ? this.__proto__.properties : this.properties, config); this.mixin(config, this._aboveConfig); this._config = config; if (this._clients && this._clients.length) { @@ -2067,6 +2128,7 @@ }); }());(function () { 'use strict'; +var Path = Polymer.Path; Polymer.Base._addFeature({ notifyPath: function (path, value, fromAbove) { var info = {}; @@ -2174,7 +2236,7 @@ return prop; }, _pathEffector: function (path, value) { -var model = this._modelForPath(path); +var model = Path.root(path); var fx$ = this._propertyEffects && this._propertyEffects[model]; if (fx$) { for (var i = 0, fx; i < fx$.length && (fx = fx$[i]); i++) { @@ -2189,35 +2251,31 @@ } }, _annotationPathEffect: function (path, value, effect) { -if (effect.value === path || effect.value.indexOf(path + '.') === 0) { +if (Path.matches(effect.value, false, path)) { Polymer.Bind._annotationEffect.call(this, path, value, effect); -} else if (path.indexOf(effect.value + '.') === 0 && !effect.negate) { +} else if (!effect.negate && Path.isDescendant(effect.value, path)) { var node = this._nodes[effect.index]; if (node && node._notifyPath) { -var p = this._fixPath(effect.name, effect.value, path); -node._notifyPath(p, value, true); +var newPath = Path.translate(effect.value, effect.name, path); +node._notifyPath(newPath, value, true); } } }, _complexObserverPathEffect: function (path, value, effect) { -if (this._pathMatchesEffect(path, effect)) { +if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._complexObserverEffect.call(this, path, value, effect); } }, _computePathEffect: function (path, value, effect) { -if (this._pathMatchesEffect(path, effect)) { +if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._computeEffect.call(this, path, value, effect); } }, _annotatedComputationPathEffect: function (path, value, effect) { -if (this._pathMatchesEffect(path, effect)) { +if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._annotatedComputationEffect.call(this, path, value, effect); } }, -_pathMatchesEffect: function (path, effect) { -var effectArg = effect.trigger.name; -return effectArg == path || effectArg.indexOf(path + '.') === 0 || effect.trigger.wildcard && path.indexOf(effectArg + '.') === 0; -}, linkPaths: function (to, from) { this._boundPaths = this._boundPaths || {}; if (from) { @@ -2234,18 +2292,15 @@ _notifyBoundPaths: function (path, value) { for (var a in this._boundPaths) { var b = this._boundPaths[a]; -if (path.indexOf(a + '.') == 0) { -this._notifyPath(this._fixPath(b, a, path), value); -} else if (path.indexOf(b + '.') == 0) { -this._notifyPath(this._fixPath(a, b, path), value); +if (Path.isDescendant(a, path)) { +this._notifyPath(Path.translate(a, b, path), value); +} else if (Path.isDescendant(b, path)) { +this._notifyPath(Path.translate(b, a, path), value); } } }, -_fixPath: function (property, root, path) { -return property + path.slice(root.length); -}, _notifyPathUp: function (path, value) { -var rootName = this._modelForPath(path); +var rootName = Path.root(path); var dashCaseName = Polymer.CaseMap.camelToDashCase(rootName); var eventName = dashCaseName + this._EVENT_CHANGED; this.fire(eventName, { @@ -2253,13 +2308,9 @@ value: value }, { bubbles: false, -_useCache: true +_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE }); }, -_modelForPath: function (path) { -var dot = path.indexOf('.'); -return dot < 0 ? path : path.slice(0, dot); -}, _EVENT_CHANGED: '-changed', notifySplices: function (path, splices) { var info = {}; @@ -2365,8 +2416,6 @@ _complexObserverPathEffect: Polymer.Base._complexObserverPathEffect, _annotatedComputationPathEffect: Polymer.Base._annotatedComputationPathEffect, _computePathEffect: Polymer.Base._computePathEffect, -_modelForPath: Polymer.Base._modelForPath, -_pathMatchesEffect: Polymer.Base._pathMatchesEffect, _notifyBoundPaths: Polymer.Base._notifyBoundPaths, _getPathParts: Polymer.Base._getPathParts }); @@ -2660,7 +2709,9 @@ for (var i = 0, e; i < e$.length; i++) { e = e$[i]; if (e.localName === 'template') { +if (!e.hasAttribute('preserve-content')) { cssText += this.cssFromElement(e); +} } else { if (e.localName === 'style') { var include = e.getAttribute(this.INCLUDE_ATTR); @@ -2677,6 +2728,37 @@ } return cssText; }, +styleIncludesToTemplate: function (targetTemplate) { +var styles = targetTemplate.content.querySelectorAll('style[include]'); +for (var i = 0, s; i < styles.length; i++) { +s = styles[i]; +s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')), s); +} +}, +_includesToFragment: function (styleIncludes) { +var includeArray = styleIncludes.trim().split(' '); +var frag = document.createDocumentFragment(); +for (var i = 0; i < includeArray.length; i++) { +var t = Polymer.DomModule.import(includeArray[i], 'template'); +if (t) { +this._addStylesToFragment(frag, t.content); +} +} +return frag; +}, +_addStylesToFragment: function (frag, source) { +var s$ = source.querySelectorAll('style'); +for (var i = 0, s; i < s$.length; i++) { +s = s$[i]; +var include = s.getAttribute('include'); +if (include) { +frag.appendChild(this._includesToFragment(include)); +} +if (s.textContent) { +frag.appendChild(s.cloneNode(true)); +} +} +}, isTargetedBuild: function (buildType) { return settings.useNativeShadow ? buildType === 'shadow' : buildType === 'shady'; }, @@ -2787,9 +2869,21 @@ var styles = element._styles; var cssText = ''; var cssBuildType = element.__cssBuild; +var passthrough = settings.useNativeShadow || cssBuildType === 'shady'; +var cb; +if (passthrough) { +var self = this; +cb = function (rule) { +rule.selector = self._slottedToContent(rule.selector); +rule.selector = rule.selector.replace(ROOT, ':host > *'); +if (callback) { +callback(rule); +} +}; +} for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) { var rules = styleUtil.rulesForStyle(s); -cssText += settings.useNativeShadow || cssBuildType === 'shady' ? styleUtil.toCssText(rules, callback) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n'; +cssText += passthrough ? styleUtil.toCssText(rules, cb) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n'; } return cssText.trim(); }, @@ -2837,6 +2931,8 @@ var hostContext = false; var self = this; selector = selector.trim(); +selector = this._slottedToContent(selector); +selector = selector.replace(ROOT, ':host > *'); selector = selector.replace(CONTENT_START, HOST + ' $1'); selector = selector.replace(SIMPLE_SELECTOR_SEP, function (m, c, s) { if (!stop) { @@ -2915,13 +3011,14 @@ } }, normalizeRootSelector: function (rule) { -if (rule.selector === ROOT) { -rule.selector = 'html'; -} +rule.selector = rule.selector.replace(ROOT, 'html'); }, _transformDocumentSelector: function (selector) { return selector.match(SCOPE_JUMP) ? this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) : this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR); }, +_slottedToContent: function (cssText) { +return cssText.replace(SLOTTED_PAREN, CONTENT + '> $1'); +}, SCOPE_NAME: 'style-scope' }; var SCOPE_NAME = api.SCOPE_NAME; @@ -2943,6 +3040,7 @@ var CLASS = 'class'; var CONTENT_START = new RegExp('^(' + CONTENT + ')'); var SELECTOR_NO_MATCH = 'should_not_match'; +var SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g; return api; }();Polymer.StyleExtends = function () { var styleUtil = Polymer.StyleUtil; @@ -3120,7 +3218,7 @@ return prefix + out.join('; ') + ';'; } function fixVars(matchText, varA, varB) { -return 'var(' + varA + ',' + 'var(' + varB + '));'; +return 'var(' + varA + ',' + 'var(' + varB + '))'; } function atApplyToCssProperties(mixinName, fallbacks) { mixinName = mixinName.replace(APPLY_NAME_CLEAN, ''); @@ -3181,20 +3279,28 @@ _separator: MIXIN_VAR_SEP, transform: function (styles, elementProto) { this.__currentElementProto = elementProto; -styleUtil.forRulesInStyles(styles, this._boundTransformRule); +styleUtil.forRulesInStyles(styles, this._boundFindDefinitions); +styleUtil.forRulesInStyles(styles, this._boundFindApplications); +if (elementProto) { elementProto.__applyShimInvalid = false; +} this.__currentElementProto = null; }, -transformRule: function (rule) { -rule.cssText = this.transformCssText(rule.parsedCssText); +_findDefinitions: function (rule) { +var cssText = rule.parsedCssText; +cssText = cssText.replace(BAD_VAR, fixVars); +cssText = cssText.replace(VAR_ASSIGN, produceCssProperties); +rule.cssText = cssText; if (rule.selector === ':root') { rule.selector = ':host > *'; } }, -transformCssText: function (cssText) { -cssText = cssText.replace(BAD_VAR, fixVars); -cssText = cssText.replace(VAR_ASSIGN, produceCssProperties); -return consumeCssProperties(cssText); +_findApplications: function (rule) { +rule.cssText = consumeCssProperties(rule.cssText); +}, +transformRule: function (rule) { +this._findDefinitions(rule); +this._findApplications(rule); }, _getInitialValueForProperty: function (property) { if (!this._measureElement) { @@ -3206,6 +3312,8 @@ } }; ApplyShim._boundTransformRule = ApplyShim.transformRule.bind(ApplyShim); +ApplyShim._boundFindDefinitions = ApplyShim._findDefinitions.bind(ApplyShim); +ApplyShim._boundFindApplications = ApplyShim._findApplications.bind(ApplyShim); return ApplyShim; }();(function () { var prepElement = Polymer.Base._prepElement; @@ -3235,6 +3343,9 @@ if (this._template) { var hasTargetedCssBuild = styleUtil.isTargetedBuild(this.__cssBuild); if (settings.useNativeCSSProperties && this.__cssBuild === 'shadow' && hasTargetedCssBuild) { +if (settings.preserveStyleIncludes) { +styleUtil.styleIncludesToTemplate(this._template); +} return; } this._styles = this._styles || this._collectStyles(); @@ -3516,6 +3627,10 @@ key: o }; }, +_rootSelector: /:root|:host\s*>\s*\*/, +_checkRoot: function (hostScope, selector) { +return Boolean(selector.match(this._rootSelector)) || hostScope === 'html' && selector.indexOf('html') > -1; +}, whenHostOrRootRule: function (scope, rule, style, callback) { if (!rule.propertyInfo) { self.decorateRule(rule); @@ -3525,17 +3640,13 @@ } var hostScope = scope.is ? styleTransformer._calcHostScope(scope.is, scope.extends) : 'html'; var parsedSelector = rule.parsedSelector; -var isRoot = parsedSelector === ':root'; -var isHost = parsedSelector.indexOf(':host') === 0; +var isRoot = this._checkRoot(hostScope, parsedSelector); +var isHost = !isRoot && parsedSelector.indexOf(':host') === 0; var cssBuild = scope.__cssBuild || style.__cssBuild; if (cssBuild === 'shady') { -isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') !== -1; +isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') > -1; isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0; } -if (cssBuild === 'shadow') { -isRoot = parsedSelector === ':host > *' || parsedSelector === 'html'; -isHost = isHost && !isRoot; -} if (!isRoot && !isHost) { return; } @@ -3546,6 +3657,9 @@ } selectorToMatch = rule.transformedSelector || rule.parsedSelector; } +if (isRoot && hostScope === 'html') { +selectorToMatch = rule.transformedSelector || rule.parsedSelector; +} callback({ selector: selectorToMatch, isHost: isHost, @@ -3650,6 +3764,9 @@ style = styleUtil.applyCss(cssText, selector, null, element._scopeStyle); } } else if (!style.parentNode) { +if (IS_IE && cssText.indexOf('@media') > -1) { +style.textContent = cssText; +} styleUtil.applyStyle(style, null, element._scopeStyle); } } @@ -3660,9 +3777,6 @@ } element._customStyle = style; } -if (IS_IE) { -style.textContent = style.textContent; -} return style; }, mixinCustomStyle: function (props, customStyle) { @@ -3809,6 +3923,9 @@ }, customStyle: null, getComputedStyleValue: function (property) { +if (!nativeVariables && !this._styleProperties) { +this._computeStyleProperties(); +} return !nativeVariables && this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property); }, _setupStyleProperties: function () { @@ -3993,7 +4110,9 @@ }());Polymer.Base._addFeature({ _registerFeatures: function () { this._prepIs(); +if (this.factoryImpl) { this._prepConstructor(); +} this._prepStyles(); }, _finishRegisterFeatures: function () { @@ -4013,7 +4132,7 @@ }, _initFeatures: function () { this._setupGestures(); -this._setupConfigure(); +this._setupConfigure(this.__data__); this._setupStyleProperties(); this._setupDebouncers(); this._setupShady(); @@ -4105,10 +4224,10 @@ if (!targetedBuild) { styleUtil.forEachRule(styleRules, function (rule) { styleTransformer.documentRule(rule); -if (settings.useNativeCSSProperties && !buildType) { -applyShim.transformRule(rule); -} }); +if (settings.useNativeCSSProperties && !buildType) { +applyShim.transform([e]); +} } if (settings.useNativeCSSProperties) { e.textContent = styleUtil.toCssText(styleRules); @@ -4279,6 +4398,8 @@ effect: { event: Polymer.CaseMap.camelToDashCase(parentProp) + '-changed' } } ]; +proto._propertyEffects = proto._propertyEffects || {}; +proto._propertyEffects[parentProp] = effects; Polymer.Bind._createAccessors(proto, parentProp, effects); } } @@ -4320,12 +4441,17 @@ } for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { var val = template[n]; +if (val && n == '_propertyEffects') { +var pe = Polymer.Base.mixin({}, val); +template._propertyEffects = Polymer.Base.mixin(pe, proto._propertyEffects); +} else { var pd = Object.getOwnPropertyDescriptor(proto, n); Object.defineProperty(template, n, pd); if (val !== undefined) { template._propertySetter(n, val); } } +} }, _showHideChildren: function (hidden) { }, @@ -4335,8 +4461,7 @@ }, _notifyPathUpImpl: function (path, value) { var dataHost = this.dataHost; -var dot = path.indexOf('.'); -var root = dot < 0 ? path : path.slice(0, dot); +var root = Polymer.Path.root(path); dataHost._forwardInstancePath.call(dataHost, this, path, value); if (root in dataHost._parentProps) { dataHost._templatized._notifyPath(dataHost._parentPropPrefix + path, value); @@ -4346,7 +4471,7 @@ if (this._forwardParentPath) { if (path.indexOf(this._parentPropPrefix) === 0) { var subPath = path.substring(this._parentPropPrefix.length); -var model = this._modelForPath(subPath); +var model = Polymer.Path.root(subPath); if (model in this._parentProps) { this._forwardParentPath(subPath, value); } @@ -4592,7 +4717,7 @@ delay: Number, renderedItemCount: { type: Number, -notify: true, +notify: !Polymer.Settings.suppressTemplateNotifications, readOnly: true }, initialCount: { @@ -4603,6 +4728,7 @@ type: Number, value: 20 }, +notifyDomChange: { type: Boolean }, _targetFrameTime: { type: Number, computed: '_computeFrameTime(targetFramerate)' @@ -4770,7 +4896,9 @@ } this._pool.length = 0; this._setRenderedItemCount(this._instances.length); +if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); +} this._tryRenderChunk(); }, _applyFullRefresh: function () { @@ -4966,6 +5094,7 @@ }, _showHideChildren: function (hidden) { for (var i = 0; i < this._instances.length; i++) { +if (!this._instances[i].isPlaceholder) this._instances[i]._showHideChildren(hidden); } }, @@ -5134,7 +5263,8 @@ type: Boolean, value: false, observer: '_queueRender' -} +}, +notifyDomChange: { type: Boolean } }, behaviors: [Polymer.Templatizer], _queueRender: function () { @@ -5167,7 +5297,9 @@ this._showHideChildren(); } if (this.if != this._lastIf) { +if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); +} this._lastIf = this.if; } }, @@ -5222,6 +5354,7 @@ } });Polymer({ is: 'dom-bind', +properties: { notifyDomChange: { type: Boolean } }, extends: 'template', _template: null, created: function () { @@ -5302,6 +5435,8 @@ this._children = Polymer.TreeApi.arrayCopyChildNodes(this.root); } this._insertChildren(); +if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); } +} }); \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js index d7766c5..40fa73f 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
@@ -32,6 +32,7 @@ settings.usePolyfillProto = !settings.useNativeCustomElements && !Object.__proto__; settings.hasNativeCSSProperties = !navigator.userAgent.match('AppleWebKit/601') && window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'); settings.useNativeCSSProperties = settings.hasNativeCSSProperties && settings.lazyRegister && settings.useNativeCSSProperties; +settings.isIE = navigator.userAgent.match('Trident'); return settings; }() };(function () { @@ -43,15 +44,15 @@ if (!prototype) { prototype = {}; } -var factory = desugar(prototype); -prototype = factory.prototype; +prototype = desugar(prototype); +var customCtor = prototype === prototype.constructor.prototype ? prototype.constructor : null; var options = { prototype: prototype }; if (prototype.extends) { options.extends = prototype.extends; } Polymer.telemetry._registrate(prototype); -document.registerElement(prototype.is, options); -return factory; +var ctor = document.registerElement(prototype.is, options); +return customCtor || ctor; }; var desugar = function (prototype) { var base = Polymer.Base; @@ -60,14 +61,20 @@ } prototype = Polymer.Base.chainObject(prototype, base); prototype.registerCallback(); -return prototype.constructor; +return prototype; }; if (userPolymer) { for (var i in userPolymer) { Polymer[i] = userPolymer[i]; } } -Polymer.Class = desugar; +Polymer.Class = function (prototype) { +if (!prototype.factoryImpl) { +prototype.factoryImpl = function () { +}; +} +return desugar(prototype).constructor; +}; }()); Polymer.telemetry = { registrations: [], @@ -85,7 +92,7 @@ enumerable: true, configurable: true, get: function () { -return (document._currentScript || document.currentScript).ownerDocument; +return (document._currentScript || document.currentScript || {}).ownerDocument; } });Polymer.RenderStatus = { _ready: false, @@ -164,7 +171,7 @@ Polymer.Base = { __isPolymerInstance__: true, _addFeature: function (feature) { -this.extend(this, feature); +this.mixin(this, feature); }, registerCallback: function () { if (settings.lazyRegister === 'max') { @@ -173,7 +180,15 @@ } } else { this._desugarBehaviors(); -this._doBehavior('beforeRegister'); +for (var i = 0, b; i < this.behaviors.length; i++) { +b = this.behaviors[i]; +if (b.beforeRegister) { +b.beforeRegister.call(this); +} +} +if (this.beforeRegister) { +this.beforeRegister(); +} } this._registerFeatures(); if (!settings.lazyRegister) { @@ -181,12 +196,33 @@ } }, createdCallback: function () { +if (settings.disableUpgradeEnabled) { +if (this.hasAttribute('disable-upgrade')) { +this._propertySetter = disableUpgradePropertySetter; +this._configValue = null; +this.__data__ = {}; +return; +} else { +this.__hasInitialized = true; +} +} +this.__initialize(); +}, +__initialize: function () { if (!this.__hasRegisterFinished) { this._ensureRegisterFinished(this.__proto__); } Polymer.telemetry.instanceCount++; this.root = this; -this._doBehavior('created'); +for (var i = 0, b; i < this.behaviors.length; i++) { +b = this.behaviors[i]; +if (b.created) { +b.created.call(this); +} +} +if (this.created) { +this.created(); +} this._initFeatures(); }, ensureRegisterFinished: function () { @@ -196,13 +232,26 @@ if (proto.__hasRegisterFinished !== proto.is || !proto.is) { if (settings.lazyRegister === 'max') { proto._desugarBehaviors(); -proto._doBehaviorOnly('beforeRegister'); +for (var i = 0, b; i < proto.behaviors.length; i++) { +b = proto.behaviors[i]; +if (b.beforeRegister) { +b.beforeRegister.call(proto); +} +} } proto.__hasRegisterFinished = proto.is; if (proto._finishRegisterFeatures) { proto._finishRegisterFeatures(); } -proto._doBehavior('registered'); +for (var j = 0, pb; j < proto.behaviors.length; j++) { +pb = proto.behaviors[j]; +if (pb.registered) { +pb.registered.call(proto); +} +} +if (proto.registered) { +proto.registered(); +} if (settings.usePolyfillProto && proto !== this) { proto.extend(this, proto); } @@ -212,23 +261,43 @@ var self = this; Polymer.RenderStatus.whenReady(function () { self.isAttached = true; -self._doBehavior('attached'); +for (var i = 0, b; i < self.behaviors.length; i++) { +b = self.behaviors[i]; +if (b.attached) { +b.attached.call(self); +} +} +if (self.attached) { +self.attached(); +} }); }, detachedCallback: function () { var self = this; Polymer.RenderStatus.whenReady(function () { self.isAttached = false; -self._doBehavior('detached'); +for (var i = 0, b; i < self.behaviors.length; i++) { +b = self.behaviors[i]; +if (b.detached) { +b.detached.call(self); +} +} +if (self.detached) { +self.detached(); +} }); }, attributeChangedCallback: function (name, oldValue, newValue) { this._attributeChangedImpl(name); -this._doBehavior('attributeChanged', [ -name, -oldValue, -newValue -]); +for (var i = 0, b; i < this.behaviors.length; i++) { +b = this.behaviors[i]; +if (b.attributeChanged) { +b.attributeChanged.call(this, name, oldValue, newValue); +} +} +if (this.attributeChanged) { +this.attributeChanged(name, oldValue, newValue); +} }, _attributeChangedImpl: function (name) { this._setAttributeToProperty(this, name); @@ -299,6 +368,23 @@ return object; }; Polymer.Base = Polymer.Base.chainObject(Polymer.Base, HTMLElement.prototype); +Polymer.BaseDescriptors = {}; +var disableUpgradePropertySetter; +if (settings.disableUpgradeEnabled) { +disableUpgradePropertySetter = function (property, value) { +this.__data__[property] = value; +}; +var origAttributeChangedCallback = Polymer.Base.attributeChangedCallback; +Polymer.Base.attributeChangedCallback = function (name, oldValue, newValue) { +if (!this.__hasInitialized && name === 'disable-upgrade') { +this.__hasInitialized = true; +this._propertySetter = Polymer.Bind._modelApi._propertySetter; +this._configValue = Polymer.Base._configValue; +this.__initialize(); +} +origAttributeChangedCallback.call(this, name, oldValue, newValue); +}; +} if (window.CustomElements) { Polymer.instanceof = CustomElements.instanceof; } else { @@ -320,8 +406,7 @@ return document.createElement('dom-module'); }; DomModule.prototype = Object.create(HTMLElement.prototype); -Polymer.Base.extend(DomModule.prototype, { -constructor: DomModule, +Polymer.Base.mixin(DomModule.prototype, { createdCallback: function () { this.register(); }, @@ -347,6 +432,11 @@ } } }); +Object.defineProperty(DomModule.prototype, 'constructor', { +value: DomModule, +configurable: true, +writable: true +}); var cePolyfill = window.CustomElements && !CustomElements.useNative; document.registerElement('dom-module', DomModule); function forceDomModulesUpgrade() { @@ -411,11 +501,16 @@ }, _mixinBehavior: function (b) { var n$ = Object.getOwnPropertyNames(b); +var useAssignment = b._noAccessors; for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { if (!Polymer.Base._behaviorProperties[n] && !this.hasOwnProperty(n)) { +if (useAssignment) { +this[n] = b[n]; +} else { this.copyOwnProperty(n, b, this); } } +} }, _prepBehaviors: function () { this._prepFlattenedBehaviors(this.behaviors); @@ -426,23 +521,6 @@ } this._prepBehavior(this); }, -_doBehavior: function (name, args) { -for (var i = 0; i < this.behaviors.length; i++) { -this._invokeBehavior(this.behaviors[i], name, args); -} -this._invokeBehavior(this, name, args); -}, -_doBehaviorOnly: function (name, args) { -for (var i = 0; i < this.behaviors.length; i++) { -this._invokeBehavior(this.behaviors[i], name, args); -} -}, -_invokeBehavior: function (b, name, args) { -var fn = b[name]; -if (fn) { -fn.apply(this, args || Polymer.nar); -} -}, _marshalBehaviors: function () { for (var i = 0; i < this.behaviors.length; i++) { this._marshalBehavior(this.behaviors[i]); @@ -461,7 +539,8 @@ attached: true, detached: true, attributeChanged: true, -ready: true +ready: true, +_noAccessors: true };Polymer.Base._addFeature({ _getExtendedPrototype: function (tag) { return this._getExtendedNativePrototype(tag); @@ -470,8 +549,14 @@ _getExtendedNativePrototype: function (tag) { var p = this._nativePrototypes[tag]; if (!p) { -var np = this.getNativePrototype(tag); -p = this.extend(Object.create(np), Polymer.Base); +p = Object.create(this.getNativePrototype(tag)); +var p$ = Object.getOwnPropertyNames(Polymer.Base); +for (var i = 0, n; i < p$.length && (n = p$[i]); i++) { +if (!Polymer.BaseDescriptors[n]) { +p[n] = Polymer.Base[n]; +} +} +Object.defineProperties(p, Polymer.BaseDescriptors); this._nativePrototypes[tag] = p; } return p; @@ -507,7 +592,6 @@ } });Polymer.nob = Object.create(null); Polymer.Base._addFeature({ -properties: {}, getPropertyInfo: function (property) { var info = this._getPropertyInfo(property, this.properties); if (!info) { @@ -564,7 +648,17 @@ } } } -});Polymer.CaseMap = { +}); +(function () { +var propertiesDesc = { +configurable: true, +writable: true, +enumerable: true, +value: {} +}; +Polymer.BaseDescriptors.properties = propertiesDesc; +Object.defineProperty(Polymer.Base, 'properties', propertiesDesc); +}());Polymer.CaseMap = { _caseMap: {}, _rx: { dashToCamel: /-[a-z]/g, @@ -688,7 +782,7 @@ return value != null ? value : undefined; } } -});Polymer.version = "1.6.1";Polymer.Base._addFeature({ +});Polymer.version = "1.8.1";Polymer.Base._addFeature({ _registerFeatures: function () { this._prepIs(); this._prepBehaviors();
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js index daebde9..143aa7a3 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
@@ -73,7 +73,15 @@ this._finishDistribute(); }, _readySelf: function () { -this._doBehavior('ready'); +for (var i = 0, b; i < this.behaviors.length; i++) { +b = this.behaviors[i]; +if (b.ready) { +b.ready.call(this); +} +} +if (this.ready) { +this.ready(); +} this._readied = true; if (this._attachedPending) { this._attachedPending = false; @@ -686,7 +694,7 @@ } var nativeCloneNode = Element.prototype.cloneNode; var nativeImportNode = Document.prototype.importNode; -Polymer.Base.extend(DomApi.prototype, { +Polymer.Base.mixin(DomApi.prototype, { _lazyDistribute: function (host) { if (host.shadyRoot && host.shadyRoot._distributionClean) { host.shadyRoot._distributionClean = false; @@ -1150,7 +1158,7 @@ if (!Settings.useShadow) { return; } -Polymer.Base.extend(DomApi.prototype, { +Polymer.Base.mixin(DomApi.prototype, { querySelectorAll: function (selector) { return TreeApi.arrayCopy(this.node.querySelectorAll(selector)); }, @@ -1260,7 +1268,7 @@ 'nextElementSibling', 'previousElementSibling' ]); -}());Polymer.Base.extend(Polymer.dom, { +}());Polymer.Base.mixin(Polymer.dom, { _flushGuard: 0, _FLUSH_MAX: 100, _needsTakeRecords: !Polymer.Settings.useNativeCustomElements, @@ -1561,7 +1569,7 @@ if (Settings.useShadow) { var baseSetup = DomApi.EffectiveNodesObserver.prototype._setup; var baseCleanup = DomApi.EffectiveNodesObserver.prototype._cleanup; -Polymer.Base.extend(DomApi.EffectiveNodesObserver.prototype, { +Polymer.Base.mixin(DomApi.EffectiveNodesObserver.prototype, { _setup: function () { if (!this._observer) { var self = this; @@ -1623,7 +1631,7 @@ DomApi.EffectiveNodesObserver.call(this, domApi); }; DomApi.DistributedNodesObserver.prototype = Object.create(DomApi.EffectiveNodesObserver.prototype); -Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, { +Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, { _setup: function () { }, _cleanup: function () { @@ -1635,7 +1643,7 @@ } }); if (Settings.useShadow) { -Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, { +Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, { _setup: function () { if (!this._observer) { var root = this.domApi.getOwnerRoot(); @@ -1713,10 +1721,6 @@ } this.shadyRoot.host = this; }, -get domHost() { -var root = Polymer.dom(this).getOwnerRoot(); -return root && root.host; -}, distributeContent: function (updateInsertionPoints) { if (this.shadyRoot) { this.shadyRoot._invalidInsertionPoints = this.shadyRoot._invalidInsertionPoints || updateInsertionPoints; @@ -1903,6 +1907,15 @@ _elementRemove: function () { } }); +var domHostDesc = { +get: function () { +var root = Polymer.dom(this).getOwnerRoot(); +return root && root.host; +}, +configurable: true +}; +Object.defineProperty(Polymer.Base, 'domHost', domHostDesc); +Polymer.BaseDescriptors.domHost = domHostDesc; function distributeNodeInto(child, insertionPoint) { insertionPoint._distributedNodes.push(child); var points = child._destinationInsertionPoints;
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html index 176bf18..d54c449 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html +++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
@@ -6,8 +6,4 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt ---><html><head><link rel="import" href="polymer-micro.html"> - - - -</head><body><script src="polymer-mini-extracted.js"></script></body></html> \ No newline at end of file +--><html><head><link rel="import" href="polymer-micro.html"></head><body><script src="polymer-mini-extracted.js"></script></body></html> \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html index cac2179..9b7a70e 100644 --- a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html +++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
@@ -14,8 +14,4 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt ---><html><head><link rel="import" href="polymer-mini.html"> - - - -</head><body><script src="polymer-extracted.js"></script></body></html> \ No newline at end of file +--><html><head><link rel="import" href="polymer-mini.html"></head><body><script src="polymer-extracted.js"></script></body></html> \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt index 6523c2b..a4e7b0be 100644 --- a/third_party/polymer/v1_0/components_summary.txt +++ b/third_party/polymer/v1_0/components_summary.txt
@@ -12,9 +12,9 @@ Name: iron-a11y-keys Repository: https://github.com/PolymerElements/iron-a11y-keys.git -Tree: v1.0.6 -Revision: aa9374f069b942dfabcaabb587cbb00b0dd28c63 -Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.6 +Tree: v1.0.7 +Revision: 7830e675c3d0df6e7a7377d64fc3d6e6ae0e65a5 +Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.7 Name: iron-a11y-keys-behavior Repository: https://github.com/PolymerElements/iron-a11y-keys-behavior.git @@ -348,7 +348,7 @@ Name: polymer Repository: https://github.com/Polymer/polymer.git -Tree: v1.6.1 -Revision: 1f197d9d7874b1e5808b2a5c26f34446a7d912fc -Tree link: https://github.com/Polymer/polymer/tree/v1.6.1 +Tree: v1.8.1 +Revision: d89302fc3755b04ad4171f431e719a08b5b816f3 +Tree link: https://github.com/Polymer/polymer/tree/v1.8.1
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh index 8051243..3781a057 100755 --- a/third_party/polymer/v1_0/reproduce.sh +++ b/third_party/polymer/v1_0/reproduce.sh
@@ -80,6 +80,10 @@ # a Polymer issue and/or pull request to minimize these patches. patch -p1 --forward -r - < chromium.patch +# Undo any changes in paper-ripple, since Chromium's implementation is a fork of +# the original paper-ripple. +git checkout -- components-chromium/paper-ripple/* + new=$(git status --porcelain components-chromium | grep '^??' | \ cut -d' ' -f2 | egrep '\.(html|js|css)$' || true)
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 359d0e7..e18b6f4 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -19295,6 +19295,15 @@ <summary>Updates grouped by Extension::HistogramType.</summary> </histogram> +<histogram name="Extensions.WebRequestAction" enum="RequestAction"> + <owner>karandeepb@chromium.org</owner> + <summary> + Counts the number of times an action is requested by extensions as part of + the Web Request API. For a given web request stage, multiple actions may be + logged. + </summary> +</histogram> + <histogram name="Extensions.WebRequestEventFoundFrame" units="boolean"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -41889,6 +41898,56 @@ </summary> </histogram> +<histogram name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff" + units="ms"> + <owner>tbansal@chromium.org</owner> + <owner>bengr@chromium.org</owner> + <summary> + Records the difference between the estimated HTTP RTT and the observed HTTP + RTT. HTTP RTT estimated by the network quality estimator at the time of + navigation start is compared with the HTTP RTT observed during the specified + time interval following the start of the navigation. Both the estimated and + the observed RTT are computed using average algorithm that assigns equal + weight to all observations. + </summary> +</histogram> + +<histogram name="NQE.UnweightedAverage.MainFrame.RTT" units="ms"> + <owner>bengr@chromium.org</owner> + <owner>tbansal@chromium.org</owner> + <summary> + Rough estimate of the computed round trip time at the URLRequest layer + computed using average algorithm that assigns equal weight to all + observations. + + This metric is recorded on main-frame requests. + </summary> +</histogram> + +<histogram name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff" + units="ms"> + <owner>tbansal@chromium.org</owner> + <owner>bengr@chromium.org</owner> + <summary> + Records the difference between the estimated HTTP RTT and the observed HTTP + RTT. HTTP RTT estimated by the network quality estimator at the time of + navigation start is compared with the HTTP RTT observed during the specified + time interval following the start of the navigation. Both the estimated and + the observed RTT are computed using weighted average algorithm. + </summary> +</histogram> + +<histogram name="NQE.WeightedAverage.MainFrame.RTT" units="ms"> + <owner>bengr@chromium.org</owner> + <owner>tbansal@chromium.org</owner> + <summary> + Rough estimate of the computed round trip time at the URLRequest layer + computed using weighted average algorithm. + + This metric is recorded on main-frame requests. + </summary> +</histogram> + <histogram name="ntp.searchurls.total"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -56212,6 +56271,15 @@ </summary> </histogram> +<histogram name="ResourceScheduler.NumSkippedScans.ScheduleStart" + units="requests"> + <owner>csharrison@chromium.org</owner> + <summary> + The number of LoadAnyStartablePendingRequests scans that were skipped due to + smarter task scheduling around reprioritization. + </summary> +</histogram> + <histogram name="ResourceScheduler.RequestTimeDeferred.Active"> <obsolete> Deprecated 1/2016 @@ -105671,6 +105739,14 @@ </int> </enum> +<enum name="RequestAction" type="int"> + <int value="0" label="CANCEL"/> + <int value="1" label="REDIRECT"/> + <int value="2" label="MODIFY_REQUEST_HEADERS"/> + <int value="3" label="MODIFY_RESPONSE_HEADERS"/> + <int value="4" label="SET_AUTH_CREDENTIALS"/> +</enum> + <enum name="RequestedImageMimeType" type="int"> <int value="0" label="Png"/> <int value="1" label="Jpeg"/> @@ -117393,6 +117469,10 @@ <affected-histogram name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff"/> <affected-histogram name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff"/> + <affected-histogram + name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"/> + <affected-histogram + name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"/> </histogram_suffixes> <histogram_suffixes name="NQE.Accuracy.Metric.AccuracyRecordingIntervals" @@ -117431,6 +117511,14 @@ name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative"/> <affected-histogram name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive"/> + <affected-histogram + name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative"/> + <affected-histogram + name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive"/> + <affected-histogram + name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative"/> + <affected-histogram + name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive"/> </histogram_suffixes> <histogram_suffixes @@ -117607,6 +117695,14 @@ Deprecated 01/2017. </obsolete> </affected-histogram> + <affected-histogram + name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative.15"/> + <affected-histogram + name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive.15"/> + <affected-histogram + name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative.15"/> + <affected-histogram + name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive.15"/> </histogram_suffixes> <histogram_suffixes name="NQE.DifferentPercentiles" separator=".">
diff --git a/ui/arc/notification/arc_custom_notification_item.h b/ui/arc/notification/arc_custom_notification_item.h index 404a0cd..eecfe3f 100644 --- a/ui/arc/notification/arc_custom_notification_item.h +++ b/ui/arc/notification/arc_custom_notification_item.h
@@ -36,6 +36,7 @@ mojom::ArcNotificationDataPtr data) override; void CloseFromCloseButton(); + void OpenSettingsFromSettingsButton(); void AddObserver(Observer* observer); void RemoveObserver(Observer* observer);
diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc index a761c46d..1846796 100644 --- a/ui/arc/notification/arc_custom_notification_view.cc +++ b/ui/arc/notification/arc_custom_notification_view.cc
@@ -26,6 +26,7 @@ #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/focus/focus_manager.h" +#include "ui/views/layout/box_layout.h" #include "ui/views/painter.h" #include "ui/views/widget/root_view.h" #include "ui/views/widget/widget.h" @@ -43,8 +44,8 @@ void OnEvent(ui::Event* event) override { // Do not forward event targeted to the floating close button so that // keyboard press and tap are handled properly. - if (owner_->floating_close_button_widget_ && event->target() && - owner_->floating_close_button_widget_->GetNativeWindow() == + if (owner_->floating_control_buttons_widget_ && event->target() && + owner_->floating_control_buttons_widget_->GetNativeWindow() == event->target()) { return; } @@ -157,15 +158,15 @@ : owner_(owner) {} bool IsCloseButtonFocused() const override { - if (owner_->floating_close_button_ == nullptr) + if (owner_->close_button_ == nullptr) return false; - return owner_->floating_close_button_->HasFocus(); + return owner_->close_button_->HasFocus(); } void RequestFocusOnCloseButton() override { - if (owner_->floating_close_button_) - owner_->floating_close_button_->RequestFocus(); - owner_->UpdateCloseButtonVisiblity(); + if (owner_->close_button_) + owner_->close_button_->RequestFocus(); + owner_->UpdateControlButtonsVisiblity(); } bool IsPinned() const override { @@ -178,9 +179,9 @@ DISALLOW_COPY_AND_ASSIGN(ContentViewDelegate); }; -class ArcCustomNotificationView::CloseButton : public views::ImageButton { +class ArcCustomNotificationView::ControlButton : public views::ImageButton { public: - explicit CloseButton(ArcCustomNotificationView* owner) + explicit ControlButton(ArcCustomNotificationView* owner) : views::ImageButton(owner), owner_(owner) { set_background( views::Background::CreateSolidBackground(SK_ColorTRANSPARENT)); @@ -195,22 +196,17 @@ message_center::kControlButtonPaddingFromBorder, message_center::kControlButtonPaddingFromBorder)); - SetImage(views::CustomButton::STATE_NORMAL, message_center::GetCloseIcon()); set_animate_on_state_change(false); - SetAccessibleName(l10n_util::GetStringUTF16( - IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); - SetTooltipText(l10n_util::GetStringUTF16( - IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP)); } void OnFocus() override { views::ImageButton::OnFocus(); - owner_->UpdateCloseButtonVisiblity(); + owner_->UpdateControlButtonsVisiblity(); } void OnBlur() override { views::ImageButton::OnBlur(); - owner_->UpdateCloseButtonVisiblity(); + owner_->UpdateControlButtonsVisiblity(); } private: @@ -254,28 +250,50 @@ return base::MakeUnique<ArcCustomNotificationView::ContentViewDelegate>(this); } -void ArcCustomNotificationView::CreateFloatingCloseButton() { +void ArcCustomNotificationView::CreateFloatingControlButtons() { // Floating close button is a transient child of |surface_| and also part // of the hosting widget's focus chain. It could only be created when both // are present. if (!surface_ || !GetWidget()) return; - floating_close_button_ = new CloseButton(this); + // Creates the control_buttons_view_, which collects all control buttons into + // a horizontal box. + control_buttons_view_ = new views::View(); + control_buttons_view_->SetLayoutManager( + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); + + settings_button_ = new ControlButton(this); + settings_button_->SetImage(views::CustomButton::STATE_NORMAL, + message_center::GetSettingsIcon()); + settings_button_->SetAccessibleName(l10n_util::GetStringUTF16( + IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); + settings_button_->SetTooltipText(l10n_util::GetStringUTF16( + IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); + control_buttons_view_->AddChildView(settings_button_); + + close_button_ = new ControlButton(this); + close_button_->SetImage(views::CustomButton::STATE_NORMAL, + message_center::GetCloseIcon()); + close_button_->SetAccessibleName(l10n_util::GetStringUTF16( + IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); + close_button_->SetTooltipText(l10n_util::GetStringUTF16( + IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP)); + control_buttons_view_->AddChildView(close_button_); views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = surface_->window(); - floating_close_button_widget_.reset(new views::Widget); - floating_close_button_widget_->Init(params); - floating_close_button_widget_->SetContentsView(floating_close_button_); + floating_control_buttons_widget_.reset(new views::Widget); + floating_control_buttons_widget_->Init(params); + floating_control_buttons_widget_->SetContentsView(control_buttons_view_); // Put the close button into the focus chain. - floating_close_button_widget_->SetFocusTraversableParent( + floating_control_buttons_widget_->SetFocusTraversableParent( GetWidget()->GetFocusTraversable()); - floating_close_button_widget_->SetFocusTraversableParentView(this); + floating_control_buttons_widget_->SetFocusTraversableParentView(this); Layout(); } @@ -284,8 +302,8 @@ if (surface_ == surface) return; - // Reset |floating_close_button_widget_| when |surface_| is changed. - floating_close_button_widget_.reset(); + // Reset |floating_control_buttons_widget_| when |surface_| is changed. + floating_control_buttons_widget_.reset(); if (surface_ && surface_->window()) { surface_->window()->RemoveObserver(this); @@ -320,30 +338,30 @@ SetPreferredSize(preferred_size); } -void ArcCustomNotificationView::UpdateCloseButtonVisiblity() { - if (!surface_ || !floating_close_button_widget_) +void ArcCustomNotificationView::UpdateControlButtonsVisiblity() { + if (!surface_ || !floating_control_buttons_widget_) return; const bool target_visiblity = surface_->window()->GetBoundsInScreen().Contains( display::Screen::GetScreen()->GetCursorScreenPoint()) || - floating_close_button_->HasFocus(); - if (target_visiblity == floating_close_button_widget_->IsVisible()) + close_button_->HasFocus() || settings_button_->HasFocus(); + if (target_visiblity == floating_control_buttons_widget_->IsVisible()) return; if (target_visiblity) - floating_close_button_widget_->Show(); + floating_control_buttons_widget_->Show(); else - floating_close_button_widget_->Hide(); + floating_control_buttons_widget_->Hide(); } void ArcCustomNotificationView::UpdatePinnedState() { DCHECK(item_); - if (item_->pinned() && floating_close_button_widget_) { - floating_close_button_widget_.reset(); - } else if (!item_->pinned() && !floating_close_button_widget_) { - CreateFloatingCloseButton(); + if (item_->pinned() && floating_control_buttons_widget_) { + floating_control_buttons_widget_.reset(); + } else if (!item_->pinned() && !floating_control_buttons_widget_) { + CreateFloatingControlButtons(); } } @@ -429,16 +447,18 @@ // be positioned without the need to consider the transform. surface_->window()->children()[0]->SetTransform(transform); - if (!floating_close_button_widget_) + if (!floating_control_buttons_widget_) return; - gfx::Rect close_button_bounds(floating_close_button_->GetPreferredSize()); - close_button_bounds.set_x(contents_bounds.right() - - close_button_bounds.width()); - close_button_bounds.set_y(contents_bounds.y()); - floating_close_button_widget_->SetBounds(close_button_bounds); + gfx::Rect control_buttons_bounds(contents_bounds); + const int buttons_width = close_button_->GetPreferredSize().width() + + settings_button_->GetPreferredSize().width(); + control_buttons_bounds.set_x(control_buttons_bounds.right() - buttons_width); + control_buttons_bounds.set_height(close_button_->GetPreferredSize().height()); + control_buttons_bounds.set_width(buttons_width); + floating_control_buttons_widget_->SetBounds(control_buttons_bounds); - UpdateCloseButtonVisiblity(); + UpdateControlButtonsVisiblity(); ash::wm::SnapWindowToPixelBoundary(surface_->window()); } @@ -471,11 +491,11 @@ } void ArcCustomNotificationView::OnMouseEntered(const ui::MouseEvent&) { - UpdateCloseButtonVisiblity(); + UpdateControlButtonsVisiblity(); } void ArcCustomNotificationView::OnMouseExited(const ui::MouseEvent&) { - UpdateCloseButtonVisiblity(); + UpdateControlButtonsVisiblity(); } void ArcCustomNotificationView::OnFocus() { @@ -491,17 +511,20 @@ } views::FocusTraversable* ArcCustomNotificationView::GetFocusTraversable() { - if (floating_close_button_widget_) + if (floating_control_buttons_widget_) return static_cast<views::internal::RootView*>( - floating_close_button_widget_->GetRootView()); + floating_control_buttons_widget_->GetRootView()); return nullptr; } void ArcCustomNotificationView::ButtonPressed(views::Button* sender, const ui::Event& event) { - if (item_ && !item_->pinned() && sender == floating_close_button_) { + if (item_ && !item_->pinned() && sender == close_button_) { item_->CloseFromCloseButton(); } + if (item_ && settings_button_ && sender == settings_button_) { + item_->OpenSettings(); + } } void ArcCustomNotificationView::OnWindowBoundsChanged(
diff --git a/ui/arc/notification/arc_custom_notification_view.h b/ui/arc/notification/arc_custom_notification_view.h index 7eae001..41c5347a 100644 --- a/ui/arc/notification/arc_custom_notification_view.h +++ b/ui/arc/notification/arc_custom_notification_view.h
@@ -43,14 +43,15 @@ private: class ContentViewDelegate; - class CloseButton; + class ControlButton; class EventForwarder; + class SettingsButton; class SlideHelper; - void CreateFloatingCloseButton(); + void CreateFloatingControlButtons(); void SetSurface(exo::NotificationSurface* surface); void UpdatePreferredSize(); - void UpdateCloseButtonVisiblity(); + void UpdateControlButtonsVisiblity(); void UpdatePinnedState(); void UpdateSnapshot(); void AttachSurface(); @@ -101,13 +102,15 @@ // when a slide is in progress and restore the surface when it finishes. std::unique_ptr<SlideHelper> slide_helper_; - // A close button on top of NotificationSurface. Needed because the + // A control buttons on top of NotificationSurface. Needed because the // aura::Window of NotificationSurface is added after hosting widget's - // RootView thus standard notification close button is always below + // RootView thus standard notification control buttons are always below // it. - std::unique_ptr<views::Widget> floating_close_button_widget_; + std::unique_ptr<views::Widget> floating_control_buttons_widget_; - views::ImageButton* floating_close_button_ = nullptr; + views::View* control_buttons_view_ = nullptr; + views::ImageButton* close_button_ = nullptr; + views::ImageButton* settings_button_ = nullptr; // Protects from call loops between Layout and OnWindowBoundsChanged. bool in_layout_ = false;
diff --git a/ui/gfx/buffer_types.h b/ui/gfx/buffer_types.h index 7e1a157a..575ae7f 100644 --- a/ui/gfx/buffer_types.h +++ b/ui/gfx/buffer_types.h
@@ -40,6 +40,7 @@ enum class BufferUsage { GPU_READ, SCANOUT, + SCANOUT_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE, // TODO(reveman): Merge this with GPU_READ_CPU_READ_WRITE when SurfaceTexture // backed buffers are single buffered and support it.
diff --git a/ui/gfx/mojo/buffer_types.mojom b/ui/gfx/mojo/buffer_types.mojom index 0a05c651..b7fb7e0 100644 --- a/ui/gfx/mojo/buffer_types.mojom +++ b/ui/gfx/mojo/buffer_types.mojom
@@ -30,6 +30,7 @@ enum BufferUsage { GPU_READ, SCANOUT, + SCANOUT_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE_PERSISTENT,
diff --git a/ui/gfx/mojo/buffer_types_struct_traits.h b/ui/gfx/mojo/buffer_types_struct_traits.h index 3716a61f4..17b73a7 100644 --- a/ui/gfx/mojo/buffer_types_struct_traits.h +++ b/ui/gfx/mojo/buffer_types_struct_traits.h
@@ -115,6 +115,8 @@ return gfx::mojom::BufferUsage::GPU_READ; case gfx::BufferUsage::SCANOUT: return gfx::mojom::BufferUsage::SCANOUT; + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: + return gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: return gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: @@ -132,6 +134,9 @@ case gfx::mojom::BufferUsage::SCANOUT: *out = gfx::BufferUsage::SCANOUT; return true; + case gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE: + *out = gfx::BufferUsage::SCANOUT_CPU_READ_WRITE; + return true; case gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE: *out = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE; return true;
diff --git a/ui/message_center/BUILD.gn b/ui/message_center/BUILD.gn index 93641278..08aff8c 100644 --- a/ui/message_center/BUILD.gn +++ b/ui/message_center/BUILD.gn
@@ -11,6 +11,8 @@ icon_directory = "vector_icons" icons = [ + "notification_settings_button.1x.icon", + "notification_settings_button.icon", "notification_close_button.1x.icon", "notification_close_button.icon", ]
diff --git a/ui/message_center/message_center_style.cc b/ui/message_center/message_center_style.cc index 9183d69..020073a5 100644 --- a/ui/message_center/message_center_style.cc +++ b/ui/message_center/message_center_style.cc
@@ -45,4 +45,9 @@ gfx::kChromeIconGrey); } +gfx::ImageSkia GetSettingsIcon() { + return gfx::CreateVectorIcon(kNotificationSettingsButtonIcon, + gfx::kChromeIconGrey); +} + } // namespace message_center
diff --git a/ui/message_center/message_center_style.h b/ui/message_center/message_center_style.h index d3f52e5b..9484f8c 100644 --- a/ui/message_center/message_center_style.h +++ b/ui/message_center/message_center_style.h
@@ -143,6 +143,7 @@ // Icons. MESSAGE_CENTER_EXPORT gfx::ImageSkia GetCloseIcon(); +MESSAGE_CENTER_EXPORT gfx::ImageSkia GetSettingsIcon(); // Around notifications ////////////////////////////////////////////////////////
diff --git a/ui/message_center/vector_icons/notification_settings_button.1x.icon b/ui/message_center/vector_icons/notification_settings_button.1x.icon new file mode 100644 index 0000000..d999691 --- /dev/null +++ b/ui/message_center/vector_icons/notification_settings_button.1x.icon
@@ -0,0 +1,54 @@ +// Copyright 2017 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. + +CANVAS_DIMENSIONS, 12, +MOVE_TO, 9.82f, 6.49f, +CUBIC_TO, 9.84f, 6.33f, 9.85f, 6.17f, 9.85f, 6, +CUBIC_TO, 9.85f, 5.84f, 9.84f, 5.67f, 9.82f, 5.51f, +LINE_TO, 10.9f, 4.68f, +CUBIC_TO, 11, 4.61f, 11.03f, 4.47f, 10.97f, 4.37f, +LINE_TO, 9.94f, 2.63f, +CUBIC_TO, 9.87f, 2.53f, 9.74f, 2.48f, 9.62f, 2.53f, +LINE_TO, 8.34f, 3.03f, +CUBIC_TO, 8.08f, 2.83f, 7.79f, 2.66f, 7.48f, 2.54f, +LINE_TO, 7.28f, 1.21f, +CUBIC_TO, 7.26f, 1.09f, 7.15f, 1, 7.03f, 1, +LINE_TO, 4.97f, 1, +CUBIC_TO, 4.84f, 1, 4.74f, 1.09f, 4.72f, 1.21f, +LINE_TO, 4.52f, 2.54f, +CUBIC_TO, 4.21f, 2.66f, 3.92f, 2.83f, 3.66f, 3.03f, +LINE_TO, 2.38f, 2.53f, +CUBIC_TO, 2.26f, 2.48f, 2.13f, 2.53f, 2.06f, 2.63f, +LINE_TO, 1.03f, 4.37f, +CUBIC_TO, 0.97f, 4.47f, 1, 4.61f, 1.1f, 4.68f, +LINE_TO, 2.18f, 5.51f, +CUBIC_TO, 2.16f, 5.67f, 2.14f, 5.84f, 2.14f, 6, +CUBIC_TO, 2.14f, 6.17f, 2.16f, 6.33f, 2.18f, 6.49f, +LINE_TO, 1.1f, 7.32f, +CUBIC_TO, 1, 7.39f, 0.97f, 7.53f, 1.03f, 7.64f, +LINE_TO, 2.06f, 9.37f, +CUBIC_TO, 2.13f, 9.48f, 2.26f, 9.52f, 2.38f, 9.48f, +LINE_TO, 3.66f, 8.97f, +CUBIC_TO, 3.92f, 9.17f, 4.21f, 9.34f, 4.52f, 9.47f, +LINE_TO, 4.72f, 10.79f, +CUBIC_TO, 4.74f, 10.91f, 4.84f, 11, 4.97f, 11, +LINE_TO, 7.03f, 11, +CUBIC_TO, 7.15f, 11, 7.26f, 10.91f, 7.28f, 10.79f, +LINE_TO, 7.47f, 9.47f, +CUBIC_TO, 7.79f, 9.34f, 8.08f, 9.17f, 8.34f, 8.97f, +LINE_TO, 9.62f, 9.48f, +CUBIC_TO, 9.74f, 9.52f, 9.87f, 9.48f, 9.94f, 9.37f, +LINE_TO, 10.96f, 7.64f, +CUBIC_TO, 11.03f, 7.53f, 11, 7.39f, 10.9f, 7.32f, +LINE_TO, 9.82f, 6.49f, +LINE_TO, 9.82f, 6.49f, +CLOSE, +MOVE_TO, 6, 7.5f, +CUBIC_TO, 5.17f, 7.5f, 4.5f, 6.83f, 4.5f, 6, +CUBIC_TO, 4.5f, 5.17f, 5.17f, 4.5f, 6, 4.5f, +CUBIC_TO, 6.83f, 4.5f, 7.5f, 5.17f, 7.5f, 6, +CUBIC_TO, 7.5f, 6.83f, 6.83f, 7.5f, 6, 7.5f, +LINE_TO, 6, 7.5f, +CLOSE, +END
diff --git a/ui/message_center/vector_icons/notification_settings_button.icon b/ui/message_center/vector_icons/notification_settings_button.icon new file mode 100644 index 0000000..ae7e26a --- /dev/null +++ b/ui/message_center/vector_icons/notification_settings_button.icon
@@ -0,0 +1,54 @@ +// Copyright 2017 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. + +CANVAS_DIMENSIONS, 24, +MOVE_TO, 19.63f, 12.98f, +CUBIC_TO, 19.68f, 12.66f, 19.71f, 12.33f, 19.71f, 12, +CUBIC_TO, 19.71f, 11.67f, 19.68f, 11.35f, 19.63f, 11.03f, +LINE_TO, 21.81f, 9.37f, +CUBIC_TO, 22, 9.22f, 22.06f, 8.95f, 21.93f, 8.73f, +LINE_TO, 19.88f, 5.27f, +CUBIC_TO, 19.75f, 5.05f, 19.48f, 4.96f, 19.25f, 5.05f, +LINE_TO, 16.69f, 6.06f, +CUBIC_TO, 16.16f, 5.66f, 15.58f, 5.33f, 14.95f, 5.07f, +LINE_TO, 14.57f, 2.42f, +CUBIC_TO, 14.52f, 2.19f, 14.31f, 2, 14.05f, 2, +LINE_TO, 9.94f, 2, +CUBIC_TO, 9.68f, 2, 9.47f, 2.19f, 9.43f, 2.42f, +LINE_TO, 9.05f, 5.07f, +CUBIC_TO, 8.42f, 5.33f, 7.84f, 5.66f, 7.31f, 6.06f, +LINE_TO, 4.75f, 5.05f, +CUBIC_TO, 4.52f, 4.97f, 4.25f, 5.05f, 4.12f, 5.27f, +LINE_TO, 2.07f, 8.73f, +CUBIC_TO, 1.94f, 8.95f, 2, 9.22f, 2.19f, 9.37f, +LINE_TO, 4.36f, 11.03f, +CUBIC_TO, 4.32f, 11.35f, 4.29f, 11.67f, 4.29f, 12, +CUBIC_TO, 4.29f, 12.33f, 4.32f, 12.66f, 4.36f, 12.98f, +LINE_TO, 2.19f, 14.63f, +CUBIC_TO, 2, 14.78f, 1.94f, 15.05f, 2.07f, 15.27f, +LINE_TO, 4.12f, 18.74f, +CUBIC_TO, 4.25f, 18.95f, 4.52f, 19.04f, 4.75f, 18.95f, +LINE_TO, 7.31f, 17.95f, +CUBIC_TO, 7.84f, 18.34f, 8.42f, 18.68f, 9.05f, 18.93f, +LINE_TO, 9.43f, 21.58f, +CUBIC_TO, 9.47f, 21.82f, 9.68f, 22, 9.94f, 22, +LINE_TO, 14.05f, 22, +CUBIC_TO, 14.31f, 22, 14.52f, 21.82f, 14.56f, 21.58f, +LINE_TO, 14.95f, 18.93f, +CUBIC_TO, 15.57f, 18.68f, 16.15f, 18.35f, 16.68f, 17.95f, +LINE_TO, 19.24f, 18.95f, +CUBIC_TO, 19.47f, 19.04f, 19.74f, 18.95f, 19.87f, 18.74f, +LINE_TO, 21.93f, 15.27f, +CUBIC_TO, 22.05f, 15.06f, 22, 14.79f, 21.8f, 14.63f, +LINE_TO, 19.63f, 12.98f, +LINE_TO, 19.63f, 12.98f, +CLOSE, +MOVE_TO, 12, 15, +CUBIC_TO, 10.34f, 15, 9, 13.66f, 9, 12, +CUBIC_TO, 9, 10.34f, 10.34f, 9, 12, 9, +CUBIC_TO, 13.66f, 9, 15, 10.34f, 15, 12, +CUBIC_TO, 15, 13.66f, 13.66f, 15, 12, 15, +LINE_TO, 12, 15, +CLOSE, +END
diff --git a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc index 6199e36f..3fd704d 100644 --- a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc +++ b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
@@ -57,6 +57,11 @@ case gfx::BufferUsage::SCANOUT: return format == gfx::BufferFormat::BGRX_8888 || format == gfx::BufferFormat::RGBX_8888; + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: + return format == gfx::BufferFormat::BGRX_8888 || + format == gfx::BufferFormat::BGRA_8888 || + format == gfx::BufferFormat::RGBX_8888 || + format == gfx::BufferFormat::RGBA_8888; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: { #if defined(OS_CHROMEOS) @@ -82,6 +87,7 @@ gfx::BufferUsage usage) override { DCHECK(!handle.fds.empty()); switch (usage) { + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: #if defined(OS_CHROMEOS)
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc index 479e1a2d..8faec76 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread.cc +++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -117,6 +117,9 @@ case gfx::BufferUsage::SCANOUT: flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; break; + case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: + flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_LINEAR; + break; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: flags = GBM_BO_USE_LINEAR;
diff --git a/ui/views/examples/examples_window.h b/ui/views/examples/examples_window.h index 431b95e..804252fc 100644 --- a/ui/views/examples/examples_window.h +++ b/ui/views/examples/examples_window.h
@@ -9,13 +9,12 @@ #include <vector> #include "ui/gfx/native_widget_types.h" +#include "ui/views/examples/example_base.h" #include "ui/views/examples/views_examples_export.h" namespace views { namespace examples { -class ExampleBase; - enum Operation { DO_NOTHING_ON_CLOSE = 0, QUIT_ON_CLOSE,
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc index e1b6710..4753be75 100644 --- a/ui/views/view_unittest.cc +++ b/ui/views/view_unittest.cc
@@ -4833,14 +4833,14 @@ std::unique_ptr<View> view = NewView(); view->SetVisible(false); EXPECT_EQ(view.get(), view_visibility_changed()); - EXPECT_EQ(false, view->visible()); + EXPECT_FALSE(view->visible()); } TEST_F(ViewObserverTest, ViewEnabledChanged) { std::unique_ptr<View> view = NewView(); view->SetEnabled(false); EXPECT_EQ(view.get(), view_enabled_changed()); - EXPECT_EQ(false, view->enabled()); + EXPECT_FALSE(view->enabled()); } TEST_F(ViewObserverTest, ViewBoundsChanged) {