diff --git a/AUTHORS b/AUTHORS index dfef463..fe18810 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -116,6 +116,7 @@ Bhagirathi Satpathy <bhagirathi.s@samsung.com> Bhanukrushana Rout <b.rout@samsung.com> Biljith Jayan <billy.jayan@samsung.com> +Boaz Sender <boaz@bocoup.com> Bobby Powers <bobbypowers@gmail.com> Branden Archer <bma4@zips.uakron.edu> Brendan Kirby <brendan.kirby@imgtec.com> @@ -969,6 +970,7 @@ Akamai Inc. <*@akamai.com> ARM Holdings <*@arm.com> BlackBerry Limited <*@blackberry.com> +Bocoup <*@bocoup.com> Canonical Limited <*@canonical.com> Cloudflare, Inc. <*@cloudflare.com> Code Aurora Forum <*@codeaurora.org>
diff --git a/DEPS b/DEPS index 278523d1..09de8af 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,11 @@ # 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': '083bc1576a0e3e214496be9d8803e4bd6ba0b45d', + 'skia_revision': '16c9216905c119709366913523146d4968a6a5f5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '4b7de4a5360c971058b3b1bbb410fcedcb93f450', + 'v8_revision': '573561bf18181e6a08b8db00576dcb8adc969800', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -125,7 +125,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'fe79649598fb9bdf6d4567d58704e3a255dd5bb6', + 'swiftshader_revision': '810f3db8264a911566fb7fd84970bc93e47b8726', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -165,7 +165,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': '2ba11d1c2b02d6c962975c7bb1e20ab49d159008', + 'catapult_revision': '59297c6f73a6485334542123ebb48c648cef676b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -954,7 +954,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '7f61afaa6ec3420f840df61d6f46d355a71317f3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '1cae4d538d01959c4912c10e735e341f63cd268d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1106,7 +1106,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6d2f3f4cb8bac1f7c4a945c73d07a33df74f22f9', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '957c62e0d63eca6ac8b6c77d0391675d33fa0fe8', + Var('webrtc_git') + '/src.git' + '@' + '895ce82cabc83bc72bb5ee97b750b2d235901c17', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1137,7 +1137,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@421d954080fe05338595cbc6712f9d9a5918af1f', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e928488baf668dc39ca71206f0796ad08ea15764', 'condition': 'checkout_src_internal', },
diff --git a/ash/system/message_center/arc/arc_notification_content_view.cc b/ash/system/message_center/arc/arc_notification_content_view.cc index b0ec8c2..fe064d7 100644 --- a/ash/system/message_center/arc/arc_notification_content_view.cc +++ b/ash/system/message_center/arc/arc_notification_content_view.cc
@@ -414,11 +414,6 @@ if (surface_ == surface) return; - // Set the flag to change the visibility of the snapshot on the background - // when the surface is set or unset. The surface sets while the window on - // Android side is visible. - bool need_to_update_snapshot = (surface_ == nullptr || surface == nullptr); - // Reset |floating_control_buttons_widget_| when |surface_| is changed. floating_control_buttons_widget_.reset(); @@ -453,10 +448,6 @@ AttachSurface(); } } - - // Schedules to draw the background (snapshot or a blank). - if (need_to_update_snapshot) - SchedulePaint(); } void ArcNotificationContentView::UpdatePreferredSize() { @@ -814,8 +805,9 @@ } void ArcNotificationContentView::OnWidgetClosing(views::Widget* widget) { - // Show copied surface, since the mask doesn't work correctly with closing - // animation (fade-out): https://crbug.com/811634. + // Actually this code doesn't show copied surface. Since it looks it doesn't + // work during closing. This just hides the surface and revails hidden + // snapshot: https://crbug.com/890701. ShowCopiedSurface(); if (attached_widget_) {
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index ccbf3be..e9bc55f 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -229,6 +229,8 @@ void UnifiedSystemTrayController::ShowUserChooserView() { if (!IsUserChooserEnabled()) return; + animation_->Reset(1.0); + UpdateExpandedAmount(); unified_view_->SetDetailedView(new UserChooserView(this)); }
diff --git a/ash/system/unified/user_chooser_view.cc b/ash/system/unified/user_chooser_view.cc index 471edfe..4023315 100644 --- a/ash/system/unified/user_chooser_view.cc +++ b/ash/system/unified/user_chooser_view.cc
@@ -120,6 +120,18 @@ DISALLOW_COPY_AND_ASSIGN(Separator); }; +views::View* CreateAddUserErrorView(const base::string16& message) { + auto* label = new views::Label(message); + label->SetEnabledColor(kUnifiedMenuTextColor); + label->SetAutoColorReadabilityEnabled(false); + label->SetSubpixelRenderingEnabled(false); + label->SetBorder( + views::CreateEmptyBorder(gfx::Insets(kUnifiedTopShortcutSpacing))); + label->SetMultiLine(true); + label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + return label; +} + } // namespace views::View* CreateUserAvatarView(int user_index) { @@ -257,9 +269,24 @@ AddChildView(button); AddChildView(new Separator(i < num_users - 1)); } - if (Shell::Get()->session_controller()->GetAddUserPolicy() == - AddUserSessionPolicy::ALLOWED) { - AddChildView(new AddUserButton(controller)); + + switch (Shell::Get()->session_controller()->GetAddUserPolicy()) { + case AddUserSessionPolicy::ALLOWED: + AddChildView(new AddUserButton(controller)); + break; + case AddUserSessionPolicy::ERROR_NOT_ALLOWED_PRIMARY_USER: + AddChildView(CreateAddUserErrorView(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_MESSAGE_NOT_ALLOWED_PRIMARY_USER))); + break; + case AddUserSessionPolicy::ERROR_MAXIMUM_USERS_REACHED: + AddChildView(CreateAddUserErrorView(l10n_util::GetStringFUTF16Int( + IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER, + session_manager::kMaximumNumberOfUserSessions))); + break; + case AddUserSessionPolicy::ERROR_NO_ELIGIBLE_USERS: + AddChildView(CreateAddUserErrorView( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_MESSAGE_OUT_OF_USERS))); + break; } Shell::Get()->media_controller()->AddObserver(this);
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc index 2c7551ea..92b29f4 100644 --- a/ash/wm/overview/window_selector.cc +++ b/ash/wm/overview/window_selector.cc
@@ -463,6 +463,11 @@ } void WindowSelector::OnGridEmpty(WindowGrid* grid) { + // TODO(crbug.com/881089): Speculative fix based on the crash stack, needs + // confirming. + if (IsShuttingDown()) + return; + size_t index = 0; // If there are no longer any items on any of the grids, shutdown, // otherwise the empty grids will remain blurred but will have no items.
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc index d1627e1a..c190c9a 100644 --- a/base/task/sequence_manager/sequence_manager_impl.cc +++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -462,8 +462,7 @@ return delay_till_next_task; } -void SequenceManagerImpl::WillQueueTask( - internal::TaskQueueImpl::Task* pending_task) { +void SequenceManagerImpl::WillQueueTask(Task* pending_task) { controller_->WillQueueTask(pending_task); }
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h index 1572ac4..81b43fe 100644 --- a/base/task/sequence_manager/sequence_manager_impl.h +++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -192,15 +192,15 @@ // selector interface is unaware of those. This struct keeps track off all // task related state needed to make pairs of TakeTask() / DidRunTask() work. struct ExecutingTask { - ExecutingTask(internal::TaskQueueImpl::Task&& task, + ExecutingTask(Task&& task, internal::TaskQueueImpl* task_queue, TaskQueue::TaskTiming task_timing) : pending_task(std::move(task)), task_queue(task_queue), task_timing(task_timing), - task_type(pending_task.task_type()) {} + task_type(pending_task.task_type) {} - internal::TaskQueueImpl::Task pending_task; + Task pending_task; internal::TaskQueueImpl* task_queue = nullptr; TaskQueue::TaskTiming task_timing; // Save task metadata to use in after running a task as |pending_task| @@ -270,7 +270,7 @@ // Called by the task queue to inform this SequenceManager of a task that's // about to be queued. This SequenceManager may use this opportunity to add // metadata to |pending_task| before it is moved into the queue. - void WillQueueTask(internal::TaskQueueImpl::Task* pending_task); + void WillQueueTask(Task* pending_task); // Delayed Tasks with run_times <= Now() are enqueued onto the work queue and // reloads any empty work queues.
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc index 7a6bb5a7..7b6fd80 100644 --- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc +++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -2910,11 +2910,11 @@ int* start_counter, int* complete_counter) { task_queue->GetTaskQueueImpl()->SetOnTaskStartedHandler(BindRepeating( - [](int* counter, const TaskQueue::Task& task, + [](int* counter, const Task& task, const TaskQueue::TaskTiming& task_timing) { ++(*counter); }, start_counter)); task_queue->GetTaskQueueImpl()->SetOnTaskCompletedHandler(BindRepeating( - [](int* counter, const TaskQueue::Task& task, + [](int* counter, const Task& task, const TaskQueue::TaskTiming& task_timing) { ++(*counter); }, complete_counter)); }
diff --git a/base/task/sequence_manager/task_queue.cc b/base/task/sequence_manager/task_queue.cc index 62cb6585..85daf685 100644 --- a/base/task/sequence_manager/task_queue.cc +++ b/base/task/sequence_manager/task_queue.cc
@@ -52,14 +52,6 @@ TakeTaskQueueImpl()); } -TaskQueue::Task::Task(internal::PostedTask posted_task, - TimeTicks desired_run_time) - : PendingTask(posted_task.location, - std::move(posted_task.callback), - desired_run_time, - posted_task.nestable), - task_type_(posted_task.task_type) {} - TaskQueue::TaskTiming::TaskTiming(bool has_wall_time, bool has_thread_time) : has_wall_time_(has_wall_time), has_thread_time_(has_thread_time) {}
diff --git a/base/task/sequence_manager/task_queue.h b/base/task/sequence_manager/task_queue.h index 4b747a8..07251608 100644 --- a/base/task/sequence_manager/task_queue.h +++ b/base/task/sequence_manager/task_queue.h
@@ -128,19 +128,6 @@ bool should_notify_observers; }; - // Interface to inspect task type by a scheduler controlling SequenceManager. - // TODO(kraynov): Merge with TaskQueueImpl::Task (keeping enqueue order - // private with friend classes) and move to tasks.(h|cc). - class BASE_EXPORT Task : public PendingTask { - public: - Task(internal::PostedTask posted_task, TimeTicks desired_run_time); - - int task_type() const { return task_type_; } - - private: - int task_type_; - }; - // Information about task execution. // // Wall-time related methods (start_time, end_time, wall_duration) can be
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc index bc361dda..d3d3839 100644 --- a/base/task/sequence_manager/task_queue_impl.cc +++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -73,24 +73,6 @@ #endif } -TaskQueueImpl::Task::Task(PostedTask task, - TimeTicks desired_run_time, - EnqueueOrder sequence_number) - : TaskQueue::Task(std::move(task), desired_run_time) { - // It might wrap around to a negative number but it's handled properly. - sequence_num = static_cast<int>(sequence_number); -} - -TaskQueueImpl::Task::Task(PostedTask task, - TimeTicks desired_run_time, - EnqueueOrder sequence_number, - EnqueueOrder enqueue_order) - : TaskQueue::Task(std::move(task), desired_run_time), - enqueue_order_(enqueue_order) { - // It might wrap around to a negative number but it's handled properly. - sequence_num = static_cast<int>(sequence_number); -} - TaskQueueImpl::AnyThread::AnyThread(SequenceManagerImpl* sequence_manager, TimeDomain* time_domain) : sequence_manager(sequence_manager), time_domain(time_domain) {} @@ -263,7 +245,7 @@ Task(PostedTask(BindOnce(&TaskQueueImpl::ScheduleDelayedWorkTask, Unretained(this), std::move(pending_task)), FROM_HERE, TimeDelta(), Nestable::kNonNestable, - pending_task.task_type()), + pending_task.task_type), TimeTicks(), thread_hop_task_sequence_number, thread_hop_task_sequence_number)); } @@ -332,6 +314,10 @@ AutoLock immediate_incoming_queue_lock(immediate_incoming_queue_lock_); queue->swap(immediate_incoming_queue()); + // Since |immediate_incoming_queue| is empty, now is a good time to consider + // reducing it's capacity if we're wasting memory. + immediate_incoming_queue().MaybeShrinkQueue(); + // Activate delayed fence if necessary. This is ideologically similar to // ActivateDelayedFenceIfNeeded, but due to immediate tasks being posted // from any thread we can't generate an enqueue order for the fence there, @@ -397,8 +383,7 @@ return !immediate_incoming_queue().empty(); } -Optional<TaskQueueImpl::DelayedWakeUp> -TaskQueueImpl::GetNextScheduledWakeUpImpl() { +Optional<DelayedWakeUp> TaskQueueImpl::GetNextScheduledWakeUpImpl() { // Note we don't scheduled a wake-up for disabled queues. if (main_thread_only().delayed_incoming_queue.empty() || !IsQueueEnabled()) return nullopt; @@ -426,6 +411,7 @@ if (task.delayed_run_time > lazy_now->Now()) break; ActivateDelayedFenceIfNeeded(task.delayed_run_time); + DCHECK(!task.enqueue_order_set()); task.set_enqueue_order( main_thread_only().sequence_manager->GetNextSequenceNumber()); main_thread_only().delayed_work_queue->Push(std::move(task)); @@ -509,6 +495,13 @@ state->SetInteger("delayed_work_queue_size", main_thread_only().delayed_work_queue->Size()); + state->SetInteger("immediate_incoming_queue_capacity", + immediate_incoming_queue().capacity()); + state->SetInteger("immediate_work_queue_capacity", + immediate_work_queue()->Capacity()); + state->SetInteger("delayed_work_queue_capacity", + delayed_work_queue()->Capacity()); + if (!main_thread_only().delayed_incoming_queue.empty()) { TimeDelta delay_to_next_task = (main_thread_only().delayed_incoming_queue.top().delayed_run_time - @@ -870,12 +863,14 @@ main_thread_only().delayed_incoming_queue = std::move(remaining_tasks); + // Also consider shrinking the work queue if it's wasting memory. + main_thread_only().delayed_work_queue->MaybeShrinkQueue(); + LazyNow lazy_now(now); UpdateDelayedWakeUp(&lazy_now); } -void TaskQueueImpl::PushImmediateIncomingTaskForTest( - TaskQueueImpl::Task&& task) { +void TaskQueueImpl::PushImmediateIncomingTaskForTest(Task&& task) { AutoLock lock(immediate_incoming_queue_lock_); immediate_incoming_queue().push_back(std::move(task)); } @@ -914,9 +909,8 @@ return UpdateDelayedWakeUpImpl(lazy_now, GetNextScheduledWakeUpImpl()); } -void TaskQueueImpl::UpdateDelayedWakeUpImpl( - LazyNow* lazy_now, - Optional<TaskQueueImpl::DelayedWakeUp> wake_up) { +void TaskQueueImpl::UpdateDelayedWakeUpImpl(LazyNow* lazy_now, + Optional<DelayedWakeUp> wake_up) { if (main_thread_only().scheduled_wake_up == wake_up) return; main_thread_only().scheduled_wake_up = wake_up; @@ -932,7 +926,7 @@ } void TaskQueueImpl::SetDelayedWakeUpForTesting( - Optional<TaskQueueImpl::DelayedWakeUp> wake_up) { + Optional<DelayedWakeUp> wake_up) { LazyNow lazy_now = main_thread_only().time_domain->CreateLazyNow(); UpdateDelayedWakeUpImpl(&lazy_now, wake_up); } @@ -954,7 +948,7 @@ main_thread_only().on_task_started_handler = std::move(handler); } -void TaskQueueImpl::OnTaskStarted(const TaskQueue::Task& task, +void TaskQueueImpl::OnTaskStarted(const Task& task, const TaskQueue::TaskTiming& task_timing) { if (!main_thread_only().on_task_started_handler.is_null()) main_thread_only().on_task_started_handler.Run(task, task_timing); @@ -965,7 +959,7 @@ main_thread_only().on_task_completed_handler = std::move(handler); } -void TaskQueueImpl::OnTaskCompleted(const TaskQueue::Task& task, +void TaskQueueImpl::OnTaskCompleted(const Task& task, const TaskQueue::TaskTiming& task_timing) { if (!main_thread_only().on_task_completed_handler.is_null()) main_thread_only().on_task_completed_handler.Run(task, task_timing);
diff --git a/base/task/sequence_manager/task_queue_impl.h b/base/task/sequence_manager/task_queue_impl.h index 5fb05b84..cdb0bb9 100644 --- a/base/task/sequence_manager/task_queue_impl.h +++ b/base/task/sequence_manager/task_queue_impl.h
@@ -12,7 +12,6 @@ #include <set> #include "base/callback.h" -#include "base/containers/circular_deque.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" @@ -80,91 +79,22 @@ ~TaskQueueImpl(); - // Represents a time at which a task wants to run. Tasks scheduled for the - // same point in time will be ordered by their sequence numbers. - struct DelayedWakeUp { - TimeTicks time; - int sequence_num; - - bool operator!=(const DelayedWakeUp& other) const { - return time != other.time || other.sequence_num != sequence_num; - } - - bool operator==(const DelayedWakeUp& other) const { - return !(*this != other); - } - - bool operator<=(const DelayedWakeUp& other) const { - if (time == other.time) { - // Debug gcc builds can compare an element against itself. - DCHECK(sequence_num != other.sequence_num || this == &other); - // |PendingTask::sequence_num| is int and might wrap around to - // a negative number when casted from EnqueueOrder. - // This way of comparison handles that properly. - return (sequence_num - other.sequence_num) <= 0; - } - return time < other.time; - } - }; - - class BASE_EXPORT Task : public TaskQueue::Task { - public: - Task(PostedTask task, - TimeTicks desired_run_time, - EnqueueOrder sequence_number); - - Task(PostedTask task, - TimeTicks desired_run_time, - EnqueueOrder sequence_number, - EnqueueOrder enqueue_order); - - DelayedWakeUp delayed_wake_up() const { - // Since we use |sequence_num| in DelayedWakeUp for ordering purposes - // and integer overflow handling is type-sensitive it's worth to protect - // it from an unnoticed potential change in the PendingTask base class. - static_assert(std::is_same<decltype(sequence_num), int>::value, ""); - return DelayedWakeUp{delayed_run_time, sequence_num}; - } - - EnqueueOrder enqueue_order() const { - DCHECK(enqueue_order_); - return enqueue_order_; - } - - void set_enqueue_order(EnqueueOrder enqueue_order) { - DCHECK(!enqueue_order_); - enqueue_order_ = enqueue_order; - } - - bool enqueue_order_set() const { return enqueue_order_; } - - private: - // Similar to sequence number, but ultimately the |enqueue_order_| is what - // the scheduler uses for task ordering. For immediate tasks |enqueue_order| - // is set when posted, but for delayed tasks it's not defined until they are - // enqueued on the |delayed_work_queue_|. This is because otherwise delayed - // tasks could run before an immediate task posted after the delayed task. - EnqueueOrder enqueue_order_; - }; - // Types of queues TaskQueueImpl is maintaining internally. enum class WorkQueueType { kImmediate, kDelayed }; // Non-nestable tasks may get deferred but such queue is being maintained on // SequenceManager side, so we need to keep information how to requeue it. struct DeferredNonNestableTask { - internal::TaskQueueImpl::Task task; + Task task; internal::TaskQueueImpl* task_queue; WorkQueueType work_queue_type; }; using OnNextWakeUpChangedCallback = RepeatingCallback<void(TimeTicks)>; using OnTaskStartedHandler = - RepeatingCallback<void(const TaskQueue::Task&, - const TaskQueue::TaskTiming&)>; + RepeatingCallback<void(const Task&, const TaskQueue::TaskTiming&)>; using OnTaskCompletedHandler = - RepeatingCallback<void(const TaskQueue::Task&, - const TaskQueue::TaskTiming&)>; + RepeatingCallback<void(const Task&, const TaskQueue::TaskTiming&)>; // May be called from any thread. scoped_refptr<SingleThreadTaskRunner> CreateTaskRunner(int task_type) const; @@ -256,7 +186,7 @@ // TODO(kraynov): Simplify non-nestable task logic https://crbug.com/845437. void RequeueDeferredNonNestableTask(DeferredNonNestableTask task); - void PushImmediateIncomingTaskForTest(TaskQueueImpl::Task&& task); + void PushImmediateIncomingTaskForTest(Task&& task); class QueueEnabledVoterImpl : public TaskQueue::QueueEnabledVoter { public: @@ -283,10 +213,10 @@ // Allows wrapping TaskQueue to set a handler to subscribe for notifications // about started and completed tasks. void SetOnTaskStartedHandler(OnTaskStartedHandler handler); - void OnTaskStarted(const TaskQueue::Task& task, + void OnTaskStarted(const Task& task, const TaskQueue::TaskTiming& task_timing); void SetOnTaskCompletedHandler(OnTaskCompletedHandler handler); - void OnTaskCompleted(const TaskQueue::Task& task, + void OnTaskCompleted(const Task& task, const TaskQueue::TaskTiming& task_timing); bool RequiresTaskTiming() const; @@ -342,7 +272,7 @@ std::unique_ptr<WorkQueue> delayed_work_queue; std::unique_ptr<WorkQueue> immediate_work_queue; - std::priority_queue<TaskQueueImpl::Task> delayed_incoming_queue; + std::priority_queue<Task> delayed_incoming_queue; ObserverList<MessageLoop::TaskObserver>::Unchecked task_observers; size_t set_index; HeapHandle heap_handle; @@ -381,7 +311,7 @@ // empty. void PushOntoImmediateIncomingQueueLocked(Task task); - using TaskDeque = circular_deque<Task>; + using TaskDeque = LazilyDeallocatedDeque<Task>; // Extracts all the tasks from the immediate incoming queue and swaps it with // |queue| which must be empty.
diff --git a/base/task/sequence_manager/task_queue_selector_unittest.cc b/base/task/sequence_manager/task_queue_selector_unittest.cc index 0a41733..e7b0bb56 100644 --- a/base/task/sequence_manager/task_queue_selector_unittest.cc +++ b/base/task/sequence_manager/task_queue_selector_unittest.cc
@@ -116,9 +116,8 @@ for (size_t i = 0; i < num_tasks; i++) { changed_queue_set.insert(queue_indices[i]); task_queues_[queue_indices[i]]->immediate_work_queue()->Push( - TaskQueueImpl::Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder(), - enqueue_order_generator.GenerateNext())); + Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), + EnqueueOrder(), enqueue_order_generator.GenerateNext())); } } @@ -128,10 +127,9 @@ std::set<size_t> changed_queue_set; for (size_t i = 0; i < num_tasks; i++) { changed_queue_set.insert(queue_indices[i]); - task_queues_[queue_indices[i]]->immediate_work_queue()->Push( - TaskQueueImpl::Task( - PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(), - EnqueueOrder::FromIntForTesting(enqueue_orders[i]))); + task_queues_[queue_indices[i]]->immediate_work_queue()->Push(Task( + PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(), + EnqueueOrder::FromIntForTesting(enqueue_orders[i]))); } } @@ -738,8 +736,8 @@ TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) { task_queues_[0]->delayed_work_queue()->Push( - TaskQueueImpl::Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder(), EnqueueOrder::FromIntForTesting(2))); + Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(), + EnqueueOrder::FromIntForTesting(2))); WorkQueue* chosen_work_queue = nullptr; bool chose_delayed_over_immediate = false; @@ -752,8 +750,8 @@ TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) { task_queues_[0]->immediate_work_queue()->Push( - TaskQueueImpl::Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder(), EnqueueOrder::FromIntForTesting(2))); + Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(), + EnqueueOrder::FromIntForTesting(2))); WorkQueue* chosen_work_queue = nullptr; bool chose_delayed_over_immediate = false; @@ -777,8 +775,8 @@ task_queue->SetQueueEnabledForTest(false); selector.DisableQueue(task_queue.get()); - TaskQueueImpl::Task task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder(), EnqueueOrder::FromIntForTesting(2)); + Task task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(), + EnqueueOrder::FromIntForTesting(2)); task_queue->immediate_work_queue()->Push(std::move(task)); WorkQueue* chosen_work_queue; @@ -807,12 +805,12 @@ selector.SetQueuePriority(task_queue2.get(), TaskQueue::kControlPriority); - TaskQueueImpl::Task task1(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder::FromIntForTesting(2), - EnqueueOrder::FromIntForTesting(2)); - TaskQueueImpl::Task task2(PostedTask(test_closure_, FROM_HERE), TimeTicks(), - EnqueueOrder::FromIntForTesting(3), - EnqueueOrder::FromIntForTesting(3)); + Task task1(PostedTask(test_closure_, FROM_HERE), TimeTicks(), + EnqueueOrder::FromIntForTesting(2), + EnqueueOrder::FromIntForTesting(2)); + Task task2(PostedTask(test_closure_, FROM_HERE), TimeTicks(), + EnqueueOrder::FromIntForTesting(3), + EnqueueOrder::FromIntForTesting(3)); task_queue->immediate_work_queue()->Push(std::move(task1)); task_queue2->immediate_work_queue()->Push(std::move(task2)); @@ -856,13 +854,13 @@ public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {}; TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) { - task_queues_[0]->immediate_work_queue()->Push(TaskQueueImpl::Task( + task_queues_[0]->immediate_work_queue()->Push(Task( PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder::FromIntForTesting(GetParam().immediate_task_enqueue_order), EnqueueOrder::FromIntForTesting( GetParam().immediate_task_enqueue_order))); - task_queues_[0]->delayed_work_queue()->Push(TaskQueueImpl::Task( + task_queues_[0]->delayed_work_queue()->Push(Task( PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder::FromIntForTesting(GetParam().delayed_task_enqueue_order), EnqueueOrder::FromIntForTesting(GetParam().delayed_task_enqueue_order)));
diff --git a/base/task/sequence_manager/tasks.cc b/base/task/sequence_manager/tasks.cc index 6ff7a18..0172378 100644 --- a/base/task/sequence_manager/tasks.cc +++ b/base/task/sequence_manager/tasks.cc
@@ -6,6 +6,25 @@ namespace base { namespace sequence_manager { + +Task::Task(internal::PostedTask posted_task, + TimeTicks desired_run_time, + internal::EnqueueOrder sequence_order, + internal::EnqueueOrder enqueue_order) + : PendingTask(posted_task.location, + std::move(posted_task.callback), + desired_run_time, + posted_task.nestable), + task_type(posted_task.task_type), + enqueue_order_(enqueue_order) { + // We use |sequence_num| in DelayedWakeUp for ordering purposes and it + // may wrap around to a negative number during the static cast, hence, + // the relevant code is especially sensitive to a potential change of + // |PendingTask::sequence_num|'s type. + static_assert(std::is_same<decltype(sequence_num), int>::value, ""); + sequence_num = static_cast<int>(sequence_order); +} + namespace internal { PostedTask::PostedTask(OnceClosure callback,
diff --git a/base/task/sequence_manager/tasks.h b/base/task/sequence_manager/tasks.h index b227028e..38b98a5 100644 --- a/base/task/sequence_manager/tasks.h +++ b/base/task/sequence_manager/tasks.h
@@ -6,14 +6,13 @@ #define BASE_TASK_SEQUENCE_MANAGER_TASKS_H_ #include "base/pending_task.h" +#include "base/task/sequence_manager/enqueue_order.h" namespace base { namespace sequence_manager { constexpr int kTaskTypeNone = 0; -// TODO(kraynov): Move TaskQueue::Task here. - namespace internal { // Wrapper around PostTask method arguments and the assigned task type. @@ -36,7 +35,70 @@ DISALLOW_COPY_AND_ASSIGN(PostedTask); }; +// Represents a time at which a task wants to run. Tasks scheduled for the +// same point in time will be ordered by their sequence numbers. +struct DelayedWakeUp { + TimeTicks time; + int sequence_num; + + bool operator!=(const DelayedWakeUp& other) const { + return time != other.time || other.sequence_num != sequence_num; + } + + bool operator==(const DelayedWakeUp& other) const { + return !(*this != other); + } + + bool operator<=(const DelayedWakeUp& other) const { + if (time == other.time) { + // Debug gcc builds can compare an element against itself. + DCHECK(sequence_num != other.sequence_num || this == &other); + // |sequence_num| is int and might wrap around to a negative number when + // casted from EnqueueOrder. This way of comparison handles that properly. + return (sequence_num - other.sequence_num) <= 0; + } + return time < other.time; + } +}; + } // namespace internal + +// PendingTask with extra metadata for SequenceManager. +struct BASE_EXPORT Task : public PendingTask { + Task(internal::PostedTask posted_task, + TimeTicks desired_run_time, + internal::EnqueueOrder sequence_order, + internal::EnqueueOrder enqueue_order = internal::EnqueueOrder()); + + internal::DelayedWakeUp delayed_wake_up() const { + return internal::DelayedWakeUp{delayed_run_time, sequence_num}; + } + + // SequenceManager is particularly sensitive to enqueue order, + // so we have accessors for safety. + internal::EnqueueOrder enqueue_order() const { + DCHECK(enqueue_order_); + return enqueue_order_; + } + + void set_enqueue_order(internal::EnqueueOrder enqueue_order) { + DCHECK(!enqueue_order_); + enqueue_order_ = enqueue_order; + } + + bool enqueue_order_set() const { return enqueue_order_; } + + int task_type; + + private: + // Similar to |sequence_num|, but ultimately the |enqueue_order| is what + // the scheduler uses for task ordering. For immediate tasks |enqueue_order| + // is set when posted, but for delayed tasks it's not defined until they are + // enqueued. This is because otherwise delayed tasks could run before + // an immediate task posted after the delayed task. + internal::EnqueueOrder enqueue_order_; +}; + } // namespace sequence_manager } // namespace base
diff --git a/base/task/sequence_manager/test/fake_task.cc b/base/task/sequence_manager/test/fake_task.cc index e87cb4b..779e12a 100644 --- a/base/task/sequence_manager/test/fake_task.cc +++ b/base/task/sequence_manager/test/fake_task.cc
@@ -10,12 +10,13 @@ FakeTask::FakeTask() : FakeTask(0 /* task_type */) {} FakeTask::FakeTask(int task_type) - : TaskQueue::Task(internal::PostedTask(OnceClosure(), - FROM_HERE, - TimeDelta(), - Nestable::kNestable, - task_type), - TimeTicks()) {} + : Task(internal::PostedTask(OnceClosure(), + FROM_HERE, + TimeDelta(), + Nestable::kNestable, + task_type), + TimeTicks(), + internal::EnqueueOrder()) {} FakeTaskTiming::FakeTaskTiming() : TaskTiming(false /* has_wall_time */, false /* has_thread_time */) {}
diff --git a/base/task/sequence_manager/test/fake_task.h b/base/task/sequence_manager/test/fake_task.h index 4c4759a..6de56a6c 100644 --- a/base/task/sequence_manager/test/fake_task.h +++ b/base/task/sequence_manager/test/fake_task.h
@@ -6,11 +6,12 @@ #define BASE_TASK_SEQUENCE_MANAGER_TEST_FAKE_TASK_H_ #include "base/task/sequence_manager/task_queue.h" +#include "base/task/sequence_manager/tasks.h" namespace base { namespace sequence_manager { -class FakeTask : public TaskQueue::Task { +class FakeTask : public Task { public: FakeTask(); explicit FakeTask(int task_type);
diff --git a/base/task/sequence_manager/time_domain.cc b/base/task/sequence_manager/time_domain.cc index f7d57be..8ca32e756 100644 --- a/base/task/sequence_manager/time_domain.cc +++ b/base/task/sequence_manager/time_domain.cc
@@ -55,7 +55,7 @@ void TimeDomain::SetNextWakeUpForQueue( internal::TaskQueueImpl* queue, - Optional<internal::TaskQueueImpl::DelayedWakeUp> wake_up, + Optional<internal::DelayedWakeUp> wake_up, LazyNow* lazy_now) { DCHECK_CALLED_ON_VALID_THREAD(associated_thread_->thread_checker); DCHECK_EQ(queue->GetTimeDomain(), this);
diff --git a/base/task/sequence_manager/time_domain.h b/base/task/sequence_manager/time_domain.h index 685590ae..e06f9cc 100644 --- a/base/task/sequence_manager/time_domain.h +++ b/base/task/sequence_manager/time_domain.h
@@ -97,10 +97,9 @@ // the same |queue| invalidate previous requests. // Nullopt |wake_up| cancels a previously set wake up for |queue|. // NOTE: |lazy_now| is provided in TimeDomain's time. - void SetNextWakeUpForQueue( - internal::TaskQueueImpl* queue, - Optional<internal::TaskQueueImpl::DelayedWakeUp> wake_up, - LazyNow* lazy_now); + void SetNextWakeUpForQueue(internal::TaskQueueImpl* queue, + Optional<internal::DelayedWakeUp> wake_up, + LazyNow* lazy_now); // Remove the TaskQueue from any internal data sctructures. void UnregisterQueue(internal::TaskQueueImpl* queue); @@ -109,7 +108,7 @@ void WakeUpReadyDelayedQueues(LazyNow* lazy_now); struct ScheduledDelayedWakeUp { - internal::TaskQueueImpl::DelayedWakeUp wake_up; + internal::DelayedWakeUp wake_up; internal::TaskQueueImpl* queue; bool operator<=(const ScheduledDelayedWakeUp& other) const {
diff --git a/base/task/sequence_manager/time_domain_unittest.cc b/base/task/sequence_manager/time_domain_unittest.cc index 951314f..54efd761 100644 --- a/base/task/sequence_manager/time_domain_unittest.cc +++ b/base/task/sequence_manager/time_domain_unittest.cc
@@ -97,7 +97,7 @@ TimeTicks now = time_domain_->Now(); LazyNow lazy_now(now); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{now + delay, 0}); + internal::DelayedWakeUp{now + delay, 0}); EXPECT_EQ(delayed_runtime, time_domain_->NextScheduledRunTime()); @@ -117,7 +117,7 @@ TimeTicks now = time_domain_->Now(); LazyNow lazy_now(now); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{delayed_runtime1, 0}); + internal::DelayedWakeUp{delayed_runtime1, 0}); EXPECT_EQ(delayed_runtime1, time_domain_->NextScheduledRunTime()); @@ -127,7 +127,7 @@ // requested one. EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, delayed_runtime2)); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{delayed_runtime2, 0}); + internal::DelayedWakeUp{delayed_runtime2, 0}); EXPECT_EQ(delayed_runtime2, time_domain_->NextScheduledRunTime()); Mock::VerifyAndClearExpectations(time_domain_.get()); @@ -160,22 +160,22 @@ LazyNow lazy_now(now); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, now + delay1)); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{now + delay1, 0}); + internal::DelayedWakeUp{now + delay1, 0}); Mock::VerifyAndClearExpectations(time_domain_.get()); // SetNextDelayedDoWork should not be called when scheduling later tasks. EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, _)).Times(0); task_queue2->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{now + delay2, 0}); + internal::DelayedWakeUp{now + delay2, 0}); task_queue3->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{now + delay3, 0}); + internal::DelayedWakeUp{now + delay3, 0}); // SetNextDelayedDoWork should be called when scheduling earlier tasks. Mock::VerifyAndClearExpectations(time_domain_.get()); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, now + delay4)); task_queue4->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{now + delay4, 0}); + internal::DelayedWakeUp{now + delay4, 0}); Mock::VerifyAndClearExpectations(time_domain_.get()); @@ -194,11 +194,10 @@ LazyNow lazy_now(now); TimeTicks wake_up1 = now + TimeDelta::FromMilliseconds(10); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, wake_up1)).Times(1); - task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{wake_up1, 0}); + task_queue_->SetDelayedWakeUpForTesting(internal::DelayedWakeUp{wake_up1, 0}); TimeTicks wake_up2 = now + TimeDelta::FromMilliseconds(100); task_queue2_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{wake_up2, 0}); + internal::DelayedWakeUp{wake_up2, 0}); EXPECT_EQ(task_queue_.get(), time_domain_->NextScheduledTaskQueue()); @@ -226,7 +225,7 @@ TimeTicks delayed_runtime = now + delay; EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, delayed_runtime)); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{delayed_runtime, 0}); + internal::DelayedWakeUp{delayed_runtime, 0}); EXPECT_EQ(delayed_runtime, time_domain_->NextScheduledRunTime()); @@ -254,9 +253,9 @@ TaskQueue::Spec("test")); task_queue2->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{delayed_runtime, ++sequence_num}); + internal::DelayedWakeUp{delayed_runtime, ++sequence_num}); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{delayed_runtime, ++sequence_num}); + internal::DelayedWakeUp{delayed_runtime, ++sequence_num}); time_domain_->WakeUpReadyDelayedQueues(&lazy_now); @@ -273,8 +272,7 @@ TimeTicks run_time = now + TimeDelta::FromMilliseconds(20); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, run_time)); - task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{run_time, 0}); + task_queue_->SetDelayedWakeUpForTesting(internal::DelayedWakeUp{run_time, 0}); EXPECT_EQ(task_queue_.get(), time_domain_->NextScheduledTaskQueue()); @@ -294,12 +292,12 @@ TimeTicks run_time2 = now + TimeDelta::FromMilliseconds(40); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, run_time1)); task_queue_->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{run_time1, 0}); + internal::DelayedWakeUp{run_time1, 0}); Mock::VerifyAndClearExpectations(time_domain_.get()); EXPECT_CALL(*time_domain_.get(), SetNextDelayedDoWork(_, _)).Times(0); task_queue2->SetDelayedWakeUpForTesting( - internal::TaskQueueImpl::DelayedWakeUp{run_time2, 0}); + internal::DelayedWakeUp{run_time2, 0}); Mock::VerifyAndClearExpectations(time_domain_.get()); EXPECT_EQ(task_queue_.get(), time_domain_->NextScheduledTaskQueue());
diff --git a/base/task/sequence_manager/work_queue.cc b/base/task/sequence_manager/work_queue.cc index 4d95f4b..43b5bea 100644 --- a/base/task/sequence_manager/work_queue.cc +++ b/base/task/sequence_manager/work_queue.cc
@@ -17,7 +17,7 @@ void WorkQueue::AsValueInto(TimeTicks now, trace_event::TracedValue* state) const { - for (const TaskQueueImpl::Task& task : tasks_) { + for (const Task& task : tasks_) { TaskQueueImpl::TaskAsValueInto(task, now, state); } } @@ -27,13 +27,13 @@ << work_queue_sets_->GetName() << " : " << name_; } -const TaskQueueImpl::Task* WorkQueue::GetFrontTask() const { +const Task* WorkQueue::GetFrontTask() const { if (tasks_.empty()) return nullptr; return &tasks_.front(); } -const TaskQueueImpl::Task* WorkQueue::GetBackTask() const { +const Task* WorkQueue::GetBackTask() const { if (tasks_.empty()) return nullptr; return &tasks_.back(); @@ -60,14 +60,14 @@ return true; } -void WorkQueue::Push(TaskQueueImpl::Task task) { +void WorkQueue::Push(Task task) { bool was_empty = tasks_.empty(); #ifndef NDEBUG DCHECK(task.enqueue_order_set()); #endif // Make sure the |enqueue_order()| is monotonically increasing. - DCHECK(was_empty || tasks_.rbegin()->enqueue_order() < task.enqueue_order()); + DCHECK(was_empty || tasks_.back().enqueue_order() < task.enqueue_order()); // Amoritized O(1). tasks_.push_back(std::move(task)); @@ -80,7 +80,7 @@ work_queue_sets_->OnTaskPushedToEmptyQueue(this); } -void WorkQueue::PushNonNestableTaskToFront(TaskQueueImpl::Task task) { +void WorkQueue::PushNonNestableTaskToFront(Task task) { DCHECK(task.nestable == Nestable::kNonNestable); bool was_empty = tasks_.empty(); @@ -90,7 +90,7 @@ #endif if (!was_empty) { - // Make sure the |enqueue_order()| is monotonically increasing. + // Make sure the |enqueue_order| is monotonically increasing. DCHECK_LE(task.enqueue_order(), tasks_.front().enqueue_order()) << task_queue_->GetName() << " : " << work_queue_sets_->GetName() << " : " << name_; @@ -126,16 +126,23 @@ work_queue_sets_->OnTaskPushedToEmptyQueue(this); } -TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() { +Task WorkQueue::TakeTaskFromWorkQueue() { DCHECK(work_queue_sets_); DCHECK(!tasks_.empty()); - TaskQueueImpl::Task pending_task = std::move(tasks_.front()); + Task pending_task = std::move(tasks_.front()); tasks_.pop_front(); // NB immediate tasks have a different pipeline to delayed ones. - if (queue_type_ == QueueType::kImmediate && tasks_.empty()) { - // Short-circuit the queue reload so that OnPopQueue does the right thing. - task_queue_->ReloadEmptyImmediateQueue(&tasks_); + if (tasks_.empty()) { + // NB delayed tasks are inserted via Push, no don't need to reload those. + if (queue_type_ == QueueType::kImmediate) { + // Short-circuit the queue reload so that OnPopQueue does the right + // thing. + task_queue_->ReloadEmptyImmediateQueue(&tasks_); + } + // Since the queue is empty, now is a good time to consider reducing it's + // capacity if we're wasting memory. + tasks_.MaybeShrinkQueue(); } // OnPopQueue calls GetFrontTaskEnqueueOrder which checks BlockedByFence() so @@ -154,10 +161,16 @@ task_removed = true; } if (task_removed) { - // NB immediate tasks have a different pipeline to delayed ones. - if (queue_type_ == QueueType::kImmediate && tasks_.empty()) { - // Short-circuit the queue reload so that OnPopQueue does the right thing. - task_queue_->ReloadEmptyImmediateQueue(&tasks_); + if (tasks_.empty()) { + // NB delayed tasks are inserted via Push, no don't need to reload those. + if (queue_type_ == QueueType::kImmediate) { + // Short-circuit the queue reload so that OnPopQueue does the right + // thing. + task_queue_->ReloadEmptyImmediateQueue(&tasks_); + } + // Since the queue is empty, now is a good time to consider reducing it's + // capacity if we're wasting memory. + tasks_.MaybeShrinkQueue(); } work_queue_sets_->OnPopQueue(this); task_queue_->TraceQueueSize(); @@ -231,6 +244,10 @@ tasks_.pop_front(); } +void WorkQueue::MaybeShrinkQueue() { + tasks_.MaybeShrinkQueue(); +} + } // namespace internal } // namespace sequence_manager } // namespace base
diff --git a/base/task/sequence_manager/work_queue.h b/base/task/sequence_manager/work_queue.h index 5197949..b273fc05 100644 --- a/base/task/sequence_manager/work_queue.h +++ b/base/task/sequence_manager/work_queue.h
@@ -55,20 +55,20 @@ // Returns the first task in this queue or null if the queue is empty. This // method ignores any fences. - const TaskQueueImpl::Task* GetFrontTask() const; + const Task* GetFrontTask() const; // Returns the last task in this queue or null if the queue is empty. This // method ignores any fences. - const TaskQueueImpl::Task* GetBackTask() const; + const Task* GetBackTask() const; // Pushes the task onto the |tasks_| and if a fence hasn't been reached // it informs the WorkQueueSets if the head changed. - void Push(TaskQueueImpl::Task task); + void Push(Task task); // Pushes the task onto the front of the |tasks_| and if it's before any // fence it informs the WorkQueueSets the head changed. Use with caution this // API can easily lead to task starvation if misused. - void PushNonNestableTaskToFront(TaskQueueImpl::Task task); + void PushNonNestableTaskToFront(Task task); // Reloads the empty |tasks_| with // |task_queue_->TakeImmediateIncomingQueue| and if a fence hasn't been @@ -77,10 +77,12 @@ size_t Size() const { return tasks_.size(); } + size_t Capacity() const { return tasks_.capacity(); } + // Pulls a task off the |tasks_| and informs the WorkQueueSets. If the // task removed had an enqueue order >= the current fence then WorkQueue // pretends to be empty as far as the WorkQueueSets is concerned. - TaskQueueImpl::Task TakeTaskFromWorkQueue(); + Task TakeTaskFromWorkQueue(); // Removes all canceled tasks from the head of the list. Returns true if any // tasks were removed. @@ -130,6 +132,9 @@ // Test support function. This should not be used in production code. void PopTaskForTesting(); + // Shrinks |tasks_| if it's wasting memory. + void MaybeShrinkQueue(); + private: bool InsertFenceImpl(EnqueueOrder fence);
diff --git a/base/task/sequence_manager/work_queue_sets_unittest.cc b/base/task/sequence_manager/work_queue_sets_unittest.cc index cc33de4..374af2a 100644 --- a/base/task/sequence_manager/work_queue_sets_unittest.cc +++ b/base/task/sequence_manager/work_queue_sets_unittest.cc
@@ -43,17 +43,17 @@ return queue; } - TaskQueueImpl::Task FakeTaskWithEnqueueOrder(int enqueue_order) { - TaskQueueImpl::Task fake_task( - PostedTask(BindOnce([] {}), FROM_HERE), TimeTicks(), EnqueueOrder(), - EnqueueOrder::FromIntForTesting(enqueue_order)); + Task FakeTaskWithEnqueueOrder(int enqueue_order) { + Task fake_task(PostedTask(BindOnce([] {}), FROM_HERE), TimeTicks(), + EnqueueOrder(), + EnqueueOrder::FromIntForTesting(enqueue_order)); return fake_task; } - TaskQueueImpl::Task FakeNonNestableTaskWithEnqueueOrder(int enqueue_order) { - TaskQueueImpl::Task fake_task( - PostedTask(BindOnce([] {}), FROM_HERE), TimeTicks(), EnqueueOrder(), - EnqueueOrder::FromIntForTesting(enqueue_order)); + Task FakeNonNestableTaskWithEnqueueOrder(int enqueue_order) { + Task fake_task(PostedTask(BindOnce([] {}), FROM_HERE), TimeTicks(), + EnqueueOrder(), + EnqueueOrder::FromIntForTesting(enqueue_order)); fake_task.nestable = Nestable::kNonNestable; return fake_task; }
diff --git a/base/task/sequence_manager/work_queue_unittest.cc b/base/task/sequence_manager/work_queue_unittest.cc index 9aec1a5..56bd291 100644 --- a/base/task/sequence_manager/work_queue_unittest.cc +++ b/base/task/sequence_manager/work_queue_unittest.cc
@@ -47,27 +47,26 @@ void TearDown() override { work_queue_sets_->RemoveQueue(work_queue_.get()); } protected: - TaskQueueImpl::Task FakeCancelableTaskWithEnqueueOrder( - int enqueue_order, - WeakPtr<Cancelable> weak_ptr) { - TaskQueueImpl::Task fake_task( + Task FakeCancelableTaskWithEnqueueOrder(int enqueue_order, + WeakPtr<Cancelable> weak_ptr) { + Task fake_task( PostedTask(BindOnce(&Cancelable::NopTask, weak_ptr), FROM_HERE), TimeTicks(), EnqueueOrder(), EnqueueOrder::FromIntForTesting(enqueue_order)); return fake_task; } - TaskQueueImpl::Task FakeTaskWithEnqueueOrder(int enqueue_order) { - TaskQueueImpl::Task fake_task( - PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(), EnqueueOrder(), - EnqueueOrder::FromIntForTesting(enqueue_order)); + Task FakeTaskWithEnqueueOrder(int enqueue_order) { + Task fake_task(PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(), + EnqueueOrder(), + EnqueueOrder::FromIntForTesting(enqueue_order)); return fake_task; } - TaskQueueImpl::Task FakeNonNestableTaskWithEnqueueOrder(int enqueue_order) { - TaskQueueImpl::Task fake_task( - PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(), EnqueueOrder(), - EnqueueOrder::FromIntForTesting(enqueue_order)); + Task FakeNonNestableTaskWithEnqueueOrder(int enqueue_order) { + Task fake_task(PostedTask(BindOnce(&NopTask), FROM_HERE), TimeTicks(), + EnqueueOrder(), + EnqueueOrder::FromIntForTesting(enqueue_order)); fake_task.nestable = Nestable::kNonNestable; return fake_task; }
diff --git a/build/config/arm.gni b/build/config/arm.gni index e8e01ae2..29434eb 100644 --- a/build/config/arm.gni +++ b/build/config/arm.gni
@@ -4,10 +4,6 @@ import("//build/config/v8_target_cpu.gni") -if (target_os == "android") { - import("//third_party/catapult/devil/devil_arm.gni") -} - # These are primarily relevant in current_cpu == "arm" contexts, where # ARM code is being compiled. But they can also be relevant in the # other contexts when the code will change its behavior based on the @@ -83,15 +79,8 @@ } if (arm_float_abi == "") { - if (current_os == "android") { + if (current_os == "android" || target_os == "android") { arm_float_abi = "softfp" - } else if (target_os == "android") { - if (build_devil_arm_deps) { - # Raspberry Pis require "hard" - arm_float_abi = "hard" - } else { - arm_float_abi = "softfp" - } } else if (current_os == "linux" && target_cpu != v8_target_cpu) { # Default to the same as Android for V8 simulator builds. arm_float_abi = "softfp"
diff --git a/chrome/android/java/res/layout-sw600dp/location_bar.xml b/chrome/android/java/res/layout-sw600dp/location_bar.xml index 5c2a4b7..47d81308 100644 --- a/chrome/android/java/res/layout-sw600dp/location_bar.xml +++ b/chrome/android/java/res/layout-sw600dp/location_bar.xml
@@ -20,7 +20,7 @@ android:src="@drawable/ic_omnibox_page" android:scaleType="center" android:contentDescription="@string/accessibility_toolbar_btn_site_info"/> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/security_button" style="@style/LocationBarButton" android:layout_width="match_parent" @@ -29,7 +29,7 @@ android:layout_gravity="center" android:alpha="0" android:visibility="invisible" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </FrameLayout> <include layout="@layout/location_bar_status" />
diff --git a/chrome/android/java/res/layout/accept_languages_item.xml b/chrome/android/java/res/layout/accept_languages_item.xml index dd9fd20a..48c794e 100644 --- a/chrome/android/java/res/layout/accept_languages_item.xml +++ b/chrome/android/java/res/layout/accept_languages_item.xml
@@ -13,10 +13,10 @@ android:paddingEnd="@dimen/pref_languages_padding" style="@style/ListItemContainer"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/icon_view" style="@style/ListItemStartIcon" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <LinearLayout android:layout_width="0dp" @@ -48,6 +48,6 @@ android:background="@null" android:src="@drawable/ic_more_vert_black_24dp" app:menuWidth="@dimen/pref_languages_item_popup_width" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" tools:ignore="ContentDescription" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/accessibility_tab_switcher.xml b/chrome/android/java/res/layout/accessibility_tab_switcher.xml index a8ba536d..7b2057b 100644 --- a/chrome/android/java/res/layout/accessibility_tab_switcher.xml +++ b/chrome/android/java/res/layout/accessibility_tab_switcher.xml
@@ -54,14 +54,14 @@ android:id="@+id/button_wrapper" android:visibility="gone"> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/standard_tabs_button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/btn_bg_holo_active" android:src="@drawable/btn_normal_tabs" - app:chrometint="@color/light_mode_tint" + app:tint="@color/light_mode_tint" android:contentDescription="@string/accessibility_tab_switcher_standard_stack" style="?android:attr/borderlessButtonStyle" /> @@ -71,13 +71,13 @@ android:layout_gravity="center_vertical" android:background="#292929" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/incognito_tabs_button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/btn_incognito_tabs" - app:chrometint="@color/light_mode_tint" + app:tint="@color/light_mode_tint" android:background="@drawable/btn_bg_holo" android:contentDescription="@string/accessibility_tab_switcher_incognito_stack" style="?android:attr/borderlessButtonStyle" />
diff --git a/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml b/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml index cf23a9b..62e6b35 100644 --- a/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml +++ b/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml
@@ -9,7 +9,6 @@ <org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" android:id="@+id/list_item_frame" android:layout_width="match_parent" android:layout_height="@dimen/accessibility_tab_height"> @@ -20,13 +19,13 @@ <include layout="@layout/modern_list_item_view" /> <!-- TODO(huayinz): Remove custom padding after https://crbug.com/746712 is fixed. --> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/close_btn_modern" style="@style/ListItemEndIconSmall" android:paddingStart="23dp" android:paddingEnd="13dp" android:src="@drawable/btn_delete_24dp" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout> <LinearLayout
diff --git a/chrome/android/java/res/layout/bottom_toolbar.xml b/chrome/android/java/res/layout/bottom_toolbar.xml index c84fd09..f69fdcfa 100644 --- a/chrome/android/java/res/layout/bottom_toolbar.xml +++ b/chrome/android/java/res/layout/bottom_toolbar.xml
@@ -5,12 +5,11 @@ <org.chromium.chrome.browser.toolbar.ScrollingBottomViewResourceFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bottom_toolbar_control_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="@dimen/bottom_toolbar_height" > + android:minHeight="@dimen/bottom_toolbar_height"> <ImageView android:id="@+id/bottom_toolbar_top_shadow" @@ -40,7 +39,7 @@ android:layout_height="1dp" android:layout_weight="1" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/first_button" style="@style/ToolbarButton" android:layout_gravity="center" /> @@ -50,7 +49,7 @@ android:layout_height="1dp" android:layout_weight="1" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/second_button" style="@style/ToolbarButton" android:layout_gravity="center" />
diff --git a/chrome/android/java/res/layout/chip.xml b/chrome/android/java/res/layout/chip.xml index 2bcb5390..d158383 100644 --- a/chrome/android/java/res/layout/chip.xml +++ b/chrome/android/java/res/layout/chip.xml
@@ -13,14 +13,14 @@ android:orientation="horizontal" android:gravity="center_vertical" android:background="@drawable/chip_bg"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/icon" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginStart="8dp" android:gravity="center" android:scaleType="fitCenter" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <TextView android:id="@+id/text" android:layout_width="wrap_content"
diff --git a/chrome/android/java/res/layout/clear_storage.xml b/chrome/android/java/res/layout/clear_storage.xml index de067072..671db1d9 100644 --- a/chrome/android/java/res/layout/clear_storage.xml +++ b/chrome/android/java/res/layout/clear_storage.xml
@@ -3,11 +3,11 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.widget.TintedImageView +<android.support.v7.widget.AppCompatImageView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/webstorage_clear_data_dialog_title" android:src="@drawable/ic_delete_white_24dp" - app:chrometint="@color/blue_mode_tint"/> + app:tint="@color/blue_mode_tint"/>
diff --git a/chrome/android/java/res/layout/content_suggestions_card_modern_reversed.xml b/chrome/android/java/res/layout/content_suggestions_card_modern_reversed.xml index 7d81b4b..a330626 100644 --- a/chrome/android/java/res/layout/content_suggestions_card_modern_reversed.xml +++ b/chrome/android/java/res/layout/content_suggestions_card_modern_reversed.xml
@@ -100,7 +100,7 @@ </LinearLayout> </LinearLayout> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/article_thumbnail" android:layout_width="@dimen/snippets_thumbnail_size" android:layout_height="@dimen/snippets_thumbnail_size"
diff --git a/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml b/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml index e8baf25..a5f55d9 100644 --- a/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml +++ b/chrome/android/java/res/layout/contextual_suggestions_card_modern.xml
@@ -99,7 +99,6 @@ android:layout_marginStart="6dp" android:contentDescription="@string/accessibility_ntp_offline_badge" android:visibility="gone" - android:src="@drawable/offline_pin_round" - app:chrometint="@color/default_icon_color" /> + android:src="@drawable/offline_pin_round" /> </LinearLayout> </RelativeLayout>
diff --git a/chrome/android/java/res/layout/contextual_suggestions_card_modern_alternate.xml b/chrome/android/java/res/layout/contextual_suggestions_card_modern_alternate.xml index 3dbfc54..22d1da9 100644 --- a/chrome/android/java/res/layout/contextual_suggestions_card_modern_alternate.xml +++ b/chrome/android/java/res/layout/contextual_suggestions_card_modern_alternate.xml
@@ -67,8 +67,7 @@ android:layout_marginStart="6dp" android:contentDescription="@string/accessibility_ntp_offline_badge" android:visibility="gone" - android:src="@drawable/offline_pin_round" - app:chrometint="@color/default_icon_color" /> + android:src="@drawable/offline_pin_round" /> </LinearLayout> <LinearLayout
diff --git a/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml b/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml index 928d7c4..797e7def 100644 --- a/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml +++ b/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml
@@ -45,10 +45,10 @@ android:layout_height="match_parent" android:background="?attr/selectableItemBackground" android:src="@drawable/ic_more_vert_black_24dp" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" tools:ignore="ContentDescription" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/close_button" android:layout_height="match_parent" android:layout_width="@dimen/contextual_suggestions_toolbar_icon_size" @@ -56,7 +56,7 @@ android:src="@drawable/btn_close" android:scaleType="center" android:contentDescription="@string/contextual_suggestions_close_button_description" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout> <ImageView
diff --git a/chrome/android/java/res/layout/custom_tabs_toolbar.xml b/chrome/android/java/res/layout/custom_tabs_toolbar.xml index 981f544..efae5b1 100644 --- a/chrome/android/java/res/layout/custom_tabs_toolbar.xml +++ b/chrome/android/java/res/layout/custom_tabs_toolbar.xml
@@ -19,7 +19,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" > - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/security_button" style="@style/LocationBarButton" android:layout_width="@dimen/location_bar_icon_width" @@ -27,7 +27,7 @@ android:layout_gravity="center_vertical" android:scaleType="center" android:visibility="invisible" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <view class="org.chromium.chrome.browser.toolbar.CustomTabToolbar$InterceptTouchLayout" android:id="@+id/title_url_container" @@ -96,7 +96,7 @@ android:layout_gravity="center_vertical|end" android:gravity="center_vertical" android:orientation="horizontal" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/menu_button" style="@style/ToolbarButton" android:layout_gravity="center_vertical|end" @@ -105,5 +105,5 @@ android:src="@drawable/ic_more_vert_black_24dp" android:contentDescription="@string/accessibility_toolbar_btn_menu" android:background="@null" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </org.chromium.chrome.browser.toolbar.CustomTabToolbar>
diff --git a/chrome/android/java/res/layout/empty_background_view_tablet.xml b/chrome/android/java/res/layout/empty_background_view_tablet.xml index 212b92a..dd8806e6 100644 --- a/chrome/android/java/res/layout/empty_background_view_tablet.xml +++ b/chrome/android/java/res/layout/empty_background_view_tablet.xml
@@ -43,7 +43,7 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/accessibility_tabstrip_btn_incognito_toggle_standard" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/empty_menu_button" style="@style/ToolbarButton" android:layout_width="48dp" @@ -52,7 +52,7 @@ android:scaleType="center" android:contentDescription="@string/accessibility_toolbar_btn_menu" android:paddingStart="2dp" - app:chrometint="@color/light_mode_tint" + app:tint="@color/light_mode_tint" /> </LinearLayout> </org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewTablet>
diff --git a/chrome/android/java/res/layout/experimental_toolbar_button.xml b/chrome/android/java/res/layout/experimental_toolbar_button.xml index 1dbeb1f..8c7f19b 100644 --- a/chrome/android/java/res/layout/experimental_toolbar_button.xml +++ b/chrome/android/java/res/layout/experimental_toolbar_button.xml
@@ -3,11 +3,10 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.widget.TintedImageButton +<android.support.v7.widget.AppCompatImageButton xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" style="@style/ToolbarButton" android:layout_gravity="top" android:paddingStart="8dp" - tools:ignore="ContentDescription" /> \ No newline at end of file + tools:ignore="ContentDescription"/> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/find_in_page.xml b/chrome/android/java/res/layout/find_in_page.xml index acde96ff..caa4296 100644 --- a/chrome/android/java/res/layout/find_in_page.xml +++ b/chrome/android/java/res/layout/find_in_page.xml
@@ -41,25 +41,25 @@ android:layout_marginBottom="8dp" android:background="#000000" android:alpha="0.1" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/find_prev_button" style="@style/ToolbarButton" android:layout_height="match_parent" android:src="@drawable/ic_expand_less_black_24dp" android:contentDescription="@string/accessibility_find_toolbar_btn_prev" - app:chrometint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageButton + app:tint="@color/dark_mode_tint" /> + <android.support.v7.widget.AppCompatImageButton android:id="@+id/find_next_button" style="@style/ToolbarButton" android:layout_height="match_parent" android:src="@drawable/ic_expand_more_black_24dp" android:contentDescription="@string/accessibility_find_toolbar_btn_next" - app:chrometint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageButton + app:tint="@color/dark_mode_tint" /> + <android.support.v7.widget.AppCompatImageButton android:id="@+id/close_find_button" style="@style/ToolbarButton" android:layout_height="match_parent" android:src="@drawable/btn_close" android:contentDescription="@string/close" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/history_item_view.xml b/chrome/android/java/res/layout/history_item_view.xml index c2bd348..b4b1c99 100644 --- a/chrome/android/java/res/layout/history_item_view.xml +++ b/chrome/android/java/res/layout/history_item_view.xml
@@ -15,12 +15,12 @@ <include layout="@layout/modern_list_item_view" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/remove" style="@style/ListItemEndIconSmall" android:contentDescription="@string/remove" android:src="@drawable/btn_delete_24dp" - app:chrometint="@color/light_icon_color" /> + app:tint="@color/light_icon_color" /> </LinearLayout> </org.chromium.chrome.browser.history.HistoryItemView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/icon_row_menu_footer.xml b/chrome/android/java/res/layout/icon_row_menu_footer.xml index 02571a7..9b18e375 100644 --- a/chrome/android/java/res/layout/icon_row_menu_footer.xml +++ b/chrome/android/java/res/layout/icon_row_menu_footer.xml
@@ -18,31 +18,31 @@ android:orientation="horizontal" android:id="@+id/menu_items" > - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/forward_menu_id" style="@style/OverflowMenuButton" android:src="@drawable/btn_forward" android:contentDescription="@string/accessibility_menu_forward" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/bookmark_this_page_id" style="@style/OverflowMenuButton" android:src="@drawable/btn_star" android:contentDescription="@string/accessibility_menu_bookmark" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/offline_page_id" style="@style/OverflowMenuButton" android:src="@drawable/ic_file_download_white_24dp" android:contentDescription="@string/download_page" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/info_menu_id" style="@style/OverflowMenuButton" android:src="@drawable/btn_info" android:contentDescription="@string/accessibility_menu_info" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/reload_menu_id" style="@style/OverflowMenuButton" android:src="@drawable/btn_reload_stop"
diff --git a/chrome/android/java/res/layout/icon_row_menu_item.xml b/chrome/android/java/res/layout/icon_row_menu_item.xml index 43442e6..7da9b78 100644 --- a/chrome/android/java/res/layout/icon_row_menu_item.xml +++ b/chrome/android/java/res/layout/icon_row_menu_item.xml
@@ -6,29 +6,28 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeightSmall" android:layout_gravity="top|start" android:orientation="horizontal"> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button_one" style="@style/OverflowMenuButton" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button_two" style="@style/OverflowMenuButton" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button_three" style="@style/OverflowMenuButton" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button_four" style="@style/OverflowMenuButton" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button_five" style="@style/OverflowMenuButton" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/infobar_translate_compact_content.xml b/chrome/android/java/res/layout/infobar_translate_compact_content.xml index 30967f37..41f8e9bf 100644 --- a/chrome/android/java/res/layout/infobar_translate_compact_content.xml +++ b/chrome/android/java/res/layout/infobar_translate_compact_content.xml
@@ -23,7 +23,7 @@ app:tabGravity="fill" app:tabMode="scrollable" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/translate_infobar_menu_button" android:layout_width="wrap_content" android:layout_height="match_parent" @@ -33,5 +33,5 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/accessibility_toolbar_btn_menu" android:src="@drawable/ic_more_vert_black_24dp" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/list_menu_button.xml b/chrome/android/java/res/layout/list_menu_button.xml index 5672e8ca..8e6de6e 100644 --- a/chrome/android/java/res/layout/list_menu_button.xml +++ b/chrome/android/java/res/layout/list_menu_button.xml
@@ -16,5 +16,5 @@ android:paddingEnd="@dimen/selectable_list_layout_row_padding" android:background="@null" android:src="@drawable/ic_more_vert_black_24dp" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" tools:ignore="ContentDescription" />
diff --git a/chrome/android/java/res/layout/list_selection_handle_view.xml b/chrome/android/java/res/layout/list_selection_handle_view.xml index 3367d7e8..a3360a1 100644 --- a/chrome/android/java/res/layout/list_selection_handle_view.xml +++ b/chrome/android/java/res/layout/list_selection_handle_view.xml
@@ -9,18 +9,18 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/check" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="center" android:background="@drawable/list_item_icon_modern_bg" android:visibility="gone" - app:chrometint="@color/white_mode_tint" + app:tint="@color/white_mode_tint" app:layout_gravity="center" tools:ignore="ContentDescription" /> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/circle" android:layout_width="match_parent" android:layout_height="match_parent" @@ -28,7 +28,7 @@ android:background="@null" android:src="@drawable/download_circular_selector_transparent" android:visibility="gone" - app:chrometint="@null" + app:tint="@null" tools:ignore="ContentDescription"/> </merge>
diff --git a/chrome/android/java/res/layout/location_bar_base.xml b/chrome/android/java/res/layout/location_bar_base.xml index 7d9bc9f..4970595 100644 --- a/chrome/android/java/res/layout/location_bar_base.xml +++ b/chrome/android/java/res/layout/location_bar_base.xml
@@ -24,7 +24,7 @@ android:scaleType="center" android:contentDescription="@string/accessibility_toolbar_btn_site_info" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/security_button" style="@style/LocationBarButton" android:layout_width="match_parent" @@ -33,7 +33,7 @@ android:layout_gravity="center" android:alpha="0" android:visibility="invisible" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </FrameLayout>
diff --git a/chrome/android/java/res/layout/menu_button.xml b/chrome/android/java/res/layout/menu_button.xml index 442f408..f4808b1 100644 --- a/chrome/android/java/res/layout/menu_button.xml +++ b/chrome/android/java/res/layout/menu_button.xml
@@ -12,13 +12,13 @@ android:layout_height="wrap_content" android:id="@+id/menu_button_wrapper"> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/menu_button" style="@style/ToolbarMenuButtonPhone" android:src="@drawable/ic_more_vert_black_24dp" android:contentDescription="@string/accessibility_toolbar_btn_menu" android:layout_gravity="center" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <ImageView android:id="@+id/menu_badge"
diff --git a/chrome/android/java/res/layout/modern_list_item_view.xml b/chrome/android/java/res/layout/modern_list_item_view.xml index 3616a79..0180c25 100644 --- a/chrome/android/java/res/layout/modern_list_item_view.xml +++ b/chrome/android/java/res/layout/modern_list_item_view.xml
@@ -6,7 +6,7 @@ <merge xmlns:android="http://schemas.android.com/apk/res/android"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/icon_view" style="@style/ListItemStartIcon" />
diff --git a/chrome/android/java/res/layout/new_tab_page_layout.xml b/chrome/android/java/res/layout/new_tab_page_layout.xml index 7c0158c..722604e4 100644 --- a/chrome/android/java/res/layout/new_tab_page_layout.xml +++ b/chrome/android/java/res/layout/new_tab_page_layout.xml
@@ -54,13 +54,13 @@ android:gravity="center_vertical" android:inputType="text" android:singleLine="true" /> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/voice_search_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/accessibility_toolbar_btn_mic" android:src="@drawable/btn_mic" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </view> <ViewStub
diff --git a/chrome/android/java/res/layout/password_entry_editor_copyable_row.xml b/chrome/android/java/res/layout/password_entry_editor_copyable_row.xml index 73cea57..5f6180b 100644 --- a/chrome/android/java/res/layout/password_entry_editor_copyable_row.xml +++ b/chrome/android/java/res/layout/password_entry_editor_copyable_row.xml
@@ -17,7 +17,7 @@ android:layout_weight="1" android:textAppearance="@style/TextAppearance.PreferenceMediumText" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/password_entry_editor_copy" android:background="?attr/selectableItemBackground" android:layout_width="wrap_content" @@ -25,7 +25,7 @@ android:layout_gravity="end" android:layout_marginTop="15dp" android:layout_marginEnd="15dp" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" android:contentDescription="@string/password_entry_editor_copy_stored_username" style="?android:attr/buttonStyleSmall" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/password_entry_editor_interactive.xml b/chrome/android/java/res/layout/password_entry_editor_interactive.xml index 97f3535c..efa7efb 100644 --- a/chrome/android/java/res/layout/password_entry_editor_interactive.xml +++ b/chrome/android/java/res/layout/password_entry_editor_interactive.xml
@@ -59,7 +59,7 @@ android:layout_weight="1" android:textAppearance="@style/TextAppearance.PreferenceMediumText" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/password_entry_editor_view_password" android:background="?attr/selectableItemBackground" android:layout_width="wrap_content" @@ -68,11 +68,11 @@ android:layout_marginTop="15dp" android:layout_marginEnd="15dp" app:srcCompat="@drawable/ic_visibility_black" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" android:contentDescription="@string/password_entry_editor_view_stored_password" style="?android:attr/buttonStyleSmall" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/password_entry_editor_copy_password" android:background="?attr/selectableItemBackground" android:layout_width="wrap_content" @@ -80,7 +80,7 @@ android:layout_gravity="end" android:layout_marginTop="15dp" android:layout_marginEnd="15dp" - app:chrometint="@color/dark_mode_tint" + app:tint="@color/dark_mode_tint" android:contentDescription="@string/password_entry_editor_copy_stored_password" style="?android:attr/buttonStyleSmall" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/search_toolbar.xml b/chrome/android/java/res/layout/search_toolbar.xml index 92ab49a..c2088a4a 100644 --- a/chrome/android/java/res/layout/search_toolbar.xml +++ b/chrome/android/java/res/layout/search_toolbar.xml
@@ -24,7 +24,7 @@ android:textAppearance="@style/BlackTitle1" android:textColorHint="@color/search_box_hint"/> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/clear_text_button" android:layout_width="wrap_content" android:layout_height="match_parent" @@ -35,5 +35,5 @@ android:scaleType="center" android:contentDescription="@string/accessibility_toolbar_btn_delete_url" android:visibility="invisible" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/textbubble_text_with_image.xml b/chrome/android/java/res/layout/textbubble_text_with_image.xml index 2f12ec6..24332f9 100644 --- a/chrome/android/java/res/layout/textbubble_text_with_image.xml +++ b/chrome/android/java/res/layout/textbubble_text_with_image.xml
@@ -16,14 +16,14 @@ android:padding="16dp" android:gravity="center" > - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/image" android:layout_width="20sp" android:layout_height="20sp" android:layout_marginEnd="12dp" tools:ignore="ContentDescription" android:scaleType="centerInside" - app:chrometint="@color/white_mode_tint" /> + app:tint="@color/white_mode_tint" /> <TextView android:id="@+id/message"
diff --git a/chrome/android/java/res/layout/title_button_menu_item.xml b/chrome/android/java/res/layout/title_button_menu_item.xml index 423c0ba2..7f91b77 100644 --- a/chrome/android/java/res/layout/title_button_menu_item.xml +++ b/chrome/android/java/res/layout/title_button_menu_item.xml
@@ -11,9 +11,8 @@ * A text label with an icon --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="?android:attr/listPreferredItemHeightSmall"> + android:layout_width="match_parent" + android:layout_height="?android:attr/listPreferredItemHeightSmall"> <TextView android:id="@+id/title" android:layout_width="0dp" @@ -41,7 +40,7 @@ android:src="?android:attr/listChoiceIndicatorMultiple" /> <!-- Displays an icon. --> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/button" android:layout_width="56dp" android:layout_height="match_parent"
diff --git a/chrome/android/java/res/layout/toolbar_phone.xml b/chrome/android/java/res/layout/toolbar_phone.xml index 47f6ec5..1751858c 100644 --- a/chrome/android/java/res/layout/toolbar_phone.xml +++ b/chrome/android/java/res/layout/toolbar_phone.xml
@@ -30,7 +30,7 @@ android:src="@drawable/btn_toolbar_home" android:contentDescription="@string/accessibility_toolbar_btn_home" android:visibility="gone" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <org.chromium.chrome.browser.omnibox.LocationBarPhone android:id="@+id/location_bar"
diff --git a/chrome/android/java/res/layout/toolbar_tablet.xml b/chrome/android/java/res/layout/toolbar_tablet.xml index 42b2376..d9fbd76 100644 --- a/chrome/android/java/res/layout/toolbar_tablet.xml +++ b/chrome/android/java/res/layout/toolbar_tablet.xml
@@ -28,28 +28,28 @@ android:src="@drawable/btn_toolbar_home" android:contentDescription="@string/accessibility_toolbar_btn_home" android:visibility="gone" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/back_button" style="@style/ToolbarButton" android:src="@drawable/btn_back" android:contentDescription="@string/accessibility_toolbar_btn_back" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/forward_button" style="@style/ToolbarButton" android:src="@drawable/btn_forward" android:contentDescription="@string/accessibility_toolbar_btn_forward" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/refresh_button" style="@style/ToolbarButton" android:src="@drawable/btn_reload_stop" android:contentDescription="@string/accessibility_btn_refresh" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <org.chromium.chrome.browser.omnibox.LocationBarTablet android:id="@+id/location_bar" @@ -72,12 +72,12 @@ android:layout_height="wrap_content" android:id="@+id/menu_button_wrapper" > - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/menu_button" style="@style/ToolbarMenuButtonTablet" android:src="@drawable/ic_more_vert_black_24dp" android:contentDescription="@string/accessibility_toolbar_btn_menu" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <ImageView android:id="@+id/menu_badge"
diff --git a/chrome/android/java/res/layout/translate_menu_item_checked.xml b/chrome/android/java/res/layout/translate_menu_item_checked.xml index c5b1ea62..3115270 100644 --- a/chrome/android/java/res/layout/translate_menu_item_checked.xml +++ b/chrome/android/java/res/layout/translate_menu_item_checked.xml
@@ -26,14 +26,14 @@ android:paddingTop="13dp" android:paddingBottom="13dp" android:paddingEnd="16dp" /> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/menu_item_icon" android:src="@drawable/ic_check_googblue_24dp" android:layout_width="24dp" android:layout_height="match_parent" android:layout_gravity="end" android:gravity="center_vertical" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/update_menu_item.xml b/chrome/android/java/res/layout/update_menu_item.xml index f2f8a1b..98b05087 100644 --- a/chrome/android/java/res/layout/update_menu_item.xml +++ b/chrome/android/java/res/layout/update_menu_item.xml
@@ -41,6 +41,6 @@ android:layout_height="match_parent" android:layout_gravity="end" android:gravity="center_vertical" - app:chrometint="@null" /> + app:tint="@null" /> </LinearLayout> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/url_action_container.xml b/chrome/android/java/res/layout/url_action_container.xml index 53dbc0e4..5756cf2a 100644 --- a/chrome/android/java/res/layout/url_action_container.xml +++ b/chrome/android/java/res/layout/url_action_container.xml
@@ -4,8 +4,7 @@ found in the LICENSE file. --> <merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:id="@+id/url_action_container" android:layout_width="wrap_content" @@ -13,27 +12,27 @@ android:layout_gravity="end|center_vertical" android:orientation="horizontal" > - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/delete_button" style="@style/LocationBarActionButton" android:src="@drawable/btn_delete_24dp" android:visibility="invisible" android:contentDescription="@string/accessibility_toolbar_btn_delete_url" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/mic_button" style="@style/LocationBarActionButton" android:src="@drawable/btn_mic" android:visibility="invisible" android:contentDescription="@string/accessibility_toolbar_btn_mic" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/bookmark_button" style="@style/LocationBarActionButton" android:visibility="gone" android:contentDescription="@string/accessibility_menu_bookmark" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/save_offline_button" style="@style/LocationBarActionButton" android:nextFocusForward="@+id/menu_button"
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index 3d946cde..54ebed0a 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -298,7 +298,7 @@ <item name="android:layout_weight">1</item> <item name="android:background">?attr/listChoiceBackgroundIndicator</item> <item name="android:scaleType">center</item> - <item name="chrometint">@color/dark_mode_tint</item> + <item name="tint">@color/dark_mode_tint</item> </style> <style name="OverflowMenuAnim"> <item name="android:windowEnterAnimation">@anim/menu_enter</item> @@ -560,7 +560,7 @@ <item name="android:paddingStart">4dp</item> <item name="android:scaleType">center</item> <item name="android:layout_gravity">end</item> - <item name="chrometint">@color/dark_mode_tint</item> + <item name="tint">@color/dark_mode_tint</item> </style> <style name="ModernToolbar" parent="Widget.AppCompat.Toolbar"> <item name="titleTextAppearance">@style/BlackHeadline1</item>
diff --git a/chrome/android/java/res/values/attrs.xml b/chrome/android/java/res/values/attrs.xml index fc71116..e0f3c30 100644 --- a/chrome/android/java/res/values/attrs.xml +++ b/chrome/android/java/res/values/attrs.xml
@@ -4,10 +4,6 @@ found in the LICENSE file. --> <resources> - <declare-styleable name="TintedImage"> - <attr name="chrometint" format="color" /> - </declare-styleable> - <declare-styleable name="HyperlinkPreference"> <!-- The URL to load when the preference is clicked --> <attr name="url" format="string" />
diff --git a/chrome/android/java/res/xml/data_reduction_preferences_off.xml b/chrome/android/java/res/xml/data_reduction_preferences_off.xml index b8106717..3cd5b09f 100644 --- a/chrome/android/java/res/xml/data_reduction_preferences_off.xml +++ b/chrome/android/java/res/xml/data_reduction_preferences_off.xml
@@ -7,6 +7,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" > <org.chromium.chrome.browser.preferences.TextMessagePreference + android:title="@string/data_reduction_benefits_description" /> + <org.chromium.chrome.browser.preferences.TextMessagePreference android:title="@string/data_reduction_description" /> <org.chromium.chrome.browser.preferences.TextMessagePreference android:title="@string/safe_browsing_description" />
diff --git a/chrome/android/java/res_download/layout/download_item_view.xml b/chrome/android/java/res_download/layout/download_item_view.xml index e396f2c..e36dd3f 100644 --- a/chrome/android/java/res_download/layout/download_item_view.xml +++ b/chrome/android/java/res_download/layout/download_item_view.xml
@@ -15,10 +15,10 @@ android:id="@+id/layout_container" style="@style/ListItemContainer" > - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/icon_view" style="@style/DownloadIconView" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <!-- Shown for completed downloads. --> <RelativeLayout @@ -91,7 +91,7 @@ android:layout_below="@+id/download_progress_view" android:textAlignment="viewEnd" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/pause_button" android:layout_width="48dp" android:layout_height="48dp" @@ -102,9 +102,9 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/download_notification_pause_button" android:src="@drawable/ic_pause_white_24dp" - app:chrometint="@color/default_icon_color" /> + app:tint="@color/default_icon_color" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/cancel_button" android:layout_width="48dp" android:layout_height="48dp" @@ -116,7 +116,7 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/download_notification_cancel_button" android:src="@drawable/btn_close" - app:chrometint="@color/default_icon_color" /> + app:tint="@color/default_icon_color" /> </RelativeLayout> </LinearLayout> </view>
diff --git a/chrome/android/java/res_download/layout/download_location_dialog.xml b/chrome/android/java/res_download/layout/download_location_dialog.xml index cb75a04..4061a078 100644 --- a/chrome/android/java/res_download/layout/download_location_dialog.xml +++ b/chrome/android/java/res_download/layout/download_location_dialog.xml
@@ -28,11 +28,11 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_drive_file_24dp" - app:chrometint="@color/default_icon_color" + app:tint="@color/default_icon_color" style="@style/ListItemStartIcon" /> <org.chromium.chrome.browser.widget.AlertDialogEditText @@ -49,11 +49,11 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_folder_blue_24dp" - app:chrometint="@color/default_icon_color" + app:tint="@color/default_icon_color" style="@style/ListItemStartIcon" /> <Spinner
diff --git a/chrome/android/java/res_download/layout/download_manager_generic_item.xml b/chrome/android/java/res_download/layout/download_manager_generic_item.xml index ceaa410..581a439 100644 --- a/chrome/android/java/res_download/layout/download_manager_generic_item.xml +++ b/chrome/android/java/res_download/layout/download_manager_generic_item.xml
@@ -16,7 +16,7 @@ app:columnCount="3" app:rowCount="2"> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/thumbnail" android:layout_width="@dimen/download_manager_generic_thumbnail_size" android:layout_height="@dimen/download_manager_generic_thumbnail_size" @@ -27,7 +27,7 @@ app:layout_row="0" app:layout_rowSpan="2" app:layout_gravity="center_vertical" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <org.chromium.chrome.browser.download.home.view.SelectionView android:id="@+id/selection"
diff --git a/chrome/android/java/res_download/layout/download_manager_in_progress_item.xml b/chrome/android/java/res_download/layout/download_manager_in_progress_item.xml index b5304d6..4762920e 100644 --- a/chrome/android/java/res_download/layout/download_manager_in_progress_item.xml +++ b/chrome/android/java/res_download/layout/download_manager_in_progress_item.xml
@@ -43,7 +43,7 @@ app:layout_row="1" app:layout_gravity="fill_horizontal" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/cancel_button" android:layout_width="48dp" android:layout_height="48dp" @@ -54,6 +54,6 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/download_notification_cancel_button" android:src="@drawable/btn_close" - app:chrometint="@color/default_icon_color" /> + app:tint="@color/default_icon_color" /> </android.support.v7.widget.GridLayout> \ No newline at end of file
diff --git a/chrome/android/java/res_download/layout/download_manager_in_progress_video_item.xml b/chrome/android/java/res_download/layout/download_manager_in_progress_video_item.xml index 8557e4a..116f9e8 100644 --- a/chrome/android/java/res_download/layout/download_manager_in_progress_video_item.xml +++ b/chrome/android/java/res_download/layout/download_manager_in_progress_video_item.xml
@@ -60,7 +60,7 @@ android:layout_marginStart="16dp" app:layout_gravity="fill_horizontal" /> - <org.chromium.chrome.browser.widget.TintedImageButton + <android.support.v7.widget.AppCompatImageButton android:id="@+id/cancel_button" android:layout_width="48dp" android:layout_height="48dp" @@ -71,6 +71,6 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/download_notification_cancel_button" android:src="@drawable/btn_close" - app:chrometint="@color/default_icon_color" /> + app:tint="@color/default_icon_color" /> </android.support.v7.widget.GridLayout>
diff --git a/chrome/android/java/res_download/layout/offline_download_header.xml b/chrome/android/java/res_download/layout/offline_download_header.xml index 74d9b36..60cfc07d 100644 --- a/chrome/android/java/res_download/layout/offline_download_header.xml +++ b/chrome/android/java/res_download/layout/offline_download_header.xml
@@ -16,11 +16,11 @@ android:id="@+id/layout_container" style="@style/ListItemContainer" > - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/icon_view" style="@style/DownloadIconView" android:src="@drawable/ic_chrome" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> <RelativeLayout android:id="@+id/completed_layout" @@ -47,7 +47,7 @@ android:layout_weight="0" android:visibility="gone" /> - <org.chromium.chrome.browser.widget.TintedImageView + <android.support.v7.widget.AppCompatImageView android:id="@+id/expand_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -56,7 +56,7 @@ android:paddingEnd="16dp" tools:ignore="ContentDescription" android:src="@drawable/ic_expand_more_black_24dp" - app:chrometint="@color/dark_mode_tint" /> + app:tint="@color/dark_mode_tint" /> </LinearLayout> <TextView
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java index 6732fdd4..e6d2716 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -10,7 +10,9 @@ import android.animation.ObjectAnimator; import android.graphics.drawable.Drawable; import android.support.annotation.IntDef; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MenuItem; @@ -23,7 +25,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.ViewHighlighter; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.interpolators.BakedBezierInterpolator; @@ -227,7 +228,7 @@ holder = new TitleButtonMenuItemViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.checkbox = (AppMenuItemIcon) convertView.findViewById(R.id.checkbox); - holder.button = (TintedImageButton) convertView.findViewById(R.id.button); + holder.button = (AppCompatImageButton) convertView.findViewById(R.id.button); holder.button.setTag( R.id.menu_item_original_background, holder.button.getBackground()); @@ -288,13 +289,13 @@ // The checkbox must be tinted to make Android consistently style it across OS versions. // http://crbug.com/571445 - button.setTint( + ImageViewCompat.setImageTintList(button, AppCompatResources.getColorStateList(button.getContext(), R.color.checkbox_tint)); setupMenuButton(button, item); } - private void setupImageButton(TintedImageButton button, final MenuItem item) { + private void setupImageButton(AppCompatImageButton button, final MenuItem item) { // Store and recover the level of image as button.setimageDrawable // resets drawable to default level. int currentLevel = item.getIcon().getLevel(); @@ -302,8 +303,9 @@ item.getIcon().setLevel(currentLevel); if (item.isChecked()) { - button.setTint(AppCompatResources.getColorStateList( - button.getContext(), R.color.blue_mode_tint)); + ImageViewCompat.setImageTintList(button, + AppCompatResources.getColorStateList( + button.getContext(), R.color.blue_mode_tint)); } setupMenuButton(button, item); @@ -438,8 +440,8 @@ // Save references to all the buttons. for (int i = 0; i < numItems; i++) { - TintedImageButton view = - (TintedImageButton) convertView.findViewById(BUTTON_IDS[i]); + AppCompatImageButton view = + (AppCompatImageButton) convertView.findViewById(BUTTON_IDS[i]); holder.buttons[i] = view; holder.buttons[i].setTag( R.id.menu_item_original_background, holder.buttons[i].getBackground()); @@ -475,16 +477,16 @@ } private static class RowItemViewHolder { - public TintedImageButton[] buttons; + public AppCompatImageButton[] buttons; RowItemViewHolder(int numButtons) { - buttons = new TintedImageButton[numButtons]; + buttons = new AppCompatImageButton[numButtons]; } } static class TitleButtonMenuItemViewHolder { public TextView title; public AppMenuItemIcon checkbox; - public TintedImageButton button; + public AppCompatImageButton button; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java index 72be6c58..3a681f5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java
@@ -5,7 +5,9 @@ package org.chromium.chrome.browser.appmenu; import android.content.Context; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; @@ -15,7 +17,6 @@ import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.widget.TintedImageButton; /** * A {@link LinearLayout} that displays a horizontal row of icons for page actions. @@ -24,11 +25,11 @@ private ChromeActivity mActivity; private AppMenu mAppMenu; - private TintedImageButton mForwardButton; - private TintedImageButton mBookmarkButton; - private TintedImageButton mDownloadButton; - private TintedImageButton mPageInfoButton; - private TintedImageButton mReloadButton; + private AppCompatImageButton mForwardButton; + private AppCompatImageButton mBookmarkButton; + private AppCompatImageButton mDownloadButton; + private AppCompatImageButton mPageInfoButton; + private AppCompatImageButton mReloadButton; public AppMenuIconRowFooter(Context context, AttributeSet attrs) { super(context, attrs); @@ -38,19 +39,19 @@ protected void onFinishInflate() { super.onFinishInflate(); - mForwardButton = (TintedImageButton) findViewById(R.id.forward_menu_id); + mForwardButton = (AppCompatImageButton) findViewById(R.id.forward_menu_id); mForwardButton.setOnClickListener(this); - mBookmarkButton = (TintedImageButton) findViewById(R.id.bookmark_this_page_id); + mBookmarkButton = (AppCompatImageButton) findViewById(R.id.bookmark_this_page_id); mBookmarkButton.setOnClickListener(this); - mDownloadButton = (TintedImageButton) findViewById(R.id.offline_page_id); + mDownloadButton = (AppCompatImageButton) findViewById(R.id.offline_page_id); mDownloadButton.setOnClickListener(this); - mPageInfoButton = (TintedImageButton) findViewById(R.id.info_menu_id); + mPageInfoButton = (AppCompatImageButton) findViewById(R.id.info_menu_id); mPageInfoButton.setOnClickListener(this); - mReloadButton = (TintedImageButton) findViewById(R.id.reload_menu_id); + mReloadButton = (AppCompatImageButton) findViewById(R.id.reload_menu_id); mReloadButton.setOnClickListener(this); } @@ -102,7 +103,7 @@ if (currentTab.getBookmarkId() != Tab.INVALID_BOOKMARK_ID) { mBookmarkButton.setImageResource(R.drawable.btn_star_filled); mBookmarkButton.setContentDescription(mActivity.getString(R.string.edit_bookmark)); - mBookmarkButton.setTint( + ImageViewCompat.setImageTintList(mBookmarkButton, AppCompatResources.getColorStateList(getContext(), R.color.blue_mode_tint)); } else { mBookmarkButton.setImageResource(R.drawable.btn_star);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuItemIcon.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuItemIcon.java index 47b3980..87113f8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuItemIcon.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuItemIcon.java
@@ -5,15 +5,14 @@ package org.chromium.chrome.browser.appmenu; import android.content.Context; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.widget.Checkable; -import org.chromium.chrome.browser.widget.TintedImageView; - /** - * A TintedImageView that supports the checkable state. + * An AppCompatImageView that supports the checkable state. */ -public class AppMenuItemIcon extends TintedImageView implements Checkable { +public class AppMenuItemIcon extends AppCompatImageView implements Checkable { private static final int[] CHECKED_STATE_SET = new int[] {android.R.attr.state_checked}; private boolean mCheckedState;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java index 5337520..aeaff82358 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
@@ -36,6 +36,9 @@ /** Variation url parameter name. */ private static final String URL_PARAMETER_NAME = "url"; + /** Special parameter that enables the feature. */ + private static final String PARAMETER_ENABLED = "ENABLED"; + private final long mUiControllerAndroid; private final AutofillAssistantUiDelegate mUiDelegate; @@ -44,9 +47,10 @@ * * @return True if a controller can be constructed. */ - public static boolean isConfigured() { - return !VariationsAssociatedData.getVariationParamValue(STUDY_NAME, URL_PARAMETER_NAME) - .isEmpty(); + public static boolean isConfigured(Bundle intentExtras) { + return getBooleanParameter(intentExtras, PARAMETER_ENABLED) + && !VariationsAssociatedData.getVariationParamValue(STUDY_NAME, URL_PARAMETER_NAME) + .isEmpty(); } /** @@ -59,10 +63,9 @@ // nativeInit already. mUiDelegate = new AutofillAssistantUiDelegate(activity, this); - // TODO(crbug.com/806868): Treat parameter - // org.chromium.chrome.browser.autofill_assistant.ENABLED specially, and disable autofill - // assistant if it is false or unset. Map<String, String> parameters = extractParameters(activity.getInitialIntent().getExtras()); + parameters.remove(PARAMETER_ENABLED); + Tab activityTab = activity.getActivityTab(); mUiControllerAndroid = nativeInit(activityTab.getWebContents(), parameters.keySet().toArray(new String[parameters.size()]), @@ -105,6 +108,11 @@ nativeOnScriptSelected(mUiControllerAndroid, scriptPath); } + /** Return the value if the given boolean parameter from the extras. */ + private static boolean getBooleanParameter(Bundle extras, String parameterName) { + return extras.getBoolean(INTENT_EXTRA_PREFIX + parameterName, false); + } + /** Returns a map containing the extras starting with {@link #INTENT_EXTRA_PREFIX}. */ private static Map<String, String> extractParameters(Bundle extras) { Map<String, String> result = new HashMap<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java index 116dbf49..289f6f3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java
@@ -11,6 +11,7 @@ import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.view.ViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; @@ -26,7 +27,6 @@ import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver; import org.chromium.chrome.browser.util.IntentUtils; -import org.chromium.chrome.browser.widget.TintedImageView; import org.chromium.chrome.browser.widget.selection.SelectableItemView; import org.chromium.components.bookmarks.BookmarkId; @@ -359,7 +359,7 @@ * i.e. New Folder, Normal and Selected. */ private void setUpIcons(FolderListEntry entry, View view) { - TintedImageView startIcon = view.findViewById(R.id.icon_view); + AppCompatImageView startIcon = view.findViewById(R.id.icon_view); Drawable iconDrawable; if (entry.mType == FolderListEntry.TYPE_NORMAL) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactsFetcherWorkerTask.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactsFetcherWorkerTask.java new file mode 100644 index 0000000..e232aa6 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactsFetcherWorkerTask.java
@@ -0,0 +1,156 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.contacts_picker; + +import android.content.ContentResolver; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.task.AsyncTask; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * A worker task to retrieve images for contacts. + */ +class ContactsFetcherWorkerTask extends AsyncTask<ArrayList<ContactDetails>> { + private static final String[] PROJECTION = { + ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, + ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, + }; + + /** + * An interface to use to communicate back the results to the client. + */ + public interface ContactsRetrievedCallback { + /** + * A callback to define to receive the contact details. + * @param contacts The contacts retrieved. + */ + void contactsRetrieved(ArrayList<ContactDetails> contacts); + } + + // The content resolver to use for looking up contacts. + private ContentResolver mContentResolver; + + // The callback to use to communicate the results. + private ContactsRetrievedCallback mCallback; + + /** + * A ContactsFetcherWorkerTask constructor. + * @param callback The callback to use to communicate back the results. + */ + public ContactsFetcherWorkerTask( + ContentResolver contentResolver, ContactsRetrievedCallback callback) { + mContentResolver = contentResolver; + mCallback = callback; + } + + /** + * Fetches the details for all contacts (in a background thread). + * @return The icon representing a contact. + */ + @Override + protected ArrayList<ContactDetails> doInBackground() { + assert !ThreadUtils.runningOnUiThread(); + + if (isCancelled()) return null; + + return getAllContacts(); + } + + /** + * Fetches specific details for contacts. + * @param source The source URI to use for the lookup. + * @param idColumn The name of the id column. + * @param idColumn The name of the data column. + * @param sortOrder The sort order. Data must be sorted by CONTACT_ID but can be additionally + * sorted also. + * @return A map of ids to contact details (as ArrayList). + */ + private Map<String, ArrayList<String>> getDetails( + Uri source, String idColumn, String dataColumn, String sortOrder) { + Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); + + Cursor cursor = mContentResolver.query(source, null, null, null, sortOrder); + ArrayList<String> list = new ArrayList<String>(); + String key = ""; + String value; + while (cursor.moveToNext()) { + String id = cursor.getString(cursor.getColumnIndex(idColumn)); + value = cursor.getString(cursor.getColumnIndex(dataColumn)); + if (key.isEmpty()) { + key = id; + list.add(value); + } else { + if (key.equals(id)) { + list.add(value); + } else { + map.put(key, list); + list = new ArrayList<String>(); + list.add(value); + key = id; + } + } + } + map.put(key, list); + cursor.close(); + + return map; + } + + /** + * Fetches all known contacts. + * @return The contact list as an array. + */ + public ArrayList<ContactDetails> getAllContacts() { + Map<String, ArrayList<String>> emailMap = + getDetails(ContactsContract.CommonDataKinds.Email.CONTENT_URI, + ContactsContract.CommonDataKinds.Email.CONTACT_ID, + ContactsContract.CommonDataKinds.Email.DATA, + ContactsContract.CommonDataKinds.Email.CONTACT_ID + " ASC, " + + ContactsContract.CommonDataKinds.Email.DATA + " ASC"); + + Map<String, ArrayList<String>> phoneMap = + getDetails(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + ContactsContract.CommonDataKinds.Phone.CONTACT_ID, + ContactsContract.CommonDataKinds.Email.DATA, + ContactsContract.CommonDataKinds.Email.CONTACT_ID + " ASC, " + + ContactsContract.CommonDataKinds.Phone.NUMBER + " ASC"); + + // A cursor containing the raw contacts data. + Cursor cursor = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, + null, null, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " ASC"); + + ArrayList<ContactDetails> contacts = new ArrayList<ContactDetails>(cursor.getCount()); + if (!cursor.moveToFirst()) return contacts; + do { + String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); + String name = cursor.getString( + cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)); + contacts.add(new ContactDetails(id, name, emailMap.get(id), phoneMap.get(id))); + } while (cursor.moveToNext()); + + cursor.close(); + return contacts; + } + + /** + * Communicates the results back to the client. Called on the UI thread. + * @param contacts The contacts retrieved. + */ + @Override + protected void onPostExecute(ArrayList<ContactDetails> contacts) { + assert ThreadUtils.runningOnUiThread(); + + if (isCancelled()) return; + + mCallback.contactsRetrieved(contacts); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java index 6875e5e3..c6629368 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java
@@ -5,25 +5,22 @@ package org.chromium.chrome.browser.contacts_picker; import android.content.ContentResolver; -import android.database.Cursor; import android.graphics.Bitmap; -import android.net.Uri; -import android.provider.ContactsContract; import android.support.v7.widget.RecyclerView.Adapter; import android.view.LayoutInflater; import android.view.ViewGroup; +import org.chromium.base.task.AsyncTask; import org.chromium.chrome.R; import java.util.ArrayList; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; /** * A data adapter for the Contacts Picker. */ -public class PickerAdapter extends Adapter<ContactViewHolder> { +public class PickerAdapter extends Adapter<ContactViewHolder> + implements ContactsFetcherWorkerTask.ContactsRetrievedCallback { // The category view to use to show the contacts. private PickerCategoryView mCategoryView; @@ -33,14 +30,12 @@ // The full list of all registered contacts on the device. private ArrayList<ContactDetails> mContactDetails; + // The async worker task to use for fetching the contact details. + private ContactsFetcherWorkerTask mWorkerTask; + // A list of search result indices into the larger data set. private ArrayList<Integer> mSearchResults; - private static final String[] PROJECTION = { - ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, - ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, - }; - /** * The PickerAdapter constructor. * @param categoryView The category view to use to show the contacts. @@ -49,7 +44,9 @@ public PickerAdapter(PickerCategoryView categoryView, ContentResolver contentResolver) { mCategoryView = categoryView; mContentResolver = contentResolver; - mContactDetails = getAllContacts(); + + mWorkerTask = new ContactsFetcherWorkerTask(mContentResolver, this); + mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } /** @@ -82,37 +79,15 @@ * @return The contact list as an array. */ public ArrayList<ContactDetails> getAllContacts() { - if (mContactDetails != null) return mContactDetails; + return mContactDetails; + } - Map<String, ArrayList<String>> emailMap = - getDetails(ContactsContract.CommonDataKinds.Email.CONTENT_URI, - ContactsContract.CommonDataKinds.Email.CONTACT_ID, - ContactsContract.CommonDataKinds.Email.DATA, - ContactsContract.CommonDataKinds.Email.CONTACT_ID + " ASC, " - + ContactsContract.CommonDataKinds.Email.DATA + " ASC"); + // ContactFetcherWorkerTask.ContactsRetrievedCallback: - Map<String, ArrayList<String>> phoneMap = - getDetails(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, - ContactsContract.CommonDataKinds.Phone.CONTACT_ID, - ContactsContract.CommonDataKinds.Email.DATA, - ContactsContract.CommonDataKinds.Email.CONTACT_ID + " ASC, " - + ContactsContract.CommonDataKinds.Phone.NUMBER + " ASC"); - - // A cursor containing the raw contacts data. - Cursor cursor = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, - null, null, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " ASC"); - - ArrayList<ContactDetails> contacts = new ArrayList<ContactDetails>(cursor.getCount()); - if (!cursor.moveToFirst()) return contacts; - do { - String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); - String name = cursor.getString( - cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)); - contacts.add(new ContactDetails(id, name, emailMap.get(id), phoneMap.get(id))); - } while (cursor.moveToNext()); - - cursor.close(); - return contacts; + @Override + public void contactsRetrieved(ArrayList<ContactDetails> contacts) { + mContactDetails = contacts; + notifyDataSetChanged(); } // RecyclerView.Adapter: @@ -138,46 +113,6 @@ holder.setContactDetails(contact); } - /** - * Fetches details for a contact. - * @param source The source URI to use for the lookup. - * @param idColumn The name of the id column. - * @param idColumn The name of the data column. - * @param sortOrder The sort order. Data must be sorted by CONTACT_ID but can be additionally - * sorted also. - * @return A map of ids to contact details (as ArrayList). - */ - private Map<String, ArrayList<String>> getDetails( - Uri source, String idColumn, String dataColumn, String sortOrder) { - Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); - - Cursor cursor = mContentResolver.query(source, null, null, null, sortOrder); - ArrayList<String> list = new ArrayList<String>(); - String key = ""; - String value; - while (cursor.moveToNext()) { - String id = cursor.getString(cursor.getColumnIndex(idColumn)); - value = cursor.getString(cursor.getColumnIndex(dataColumn)); - if (key.isEmpty()) { - key = id; - list.add(value); - } else { - if (key.equals(id)) { - list.add(value); - } else { - map.put(key, list); - list = new ArrayList<String>(); - list.add(value); - key = id; - } - } - } - map.put(key, list); - cursor.close(); - - return map; - } - private Bitmap getPhoto() { return null; } @@ -185,7 +120,7 @@ @Override public int getItemCount() { if (mSearchResults != null) return mSearchResults.size(); - + if (mContactDetails == null) return 0; return mContactDetails.size(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 149d1adf..1057dfbe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -680,11 +680,9 @@ getActivityTab().getWebContents()); } - // TODO(crbug.com/806868): Only enable Autofill Assistant when the flag is enabled in the - // intent. if (mAutofillAssistantUiController == null && ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT) - && AutofillAssistantUiController.isConfigured()) { + && AutofillAssistantUiController.isConfigured(getInitialIntent().getExtras())) { mAutofillAssistantUiController = new AutofillAssistantUiController(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java index 66d3dd04..029bcd6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java
@@ -5,31 +5,31 @@ import android.content.res.ColorStateList; import android.support.v4.view.ViewCompat; +import android.support.v4.widget.ImageViewCompat; +import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import org.chromium.chrome.browser.widget.TintedImageView; - /** The {@link ViewHolder} responsible for reflecting a {@link Chip} to a {@link View}. */ public class ChipsViewHolder extends ViewHolder { private final int mTextStartPaddingWithIconPx; private final int mTextStartPaddingWithNoIconPx; private final TextView mText; - private final TintedImageView mImage; + private final AppCompatImageView mImage; /** Builds a ChipsViewHolder around a specific {@link View}. */ private ChipsViewHolder(View itemView) { super(itemView); mText = itemView.findViewById(org.chromium.chrome.R.id.text); - mImage = (TintedImageView) itemView.findViewById(org.chromium.chrome.R.id.icon); + mImage = (AppCompatImageView) itemView.findViewById(org.chromium.chrome.R.id.icon); ColorStateList textColors = mText.getTextColors(); - if (textColors != null) mImage.setTint(textColors); + if (textColors != null) ImageViewCompat.setImageTintList(mImage, textColors); mTextStartPaddingWithIconPx = mText.getResources().getDimensionPixelSize( org.chromium.chrome.R.dimen.chip_icon_padding);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java index 25ee4a60..4c752178 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java
@@ -9,7 +9,9 @@ import android.support.annotation.DrawableRes; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,7 +22,6 @@ import org.chromium.chrome.browser.download.home.list.UiUtils; import org.chromium.chrome.browser.download.home.view.SelectionView; import org.chromium.chrome.browser.modelutil.PropertyModel; -import org.chromium.chrome.browser.widget.TintedImageView; import org.chromium.chrome.download.R; import org.chromium.components.offline_items_collection.OfflineItemVisuals; @@ -31,7 +32,7 @@ private final TextView mTitle; private final TextView mCaption; - private final TintedImageView mThumbnailView; + private final AppCompatImageView mThumbnailView; private Bitmap mThumbnailBitmap; @@ -52,7 +53,7 @@ mTitle = (TextView) itemView.findViewById(R.id.title); mCaption = (TextView) itemView.findViewById(R.id.caption); - mThumbnailView = (TintedImageView) itemView.findViewById(R.id.thumbnail); + mThumbnailView = (AppCompatImageView) itemView.findViewById(R.id.thumbnail); } // ListItemViewHolder implementation. @@ -83,7 +84,7 @@ assert !mThumbnailBitmap.isRecycled(); mThumbnailView.setBackground(null); - mThumbnailView.setTint(null); + ImageViewCompat.setImageTintList(mThumbnailView, null); RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(resources, mThumbnailBitmap); @@ -94,8 +95,9 @@ mThumbnailView.getBackground().setLevel( resources.getInteger(R.integer.list_item_level_default)); mThumbnailView.setImageResource(mIconId); - mThumbnailView.setTint(AppCompatResources.getColorStateList( - mThumbnailView.getContext(), R.color.dark_mode_tint)); + ImageViewCompat.setImageTintList(mThumbnailView, + AppCompatResources.getColorStateList( + mThumbnailView.getContext(), R.color.dark_mode_tint)); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressVideoViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressVideoViewHolder.java index 5a12ed80..6d214b0c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressVideoViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressVideoViewHolder.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.download.home.list.holder; +import android.support.v7.widget.AppCompatImageButton; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,7 +16,6 @@ import org.chromium.chrome.browser.download.home.list.UiUtils; import org.chromium.chrome.browser.download.home.list.view.CircularProgressView; import org.chromium.chrome.browser.modelutil.PropertyModel; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.download.R; import org.chromium.components.offline_items_collection.OfflineItem; import org.chromium.components.offline_items_collection.OfflineItemState; @@ -28,7 +28,7 @@ private final TextView mTitle; private final TextView mCaption; private final CircularProgressView mActionButton; - private final TintedImageButton mCancelButton; + private final AppCompatImageButton mCancelButton; /** * Creates a new {@link InProgressViewHolder} instance.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java index 186e8df..ee2f125 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.download.home.list.holder; +import android.support.v7.widget.AppCompatImageButton; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,7 +16,6 @@ import org.chromium.chrome.browser.download.home.list.UiUtils; import org.chromium.chrome.browser.download.home.list.view.CircularProgressView; import org.chromium.chrome.browser.modelutil.PropertyModel; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.download.R; import org.chromium.components.offline_items_collection.OfflineItem; import org.chromium.components.offline_items_collection.OfflineItemState; @@ -28,7 +28,7 @@ private final TextView mTitle; private final TextView mCaption; private final CircularProgressView mActionButton; - private final TintedImageButton mCancelButton; + private final AppCompatImageButton mCancelButton; /** * Creates a new {@link InProgressViewHolder} instance.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java index de4bfff..75cc8fd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java
@@ -6,12 +6,12 @@ import android.content.Context; import android.support.graphics.drawable.AnimatedVectorDrawableCompat; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.FrameLayout; import org.chromium.chrome.R; -import org.chromium.chrome.browser.widget.TintedImageView; /** * A helper UI widget that provides visual feedback when the selection state of the underlying view @@ -19,8 +19,8 @@ * selected. The caller can define the UI behavior at each of these states by subclassing this view. */ public class SelectionView extends FrameLayout { - private final TintedImageView mCheck; - private final TintedImageView mCircle; + private final AppCompatImageView mCheck; + private final AppCompatImageView mCircle; private final AnimatedVectorDrawableCompat mCheckDrawable; private boolean mIsSelected; @@ -31,8 +31,8 @@ public SelectionView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.list_selection_handle_view, this, true); - mCheck = (TintedImageView) findViewById(R.id.check); - mCircle = (TintedImageView) findViewById(R.id.circle); + mCheck = (AppCompatImageView) findViewById(R.id.check); + mCircle = (AppCompatImageView) findViewById(R.id.circle); mCheckDrawable = AnimatedVectorDrawableCompat.create( context, R.drawable.ic_check_googblue_24dp_animated); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java index 202bd0a..894ac5c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java
@@ -11,7 +11,9 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.MarginLayoutParamsCompat; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.text.TextUtils; import android.text.format.Formatter; import android.util.AttributeSet; @@ -30,7 +32,6 @@ import org.chromium.chrome.browser.widget.ListMenuButton.Item; import org.chromium.chrome.browser.widget.MaterialProgressBar; import org.chromium.chrome.browser.widget.ThumbnailProvider; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.selection.SelectableItemView; import org.chromium.chrome.download.R; import org.chromium.components.offline_items_collection.OfflineItem; @@ -100,7 +101,7 @@ private TextView mDownloadStatusView; private TextView mDownloadPercentageView; private MaterialProgressBar mProgressView; - private TintedImageButton mPauseResumeButton; + private AppCompatImageButton mPauseResumeButton; private View mCancelButton; /** @@ -154,7 +155,7 @@ mDownloadStatusView = (TextView) findViewById(R.id.status_view); mDownloadPercentageView = (TextView) findViewById(R.id.percentage_view); - mPauseResumeButton = (TintedImageButton) findViewById(R.id.pause_button); + mPauseResumeButton = (AppCompatImageButton) findViewById(R.id.pause_button); mCancelButton = findViewById(R.id.cancel_button); mMoreButton.setDelegate(this); @@ -348,7 +349,7 @@ mIconView.getBackground().setLevel( getResources().getInteger(R.integer.list_item_level_selected)); mIconView.setImageDrawable(mCheckDrawable); - mIconView.setTint(mCheckedIconForegroundColorList); + ImageViewCompat.setImageTintList(mIconView, mCheckedIconForegroundColorList); mCheckDrawable.start(); } else if (mThumbnailBitmap != null) { assert !mThumbnailBitmap.isRecycled(); @@ -357,13 +358,13 @@ Bitmap.createScaledBitmap(mThumbnailBitmap, mIconSize, mIconSize, false), getResources().getDimensionPixelSize( R.dimen.list_item_start_icon_corner_radius))); - mIconView.setTint(null); + ImageViewCompat.setImageTintList(mIconView, null); } else { mIconView.setBackgroundResource(mIconBackgroundResId); mIconView.getBackground().setLevel( getResources().getInteger(R.integer.list_item_level_default)); mIconView.setImageResource(mIconResId); - mIconView.setTint(mIconForegroundColorList); + ImageViewCompat.setImageTintList(mIconView, mIconForegroundColorList); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java index c6ce60b..0ae7e87 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java
@@ -7,7 +7,9 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.text.format.DateUtils; import android.text.format.Formatter; import android.util.AttributeSet; @@ -18,7 +20,6 @@ import org.chromium.chrome.browser.download.ui.DownloadHistoryAdapter.SubsectionHeader; import org.chromium.chrome.browser.download.ui.DownloadItemSelectionDelegate.SubsectionHeaderSelectionObserver; import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem; -import org.chromium.chrome.browser.widget.TintedImageView; import org.chromium.chrome.browser.widget.selection.SelectableItemView; import org.chromium.chrome.download.R; @@ -39,7 +40,7 @@ private TextView mDescriptionTextView; private ImageView mExpandImage; - private TintedImageView mIconImageView; + private AppCompatImageView mIconImageView; public OfflineGroupHeaderView(Context context, AttributeSet attrs) { super(context, attrs); @@ -54,7 +55,7 @@ protected void onFinishInflate() { super.onFinishInflate(); - mIconImageView = (TintedImageView) findViewById(R.id.icon_view); + mIconImageView = (AppCompatImageView) findViewById(R.id.icon_view); mDescriptionTextView = (TextView) findViewById(R.id.description); mExpandImage = (ImageView) findViewById(R.id.expand_icon); } @@ -116,7 +117,7 @@ getResources().getInteger(R.integer.list_item_level_selected)); mIconImageView.setImageDrawable(mCheckDrawable); - mIconImageView.setTint(mCheckedIconForegroundColorList); + ImageViewCompat.setImageTintList(mIconImageView, mCheckedIconForegroundColorList); mCheckDrawable.start(); } else { mIconImageView.setBackgroundResource(mIconBackgroundResId); @@ -124,7 +125,7 @@ getResources().getInteger(R.integer.list_item_level_default)); mIconImageView.setImageResource(R.drawable.ic_chrome); - mIconImageView.setTint(mIconForegroundColorList); + ImageViewCompat.setImageTintList(mIconImageView, mIconForegroundColorList); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java index b610b826..bbd4697 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
@@ -11,6 +11,7 @@ import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.view.ViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; @@ -23,14 +24,13 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.widget.RoundedIconGenerator; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.selection.SelectableItemView; /** * The SelectableItemView for items displayed in the browsing history UI. */ public class HistoryItemView extends SelectableItemView<HistoryItem> implements LargeIconCallback { - private TintedImageButton mRemoveButton; + private AppCompatImageButton mRemoveButton; private VectorDrawableCompat mBlockedVisitDrawable; private View mContentView; @@ -62,7 +62,7 @@ super.onFinishInflate(); mIconView.setImageResource(R.drawable.default_favicon); mContentView = findViewById(R.id.content); - mRemoveButton = (TintedImageButton) findViewById(R.id.remove); + mRemoveButton = (AppCompatImageButton) findViewById(R.id.remove); mRemoveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java index 9b1ecff..a66105b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
@@ -6,6 +6,7 @@ import android.support.design.widget.TabLayout; import android.support.v4.content.ContextCompat; +import android.support.v7.widget.AppCompatImageButton; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.infobar.translate.TranslateTabLayout; import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.ui.widget.Toast; /** @@ -104,7 +104,7 @@ private TranslateMenuHelper mOverflowMenuHelper; private TranslateMenuHelper mLanguageMenuHelper; - private TintedImageButton mMenuButton; + private AppCompatImageButton mMenuButton; private InfoBarCompactLayout mParent; private TranslateSnackbarController mSnackbarController; @@ -239,7 +239,8 @@ } }); - mMenuButton = (TintedImageButton) content.findViewById(R.id.translate_infobar_menu_button); + mMenuButton = + (AppCompatImageButton) content.findViewById(R.id.translate_infobar_menu_button); mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java index ca104d9..a3173a6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java
@@ -8,6 +8,7 @@ import android.graphics.Rect; import android.os.Build; import android.support.v4.content.ContextCompat; +import android.support.v7.widget.AppCompatImageView; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; @@ -22,7 +23,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.infobar.TranslateOptions; -import org.chromium.chrome.browser.widget.TintedImageView; import java.util.ArrayList; import java.util.List; @@ -287,8 +287,8 @@ menuItemView = getItemView( menuItemView, position, parent, R.layout.translate_menu_item_checked); - TintedImageView checkboxIcon = - (TintedImageView) menuItemView.findViewById(R.id.menu_item_icon); + AppCompatImageView checkboxIcon = + (AppCompatImageView) menuItemView.findViewById(R.id.menu_item_icon); if (getItem(position).mId == TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE && mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE)) { checkboxIcon.setVisibility(View.VISIBLE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index bf78c48..b43056d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -22,7 +22,9 @@ import android.support.annotation.Nullable; import android.support.v4.view.MarginLayoutParamsCompat; import android.support.v4.view.ViewCompat; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.text.TextUtils; import android.util.AttributeSet; import android.util.SparseArray; @@ -77,7 +79,6 @@ import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.ScrimView.ScrimParams; import org.chromium.chrome.browser.widget.TintedDrawable; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; @@ -110,10 +111,10 @@ private ScrimParams mScrimParams; protected ImageView mNavigationButton; - protected TintedImageButton mSecurityButton; + protected AppCompatImageButton mSecurityButton; protected TextView mVerboseStatusTextView; - protected TintedImageButton mDeleteButton; - protected TintedImageButton mMicButton; + protected AppCompatImageButton mDeleteButton; + protected AppCompatImageButton mMicButton; protected View mUrlBar; private final boolean mIsTablet; @@ -395,12 +396,12 @@ mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context); mNavigationButtonType = mIsTablet ? NavigationButtonType.PAGE : NavigationButtonType.EMPTY; - mSecurityButton = (TintedImageButton) findViewById(R.id.security_button); + mSecurityButton = (AppCompatImageButton) findViewById(R.id.security_button); mSecurityIconResource = 0; mVerboseStatusTextView = (TextView) findViewById(R.id.location_bar_verbose_status); - mDeleteButton = (TintedImageButton) findViewById(R.id.delete_button); + mDeleteButton = (AppCompatImageButton) findViewById(R.id.delete_button); mUrlBar = findViewById(R.id.url_bar); mUrlCoordinator = new UrlBarCoordinator((UrlBar) mUrlBar); @@ -409,7 +410,7 @@ mSuggestionItems = new ArrayList<OmniboxResultItem>(); mSuggestionListAdapter = new OmniboxResultsAdapter(getContext(), mSuggestionItems); - mMicButton = (TintedImageButton) findViewById(R.id.mic_button); + mMicButton = (AppCompatImageButton) findViewById(R.id.mic_button); mUrlActionContainer = (LinearLayout) findViewById(R.id.url_action_container); @@ -1016,7 +1017,8 @@ } else { // ImageView#setImageResource is no-op if given resource is the current one. mSecurityButton.setImageResource(id); - mSecurityButton.setTint(mToolbarDataProvider.getSecurityIconColorStateList()); + ImageViewCompat.setImageTintList( + mSecurityButton, mToolbarDataProvider.getSecurityIconColorStateList()); } int contentDescriptionId = getToolbarDataProvider().getSecurityIconContentDescription(); @@ -2123,8 +2125,8 @@ if (updateUseDarkColors()) updateSecurityIcon(); int id = mUseDarkColors ? R.color.dark_mode_tint : R.color.light_mode_tint; ColorStateList colorStateList = AppCompatResources.getColorStateList(getContext(), id); - mMicButton.setTint(colorStateList); - mDeleteButton.setTint(colorStateList); + ImageViewCompat.setImageTintList(mMicButton, colorStateList); + ImageViewCompat.setImageTintList(mDeleteButton, colorStateList); setNavigationButtonType(mNavigationButtonType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java index 2f42e70..4ae1304 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java
@@ -8,6 +8,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.widget.TextViewCompat; +import android.support.v7.widget.AppCompatImageView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.download.DownloadDirectoryProvider; import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.preferences.PrefServiceBridge; -import org.chromium.chrome.browser.widget.TintedImageView; import org.chromium.chrome.download.R; import java.util.ArrayList; @@ -146,7 +146,7 @@ } } - TintedImageView imageView = (TintedImageView) view.findViewById(R.id.icon_view); + AppCompatImageView imageView = (AppCompatImageView) view.findViewById(R.id.icon_view); imageView.setVisibility(View.GONE); return view;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java index ed7fa35..3cd386ae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java
@@ -11,6 +11,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; +import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.helper.ItemTouchHelper; @@ -25,7 +26,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.widget.ListMenuButton; -import org.chromium.chrome.browser.widget.TintedImageView; import java.util.ArrayList; import java.util.Collections; @@ -52,7 +52,7 @@ private TextView mTitle; private TextView mDescription; - private TintedImageView mStartIcon; + private AppCompatImageView mStartIcon; private ListMenuButton mMoreButton; LanguageRowViewHolder(View view) { @@ -61,7 +61,7 @@ mTitle = (TextView) view.findViewById(R.id.title); mDescription = (TextView) view.findViewById(R.id.description); - mStartIcon = (TintedImageView) view.findViewById(R.id.icon_view); + mStartIcon = (AppCompatImageView) view.findViewById(R.id.icon_view); mMoreButton = (ListMenuButton) view.findViewById(R.id.more); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java index 021fbe6..695b294 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
@@ -13,6 +13,7 @@ import android.os.Bundle; import android.support.annotation.StringRes; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.text.InputType; import android.text.SpannableString; import android.text.Spanned; @@ -35,7 +36,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.preferences.PreferenceUtils; import org.chromium.chrome.browser.sync.ProfileSyncService; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.widget.Toast; @@ -266,7 +266,7 @@ } private void hookupCopyUsernameButton(View usernameView) { - final TintedImageButton copyUsernameButton = + final AppCompatImageButton copyUsernameButton = usernameView.findViewById(R.id.password_entry_editor_copy); copyUsernameButton.setImageDrawable( AppCompatResources.getDrawable(getActivity(), R.drawable.ic_content_copy_black)); @@ -288,7 +288,7 @@ } private void hookupCopySiteButton(View siteView) { - final TintedImageButton copySiteButton = + final AppCompatImageButton copySiteButton = siteView.findViewById(R.id.password_entry_editor_copy); copySiteButton.setContentDescription( getActivity().getString(R.string.password_entry_editor_copy_stored_site)); @@ -362,7 +362,7 @@ } private void hookupPasswordButtons() { - final TintedImageButton copyPasswordButton = + final AppCompatImageButton copyPasswordButton = mView.findViewById(R.id.password_entry_editor_copy_password); final ImageButton viewPasswordButton = mView.findViewById(R.id.password_entry_editor_view_password);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java index e1cf6e9..03e48c5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
@@ -16,6 +16,7 @@ import android.os.SystemClock; import android.support.annotation.Nullable; import android.support.v4.text.BidiFormatter; +import android.support.v4.widget.ImageViewCompat; import android.text.TextUtils; import android.text.format.DateUtils; import android.view.View; @@ -36,7 +37,6 @@ import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.util.ViewUtils; -import org.chromium.chrome.browser.widget.TintedImageView; /** * This class is directly connected to suggestions view holders. It takes over the responsibility @@ -252,7 +252,7 @@ } else { mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder); } - if (!mIsContextual) ((TintedImageView) mThumbnailView).setTint(null); + if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null); // Fetch thumbnail for the current article. mImageFetcher.makeArticleThumbnailRequest( @@ -301,7 +301,7 @@ mThumbnailView.setScaleType(ImageView.ScaleType.CENTER_CROP); mThumbnailView.setBackground(null); mThumbnailView.setImageDrawable(thumbnail); - if (!mIsContextual) ((TintedImageView) mThumbnailView).setTint(null); + if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null); } private void setThumbnailFromFileType(@DownloadFilter.Type int fileType) { @@ -313,7 +313,9 @@ mThumbnailView.setBackgroundColor(iconBackgroundColor); mThumbnailView.setImageResource( DownloadUtils.getIconResId(fileType, DownloadUtils.IconSize.DP_36)); - if (!mIsContextual) ((TintedImageView) mThumbnailView).setTint(iconForegroundColorList); + if (!mIsContextual) { + ImageViewCompat.setImageTintList(mThumbnailView, iconForegroundColorList); + } } private void setDefaultFaviconOnView(int faviconSizePx) { @@ -342,7 +344,7 @@ mThumbnailView.setScaleType(ImageView.ScaleType.CENTER_CROP); mThumbnailView.setBackground(null); - if (!mIsContextual) ((TintedImageView) mThumbnailView).setTint(null); + if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null); int duration = (int) (FADE_IN_ANIMATION_TIME_MS * ChromeAnimation.Animation.getAnimationMultiplier()); if (duration == 0) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarViewBinder.java index bdceb17..44106cdcb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarViewBinder.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.toolbar; +import android.support.v7.widget.AppCompatImageButton; import android.view.View; import android.view.ViewGroup; @@ -13,7 +14,6 @@ import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; import org.chromium.chrome.browser.toolbar.ToolbarButtonSlotData.ToolbarButtonData; import org.chromium.chrome.browser.util.ColorUtils; -import org.chromium.chrome.browser.widget.TintedImageButton; /** * This class is responsible for pushing updates to both the Android view and the compositor @@ -34,19 +34,19 @@ /** A handle to the composited bottom toolbar layer. */ public ScrollingBottomViewSceneLayer sceneLayer; - /** Cached {@link TintedImageButton} of the first button. */ - public final TintedImageButton firstTintedImageButton; + /** Cached {@link android.support.v7.widget.AppCompatImageButton} of the first button. */ + public final AppCompatImageButton firstImageButton; - /** Cached {@link TintedImageButton} of the second button. */ - public final TintedImageButton secondTintedImageButton; + /** Cached {@link android.support.v7.widget.AppCompatImageButton} of the second button. */ + public final AppCompatImageButton secondImageButton; /** * @param toolbarRootView The Android View based toolbar. */ public ViewHolder(ScrollingBottomViewResourceFrameLayout toolbarRootView) { toolbarRoot = toolbarRootView; - firstTintedImageButton = toolbarRoot.findViewById(R.id.first_button); - secondTintedImageButton = toolbarRoot.findViewById(R.id.second_button); + firstImageButton = toolbarRoot.findViewById(R.id.first_button); + secondImageButton = toolbarRoot.findViewById(R.id.second_button); } } @@ -86,18 +86,18 @@ } else if (BottomToolbarModel.TOOLBAR_SWIPE_HANDLER == propertyKey) { view.toolbarRoot.setSwipeDetector(model.get(BottomToolbarModel.TOOLBAR_SWIPE_HANDLER)); } else if (BottomToolbarModel.FIRST_BUTTON_DATA == propertyKey) { - updateButton(view.firstTintedImageButton, - model.get(BottomToolbarModel.FIRST_BUTTON_DATA), useLightIcons(model)); + updateButton(view.firstImageButton, model.get(BottomToolbarModel.FIRST_BUTTON_DATA), + useLightIcons(model)); } else if (BottomToolbarModel.SECOND_BUTTON_DATA == propertyKey) { - updateButton(view.secondTintedImageButton, - model.get(BottomToolbarModel.SECOND_BUTTON_DATA), useLightIcons(model)); + updateButton(view.secondImageButton, model.get(BottomToolbarModel.SECOND_BUTTON_DATA), + useLightIcons(model)); } else if (BottomToolbarModel.PRIMARY_COLOR == propertyKey) { final boolean useLightIcons = useLightIcons(model); view.toolbarRoot.findViewById(R.id.bottom_sheet_toolbar) .setBackgroundColor(model.get(BottomToolbarModel.PRIMARY_COLOR)); - updateButtonDrawable(view.firstTintedImageButton, + updateButtonDrawable(view.firstImageButton, model.get(BottomToolbarModel.FIRST_BUTTON_DATA), useLightIcons); - updateButtonDrawable(view.secondTintedImageButton, + updateButtonDrawable(view.secondImageButton, model.get(BottomToolbarModel.SECOND_BUTTON_DATA), useLightIcons); } else { assert false : "Unhandled property detected in BottomToolbarViewBinder!"; @@ -110,7 +110,7 @@ } private static void updateButton( - TintedImageButton button, ToolbarButtonData buttonData, boolean useLightIcons) { + AppCompatImageButton button, ToolbarButtonData buttonData, boolean useLightIcons) { if (buttonData == null) { ToolbarButtonData.clearButton(button); } else { @@ -119,7 +119,7 @@ } private static void updateButtonDrawable( - TintedImageButton button, ToolbarButtonData buttonData, boolean useLightIcons) { + AppCompatImageButton button, ToolbarButtonData buttonData, boolean useLightIcons) { if (buttonData != null) buttonData.updateButtonDrawable(button, useLightIcons); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java index 5d82548..799c412d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -23,6 +23,8 @@ import android.support.annotation.Nullable; import android.support.v4.text.BidiFormatter; import android.support.v4.view.MarginLayoutParamsCompat; +import android.support.v4.widget.ImageViewCompat; +import android.support.v7.widget.AppCompatImageButton; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; @@ -60,7 +62,6 @@ import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.TintedDrawable; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.net.GURLUtils; @@ -131,7 +132,7 @@ private View mLiteStatusSeparatorView; private UrlBarCoordinator mUrlCoordinator; private TextView mTitleBar; - private TintedImageButton mSecurityButton; + private AppCompatImageButton mSecurityButton; private LinearLayout mCustomActionButtons; private ImageButton mCloseButton; @@ -503,7 +504,8 @@ private void updateButtonsTint() { if (getMenuButton() != null) { - getMenuButton().setTint(mUseDarkColors ? mDarkModeTint : mLightModeTint); + ImageViewCompat.setImageTintList( + getMenuButton(), mUseDarkColors ? mDarkModeTint : mLightModeTint); } updateButtonTint(mCloseButton); int numCustomActionButtons = mCustomActionButtons.getChildCount(); @@ -549,7 +551,8 @@ } else { // ImageView#setImageResource is no-op if given resource is the current one. mSecurityButton.setImageResource(securityIconResource); - mSecurityButton.setTint(getToolbarDataProvider().getSecurityIconColorStateList()); + ImageViewCompat.setImageTintList( + mSecurityButton, getToolbarDataProvider().getSecurityIconColorStateList()); mAnimDelegate.showSecurityButton(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/HomePageButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/HomePageButton.java index 29eba6c..7f13edf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/HomePageButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/HomePageButton.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.toolbar; import android.content.Context; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -16,14 +17,12 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.util.FeatureUtilities; -import org.chromium.chrome.browser.widget.TintedImageButton; /** * View that displays the home page button. */ -public class HomePageButton extends TintedImageButton +public class HomePageButton extends AppCompatImageButton implements OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener { - private static final int ID_REMOVE = 0; /** Constructor inflating from XML. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java index 99a9d5a..946a274 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java
@@ -7,7 +7,9 @@ import android.content.Context; import android.content.res.ColorStateList; import android.support.design.widget.TabLayout; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import org.chromium.chrome.R; @@ -15,7 +17,6 @@ import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.widget.TintedImageView; /** * TabLayout shown in the Horizontal Tab Switcher. @@ -23,8 +24,8 @@ public class IncognitoToggleTabLayout extends TabLayout { private TabLayout.Tab mStandardButton; private TabLayout.Tab mIncognitoButton; - private TintedImageView mStandardButtonIcon; - private TintedImageView mIncognitoButtonIcon; + private AppCompatImageView mStandardButtonIcon; + private AppCompatImageView mIncognitoButtonIcon; private TabSwitcherDrawable mTabSwitcherDrawable; private ColorStateList mTabIconDarkColor; @@ -49,10 +50,10 @@ mTabIconSelectedLightColor = AppCompatResources.getColorStateList(getContext(), R.color.white_mode_tint); - mStandardButtonIcon = new TintedImageView(getContext()); + mStandardButtonIcon = new AppCompatImageView(getContext()); mTabSwitcherDrawable = TabSwitcherDrawable.createTabSwitcherDrawable(getContext(), false); mStandardButtonIcon.setImageDrawable(mTabSwitcherDrawable); - mIncognitoButtonIcon = new TintedImageView(getContext()); + mIncognitoButtonIcon = new AppCompatImageView(getContext()); mIncognitoButtonIcon.setImageResource(R.drawable.incognito_simple); mStandardButton = @@ -109,14 +110,14 @@ final boolean isIncognitoSelected = mTabModelSelector.isIncognitoSelected(); if (isIncognitoSelected) { setSelectedTabIndicatorColor(mTabIconSelectedLightColor.getDefaultColor()); - mStandardButtonIcon.setTint(mTabIconLightColor); + ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconLightColor); mTabSwitcherDrawable.setTint(mTabIconLightColor); - mIncognitoButtonIcon.setTint(mTabIconSelectedLightColor); + ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconSelectedLightColor); } else { setSelectedTabIndicatorColor(mTabIconSelectedDarkColor.getDefaultColor()); - mStandardButtonIcon.setTint(mTabIconSelectedDarkColor); + ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor); mTabSwitcherDrawable.setTint(mTabIconSelectedDarkColor); - mIncognitoButtonIcon.setTint(mTabIconDarkColor); + ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor); } // Ensure the tab in tab layout is correctly selected when tab switcher is // first opened.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java index b48b03161..b93bafd39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
@@ -6,21 +6,20 @@ import android.content.Context; import android.content.res.ColorStateList; +import android.support.v4.widget.ImageViewCompat; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; -import android.view.View.AccessibilityDelegate; -import android.view.View.OnTouchListener; import android.widget.FrameLayout; import org.chromium.chrome.R; -import org.chromium.chrome.browser.widget.TintedImageButton; /** * The overflow menu button. */ class MenuButton extends FrameLayout { - /** The {@link TintedImageButton} for the menu button. */ - private TintedImageButton mMenuTintedImageButton; + /** The {@link android.support.v7.widget.AppCompatImageButton} for the menu button. */ + private AppCompatImageButton mMenuImageButton; /** The view for the update badge. */ private View mUpdateBadgeView; @@ -32,7 +31,7 @@ @Override protected void onFinishInflate() { super.onFinishInflate(); - mMenuTintedImageButton = findViewById(R.id.menu_button); + mMenuImageButton = findViewById(R.id.menu_button); mUpdateBadgeView = findViewById(R.id.menu_badge); } @@ -41,12 +40,12 @@ * clicked. */ void setTouchListener(OnTouchListener onTouchListener) { - mMenuTintedImageButton.setOnTouchListener(onTouchListener); + mMenuImageButton.setOnTouchListener(onTouchListener); } @Override public void setAccessibilityDelegate(AccessibilityDelegate delegate) { - mMenuTintedImageButton.setAccessibilityDelegate(delegate); + mMenuImageButton.setAccessibilityDelegate(delegate); } /** @@ -64,7 +63,7 @@ } View getMenuButton() { - return mMenuTintedImageButton; + return mMenuImageButton; } /** @@ -72,6 +71,6 @@ * tinted). */ void setTint(ColorStateList tintList) { - mMenuTintedImageButton.setTint(tintList); + ImageViewCompat.setImageTintList(mMenuImageButton, tintList); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonSlotData.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonSlotData.java index 8599e1f..c5089fef 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonSlotData.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonSlotData.java
@@ -13,11 +13,11 @@ import android.graphics.drawable.Drawable; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.view.View; import android.view.View.OnClickListener; import org.chromium.chrome.R; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.ui.interpolators.BakedBezierInterpolator; /** @@ -75,19 +75,19 @@ } /** - * @param imageButton The {@link TintedImageButton} this button data will fill. + * @param imageButton The {@link AppCompatImageButton} this button data will fill. * @param isLight Whether or not to use light mode. */ - void updateButton(TintedImageButton imageButton, boolean isLight) { + void updateButton(AppCompatImageButton imageButton, boolean isLight) { imageButton.setOnClickListener(mOnClickListener); updateButtonDrawable(imageButton, isLight); } /** - * @param imageButton The {@link TintedImageButton} this button data will fill. + * @param imageButton The {@link AppCompatImageButton} this button data will fill. * @param isLight Whether or not to use light mode. */ - void updateButtonDrawable(TintedImageButton imageButton, boolean isLight) { + void updateButtonDrawable(AppCompatImageButton imageButton, boolean isLight) { ObjectAnimator fadeOutAnim = ObjectAnimator.ofFloat(imageButton, View.ALPHA, 1.0f, 0.0f); fadeOutAnim.setDuration(FADE_DURATION / 2); @@ -124,7 +124,7 @@ animatorSet.start(); } - static void clearButton(TintedImageButton button) { + static void clearButton(AppCompatImageButton button) { ToolbarButtonData emptyButtonData = new ToolbarButtonData(null, "", "", null, button.getContext()); emptyButtonData.updateButton(button, false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java index 125178c0..f8cd899 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java
@@ -18,6 +18,7 @@ import android.support.annotation.StringRes; import android.support.v4.view.ViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.InputDevice; import android.view.MotionEvent; @@ -44,7 +45,6 @@ import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.widget.PulseDrawable; import org.chromium.chrome.browser.widget.ScrimView; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.ToolbarProgressBar; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.components.security_state.ConnectionSecurityLevel; @@ -63,7 +63,7 @@ /** * The ImageButton view that represents the menu button. */ - protected TintedImageButton mMenuButton; + protected AppCompatImageButton mMenuButton; private ImageView mMenuBadge; private View mMenuButtonWrapper; private AppMenuButtonHelper mAppMenuButtonHelper; @@ -156,7 +156,7 @@ protected void onFinishInflate() { super.onFinishInflate(); - mMenuButton = (TintedImageButton) findViewById(R.id.menu_button); + mMenuButton = (AppCompatImageButton) findViewById(R.id.menu_button); mMenuBadge = (ImageView) findViewById(R.id.menu_badge); mMenuButtonWrapper = findViewById(R.id.menu_button_wrapper); @@ -306,9 +306,9 @@ } /** - * @return The {@link TintedImageButton} containing the menu button. + * @return The {@link AppCompatImageButton} containing the menu button. */ - protected TintedImageButton getMenuButton() { + protected AppCompatImageButton getMenuButton() { return mMenuButton; } @@ -986,7 +986,7 @@ * #onNativeLibraryReady() & once in #onFinishInflate() (see https://crbug.com/862887). * @param ntpButton The button that needs to be changed. */ - protected void changeIconToNTPIcon(TintedImageButton ntpButton) { + protected void changeIconToNTPIcon(AppCompatImageButton ntpButton) { if (FeatureUtilities.isNewTabPageButtonEnabled()) ntpButton.setImageResource(R.drawable.ic_home); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java index 789ce1d7..e3ace30 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -30,7 +30,9 @@ import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.animation.FastOutSlowInInterpolator; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.graphics.drawable.DrawableWrapper; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.util.Property; import android.util.TypedValue; @@ -76,7 +78,6 @@ import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.MathUtils; import org.chromium.chrome.browser.util.ViewUtils; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.animation.CancelAwareAnimatorListener; import org.chromium.chrome.browser.widget.newtab.NewTabButton; import org.chromium.chrome.browser.widget.textbubble.TextBubble; @@ -147,11 +148,11 @@ private IncognitoToggleTabLayout mIncognitoToggleTabLayout; protected ImageView mToggleTabStackButton; protected NewTabButton mNewTabButton; - protected @Nullable TintedImageButton mHomeButton; + protected @Nullable AppCompatImageButton mHomeButton; private TextView mUrlBar; protected View mUrlActionContainer; protected ImageView mToolbarShadow; - private @Nullable TintedImageButton mExperimentalButton; + private @Nullable AppCompatImageButton mExperimentalButton; private final int mProgressBackBackgroundColorWhite; @@ -393,7 +394,7 @@ mToolbarButtonsContainer = (ViewGroup) findViewById(R.id.toolbar_buttons); - mHomeButton = (TintedImageButton) findViewById(R.id.home_button); + mHomeButton = (AppCompatImageButton) findViewById(R.id.home_button); changeIconToNTPIcon(mHomeButton); if (FeatureUtilities.isBottomToolbarEnabled()) { disableMenuButton(); @@ -493,7 +494,7 @@ mToggleTabStackButton.setOnKeyListener(new KeyboardNavigationListener() { @Override public View getNextFocusForward() { - final TintedImageButton menuButton = getMenuButton(); + final AppCompatImageButton menuButton = getMenuButton(); if (menuButton != null && menuButton.isShown()) { return menuButton; } else { @@ -1380,7 +1381,7 @@ } // Draw the menu button if necessary. - final TintedImageButton menuButton = getMenuButton(); + final AppCompatImageButton menuButton = getMenuButton(); if (menuButton != null && !mShowMenuBadge && mTabSwitcherAnimationMenuDrawable != null && mUrlExpansionPercent != 1f) { mTabSwitcherAnimationMenuDrawable.setBounds(menuButton.getPaddingLeft(), @@ -1720,7 +1721,8 @@ private void addHomeButton() { mHomeButton.setVisibility( urlHasFocus() || isTabSwitcherAnimationRunning() ? INVISIBLE : VISIBLE); - mHomeButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); + ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint; + ImageViewCompat.setImageTintList(mHomeButton, tintList); mBrowsingModeViews.add(mHomeButton); } @@ -2574,12 +2576,14 @@ } if (getMenuButton() != null) { - getMenuButton().setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); + ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint; + ImageViewCompat.setImageTintList(getMenuButton(), tintList); } updateModernLocationBarColor(getLocationBarColorForToolbarColor(currentPrimaryColor)); if (mExperimentalButton != null) { - mExperimentalButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); + ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint; + ImageViewCompat.setImageTintList(mExperimentalButton, tintList); } setMenuButtonHighlightDrawable(mHighlightingMenu); @@ -2587,7 +2591,9 @@ setAppMenuUpdateBadgeDrawable(mUseLightToolbarDrawables); } ColorStateList tint = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint; - if (mIsHomeButtonEnabled && mHomeButton != null) mHomeButton.setTint(tint); + if (mIsHomeButtonEnabled && mHomeButton != null) { + ImageViewCompat.setImageTintList(mHomeButton, tint); + } mLocationBar.updateVisualsForState(); @@ -2689,7 +2695,7 @@ OnClickListener onClickListener, int drawableResId, int contentDescriptionResId) { if (mExperimentalButton == null) { ViewStub viewStub = findViewById(R.id.experimental_button_stub); - mExperimentalButton = (TintedImageButton) viewStub.inflate(); + mExperimentalButton = (AppCompatImageButton) viewStub.inflate(); if (!isMenuButtonPresent()) mExperimentalButton.setPadding(0, 0, 0, 0); mExperimentalButtonTranslation = getResources().getDimensionPixelSize( @@ -2708,7 +2714,8 @@ mExperimentalButton.setImageResource(drawableResId); mExperimentalButton.setContentDescription( getContext().getResources().getString(contentDescriptionResId)); - mExperimentalButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mExperimentalButton, mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); if (mTabSwitcherState == STATIC_TAB) { if (!mUrlFocusChangeInProgress && !urlHasFocus()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java index 9e034ac5..4626f83 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java
@@ -11,7 +11,9 @@ import android.content.Context; import android.content.res.Resources; import android.support.v4.view.ViewCompat; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; @@ -32,7 +34,6 @@ import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.FeatureUtilities; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.ui.base.DeviceFormFactor; import java.util.ArrayList; @@ -47,13 +48,13 @@ // The number of toolbar buttons that can be hidden at small widths (reload, back, forward). public static final int HIDEABLE_BUTTON_COUNT = 3; - private TintedImageButton mHomeButton; - private TintedImageButton mBackButton; - private TintedImageButton mForwardButton; - private TintedImageButton mReloadButton; - private TintedImageButton mBookmarkButton; - private TintedImageButton mSaveOfflineButton; - private TintedImageButton mSecurityButton; + private AppCompatImageButton mHomeButton; + private AppCompatImageButton mBackButton; + private AppCompatImageButton mForwardButton; + private AppCompatImageButton mReloadButton; + private AppCompatImageButton mBookmarkButton; + private AppCompatImageButton mSaveOfflineButton; + private AppCompatImageButton mSecurityButton; private ImageButton mAccessibilitySwitcherButton; private OnClickListener mBookmarkListener; @@ -63,7 +64,7 @@ private boolean mShowTabStack; private boolean mToolbarButtonsVisible; - private TintedImageButton[] mToolbarButtons; + private AppCompatImageButton[] mToolbarButtons; private NavigationPopup mNavigationPopup; @@ -98,12 +99,12 @@ super.onFinishInflate(); mLocationBar = (LocationBarTablet) findViewById(R.id.location_bar); - mHomeButton = (TintedImageButton) findViewById(R.id.home_button); + mHomeButton = (AppCompatImageButton) findViewById(R.id.home_button); changeIconToNTPIcon(mHomeButton); - mBackButton = (TintedImageButton) findViewById(R.id.back_button); - mForwardButton = (TintedImageButton) findViewById(R.id.forward_button); - mReloadButton = (TintedImageButton) findViewById(R.id.refresh_button); - mSecurityButton = (TintedImageButton) findViewById(R.id.security_button); + mBackButton = (AppCompatImageButton) findViewById(R.id.back_button); + mForwardButton = (AppCompatImageButton) findViewById(R.id.forward_button); + mReloadButton = (AppCompatImageButton) findViewById(R.id.refresh_button); + mSecurityButton = (AppCompatImageButton) findViewById(R.id.security_button); mShowTabStack = AccessibilityUtil.isAccessibilityEnabled() && isAccessibilityTabSwitcherPreferenceEnabled(); @@ -116,7 +117,7 @@ mAccessibilitySwitcherButton.setImageDrawable(mTabSwitcherButtonDrawable); updateSwitcherButtonVisibility(mShowTabStack); - mBookmarkButton = (TintedImageButton) findViewById(R.id.bookmark_button); + mBookmarkButton = (AppCompatImageButton) findViewById(R.id.bookmark_button); final View menuButtonWrapper = getMenuButtonWrapper(); menuButtonWrapper.setVisibility(View.VISIBLE); @@ -127,13 +128,13 @@ getResources().getDimensionPixelSize(R.dimen.tablet_toolbar_end_padding), 0); } - mSaveOfflineButton = (TintedImageButton) findViewById(R.id.save_offline_button); + mSaveOfflineButton = (AppCompatImageButton) findViewById(R.id.save_offline_button); // Initialize values needed for showing/hiding toolbar buttons when the activity size // changes. mShouldAnimateButtonVisibilityChange = false; mToolbarButtonsVisible = true; - mToolbarButtons = new TintedImageButton[] {mBackButton, mForwardButton, mReloadButton}; + mToolbarButtons = new AppCompatImageButton[] {mBackButton, mForwardButton, mReloadButton}; } @Override @@ -382,11 +383,16 @@ setBackgroundColor(color); getProgressBar().setThemeColor(color, isIncognito()); - getMenuButton().setTint(incognito ? mLightModeTint : mDarkModeTint); - mHomeButton.setTint(incognito ? mLightModeTint : mDarkModeTint); - mBackButton.setTint(incognito ? mLightModeTint : mDarkModeTint); - mForwardButton.setTint(incognito ? mLightModeTint : mDarkModeTint); - mSaveOfflineButton.setTint(incognito ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + getMenuButton(), incognito ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mHomeButton, incognito ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mBackButton, incognito ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mForwardButton, incognito ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mSaveOfflineButton, incognito ? mLightModeTint : mDarkModeTint); if (incognito) { mLocationBar.getContainerView().getBackground().setAlpha( ToolbarPhone.LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA); @@ -471,7 +477,8 @@ mReloadButton.setContentDescription(getContext().getString( R.string.accessibility_btn_refresh)); } - mReloadButton.setTint(isIncognito() ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mReloadButton, isIncognito() ? mLightModeTint : mDarkModeTint); mReloadButton.setEnabled(!mIsInTabSwitcherMode); } @@ -480,14 +487,16 @@ if (isBookmarked) { mBookmarkButton.setImageResource(R.drawable.btn_star_filled); // Non-incognito mode shows a blue filled star. - mBookmarkButton.setTint(isIncognito() ? mLightModeTint - : AppCompatResources.getColorStateList( - getContext(), R.color.blue_mode_tint)); + ImageViewCompat.setImageTintList(mBookmarkButton, + isIncognito() ? mLightModeTint + : AppCompatResources.getColorStateList( + getContext(), R.color.blue_mode_tint)); mBookmarkButton.setContentDescription(getContext().getString( R.string.edit_bookmark)); } else { mBookmarkButton.setImageResource(R.drawable.btn_star); - mBookmarkButton.setTint(isIncognito() ? mLightModeTint : mDarkModeTint); + ImageViewCompat.setImageTintList( + mBookmarkButton, isIncognito() ? mLightModeTint : mDarkModeTint); mBookmarkButton.setContentDescription(getContext().getString( R.string.accessibility_menu_bookmark)); } @@ -604,7 +613,7 @@ if (mShouldAnimateButtonVisibilityChange) { runToolbarButtonsVisibilityAnimation(visible); } else { - for (TintedImageButton button : mToolbarButtons) { + for (AppCompatImageButton button : mToolbarButtons) { button.setVisibility(visible ? View.VISIBLE : View.GONE); } mLocationBar.setShouldShowButtonsWhenUnfocused(visible); @@ -646,7 +655,7 @@ Collection<Animator> animators = new ArrayList<>(); // Create animators for all of the toolbar buttons. - for (TintedImageButton button : mToolbarButtons) { + for (AppCompatImageButton button : mToolbarButtons) { animators.add(mLocationBar.createShowButtonAnimator(button)); } @@ -660,7 +669,7 @@ set.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - for (TintedImageButton button : mToolbarButtons) { + for (AppCompatImageButton button : mToolbarButtons) { button.setVisibility(View.VISIBLE); } // Set the padding at the start of the animation so the toolbar buttons don't jump @@ -681,7 +690,7 @@ Collection<Animator> animators = new ArrayList<>(); // Create animators for all of the toolbar buttons. - for (TintedImageButton button : mToolbarButtons) { + for (AppCompatImageButton button : mToolbarButtons) { animators.add(mLocationBar.createHideButtonAnimator(button)); } @@ -698,7 +707,7 @@ // Only set end visibility and alpha if the animation is ending because it's // completely finished and not because it was canceled. if (mToolbarButtons[0].getAlpha() == 0.f) { - for (TintedImageButton button : mToolbarButtons) { + for (AppCompatImageButton button : mToolbarButtons) { button.setVisibility(View.GONE); button.setAlpha(1.f); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java deleted file mode 100644 index ceca4af..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java +++ /dev/null
@@ -1,87 +0,0 @@ -// 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.widget; - -import android.content.res.ColorStateList; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.PorterDuff; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.widget.ImageView; - -import org.chromium.chrome.R; - -/** - * Utility for tinting an ImageView and its Drawable. - * - * Example usage in XML: - * <ImageViewTinterInstanceOwner - * xmlns:android="http://schemas.android.com/apk/res/android" - * xmlns:app="http://schemas.android.com/apk/res-auto" - * app:chrometint="@color/default_icon_color_blue" /> - */ -public class ImageViewTinter { - /** Classes that own an ImageViewTinter must implement these functions. */ - public static interface ImageViewTinterOwner { - /** See {@link ImageViewTinter#drawableStateChanged}. */ - void drawableStateChanged(); - - /** See {@link ImageViewTinter#setTint}. */ - void setTint(ColorStateList tintList); - - /** See {@link ImageView#onDraw}. */ - void onDraw(Canvas canvas); - } - - private ImageView mImageView; - private ColorStateList mTintList; - - /** - * Constructor. Should be called with the AttributeSet and style of the ImageView so that XML - * attributes for it can be parsed. - * @param view ImageView being tinted. - * @param attrs AttributeSet that is pulled in from an XML layout. May be null. - * @param defStyle Style that is pulled in from an XML layout. - */ - public ImageViewTinter(ImageViewTinterOwner view, @Nullable AttributeSet attrs, int defStyle) { - mImageView = (ImageView) view; - - // Parse out the attributes from the XML. - if (attrs != null) { - TypedArray a = mImageView.getContext().obtainStyledAttributes( - attrs, R.styleable.TintedImage, defStyle, 0); - setTint(a.getColorStateList(R.styleable.TintedImage_chrometint)); - a.recycle(); - } - } - - /** - * Sets the tint color for the given ImageView for all states. - * @param tintList The set of colors to use. - */ - public void setTint(ColorStateList tintList) { - if (mTintList == tintList) return; - mTintList = tintList; - updateTintColor(); - } - - /** Call when the state of the Drawable has changed. */ - public void drawableStateChanged() { - updateTintColor(); - } - - private void updateTintColor() { - if (mImageView.getDrawable() == null) { - return; - } else if (mTintList == null) { - mImageView.clearColorFilter(); - return; - } - - int tintColor = mTintList.getColorForState(mImageView.getDrawableState(), 0); - mImageView.setColorFilter(tintColor, PorterDuff.Mode.SRC_IN); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ListMenuButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ListMenuButton.java index 86e4b26..6ce4179d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ListMenuButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ListMenuButton.java
@@ -9,6 +9,7 @@ import android.graphics.Rect; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -28,7 +29,7 @@ * results. */ public class ListMenuButton - extends TintedImageButton implements AnchoredPopupWindow.LayoutObserver { + extends AppCompatImageButton implements AnchoredPopupWindow.LayoutObserver { private final static int INVALID_RES_ID = 0; /** A class that represents a single item in the popup menu. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java deleted file mode 100644 index baf542e..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2014 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.widget; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.widget.ImageButton; - -import org.chromium.chrome.browser.widget.ImageViewTinter.ImageViewTinterOwner; - -/** - * Implementation of ImageButton that allows tinting the Drawable for all states. - * For usage, see {@link ImageViewTinter}. - */ -public class TintedImageButton extends ImageButton implements ImageViewTinterOwner { - private ImageViewTinter mTinter; - - public TintedImageButton(Context context) { - super(context); - init(null, 0); - } - - public TintedImageButton(Context context, AttributeSet attrs) { - super(context, attrs); - init(attrs, 0); - } - - public TintedImageButton(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(attrs, defStyle); - } - - private void init(AttributeSet attrs, int defStyle) { - mTinter = new ImageViewTinter(this, attrs, defStyle); - } - - @Override - public void drawableStateChanged() { - super.drawableStateChanged(); - mTinter.drawableStateChanged(); - } - - @Override - public void setImageDrawable(@Nullable Drawable drawable) { - super.setImageDrawable(drawable); - maybeUpdateTint(); - } - - @Override - public void setImageResource(int resId) { - super.setImageResource(resId); - maybeUpdateTint(); - } - - @Override - public void setTint(ColorStateList tintList) { - mTinter.setTint(tintList); - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - } - - private void maybeUpdateTint() { - if (mTinter == null) { - // Got indirectly invoked from the superclass constructor, nothing to do yet. - return; - } - mTinter.drawableStateChanged(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageView.java deleted file mode 100644 index 61c2df7..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageView.java +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2014 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.widget; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatImageView; -import android.util.AttributeSet; - -import org.chromium.chrome.browser.widget.ImageViewTinter.ImageViewTinterOwner; - -/** - * Implementation of ImageView that allows tinting its Drawable for all states. - * For usage, see {@link ImageViewTinter}. - */ -public class TintedImageView extends AppCompatImageView implements ImageViewTinterOwner { - private ImageViewTinter mTinter; - - public TintedImageView(Context context) { - super(context); - init(null, 0); - } - - public TintedImageView(Context context, AttributeSet attrs) { - super(context, attrs, 0); - init(attrs, 0); - } - - public TintedImageView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(attrs, defStyle); - } - - private void init(AttributeSet attrs, int defStyle) { - mTinter = new ImageViewTinter(this, attrs, defStyle); - } - - @Override - public void drawableStateChanged() { - super.drawableStateChanged(); - mTinter.drawableStateChanged(); - } - - @Override - public void setImageDrawable(@Nullable Drawable drawable) { - super.setImageDrawable(drawable); - maybeUpdateTint(); - } - - @Override - public void setImageResource(int resId) { - super.setImageResource(resId); - maybeUpdateTint(); - } - - @Override - public void setTint(ColorStateList tintList) { - mTinter.setTint(tintList); - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - } - - private void maybeUpdateTint() { - if (mTinter == null) { - // Got indirectly invoked from the superclass constructor, nothing to do yet. - return; - } - mTinter.drawableStateChanged(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java index c8650e0..c34dbe1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java
@@ -13,7 +13,10 @@ import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.os.Handler; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.widget.AppCompatImageView; import android.text.TextUtils; import android.util.AttributeSet; import android.view.GestureDetector; @@ -34,8 +37,6 @@ import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; -import org.chromium.chrome.browser.widget.TintedImageButton; -import org.chromium.chrome.browser.widget.TintedImageView; /** * A widget that shows a single row of the {@link AccessibilityTabModelListView} list. @@ -72,8 +73,8 @@ private LinearLayout mTabContents; private TextView mTitleView; private TextView mDescriptionView; - private TintedImageView mFaviconView; - private TintedImageButton mCloseButton; + private AppCompatImageView mFaviconView; + private AppCompatImageButton mCloseButton; // The children on the undo view. private LinearLayout mUndoContents; @@ -311,13 +312,13 @@ mFaviconView.getBackground().setLevel(mIncognitoLevel); ApiCompatibilityUtils.setTextAppearance(mTitleView, R.style.WhiteTitle1); ApiCompatibilityUtils.setTextAppearance(mDescriptionView, R.style.WhiteBody); - mCloseButton.setTint(mLightCloseIconColor); + ImageViewCompat.setImageTintList(mCloseButton, mLightCloseIconColor); } else { setBackgroundResource(R.color.modern_primary_color); mFaviconView.getBackground().setLevel(mDefaultLevel); ApiCompatibilityUtils.setTextAppearance(mTitleView, R.style.BlackTitle1); ApiCompatibilityUtils.setTextAppearance(mDescriptionView, R.style.BlackBody); - mCloseButton.setTint(mDarkCloseIconColor); + ImageViewCompat.setImageTintList(mCloseButton, mDarkCloseIconColor); } if (TextUtils.isEmpty(url)) { @@ -333,11 +334,11 @@ Bitmap bitmap = mTab.getFavicon(); if (bitmap != null) { // Don't tint favicon bitmaps. - mFaviconView.setTint(null); + ImageViewCompat.setImageTintList(mFaviconView, null); mFaviconView.setImageBitmap(bitmap); } else { mFaviconView.setImageResource(R.drawable.ic_globe_24dp); - mFaviconView.setTint(mDarkIconColor); + ImageViewCompat.setImageTintList(mFaviconView, mDarkIconColor); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java index 01930f8..d5f2c78 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
@@ -7,7 +7,9 @@ import android.content.Context; import android.content.res.ColorStateList; import android.support.design.widget.TabLayout; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; @@ -21,7 +23,6 @@ import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; -import org.chromium.chrome.browser.widget.TintedImageView; import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; /** @@ -36,8 +37,8 @@ private TabLayout mStackButtonWrapper; private TabLayout.Tab mStandardButton; private TabLayout.Tab mIncognitoButton; - private TintedImageView mStandardButtonIcon; - private TintedImageView mIncognitoButtonIcon; + private AppCompatImageView mStandardButtonIcon; + private AppCompatImageView mIncognitoButtonIcon; private ColorStateList mTabIconDarkColor; private ColorStateList mTabIconLightColor; @@ -106,12 +107,12 @@ AppCompatResources.getColorStateList(getContext(), R.color.white_mode_tint); // Setting scaleY here to make sure the icons are not flipped due to the scaleY of its // container layout. - mStandardButtonIcon = new TintedImageView(getContext()); + mStandardButtonIcon = new AppCompatImageView(getContext()); mStandardButtonIcon.setImageResource(R.drawable.btn_normal_tabs); mStandardButtonIcon.setScaleY(-1.0f); mStandardButtonIcon.setContentDescription( getResources().getString(R.string.accessibility_tab_switcher_standard_stack)); - mIncognitoButtonIcon = new TintedImageView(getContext()); + mIncognitoButtonIcon = new AppCompatImageView(getContext()); mIncognitoButtonIcon.setImageResource(R.drawable.btn_incognito_tabs); mIncognitoButtonIcon.setScaleY(-1.0f); mIncognitoButtonIcon.setContentDescription(getResources().getString( @@ -178,15 +179,15 @@ getResources(), R.color.incognito_modern_primary_color)); mStackButtonWrapper.setSelectedTabIndicatorColor( mTabIconSelectedLightColor.getDefaultColor()); - mStandardButtonIcon.setTint(mTabIconLightColor); - mIncognitoButtonIcon.setTint(mTabIconSelectedLightColor); + ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconLightColor); + ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconSelectedLightColor); } else { setBackgroundColor( ApiCompatibilityUtils.getColor(getResources(), R.color.modern_primary_color)); mStackButtonWrapper.setSelectedTabIndicatorColor( mTabIconSelectedDarkColor.getDefaultColor()); - mStandardButtonIcon.setTint(mTabIconSelectedDarkColor); - mIncognitoButtonIcon.setTint(mTabIconDarkColor); + ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor); + ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor); } // Ensure the tab in tab layout is correctly selected when tab switcher is // first opened.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java index e24411c6..933f5c7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
@@ -15,6 +15,7 @@ import android.provider.Settings; import android.support.annotation.IntDef; import android.support.v4.view.accessibility.AccessibilityEventCompat; +import android.support.v7.widget.AppCompatImageButton; import android.text.Editable; import android.text.InputType; import android.text.Selection; @@ -45,7 +46,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.VerticallyFixedEditText; import org.chromium.ui.base.WindowAndroid; @@ -73,9 +73,9 @@ // Toolbar UI private TextView mFindStatus; protected FindQuery mFindQuery; - protected TintedImageButton mCloseFindButton; - protected TintedImageButton mFindPrevButton; - protected TintedImageButton mFindNextButton; + protected AppCompatImageButton mCloseFindButton; + protected AppCompatImageButton mFindPrevButton; + protected AppCompatImageButton mFindNextButton; private FindResultBar mResultBar; @@ -310,7 +310,7 @@ mFindStatus = (TextView) findViewById(R.id.find_status); - mFindPrevButton = (TintedImageButton) findViewById(R.id.find_prev_button); + mFindPrevButton = (AppCompatImageButton) findViewById(R.id.find_prev_button); mFindPrevButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -318,7 +318,7 @@ } }); - mFindNextButton = (TintedImageButton) findViewById(R.id.find_next_button); + mFindNextButton = (AppCompatImageButton) findViewById(R.id.find_next_button); mFindNextButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -328,7 +328,7 @@ setPrevNextEnabled(false); - mCloseFindButton = (TintedImageButton) findViewById(R.id.close_find_button); + mCloseFindButton = (AppCompatImageButton) findViewById(R.id.close_find_button); mCloseFindButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java index a2874a5..0685416 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; import android.util.AttributeSet; import android.view.View; @@ -48,17 +49,17 @@ setBackgroundColor(ColorUtils.getDefaultThemeColor(getResources(), true)); ColorStateList white = AppCompatResources.getColorStateList(getContext(), R.color.light_mode_tint); - mFindNextButton.setTint(white); - mFindPrevButton.setTint(white); - mCloseFindButton.setTint(white); + ImageViewCompat.setImageTintList(mFindNextButton, white); + ImageViewCompat.setImageTintList(mFindPrevButton, white); + ImageViewCompat.setImageTintList(mCloseFindButton, white); queryTextColorId = R.color.find_in_page_query_white_color; } else { setBackgroundColor(Color.WHITE); ColorStateList dark = AppCompatResources.getColorStateList(getContext(), R.color.dark_mode_tint); - mFindNextButton.setTint(dark); - mFindPrevButton.setTint(dark); - mCloseFindButton.setTint(dark); + ImageViewCompat.setImageTintList(mFindNextButton, dark); + ImageViewCompat.setImageTintList(mFindPrevButton, dark); + ImageViewCompat.setImageTintList(mCloseFindButton, dark); queryTextColorId = R.color.default_text_color; } mFindQuery.setTextColor(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java index f0cc03a..f932324 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java
@@ -6,7 +6,9 @@ import android.content.Context; import android.support.annotation.StringRes; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.util.AttributeSet; import android.view.View; @@ -16,7 +18,6 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; -import org.chromium.chrome.browser.widget.TintedImageButton; /** * A {@link View} that allows a user to toggle between incognito and normal {@link TabModel}s. This @@ -24,7 +25,7 @@ * TabModelSelector switches between normal and incognito modes. It can be subclassed (e.g. as is * done in IncognitoToggleButtonTablet) to add additional behaviors. */ -public class IncognitoToggleButton extends TintedImageButton { +public class IncognitoToggleButton extends AppCompatImageButton { // TODO(crbug.com/843749): refactor this class so it doesn't need to hold a reference to // TabModelSelector. protected TabModelSelector mTabModelSelector; @@ -73,8 +74,9 @@ */ protected void setImage(boolean isIncognitoSelected) { setImageResource(R.drawable.incognito_simple); - setTint(AppCompatResources.getColorStateList(getContext(), - isIncognitoSelected ? R.color.white_mode_tint : R.color.dark_mode_tint)); + ImageViewCompat.setImageTintList(this, + AppCompatResources.getColorStateList(getContext(), + isIncognitoSelected ? R.color.white_mode_tint : R.color.dark_mode_tint)); } private void updateButtonResource() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java index 294b6e8..55f827ab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java
@@ -10,13 +10,14 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.graphics.drawable.AnimatedVectorDrawableCompat; +import android.support.v4.widget.ImageViewCompat; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.widget.TextView; import org.chromium.chrome.R; import org.chromium.chrome.browser.widget.TintedDrawable; -import org.chromium.chrome.browser.widget.TintedImageView; /** * Default implementation of SelectableItemViewBase. @@ -28,7 +29,7 @@ protected final int mSelectedLevel; protected final AnimatedVectorDrawableCompat mCheckDrawable; - protected TintedImageView mIconView; + protected AppCompatImageView mIconView; protected TextView mTitleView; protected TextView mDescriptionView; protected ColorStateList mIconColorList; @@ -52,13 +53,13 @@ protected void onFinishInflate() { super.onFinishInflate(); - mIconView = (TintedImageView) findViewById(R.id.icon_view); + mIconView = (AppCompatImageView) findViewById(R.id.icon_view); mTitleView = (TextView) findViewById(R.id.title); mDescriptionView = (TextView) findViewById(R.id.description); if (mIconView != null) { mIconView.setBackgroundResource(R.drawable.list_item_icon_modern_bg); - mIconView.setTint(getDefaultIconTint()); + ImageViewCompat.setImageTintList(mIconView, getDefaultIconTint()); } } @@ -82,12 +83,12 @@ if (isChecked()) { mIconView.getBackground().setLevel(mSelectedLevel); mIconView.setImageDrawable(mCheckDrawable); - mIconView.setTint(mIconColorList); + ImageViewCompat.setImageTintList(mIconView, mIconColorList); mCheckDrawable.start(); } else { mIconView.getBackground().setLevel(mDefaultLevel); mIconView.setImageDrawable(mIconDrawable); - mIconView.setTint(getDefaultIconTint()); + ImageViewCompat.setImageTintList(mIconView, getDefaultIconTint()); } } @@ -112,7 +113,7 @@ * @param isSelected Whether the item is selected or not. */ public static void applyModernIconStyle( - TintedImageView imageView, Drawable defaultIcon, boolean isSelected) { + AppCompatImageView imageView, Drawable defaultIcon, boolean isSelected) { imageView.setBackgroundResource(R.drawable.list_item_icon_modern_bg); imageView.setImageDrawable(isSelected ? TintedDrawable.constructTintedDrawable(imageView.getContext(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java index 4fd14ee..1cd0dfb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java
@@ -16,6 +16,7 @@ import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatImageButton; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextUtils; @@ -44,7 +45,6 @@ import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.widget.NumberRollView; import org.chromium.chrome.browser.widget.TintedDrawable; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.displaystyle.DisplayStyleObserver; import org.chromium.chrome.browser.widget.displaystyle.HorizontalDisplayStyle; import org.chromium.chrome.browser.widget.displaystyle.UiConfig; @@ -98,7 +98,7 @@ private LinearLayout mSearchView; private EditText mSearchText; private EditText mSearchEditText; - private TintedImageButton mClearTextButton; + private AppCompatImageButton mClearTextButton; private SearchDelegate mSearchDelegate; private boolean mSearchEnabled; private boolean mIsVrEnabled; @@ -296,7 +296,7 @@ public void afterTextChanged(Editable s) {} }); - mClearTextButton = (TintedImageButton) findViewById(R.id.clear_text_button); + mClearTextButton = (AppCompatImageButton) findViewById(R.id.clear_text_button); mClearTextButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 2e2b6ec..6067c00 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1226,8 +1226,11 @@ <message name="IDS_DATA_REDUCTION_DATE_LABEL" desc="Summary text for the menu item that states the beginning date when the displayed mobile data was saved (i.e. XX MB saved 'since Feb 28')"> since <ph name="date">%1$s<ex>Feb 28</ex></ph> </message> - <message name="IDS_DATA_REDUCTION_DESCRIPTION" desc="Description text for the Data Saver feature."> - When this feature is turned on, Chrome will use Google servers to compress pages you visit before downloading them. Pages accessed using private connections (HTTPS) or in Incognito tabs will not be optimized or seen by Google. + <message name="IDS_DATA_REDUCTION_BENEFITS_DESCRIPTION" desc="Description text about the benefits of the Data Saver feature. Seen only before the user has enabled the feature."> + Use up to 60% less data and speed up the web. + </message> + <message name="IDS_DATA_REDUCTION_DESCRIPTION" desc="Text descripting how the Data Saver feature works. Seen only before the user has enabled the feature."> + When Data Saver is turned on, Chrome uses Google servers to speed up and compress page loads. On especially slow pages, Data Saver rewrites the page to load only the essential content. Data Saver does not optimize pages loaded in Incognito mode. </message> <message name="IDS_DATA_REDUCTION_MENU_ITEM_SUMMARY" desc="Summary text for data reduction menu item."> <ph name="PERCENT">%1$s<ex>49%</ex></ph> data savings
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index ba80c08..6ab6b0b0 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -268,6 +268,7 @@ "java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java", "java/src/org/chromium/chrome/browser/consent_auditor/ConsentAuditorBridge.java", "java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java", + "java/src/org/chromium/chrome/browser/contacts_picker/ContactsFetcherWorkerTask.java", "java/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialog.java", "java/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerToolbar.java", "java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java", @@ -1623,7 +1624,6 @@ "java/src/org/chromium/chrome/browser/widget/FadingShadow.java", "java/src/org/chromium/chrome/browser/widget/FadingShadowView.java", "java/src/org/chromium/chrome/browser/widget/FullscreenControlContainer.java", - "java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java", "java/src/org/chromium/chrome/browser/widget/ListMenuButton.java", "java/src/org/chromium/chrome/browser/widget/LoadingView.java", "java/src/org/chromium/chrome/browser/widget/MaterialProgressBar.java", @@ -1647,8 +1647,6 @@ "java/src/org/chromium/chrome/browser/widget/ThumbnailProvider.java", "java/src/org/chromium/chrome/browser/widget/ThumbnailProviderImpl.java", "java/src/org/chromium/chrome/browser/widget/TintedDrawable.java", - "java/src/org/chromium/chrome/browser/widget/TintedImageButton.java", - "java/src/org/chromium/chrome/browser/widget/TintedImageView.java", "java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java", "java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java", "java/src/org/chromium/chrome/browser/widget/VerticallyFixedEditText.java", @@ -2161,7 +2159,6 @@ "javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java", "javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java", - "javatests/src/org/chromium/chrome/browser/widget/ImageViewTinterTest.java", "javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java", "javatests/src/org/chromium/chrome/browser/widget/PromoDialogTest.java", "javatests/src/org/chromium/chrome/browser/widget/RadioButtonLayoutTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java index 48fc68b8..5137015 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java
@@ -23,6 +23,7 @@ import android.support.test.InstrumentationRegistry; import android.support.test.espresso.intent.rule.IntentsTestRule; import android.support.test.filters.SmallTest; +import android.support.v7.widget.AppCompatImageButton; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.TextUtils; @@ -52,7 +53,6 @@ import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; import org.chromium.chrome.browser.signin.SignoutReason; import org.chromium.chrome.browser.widget.DateDividedAdapter; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.selection.SelectableItemView; import org.chromium.chrome.browser.widget.selection.SelectableItemViewHolder; import org.chromium.chrome.browser.widget.selection.SelectionDelegate.SelectionObserver; @@ -190,7 +190,7 @@ ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - ((TintedImageButton) itemView.findViewById(R.id.remove)).performClick(); + ((AppCompatImageButton) itemView.findViewById(R.id.remove)).performClick(); } });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java index 0bc7323..0919498 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.omnibox; import android.support.test.filters.SmallTest; +import android.support.v7.widget.AppCompatImageButton; import android.view.View; import org.junit.Assert; @@ -24,7 +25,6 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceTestUtils; import org.chromium.chrome.browser.toolbar.ToolbarModel; -import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; @@ -131,16 +131,17 @@ return (LocationBarLayout) mActivityTestRule.getActivity().findViewById(R.id.location_bar); } - private TintedImageButton getDeleteButton() { - return (TintedImageButton) mActivityTestRule.getActivity().findViewById(R.id.delete_button); + private AppCompatImageButton getDeleteButton() { + return (AppCompatImageButton) mActivityTestRule.getActivity().findViewById( + R.id.delete_button); } - private TintedImageButton getMicButton() { - return (TintedImageButton) mActivityTestRule.getActivity().findViewById(R.id.mic_button); + private AppCompatImageButton getMicButton() { + return (AppCompatImageButton) mActivityTestRule.getActivity().findViewById(R.id.mic_button); } - private TintedImageButton getSecurityButton() { - return (TintedImageButton) mActivityTestRule.getActivity().findViewById( + private AppCompatImageButton getSecurityButton() { + return (AppCompatImageButton) mActivityTestRule.getActivity().findViewById( R.id.security_button); } @@ -269,7 +270,7 @@ mTestToolbarModel.setSecurityLevel(ConnectionSecurityLevel.NONE); setUrlToPageUrl(locationBar); - TintedImageButton securityButton = getSecurityButton(); + AppCompatImageButton securityButton = getSecurityButton(); Assert.assertNotEquals(SEARCH_TERMS, urlBar.getText().toString()); ThreadUtils.runOnUiThreadBlocking(() -> { Assert.assertNotEquals(mTestToolbarModel.getSecurityIconResource( @@ -289,7 +290,7 @@ mTestToolbarModel.setSecurityLevel(ConnectionSecurityLevel.SECURE); setUrlToPageUrl(locationBar); - TintedImageButton securityButton = getSecurityButton(); + AppCompatImageButton securityButton = getSecurityButton(); Assert.assertEquals(securityButton.getVisibility(), View.VISIBLE); ThreadUtils.runOnUiThreadBlocking(() -> { Assert.assertEquals(mTestToolbarModel.getSecurityIconResource(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ImageViewTinterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ImageViewTinterTest.java deleted file mode 100644 index 9ec150a3d..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ImageViewTinterTest.java +++ /dev/null
@@ -1,180 +0,0 @@ -// 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.widget; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.rule.UiThreadTestRule; -import android.support.v7.content.res.AppCompatResources; -import android.view.LayoutInflater; -import android.view.View.MeasureSpec; -import android.view.ViewGroup; -import android.widget.ImageView; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.widget.ImageViewTinter.ImageViewTinterOwner; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; - -/** - * Tests the classes that use ImageViewTinter. - * - * In an ideal world, these tests would simply use an XmlPullParser and XML that is defined inside - * this test, but Android explicitly disallows that because it pre-processes the XML files: - * https://developer.android.com/reference/android/view/LayoutInflater.html - * - * An alternative would be to have test-specific layout directories, but these don't seem to be - * able to reference the instrumented package's resources. Instead, the tests reference XML for - * actual controls used in the production app. - */ -@RunWith(ChromeJUnit4ClassRunner.class) -public class ImageViewTinterTest { - @Rule - public UiThreadTestRule mRule = new UiThreadTestRule(); - - private Context mContext; - - @Before - public void setUp() throws Exception { - mContext = InstrumentationRegistry.getTargetContext(); - mContext.setTheme(R.style.MainTheme); - } - - @Test - @SmallTest - public void testTintedImageView_attributeParsingExplicitTint() throws Exception { - // The tint is explicitly set to a blue in the XML. - int color = ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.blue_mode_tint); - TintedImageView clearStorageView = (TintedImageView) LayoutInflater.from(mContext).inflate( - R.layout.clear_storage, null, false); - Assert.assertNotNull(clearStorageView.getColorFilter()); - Assert.assertTrue(checkIfTintWasApplied(clearStorageView, color)); - } - - @Test - @SmallTest - public void testTintedImageButton_attributeParsingExplicitTint() throws Exception { - // The tint was explicitly set to a color. - int color = ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.dark_mode_tint); - TintedImageButton colorTint = - createImageView(R.layout.search_toolbar, R.id.clear_text_button); - Assert.assertNotNull(colorTint.getColorFilter()); - Assert.assertTrue(checkIfTintWasApplied(colorTint, color)); - } - - @Test - @SmallTest - public void testTintedImageView_attributeParsingNullTint() throws Exception { - // The tint is explicitly set to null in the XML. - int color = ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.blue_mode_tint); - TintedImageView nullTint = createImageView(R.layout.title_button_menu_item, R.id.checkbox); - Assert.assertNull(nullTint.getColorFilter()); - Assert.assertFalse(checkIfTintWasApplied(nullTint, color)); - } - - @Test - @SmallTest - public void testTintedImageButton_attributeParsingNullTint() throws Exception { - // The tint is explicitly set to null in the XML. An image resource needs to be set here - // because the layout doesn't define one by default. - int color = - ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.blue_when_enabled); - TintedImageButton nullTint = createImageView(R.layout.title_button_menu_item, R.id.button); - Assert.assertNull(nullTint.getColorFilter()); - nullTint.setImageResource(R.drawable.plus); - Assert.assertFalse(checkIfTintWasApplied(nullTint, color)); - } - - @Test - @SmallTest - public void testTintedImageView_setTint() throws Exception { - // The tint is explicitly set to null for this object in the XML. - TintedImageView nullTint = createImageView(R.layout.title_button_menu_item, R.id.checkbox); - checkSetTintWorksCorrectly(nullTint); - } - - @Test - @SmallTest - public void testTintedImageButton_setTint() throws Exception { - // The tint is explicitly set to null for this object in the XML. - TintedImageButton nullTint = createImageView(R.layout.title_button_menu_item, R.id.button); - checkSetTintWorksCorrectly(nullTint); - } - - private void checkSetTintWorksCorrectly(ImageViewTinterOwner view) { - ImageView imageView = (ImageView) view; - int color = ApiCompatibilityUtils.getColor( - mContext.getResources(), R.color.default_icon_color_blue); - - Assert.assertNull(imageView.getColorFilter()); - if (imageView.getDrawable() == null) { - // An image resource is set here in case the layout does not define one. - imageView.setImageResource(R.drawable.plus); - } - Assert.assertFalse(checkIfTintWasApplied(view, color)); - - // Set the tint to one color. - ColorStateList colorList = - AppCompatResources.getColorStateList(mContext, R.color.light_active_color); - view.setTint(colorList); - Assert.assertNotNull(imageView.getColorFilter()); - Assert.assertTrue(checkIfTintWasApplied(view, color)); - - // Clear it out. - view.setTint(null); - Assert.assertNull(imageView.getColorFilter()); - Assert.assertFalse(checkIfTintWasApplied(view, color)); - - // Set it to another color. - int otherColor = - ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.google_red_700); - ColorStateList otherColorList = - AppCompatResources.getColorStateList(mContext, R.color.google_red_700); - view.setTint(otherColorList); - Assert.assertNotNull(imageView.getColorFilter()); - Assert.assertTrue(checkIfTintWasApplied(view, otherColor)); - } - - @SuppressWarnings("unchecked") - private <T extends ImageView> T createImageView(int layoutId, int ownerId) { - ViewGroup root = (ViewGroup) LayoutInflater.from(mContext).inflate(layoutId, null, false); - return (T) root.findViewById(ownerId); - } - - private boolean checkIfTintWasApplied( - ImageViewTinterOwner imageViewTinterOwner, int expectedColor) { - int unspecifiedSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - Assert.assertTrue(imageViewTinterOwner instanceof ImageView); - ImageView imageView = (ImageView) imageViewTinterOwner; - imageView.measure(unspecifiedSpec, unspecifiedSpec); - imageView.layout(0, 0, imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); - - // Draw the ImageView into a Canvas so we can check that the tint was applied. - Drawable drawable = imageView.getDrawable(); - Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - imageViewTinterOwner.onDraw(canvas); - - // Search for any pixel that is of the expected color. - for (int x = 0; x < bitmap.getWidth(); x++) { - for (int y = 0; y < bitmap.getHeight(); y++) { - if (expectedColor == bitmap.getPixel(x, y)) return true; - } - } - return false; - } -}
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index dc892268..7ebaa62 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-71.0.3567.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-71.0.3568.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java index 4d57c37..d81219d 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java
@@ -224,6 +224,27 @@ } /** + * Sets the Wallet card and address data to be served in following GetUpdates requests. Note + * that (opposed to the native implementation) this currently only accepts a single entity, + * because that's all we needed so far. + * + * @param entity the SyncEntity to serve for Wallet. + */ + public void setWalletData(final SyncEntity entity) { + checkFakeServerInitialized("useFakeServer must be called before data injection."); + ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Void>() { + @Override + public Void call() { + // The protocol buffer is serialized as a byte array because it can be easily + // deserialized from this format in native code. + nativeSetWalletData( + mNativeFakeServerHelperAndroid, sNativeFakeServer, entity.toByteArray()); + return null; + } + }); + } + + /** * Modify the specifics of an entity on the fake Sync server. * * @param id the ID of the entity whose specifics to modify @@ -400,6 +421,8 @@ private native void nativeInjectUniqueClientEntity( long nativeFakeServerHelperAndroid, long nativeFakeServer, String name, byte[] serializedEntitySpecifics); + private native void nativeSetWalletData( + long nativeFakeServerHelperAndroid, long nativeFakeServer, byte[] serializedEntity); private native void nativeModifyEntitySpecifics(long nativeFakeServerHelperAndroid, long nativeFakeServer, String id, byte[] serializedEntitySpecifics); private native void nativeInjectBookmarkEntity(
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java index 49cd8e7..3d82320 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java
@@ -31,7 +31,6 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.autofill.CardType; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.preferences.Preferences; @@ -45,6 +44,10 @@ import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.components.sync.ModelType; import org.chromium.components.sync.PassphraseType; +import org.chromium.components.sync.protocol.AutofillWalletSpecifics; +import org.chromium.components.sync.protocol.EntitySpecifics; +import org.chromium.components.sync.protocol.SyncEntity; +import org.chromium.components.sync.protocol.WalletMaskedCreditCard; import java.util.Collection; import java.util.Collections; @@ -766,13 +769,31 @@ } private void addServerAutofillCreditCard() { - ThreadUtils.runOnUiThreadBlocking(() -> { - boolean isLocal = false; - PersonalDataManager.getInstance().addServerCreditCardForTest(new CreditCard("", - "https://example.com", isLocal, false, "Jon Doe", "4111111111111111", - "1111", "11", "20", "visa", 0, CardType.UNKNOWN, "" /* billingAddressId */, - "025eb937c022489eb8dc78cbaa969218" /* serverId */)); - }); + final String serverId = "025eb937c022489eb8dc78cbaa969218"; + WalletMaskedCreditCard card = + WalletMaskedCreditCard.newBuilder() + .setId(serverId) + .setStatus(WalletMaskedCreditCard.WalletCardStatus.VALID) + .setNameOnCard("Jon Doe") + .setType(WalletMaskedCreditCard.WalletCardType.UNKNOWN) + .setLastFour("1111") + .setExpMonth(11) + .setExpYear(2020) + .build(); + AutofillWalletSpecifics wallet_specifics = + AutofillWalletSpecifics.newBuilder() + .setType(AutofillWalletSpecifics.WalletInfoType.MASKED_CREDIT_CARD) + .setMaskedCard(card) + .build(); + EntitySpecifics specifics = + EntitySpecifics.newBuilder().setAutofillWallet(wallet_specifics).build(); + SyncEntity entity = SyncEntity.newBuilder() + .setName(serverId) + .setIdString(serverId) + .setSpecifics(specifics) + .build(); + mSyncTestRule.getFakeServerHelper().setWalletData(entity); + SyncTestUtil.triggerSyncAndWaitForCompletion(); } private boolean hasServerAutofillCreditCards() {
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index ebdab35db..97b94c4 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4406,6 +4406,8 @@ "supervised_user/supervised_user_site_list.h", "supervised_user/supervised_user_sync_data_type_controller.cc", "supervised_user/supervised_user_sync_data_type_controller.h", + "supervised_user/supervised_user_sync_model_type_controller.cc", + "supervised_user/supervised_user_sync_model_type_controller.h", "supervised_user/supervised_user_url_filter.cc", "supervised_user/supervised_user_url_filter.h", "supervised_user/supervised_user_whitelist_service.cc",
diff --git a/chrome/browser/android/download/download_media_parser.cc b/chrome/browser/android/download/download_media_parser.cc index 78e6cd6..9bbbed9 100644 --- a/chrome/browser/android/download/download_media_parser.cc +++ b/chrome/browser/android/download/download_media_parser.cc
@@ -229,15 +229,8 @@ void DownloadMediaParser::RenderVideoFrame( scoped_refptr<media::VideoFrame> video_frame) { - media::Context3D context; - gpu::ContextSupport* context_support = nullptr; auto context_provider = gpu_factories_ ? gpu_factories_->GetMediaContextProvider() : nullptr; - if (context_provider) { - context = media::Context3D(context_provider->ContextGL(), - context_provider->GrContext()); - context_support = context_provider->ContextSupport(); - } media::PaintCanvasVideoRenderer renderer; SkBitmap bitmap; @@ -246,7 +239,11 @@ // Draw the video frame to |bitmap|. cc::SkiaPaintCanvas canvas(bitmap); - renderer.Copy(video_frame, &canvas, context, context_support); + media::Context3D context = + context_provider ? media::Context3D(context_provider->ContextGL(), + context_provider->GrContext()) + : media::Context3D(); + renderer.Copy(video_frame, &canvas, context); NotifyComplete(std::move(bitmap)); }
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc index ec8c3cb..b12f99f 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -233,14 +233,10 @@ std::string job_unique_id = fetch_description->job_unique_id; DCHECK(!job_details_map_.count(job_unique_id)); - auto emplace_result = job_details_map_.emplace( + job_details_map_.emplace( job_unique_id, JobDetails(std::move(fetch_description), provider_namespace_, profile_->IsOffTheRecord())); - - const JobDetails& details = emplace_result.first->second; - for (auto* observer : observers_) - observer->OnItemsAdded({details.offline_item}); } void BackgroundFetchDelegateImpl::DownloadUrl( @@ -251,7 +247,6 @@ const net::NetworkTrafficAnnotationTag& traffic_annotation, const net::HttpRequestHeaders& headers) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DCHECK(job_details_map_.count(job_unique_id)); DCHECK(!download_job_unique_id_map_.count(download_guid)); @@ -269,6 +264,14 @@ net::MutableNetworkTrafficAnnotationTag(traffic_annotation); JobDetails& job_details = job_details_map_.find(job_unique_id)->second; + + if (!job_details.started) { + // Create a notification. + for (auto* observer : observers_) + observer->OnItemsAdded({job_details.offline_item}); + job_details.started = true; + } + if (job_details.paused) { job_details.on_resume = base::BindOnce(&BackgroundFetchDelegateImpl::StartDownload, @@ -634,8 +637,14 @@ std::set<std::string> BackgroundFetchDelegateImpl::TakeOutstandingGuids() { std::set<std::string> outstanding_guids; for (auto& job_id_details : job_details_map_) { + auto& job_details = job_id_details.second; + + // If the job is loaded at this point, then it already started + // in a previous session. + job_details.started = true; + std::vector<std::string>& job_outstanding_guids = - job_id_details.second.fetch_description->outstanding_guids; + job_details.fetch_description->outstanding_guids; for (std::string& outstanding_guid : job_outstanding_guids) outstanding_guids.insert(std::move(outstanding_guid)); job_outstanding_guids.clear();
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h index 776b723..54325043 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -128,6 +128,7 @@ void UpdateOfflineItem(); + bool started = false; bool cancelled = false; bool paused = false;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 976f240..e74c82e 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1577,12 +1577,6 @@ "policy/value_validation/onc_policy_value_validator_base.h", "policy/value_validation/onc_user_policy_value_validator.cc", "policy/value_validation/onc_user_policy_value_validator.h", - "policy/weekly_time/time_utils.cc", - "policy/weekly_time/time_utils.h", - "policy/weekly_time/weekly_time.cc", - "policy/weekly_time/weekly_time.h", - "policy/weekly_time/weekly_time_interval.cc", - "policy/weekly_time/weekly_time_interval.h", "policy/wildcard_login_checker.cc", "policy/wildcard_login_checker.h", "power/auto_screen_brightness/als_reader.h", @@ -2270,9 +2264,6 @@ "policy/upload_job_unittest.cc", "policy/user_cloud_policy_manager_chromeos_unittest.cc", "policy/user_cloud_policy_store_chromeos_unittest.cc", - "policy/weekly_time/time_utils_unittest.cc", - "policy/weekly_time/weekly_time_interval_unittest.cc", - "policy/weekly_time/weekly_time_unittest.cc", "power/auto_screen_brightness/als_reader_impl_unittest.cc", "power/auto_screen_brightness/brightness_monitor_impl_unittest.cc", "power/auto_screen_brightness/modeller_impl_unittest.cc",
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index 1f69cc1..cb9622c4 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -335,6 +335,7 @@ TestCase("openQuickView").InGuestMode(), TestCase("openQuickView").TabletMode(), TestCase("openQuickViewScrollText"), + TestCase("openQuickViewScrollHtml"), TestCase("openQuickViewDrive"), TestCase("openQuickViewDrive").EnableDriveFs(), TestCase("openQuickViewUsb"),
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager.cc b/chrome/browser/chromeos/login/users/chrome_user_manager.cc index d404f21..fa480eb 100644 --- a/chrome/browser/chromeos/login/users/chrome_user_manager.cc +++ b/chrome/browser/chromeos/login/users/chrome_user_manager.cc
@@ -22,7 +22,7 @@ namespace chromeos { namespace { -bool IsManagedSessionEnabled(const user_manager::User* active_user) { +bool IsManagedSessionEnabled(const user_manager::User& active_user) { // If the service doesn't exist or the policy is not set, enable managed // session by default. const bool managed_session_enabled_by_default = true; @@ -35,7 +35,7 @@ return managed_session_enabled_by_default; const policy::PolicyMap::Entry* entry = - service->GetBrokerForUser(active_user->GetAccountId().GetUserEmail()) + service->GetBrokerForUser(active_user.GetAccountId().GetUserEmail()) ->core() ->store() ->policy_map() @@ -47,6 +47,40 @@ return entry && entry->value && entry->value->GetBool(); } +LoginState::LoggedInUserType GetLoggedInUserType( + const user_manager::User& active_user, + bool is_current_user_owner) { + if (is_current_user_owner) + return LoginState::LOGGED_IN_USER_OWNER; + + switch (active_user.GetType()) { + case user_manager::USER_TYPE_REGULAR: + return LoginState::LOGGED_IN_USER_REGULAR; + case user_manager::USER_TYPE_GUEST: + return LoginState::LOGGED_IN_USER_GUEST; + case user_manager::USER_TYPE_PUBLIC_ACCOUNT: + return IsManagedSessionEnabled(active_user) + ? LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED + : LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT; + case user_manager::USER_TYPE_SUPERVISED: + return LoginState::LOGGED_IN_USER_SUPERVISED; + case user_manager::USER_TYPE_KIOSK_APP: + return LoginState::LOGGED_IN_USER_KIOSK_APP; + case user_manager::USER_TYPE_CHILD: + return LoginState::LOGGED_IN_USER_CHILD; + case user_manager::USER_TYPE_ARC_KIOSK_APP: + return LoginState::LOGGED_IN_USER_ARC_KIOSK_APP; + case user_manager::USER_TYPE_ACTIVE_DIRECTORY: + // NOTE(olsen) There's no LOGGED_IN_USER_ACTIVE_DIRECTORY - is it needed? + return LoginState::LOGGED_IN_USER_REGULAR; + case user_manager::NUM_USER_TYPES: + break; // Go to invalid-type handling code. + // Since there is no default, the compiler warns about unhandled types. + } + NOTREACHED() << "Invalid type for active user: " << active_user.GetType(); + return LoginState::LOGGED_IN_USER_REGULAR; +} + } // namespace ChromeUserManager::ChromeUserManager( @@ -70,37 +104,22 @@ if (!LoginState::IsInitialized()) return; // LoginState may be uninitialized in tests. - chromeos::LoginState::LoggedInState logged_in_state; - logged_in_state = active_user ? chromeos::LoginState::LOGGED_IN_ACTIVE - : chromeos::LoginState::LOGGED_IN_NONE; - - chromeos::LoginState::LoggedInUserType login_user_type; - if (logged_in_state == chromeos::LoginState::LOGGED_IN_NONE) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_NONE; - } else if (is_current_user_owner) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_OWNER; - } else if (active_user->GetType() == user_manager::USER_TYPE_GUEST) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_GUEST; - } else if (active_user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT) { - login_user_type = - IsManagedSessionEnabled(active_user) - ? chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED - : chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT; - } else if (active_user->GetType() == user_manager::USER_TYPE_SUPERVISED) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_SUPERVISED; - } else if (active_user->GetType() == user_manager::USER_TYPE_KIOSK_APP) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_KIOSK_APP; - } else if (active_user->GetType() == user_manager::USER_TYPE_ARC_KIOSK_APP) { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_ARC_KIOSK_APP; + LoginState::LoggedInState logged_in_state; + LoginState::LoggedInUserType logged_in_user_type; + if (active_user) { + logged_in_state = LoginState::LOGGED_IN_ACTIVE; + logged_in_user_type = + GetLoggedInUserType(*active_user, is_current_user_owner); } else { - login_user_type = chromeos::LoginState::LOGGED_IN_USER_REGULAR; + logged_in_state = LoginState::LOGGED_IN_NONE; + logged_in_user_type = LoginState::LOGGED_IN_USER_NONE; } if (primary_user) { LoginState::Get()->SetLoggedInStateAndPrimaryUser( - logged_in_state, login_user_type, primary_user->username_hash()); + logged_in_state, logged_in_user_type, primary_user->username_hash()); } else { - LoginState::Get()->SetLoggedInState(logged_in_state, login_user_type); + LoginState::Get()->SetLoggedInState(logged_in_state, logged_in_user_type); } }
diff --git a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder.cc b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder.cc index 1db876b..25303fdb 100644 --- a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder.cc +++ b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder.cc
@@ -10,8 +10,8 @@ #include "base/optional.h" #include "base/time/time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" using base::DictionaryValue; using base::ListValue;
diff --git a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder_unittest.cc b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder_unittest.cc index 91d9243..354c5de 100644 --- a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder_unittest.cc +++ b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder_unittest.cc
@@ -13,8 +13,8 @@ #include "base/optional.h" #include "base/time/time.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "testing/gtest/include/gtest/gtest.h" namespace em = enterprise_management;
diff --git a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils.cc b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils.cc index 476126f2..d6132ac 100644 --- a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils.cc +++ b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils.cc
@@ -8,9 +8,9 @@ #include "base/time/clock.h" #include "base/values.h" #include "chrome/browser/chromeos/policy/device_auto_update_time_restrictions_decoder.h" -#include "chrome/browser/chromeos/policy/weekly_time/time_utils.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/time_utils.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chromeos/settings/cros_settings_names.h" #include "third_party/icu/source/i18n/unicode/timezone.h"
diff --git a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils_unittest.cc b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils_unittest.cc index b81fc5f..3661376 100644 --- a/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils_unittest.cc +++ b/chrome/browser/chromeos/policy/device_auto_update_time_restrictions_utils_unittest.cc
@@ -12,8 +12,8 @@ #include "base/test/simple_test_clock.h" #include "base/time/time.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h" #include "chromeos/settings/cros_settings_names.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc b/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc index 75f4cf8b..df7568d 100644 --- a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc +++ b/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc
@@ -15,7 +15,7 @@ #include "base/time/time.h" #include "chrome/browser/chromeos/login/users/chrome_user_manager_util.h" #include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" -#include "chrome/browser/chromeos/policy/weekly_time/time_utils.h" +#include "chromeos/policy/weekly_time/time_utils.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h b/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h index f8f3f47..e9efd3ef 100644 --- a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h +++ b/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h
@@ -14,7 +14,7 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "chromeos/dbus/power_manager_client.h" #include "chromeos/dbus/system_clock_client.h" #include "components/policy/proto/chrome_device_policy.pb.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc b/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc index 82faccc..ce7323c3 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc +++ b/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc
@@ -7,8 +7,8 @@ #include <utility> #include "base/logging.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc index f933bf88b..8a90951e 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc +++ b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc
@@ -7,7 +7,7 @@ #include "base/logging.h" #include "base/time/default_clock.h" #include "base/time/time.h" -#include "chrome/browser/chromeos/policy/weekly_time/time_utils.h" +#include "chromeos/policy/weekly_time/time_utils.h" namespace em = enterprise_management;
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h index 88c136dd..8d5caf1 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h +++ b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h
@@ -11,8 +11,8 @@ #include "base/optional.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "components/policy/proto/chrome_device_policy.pb.h" namespace base {
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc index e6b4538..4028110 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc +++ b/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc
@@ -8,8 +8,8 @@ #include "base/logging.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/settings/system_settings_provider.cc b/chrome/browser/chromeos/settings/system_settings_provider.cc index 7f96218..68c2060 100644 --- a/chrome/browser/chromeos/settings/system_settings_provider.cc +++ b/chrome/browser/chromeos/settings/system_settings_provider.cc
@@ -8,8 +8,8 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/chromeos/system/timezone_util.h" +#include "chromeos/login/login_state.h" #include "chromeos/settings/cros_settings_names.h" -#include "components/user_manager/user_manager.h" namespace chromeos { @@ -33,14 +33,11 @@ void SystemSettingsProvider::DoSet(const std::string& path, const base::Value& in_value) { - user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser(); - if (!user || !user->is_logged_in()) - return; - user_manager::UserType userType = user->GetType(); - // Guest, child, or public accounts cannot change the time zone. - if (userType == user_manager::USER_TYPE_GUEST || - userType == user_manager::USER_TYPE_CHILD || - userType == user_manager::USER_TYPE_PUBLIC_ACCOUNT) { + // Guest, public, or child accounts cannot change the time zone. + if (!LoginState::Get()->IsUserLoggedIn() || + LoginState::Get()->IsGuestSessionUser() || + LoginState::Get()->IsPublicSessionUser() || + LoginState::Get()->IsChildUser()) { return; }
diff --git a/chrome/browser/devtools/devtools_eye_dropper.h b/chrome/browser/devtools/devtools_eye_dropper.h index 5c0c293..aaa87d2 100644 --- a/chrome/browser/devtools/devtools_eye_dropper.h +++ b/chrome/browser/devtools/devtools_eye_dropper.h
@@ -12,6 +12,7 @@ #include "components/viz/host/client_frame_sink_video_capturer.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents_observer.h" +#include "media/renderers/paint_canvas_video_renderer.h" #include "third_party/skia/include/core/SkBitmap.h" namespace blink { @@ -58,6 +59,7 @@ content::RenderWidgetHost::MouseEventCallback mouse_event_callback_; content::RenderWidgetHost* host_; std::unique_ptr<viz::ClientFrameSinkVideoCapturer> video_capturer_; + media::PaintCanvasVideoRenderer video_renderer_; base::WeakPtrFactory<DevToolsEyeDropper> weak_factory_; DISALLOW_COPY_AND_ASSIGN(DevToolsEyeDropper);
diff --git a/chrome/browser/prefs/pref_service_incognito_whitelist.cc b/chrome/browser/prefs/pref_service_incognito_whitelist.cc index 026dc1c..9b85d0a5 100644 --- a/chrome/browser/prefs/pref_service_incognito_whitelist.cc +++ b/chrome/browser/prefs/pref_service_incognito_whitelist.cc
@@ -209,7 +209,6 @@ // audited, checked with owners, and removed or transfered to // |kPersistentPrefNames|. const char* const kTemporaryIncognitoWhitelist[] = { - prefs::kMediaDeviceIdSalt, prefs::kClearPluginLSODataEnabled, };
diff --git a/chrome/browser/profiles/profiles_state.cc b/chrome/browser/profiles/profiles_state.cc index b58cc4af..5b397f53 100644 --- a/chrome/browser/profiles/profiles_state.cc +++ b/chrome/browser/profiles/profiles_state.cc
@@ -15,15 +15,17 @@ #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" +#include "components/signin/core/browser/account_info.h" #include "content/public/browser/browsing_data_remover.h" #include "content/public/browser/resource_dispatcher_host.h" +#include "services/identity/public/cpp/identity_manager.h" #include "ui/base/l10n/l10n_util.h" #if defined(OS_CHROMEOS) @@ -144,18 +146,22 @@ base::UTF16ToUTF8(new_profile_name)); } -std::vector<std::string> GetSecondaryAccountsForSignedInProfile( +std::vector<AccountInfo> GetSecondaryAccountsForSignedInProfile( Profile* profile) { - std::vector<std::string> accounts = - ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->GetAccounts(); - std::string primary_account = - SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedAccountId(); - DCHECK(!primary_account.empty()); + auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); + std::vector<AccountInfo> accounts = + identity_manager->GetAccountsWithRefreshTokens(); - // The vector returned by ProfileOAuth2TokenService::GetAccounts() contains + // The vector returned by GetAccountsWithRefreshTokens() contains // the primary account too, so we need to remove it from the list. - std::vector<std::string>::iterator primary_index = - std::find(accounts.begin(), accounts.end(), primary_account); + DCHECK(identity_manager->HasPrimaryAccount()); + AccountInfo primary_account = identity_manager->GetPrimaryAccountInfo(); + + std::vector<AccountInfo>::iterator primary_index = std::find_if( + accounts.begin(), accounts.end(), + [&primary_account](const AccountInfo& account_info) { + return account_info.account_id == primary_account.account_id; + }); DCHECK(primary_index != accounts.end()); accounts.erase(primary_index);
diff --git a/chrome/browser/profiles/profiles_state.h b/chrome/browser/profiles/profiles_state.h index 89be5774..29e5cb0 100644 --- a/chrome/browser/profiles/profiles_state.h +++ b/chrome/browser/profiles/profiles_state.h
@@ -23,6 +23,8 @@ namespace base { class FilePath; } +struct AccountInfo; + namespace profiles { // Assortment of methods for dealing with profiles. @@ -66,7 +68,7 @@ // Returns the list of secondary accounts for a specific // |profile|. Note that the profile must be signed in. -std::vector<std::string> GetSecondaryAccountsForSignedInProfile( +std::vector<AccountInfo> GetSecondaryAccountsForSignedInProfile( Profile* profile); #endif // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc index b5daa08..328576de 100644 --- a/chrome/browser/signin/dice_browsertest.cc +++ b/chrome/browser/signin/dice_browsertest.cc
@@ -39,10 +39,12 @@ #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/browser/ui/webui/signin/login_ui_test_utils.h" +#include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/prefs/pref_service.h" #include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/dice_header_helper.h" @@ -52,6 +54,7 @@ #include "components/signin/core/browser/signin_header_helper.h" #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_metrics.h" +#include "components/signin/core/browser/signin_pref_names.h" #include "components/sync/base/sync_prefs.h" #include "components/sync/user_events/user_event_service.h" #include "components/variations/variations_switches.h" @@ -1022,3 +1025,49 @@ EXPECT_TRUE(login_ui_test_utils::DismissSyncConfirmationDialog( browser(), base::TimeDelta::FromSeconds(30))); } + +// Tests that turning off Dice via preferences works. +IN_PROC_BROWSER_TEST_F(DiceBrowserTest, PRE_TurnOffDice) { + // Sign the profile in. + SetupSignedInAccounts(); + syncer::SyncPrefs(browser()->profile()->GetPrefs()).SetFirstSetupComplete(); + + EXPECT_TRUE(AccountConsistencyModeManager::IsDiceEnabledForProfile( + browser()->profile())); + + EXPECT_FALSE(GetSigninManager()->GetAuthenticatedAccountId().empty()); + EXPECT_TRUE(GetSigninManager()->GetAccountIdForAuthInProgress().empty()); + EXPECT_TRUE(GetTokenService()->RefreshTokenIsAvailable(GetMainAccountID())); + EXPECT_FALSE(GetAccountTrackerService()->GetAccounts().empty()); + + // Turn off Dice for this profile. + browser()->profile()->GetPrefs()->SetBoolean( + prefs::kSigninAllowedOnNextStartup, false); +} + +IN_PROC_BROWSER_TEST_F(DiceBrowserTest, TurnOffDice) { + // Check that Dice is disabled. + EXPECT_FALSE( + browser()->profile()->GetPrefs()->GetBoolean(prefs::kSigninAllowed)); + EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( + prefs::kSigninAllowedOnNextStartup)); + EXPECT_FALSE(AccountConsistencyModeManager::IsDiceEnabledForProfile( + browser()->profile())); + + EXPECT_TRUE(GetSigninManager()->GetAuthenticatedAccountId().empty()); + EXPECT_TRUE(GetSigninManager()->GetAccountIdForAuthInProgress().empty()); + EXPECT_FALSE(GetTokenService()->RefreshTokenIsAvailable(GetMainAccountID())); + // TODO(msarda): We still load the old primary account from prefs, so the + // AccountTrackerService is non-empty. + // EXPECT_TRUE(GetAccountTrackerService()->GetAccounts().empty()); +} + +// Checks that Dice is disabled in incognito mode. +IN_PROC_BROWSER_TEST_F(DiceBrowserTest, Incognito) { + Browser* incognito_browser = new Browser(Browser::CreateParams( + browser()->profile()->GetOffTheRecordProfile(), true)); + + // Check that Dice is disabled. + EXPECT_FALSE(AccountConsistencyModeManager::IsDiceEnabledForProfile( + incognito_browser->profile())); +}
diff --git a/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.cc b/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.cc new file mode 100644 index 0000000..3ed4c88 --- /dev/null +++ b/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.cc
@@ -0,0 +1,33 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/supervised_user/supervised_user_sync_model_type_controller.h" + +#include "base/bind.h" +#include "chrome/browser/profiles/profile.h" +#include "components/sync/driver/sync_client.h" +#include "components/sync/model/model_type_store_service.h" + +SupervisedUserSyncModelTypeController::SupervisedUserSyncModelTypeController( + syncer::ModelType type, + const Profile* profile, + syncer::SyncClient* sync_client) + : SyncableServiceBasedModelTypeController( + type, + sync_client->GetModelTypeStoreService()->GetStoreFactory(), + base::BindOnce(&syncer::SyncClient::GetSyncableServiceForType, + base::Unretained(sync_client), + type)), + profile_(profile) { + DCHECK(type == syncer::SUPERVISED_USER_SETTINGS || + type == syncer::SUPERVISED_USER_WHITELISTS); +} + +SupervisedUserSyncModelTypeController:: + ~SupervisedUserSyncModelTypeController() {} + +bool SupervisedUserSyncModelTypeController::ReadyForStart() const { + DCHECK(CalledOnValidThread()); + return profile_->IsSupervised(); +}
diff --git a/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.h b/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.h new file mode 100644 index 0000000..cbd908f5 --- /dev/null +++ b/chrome/browser/supervised_user/supervised_user_sync_model_type_controller.h
@@ -0,0 +1,37 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_MODEL_TYPE_CONTROLLER_H_ +#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_MODEL_TYPE_CONTROLLER_H_ + +#include "base/macros.h" +#include "components/sync/driver/syncable_service_based_model_type_controller.h" + +class Profile; + +namespace syncer { +class SyncClient; +} + +// A DataTypeController for supervised user sync datatypes, which enables or +// disables these types based on the profile's IsSupervised state. +class SupervisedUserSyncModelTypeController + : public syncer::SyncableServiceBasedModelTypeController { + public: + // |sync_client| and |profile| must not be null and must outlive this object. + SupervisedUserSyncModelTypeController(syncer::ModelType type, + const Profile* profile, + syncer::SyncClient* sync_client); + ~SupervisedUserSyncModelTypeController() override; + + // DataTypeController override. + bool ReadyForStart() const override; + + private: + const Profile* const profile_; + + DISALLOW_COPY_AND_ASSIGN(SupervisedUserSyncModelTypeController); +}; + +#endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_MODEL_TYPE_CONTROLLER_H_
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index 4f26426..f17acca 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -106,6 +106,7 @@ #include "chrome/browser/supervised_user/supervised_user_settings_service.h" #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" #include "chrome/browser/supervised_user/supervised_user_sync_data_type_controller.h" +#include "chrome/browser/supervised_user/supervised_user_sync_model_type_controller.h" #include "chrome/browser/supervised_user/supervised_user_whitelist_service.h" #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) @@ -290,10 +291,22 @@ &syncer::ReportUnrecoverableError, chrome::GetChannel()); #if BUILDFLAG(ENABLE_SUPERVISED_USERS) - controllers.push_back(std::make_unique<SupervisedUserSyncDataTypeController>( - syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_)); - controllers.push_back(std::make_unique<SupervisedUserSyncDataTypeController>( - syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, profile_)); + if (base::FeatureList::IsEnabled(switches::kSyncPseudoUSSSupervisedUsers)) { + controllers.push_back( + std::make_unique<SupervisedUserSyncModelTypeController>( + syncer::SUPERVISED_USER_SETTINGS, profile_, this)); + controllers.push_back( + std::make_unique<SupervisedUserSyncModelTypeController>( + syncer::SUPERVISED_USER_WHITELISTS, profile_, this)); + } else { + controllers.push_back( + std::make_unique<SupervisedUserSyncDataTypeController>( + syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_)); + controllers.push_back( + std::make_unique<SupervisedUserSyncDataTypeController>( + syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, + profile_)); + } #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/sync/test/integration/feature_toggler.cc b/chrome/browser/sync/test/integration/feature_toggler.cc new file mode 100644 index 0000000..91fa6ced --- /dev/null +++ b/chrome/browser/sync/test/integration/feature_toggler.cc
@@ -0,0 +1,15 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/test/integration/feature_toggler.h" + +FeatureToggler::FeatureToggler(const base::Feature& feature) { + if (GetParam()) { + override_features_.InitAndEnableFeature(feature); + } else { + override_features_.InitAndDisableFeature(feature); + } +} + +FeatureToggler::~FeatureToggler() {}
diff --git a/chrome/browser/sync/test/integration/feature_toggler.h b/chrome/browser/sync/test/integration/feature_toggler.h new file mode 100644 index 0000000..5110f04 --- /dev/null +++ b/chrome/browser/sync/test/integration/feature_toggler.h
@@ -0,0 +1,28 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_FEATURE_TOGGLER_H_ +#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_FEATURE_TOGGLER_H_ + +#include "base/macros.h" +#include "base/test/scoped_feature_list.h" +#include "testing/gtest/include/gtest/gtest.h" + +// Class that enables or disables a feature switch based on a gTest test +// parameter, intended to be used as a base class of the test fixture. Must be +// the first base class of the test fixture to take effect during the +// construction of the test fixture itself. +class FeatureToggler : public testing::WithParamInterface<bool> { + public: + explicit FeatureToggler(const base::Feature& feature); + + ~FeatureToggler(); + + private: + base::test::ScopedFeatureList override_features_; + + DISALLOW_COPY_AND_ASSIGN(FeatureToggler); +}; + +#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_FEATURE_TOGGLER_H_
diff --git a/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc index 4e88fd5..692a561e 100644 --- a/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc
@@ -3,8 +3,8 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/sync/test/integration/apps_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" #include "components/browser_sync/profile_sync_service.h" @@ -16,25 +16,10 @@ using apps_helper::InstallApp; using apps_helper::InstallPlatformApp; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientAppsSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncPseudoUSSApps); - } else { - override_features_.InitAndDisableFeature(switches::kSyncPseudoUSSApps); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientAppsSyncTest : public UssSwitchToggler, public SyncTest { - public: - SingleClientAppsSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientAppsSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSApps), SyncTest(SINGLE_CLIENT) {} ~SingleClientAppsSyncTest() override {}
diff --git a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc index f0af7bc7..f3085596 100644 --- a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
@@ -6,9 +6,9 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/test/integration/bookmarks_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" @@ -50,25 +50,10 @@ // SyncTest and using it in all single client tests. const int kSingleProfileIndex = 0; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientBookmarksSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncUSSBookmarks); - } else { - override_features_.InitAndDisableFeature(switches::kSyncUSSBookmarks); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientBookmarksSyncTest : public UssSwitchToggler, public SyncTest { - public: - SingleClientBookmarksSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientBookmarksSyncTest() + : FeatureToggler(switches::kSyncUSSBookmarks), SyncTest(SINGLE_CLIENT) {} ~SingleClientBookmarksSyncTest() override {} // Verify that the local bookmark model (for the Profile corresponding to
diff --git a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc index c4e96bc..c5dc601 100644 --- a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc
@@ -3,8 +3,8 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/sync/test/integration/dictionary_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" #include "components/browser_sync/profile_sync_service.h" @@ -12,28 +12,11 @@ namespace { -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientDictionarySyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature( - switches::kSyncPseudoUSSDictionary); - } else { - override_features_.InitAndDisableFeature( - switches::kSyncPseudoUSSDictionary); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientDictionarySyncTest : public UssSwitchToggler, - public SyncTest { - public: - SingleClientDictionarySyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientDictionarySyncTest() + : FeatureToggler(switches::kSyncPseudoUSSDictionary), + SyncTest(SINGLE_CLIENT) {} ~SingleClientDictionarySyncTest() override {} private:
diff --git a/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc b/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc index ca2f3d1..d584054 100644 --- a/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc
@@ -9,10 +9,10 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/sync/test/integration/bookmarks_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
diff --git a/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc index 38c6f7a5e..45df218 100644 --- a/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc
@@ -3,9 +3,9 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/sync/test/integration/await_match_status_change_checker.h" #include "chrome/browser/sync/test/integration/extensions_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" #include "components/browser_sync/profile_sync_service.h" @@ -20,28 +20,11 @@ using extensions_helper::InstallExtension; using extensions_helper::InstallExtensionForAllProfiles; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientExtensionsSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature( - switches::kSyncPseudoUSSExtensions); - } else { - override_features_.InitAndDisableFeature( - switches::kSyncPseudoUSSExtensions); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientExtensionsSyncTest : public UssSwitchToggler, - public SyncTest { - public: - SingleClientExtensionsSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientExtensionsSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSExtensions), + SyncTest(SINGLE_CLIENT) {} ~SingleClientExtensionsSyncTest() override {}
diff --git a/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc new file mode 100644 index 0000000..ac71bf2 --- /dev/null +++ b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc
@@ -0,0 +1,108 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stddef.h> + +#include "base/macros.h" +#include "base/task/cancelable_task_tracker.h" +#include "chrome/browser/history/history_service_factory.h" +#include "chrome/browser/history/web_history_service_factory.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" +#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" +#include "chrome/browser/sync/test/integration/sync_test.h" +#include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" +#include "components/history/core/browser/history_service.h" +#include "components/history/core/browser/history_types.h" +#include "components/sync/driver/sync_driver_switches.h" +#include "components/sync/protocol/sync.pb.h" +#include "components/sync/test/fake_server/fake_server.h" + +namespace { + +using sync_pb::HistoryDeleteDirectiveSpecifics; + +// Allows to wait until the number of server-side entities is equal to a +// expected number. +class HistoryDeleteDirectivesEqualityChecker + : public SingleClientStatusChangeChecker { + public: + HistoryDeleteDirectivesEqualityChecker( + browser_sync::ProfileSyncService* service, + fake_server::FakeServer* fake_server, + size_t num_expected_directives) + : SingleClientStatusChangeChecker(service), + fake_server_(fake_server), + num_expected_directives_(num_expected_directives) {} + + bool IsExitConditionSatisfied() override { + const std::vector<sync_pb::SyncEntity> entities = + fake_server_->GetSyncEntitiesByModelType( + syncer::HISTORY_DELETE_DIRECTIVES); + + if (entities.size() == num_expected_directives_) { + return true; + } + + // |entities.size()| is only going to grow, if |entities.size()| ever + // becomes bigger then all hope is lost of passing, stop now. + EXPECT_LT(entities.size(), num_expected_directives_) + << "Entity set will never become equal"; + return false; + } + + std::string GetDebugMessage() const override { + return "Waiting server side HISTORY_DELETE_DIRECTIVES to match expected."; + } + + private: + fake_server::FakeServer* const fake_server_; + const size_t num_expected_directives_; + + DISALLOW_COPY_AND_ASSIGN(HistoryDeleteDirectivesEqualityChecker); +}; + +class SingleClientHistoryDeleteDirectivesSyncTest : public FeatureToggler, + public SyncTest { + public: + SingleClientHistoryDeleteDirectivesSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSHistoryDeleteDirectives), + SyncTest(SINGLE_CLIENT) {} + ~SingleClientHistoryDeleteDirectivesSyncTest() override {} + + bool WaitForHistoryDeleteDirectives(size_t num_expected_directives) { + return HistoryDeleteDirectivesEqualityChecker( + GetSyncService(0), GetFakeServer(), num_expected_directives) + .Wait(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(SingleClientHistoryDeleteDirectivesSyncTest); +}; + +IN_PROC_BROWSER_TEST_P(SingleClientHistoryDeleteDirectivesSyncTest, + ShouldCommitDeleteDirective) { + const GURL kPageUrl = GURL("http://foo.com"); + const base::Time kHistoryEntryTime = base::Time::Now(); + base::CancelableTaskTracker task_tracker; + + ASSERT_TRUE(SetupSync()); + + history::HistoryService* history_service = + HistoryServiceFactory::GetForProfileWithoutCreating(GetProfile(0)); + history_service->AddPage(kPageUrl, kHistoryEntryTime, + history::SOURCE_BROWSED); + + history_service->ExpireLocalAndRemoteHistoryBetween( + WebHistoryServiceFactory::GetForProfile(GetProfile(0)), std::set<GURL>(), + /*begin_time=*/base::Time(), /*end_time=*/base::Time(), base::DoNothing(), + &task_tracker); + + EXPECT_TRUE(WaitForHistoryDeleteDirectives(1)); +} + +INSTANTIATE_TEST_CASE_P(USS, + SingleClientHistoryDeleteDirectivesSyncTest, + ::testing::Values(false, true)); + +} // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc index 1dab72f8f..d43e5fdf 100644 --- a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
@@ -4,6 +4,7 @@ #include "base/macros.h" #include "base/values.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/preferences_helper.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" @@ -12,6 +13,7 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/json_pref_store.h" #include "components/prefs/pref_service.h" +#include "components/sync/driver/sync_driver_switches.h" #include "testing/gmock/include/gmock/gmock.h" using preferences_helper::BooleanPrefMatches; @@ -24,16 +26,18 @@ namespace { -class SingleClientPreferencesSyncTest : public SyncTest { +class SingleClientPreferencesSyncTest : public FeatureToggler, public SyncTest { public: - SingleClientPreferencesSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientPreferencesSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSPreferences), + SyncTest(SINGLE_CLIENT) {} ~SingleClientPreferencesSyncTest() override {} private: DISALLOW_COPY_AND_ASSIGN(SingleClientPreferencesSyncTest); }; -IN_PROC_BROWSER_TEST_F(SingleClientPreferencesSyncTest, Sanity) { +IN_PROC_BROWSER_TEST_P(SingleClientPreferencesSyncTest, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(BooleanPrefMatches(prefs::kHomePageIsNewTabPage)); ChangeBooleanPref(0, prefs::kHomePageIsNewTabPage); @@ -43,7 +47,7 @@ // This test simply verifies that preferences registered after sync started // get properly synced. -IN_PROC_BROWSER_TEST_F(SingleClientPreferencesSyncTest, LateRegistration) { +IN_PROC_BROWSER_TEST_P(SingleClientPreferencesSyncTest, LateRegistration) { ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; PrefRegistrySyncable* registry = GetRegistry(GetProfile(0)); const std::string pref_name = "testing.my-test-preference"; @@ -64,7 +68,7 @@ EXPECT_FALSE(BooleanPrefMatches(pref_name.c_str())); } -IN_PROC_BROWSER_TEST_F(SingleClientPreferencesSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientPreferencesSyncTest, ShouldRemoveBadDataWhenRegistering) { // Populate the data store with data of type boolean but register as string. SetPreexistingPreferencesFileContents( @@ -91,4 +95,8 @@ EXPECT_FALSE(pref_store->GetValue("testing.my-test-preference", &result)); } +INSTANTIATE_TEST_CASE_P(USS, + SingleClientPreferencesSyncTest, + ::testing::Values(false, true)); + } // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc index aa2dba9d..681b1d552 100644 --- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -5,10 +5,10 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/sessions/session_service.h" #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/session_hierarchy_match_checker.h" #include "chrome/browser/sync/test/integration/sessions_helper.h" @@ -70,25 +70,10 @@ EXPECT_EQ(sample_count, samples->TotalCount()); } -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientSessionsSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncUSSSessions); - } else { - override_features_.InitAndDisableFeature(switches::kSyncUSSSessions); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientSessionsSyncTest : public UssSwitchToggler, public SyncTest { - public: - SingleClientSessionsSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientSessionsSyncTest() + : FeatureToggler(switches::kSyncUSSSessions), SyncTest(SINGLE_CLIENT) {} ~SingleClientSessionsSyncTest() override {} void ExpectNavigationChain(const std::vector<GURL>& urls) {
diff --git a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc index 63f68eb..74157ec 100644 --- a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
@@ -3,9 +3,9 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/themes_helper.h" @@ -25,25 +25,11 @@ namespace { -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class SingleClientThemesSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncPseudoUSSThemes); - } else { - override_features_.InitAndDisableFeature(switches::kSyncPseudoUSSThemes); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class SingleClientThemesSyncTest : public UssSwitchToggler, public SyncTest { - public: - SingleClientThemesSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientThemesSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSThemes), + SyncTest(SINGLE_CLIENT) {} ~SingleClientThemesSyncTest() override {} private:
diff --git a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc index cbe9721..9f19613 100644 --- a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
@@ -496,13 +496,51 @@ // Make sure the card is in the DB. autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); ASSERT_NE(nullptr, pdm); + ASSERT_EQ(1uL, pdm->GetCreditCards().size()); + + // Turn off sync, the card should be gone. + GetSyncService(0)->RequestStop(syncer::SyncService::CLEAR_DATA); + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); + + ASSERT_EQ(0uL, pdm->GetCreditCards().size()); + + // Turn sync on again, the card should come back. + GetSyncService(0)->RequestStart(); + // RequestStop(CLEAR_DATA) also clears the "first setup complete" flag, so + // set it again. + GetSyncService(0)->SetFirstSetupComplete(); + // Wait until Sync restores the card and it arrives at PDM. + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); + + ASSERT_EQ(1uL, pdm->GetCreditCards().size()); +} + +// Wallet data should get cleared from the database when sync is (temporarily) +// stopped, e.g. due to the Sync feature toggle in Android settings. +IN_PROC_BROWSER_TEST_P(SingleClientWalletSyncTest, ClearOnStopSync) { + InitWithDefaultFeatures(); + GetFakeServer()->SetWalletData( + {CreateDefaultSyncWalletAddress(), CreateDefaultSyncWalletCard()}); + ASSERT_TRUE(SetupSync()); + + // Make sure the card is in the DB. + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); std::vector<CreditCard*> cards = pdm->GetCreditCards(); ASSERT_EQ(1uL, cards.size()); // Turn off sync, the card should be gone. - ASSERT_TRUE(GetClient(0)->DisableSyncForAllDatatypes()); - cards = pdm->GetCreditCards(); - ASSERT_EQ(0uL, cards.size()); + GetSyncService(0)->RequestStop(syncer::SyncService::KEEP_DATA); + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); + + ASSERT_EQ(0uL, pdm->GetCreditCards().size()); + + // Turn sync on again, the card should come back. + GetSyncService(0)->RequestStart(); + // Wait until Sync restores the card and it arrives at PDM. + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); + + ASSERT_EQ(1uL, pdm->GetCreditCards().size()); } // ChromeOS does not sign out, so the test below does not apply. @@ -521,6 +559,7 @@ // Turn off sync, the card should be gone. GetClient(0)->SignOutPrimaryAccount(); + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); ASSERT_EQ(0uL, pdm->GetCreditCards().size()); } @@ -636,6 +675,8 @@ // Turn off autofill sync, the card should be gone. ASSERT_TRUE(GetClient(0)->DisableSyncForDatatype(syncer::AUTOFILL)); + WaitForOnPersonalDataChanged(/*should_trigger_refresh=*/false, pdm); + cards = pdm->GetCreditCards(); ASSERT_EQ(0uL, cards.size()); }
diff --git a/chrome/browser/sync/test/integration/two_client_apps_sync_test.cc b/chrome/browser/sync/test/integration/two_client_apps_sync_test.cc index 1f90ad4..cf1102fd 100644 --- a/chrome/browser/sync/test/integration/two_client_apps_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_apps_sync_test.cc
@@ -6,7 +6,6 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/bookmark_app_helper.h" @@ -16,6 +15,7 @@ #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/test/integration/apps_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_app_helper.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" @@ -49,22 +49,6 @@ namespace { -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { - public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncPseudoUSSApps); - } else { - override_features_.InitAndDisableFeature(switches::kSyncPseudoUSSApps); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - extensions::ExtensionRegistry* GetExtensionRegistry(Profile* profile) { return extensions::ExtensionRegistry::Get(profile); } @@ -75,9 +59,10 @@ } // namespace -class TwoClientAppsSyncTest : public UssSwitchToggler, public SyncTest { +class TwoClientAppsSyncTest : public FeatureToggler, public SyncTest { public: - TwoClientAppsSyncTest() : SyncTest(TWO_CLIENT) { + TwoClientAppsSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSApps), SyncTest(TWO_CLIENT) { DisableVerifier(); }
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc index ab0eaee..b2e9579 100644 --- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -11,12 +11,12 @@ #include "base/rand_util.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/policy/profile_policy_connector_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/test/integration/bookmarks_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -78,22 +78,6 @@ const char kGenericSubfolderName[] = "Subfolder Name"; const char kValidPassphrase[] = "passphrase!"; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { - public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncUSSBookmarks); - } else { - override_features_.InitAndDisableFeature(switches::kSyncUSSBookmarks); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - class TwoClientBookmarksSyncTest : public SyncTest { public: TwoClientBookmarksSyncTest() : SyncTest(TWO_CLIENT) {} @@ -115,10 +99,11 @@ // TODO(crbug.com/516866): Merge the two fixtures into one when all tests are // passing for USS. class TwoClientBookmarksSyncTestIncludingUssTests - : public UssSwitchToggler, + : public FeatureToggler, public TwoClientBookmarksSyncTest { public: - TwoClientBookmarksSyncTestIncludingUssTests() {} + TwoClientBookmarksSyncTestIncludingUssTests() + : FeatureToggler(switches::kSyncUSSBookmarks) {} ~TwoClientBookmarksSyncTestIncludingUssTests() override {} private:
diff --git a/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc b/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc index f4a97f05..2595406 100644 --- a/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc
@@ -4,8 +4,8 @@ #include "base/macros.h" #include "base/strings/string_number_conversions.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/sync/test/integration/dictionary_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -18,27 +18,11 @@ using spellcheck::kMaxSyncableDictionaryWords; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class TwoClientDictionarySyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature( - switches::kSyncPseudoUSSDictionary); - } else { - override_features_.InitAndDisableFeature( - switches::kSyncPseudoUSSDictionary); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class TwoClientDictionarySyncTest : public UssSwitchToggler, public SyncTest { - public: - TwoClientDictionarySyncTest() : SyncTest(TWO_CLIENT) {} + TwoClientDictionarySyncTest() + : FeatureToggler(switches::kSyncPseudoUSSDictionary), + SyncTest(TWO_CLIENT) {} ~TwoClientDictionarySyncTest() override {} bool TestUsesSelfNotifications() override { return false; }
diff --git a/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc index 130def9..7e6fc6a 100644 --- a/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc
@@ -3,9 +3,9 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/sync/test/integration/extensions_helper.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -23,28 +23,14 @@ using extensions_helper::InstallExtension; using extensions_helper::UninstallExtension; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class TwoClientExtensionsSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature( - switches::kSyncPseudoUSSExtensions); - } else { - override_features_.InitAndDisableFeature( - switches::kSyncPseudoUSSExtensions); - } + TwoClientExtensionsSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSExtensions), + SyncTest(TWO_CLIENT) { + DisableVerifier(); } - private: - base::test::ScopedFeatureList override_features_; -}; - -class TwoClientExtensionsSyncTest : public UssSwitchToggler, public SyncTest { - public: - TwoClientExtensionsSyncTest() : SyncTest(TWO_CLIENT) { DisableVerifier(); } - bool TestUsesSelfNotifications() override { return false; } private:
diff --git a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc index f39f62f..6eb0bb5 100644 --- a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/sync/test/integration/sessions_helper.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/common/webui_url_constants.h" +#include "components/autofill/core/common/autofill_prefs.h" #include "components/browser_sync/profile_sync_service.h" #include "components/sync/base/sync_prefs.h" #include "components/sync/engine/polling_constants.h" @@ -77,18 +78,39 @@ ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + // Disable syncing of AUTOFILL_WALLET_DATA: That type is special-cased to + // clear its data even with KEEP_DATA, which means we'd always send a regular + // GetUpdates request on starting Sync again, and so we'd have no need for a + // poll. + GetClient(0)->DisableSyncForDatatype(syncer::AUTOFILL); + GetClient(1)->DisableSyncForDatatype(syncer::AUTOFILL); + // TODO(crbug.com/890737): Once AUTOFILL_WALLET_DATA gets properly disabled + // based on the pref, we can just disable that instead of all of AUTOFILL: + // autofill::prefs::SetPaymentsIntegrationEnabled(GetProfile(0)->GetPrefs(), + // false); + // autofill::prefs::SetPaymentsIntegrationEnabled(GetProfile(1)->GetPrefs(), + // false); + // Phase 1. ASSERT_TRUE(CheckInitialState(0)); ASSERT_TRUE(CheckInitialState(1)); ASSERT_TRUE(OpenTab(0, GURL(chrome::kChromeUIHistoryURL))); GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)); + ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_DATA)); + ASSERT_FALSE(GetSyncService(1)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_DATA)); + // Phase 2. // Disconnect client 1 from sync and write another change from client 0. // Disconnnect the remote client from the invalidation service. DisableNotificationsForClient(1); // Make sure no extra sync cycles get triggered by test infrastructure. StopConfigurationRefresher(); + // Note: It's important to specify KEEP_DATA here - if we CLEAR_DATA, then + // we'll do a regular GetUpdates at the next startup, so there'd be no need + // for a poll. GetClient(1)->StopSyncService(syncer::SyncService::KEEP_DATA); ASSERT_TRUE(OpenTab(0, GURL(kURL1)));
diff --git a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc index 6552590..3449963 100644 --- a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/preferences_helper.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" @@ -15,6 +16,7 @@ #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" +#include "components/sync/driver/sync_driver_switches.h" #include "testing/gmock/include/gmock/gmock.h" using preferences_helper::BooleanPrefMatches; @@ -28,9 +30,13 @@ using testing::Eq; using user_prefs::PrefRegistrySyncable; -class TwoClientPreferencesSyncTest : public SyncTest { +namespace { + +class TwoClientPreferencesSyncTest : public FeatureToggler, public SyncTest { public: - TwoClientPreferencesSyncTest() : SyncTest(TWO_CLIENT) {} + TwoClientPreferencesSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSPreferences), + SyncTest(TWO_CLIENT) {} ~TwoClientPreferencesSyncTest() override {} bool TestUsesSelfNotifications() override { return false; } @@ -39,7 +45,7 @@ DISALLOW_COPY_AND_ASSIGN(TwoClientPreferencesSyncTest); }; -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, E2E_ENABLED(Sanity)) { +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(Sanity)) { DisableVerifier(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(StringPrefMatchChecker(prefs::kHomePage).Wait()); @@ -52,7 +58,7 @@ } } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, E2E_ENABLED(BooleanPref)) { +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(BooleanPref)) { ASSERT_TRUE(SetupSync()); ASSERT_TRUE(BooleanPrefMatchChecker(prefs::kHomePageIsNewTabPage).Wait()); @@ -60,7 +66,7 @@ ASSERT_TRUE(BooleanPrefMatchChecker(prefs::kHomePageIsNewTabPage).Wait()); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(Bidirectional)) { ASSERT_TRUE(SetupSync()); @@ -77,7 +83,7 @@ GetPrefs(0)->GetString(prefs::kHomePage)); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(UnsyncableBooleanPref)) { ASSERT_TRUE(SetupSync()); DisableVerifier(); @@ -96,7 +102,7 @@ ASSERT_FALSE(BooleanPrefMatches(prefs::kDisableScreenshots)); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, E2E_ENABLED(StringPref)) { +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(StringPref)) { ASSERT_TRUE(SetupSync()); ASSERT_TRUE(StringPrefMatchChecker(prefs::kHomePage).Wait()); @@ -104,7 +110,7 @@ ASSERT_TRUE(StringPrefMatchChecker(prefs::kHomePage).Wait()); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTest, E2E_ENABLED(ComplexPrefs)) { ASSERT_TRUE(SetupSync()); ASSERT_TRUE(IntegerPrefMatchChecker(prefs::kRestoreOnStartup).Wait()); @@ -130,7 +136,7 @@ #define MAYBE_SingleClientEnabledEncryptionBothChanged \ SingleClientEnabledEncryptionBothChanged #endif -IN_PROC_BROWSER_TEST_F( +IN_PROC_BROWSER_TEST_P( TwoClientPreferencesSyncTest, E2E_ENABLED(MAYBE_SingleClientEnabledEncryptionBothChanged)) { ASSERT_TRUE(SetupSync()); @@ -146,8 +152,9 @@ ASSERT_TRUE(BooleanPrefMatchChecker(prefs::kHomePageIsNewTabPage).Wait()); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, - E2E_ENABLED(BothClientsEnabledEncryptionAndChangedMultipleTimes)) { +IN_PROC_BROWSER_TEST_P( + TwoClientPreferencesSyncTest, + E2E_ENABLED(BothClientsEnabledEncryptionAndChangedMultipleTimes)) { ASSERT_TRUE(SetupSync()); ASSERT_TRUE(BooleanPrefMatchChecker(prefs::kHomePageIsNewTabPage).Wait()); @@ -163,9 +170,12 @@ // The following tests use lower-level mechanisms to wait for sync cycle // completions. Those only work reliably with self notifications turned on. -class TwoClientPreferencesSyncTestWithSelfNotifications : public SyncTest { +class TwoClientPreferencesSyncTestWithSelfNotifications : public FeatureToggler, + public SyncTest { public: - TwoClientPreferencesSyncTestWithSelfNotifications() : SyncTest(TWO_CLIENT) {} + TwoClientPreferencesSyncTestWithSelfNotifications() + : FeatureToggler(switches::kSyncPseudoUSSPreferences), + SyncTest(TWO_CLIENT) {} ~TwoClientPreferencesSyncTestWithSelfNotifications() override {} void SetUp() override { @@ -183,7 +193,7 @@ }; // Tests that late registered prefs are kept in sync with other clients. -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTestWithSelfNotifications, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTestWithSelfNotifications, E2E_ENABLED(LateRegisteredPrefsShouldSync)) { // client0 has the pref registered before sync and is modifying a pref before // that pref got registered with client1 (but after client1 started syncing). @@ -222,7 +232,7 @@ EXPECT_THAT(GetPrefs(0)->GetBoolean(pref_name), Eq(true)); } -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTestWithSelfNotifications, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTestWithSelfNotifications, E2E_ENABLED(ShouldKeepLocalDataOnTypeMismatch)) { // Client 1 has type-conflicting data in it's pref file. Verify that incoming // values from sync of other type do not modify the local state. @@ -258,7 +268,7 @@ // Verifies that priority synced preferences and regular sycned preferences are // kept separate. -IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTestWithSelfNotifications, +IN_PROC_BROWSER_TEST_P(TwoClientPreferencesSyncTestWithSelfNotifications, E2E_ENABLED(ShouldIsolatePriorityPreferences)) { // Register a pref as priority with client0 and regular synced with client1. ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; @@ -282,3 +292,13 @@ EXPECT_THAT(GetPrefs(0)->GetString(pref_name), Eq("priority value")); EXPECT_THAT(GetPrefs(1)->GetString(pref_name), Eq("non-priority value")); } + +INSTANTIATE_TEST_CASE_P(USS, + TwoClientPreferencesSyncTest, + ::testing::Values(false, true)); + +INSTANTIATE_TEST_CASE_P(USS, + TwoClientPreferencesSyncTestWithSelfNotifications, + ::testing::Values(false, true)); + +} // namespace
diff --git a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc index eab1b525..e7a8a12 100644 --- a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc
@@ -7,9 +7,9 @@ #include "base/guid.h" #include "base/macros.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/sessions/session_service.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/passwords_helper.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sessions_helper.h" @@ -32,25 +32,10 @@ using sessions_helper::SyncedSessionVector; using sessions_helper::WindowsMatch; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class TwoClientSessionsSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncUSSSessions); - } else { - override_features_.InitAndDisableFeature(switches::kSyncUSSSessions); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class TwoClientSessionsSyncTest : public UssSwitchToggler, public SyncTest { - public: - TwoClientSessionsSyncTest() : SyncTest(TWO_CLIENT) {} + TwoClientSessionsSyncTest() + : FeatureToggler(switches::kSyncUSSSessions), SyncTest(TWO_CLIENT) {} ~TwoClientSessionsSyncTest() override {} void WaitForWindowsInForeignSession(int index, ScopedWindowMap windows) {
diff --git a/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc b/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc index a8d651cb..e149955 100644 --- a/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "base/macros.h" -#include "base/test/scoped_feature_list.h" +#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -21,25 +21,10 @@ using themes_helper::UsingDefaultTheme; using themes_helper::UsingSystemTheme; -// Class that enables or disables USS based on test parameter. Must be the first -// base class of the test fixture. -class UssSwitchToggler : public testing::WithParamInterface<bool> { +class TwoClientThemesSyncTest : public FeatureToggler, public SyncTest { public: - UssSwitchToggler() { - if (GetParam()) { - override_features_.InitAndEnableFeature(switches::kSyncPseudoUSSThemes); - } else { - override_features_.InitAndDisableFeature(switches::kSyncPseudoUSSThemes); - } - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -class TwoClientThemesSyncTest : public UssSwitchToggler, public SyncTest { - public: - TwoClientThemesSyncTest() : SyncTest(TWO_CLIENT) {} + TwoClientThemesSyncTest() + : FeatureToggler(switches::kSyncPseudoUSSThemes), SyncTest(TWO_CLIENT) {} ~TwoClientThemesSyncTest() override {} bool TestUsesSelfNotifications() override { return false; }
diff --git a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc index 958a06b..0f29948 100644 --- a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc +++ b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc
@@ -287,6 +287,8 @@ return false; case LoginState::LOGGED_IN_USER_ARC_KIOSK_APP: return false; + case LoginState::LOGGED_IN_USER_CHILD: + return true; } NOTREACHED(); return false;
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc index 97b0ba26..e610542d 100644 --- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
@@ -344,7 +344,7 @@ " phone: 'PHONE ERROR'" " }" "}", - DialogEvent::CONTACT_INFO_EDITOR_OPENED, dialog_view()); + DialogEvent::CONTACT_INFO_EDITOR_OPENED); EXPECT_EQ(base::ASCIIToUTF16("EMAIL ERROR"), GetErrorLabelForType(autofill::EMAIL_ADDRESS)); @@ -381,7 +381,7 @@ " phone: 'PHONE ERROR'" " }" "}", - DialogEvent::CONTACT_INFO_EDITOR_OPENED, dialog_view()); + DialogEvent::CONTACT_INFO_EDITOR_OPENED); EXPECT_EQ(base::ASCIIToUTF16("EMAIL ERROR"), GetErrorLabelForType(autofill::EMAIL_ADDRESS)); @@ -411,8 +411,7 @@ " name: 'NAME ERROR'," " phone: 'PHONE ERROR'" " }" - "}", - dialog_view()); + "}"); const int kErrorLabelOffset = static_cast<int>(DialogViewID::ERROR_LABEL_OFFSET);
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc index 97b14877..1da36bc3 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -638,13 +638,10 @@ } void PaymentRequestBrowserTestBase::RetryPaymentRequest( - const std::string& validation_errors, - PaymentRequestDialogView* dialog_view) { - EXPECT_EQ(2U, dialog_view->view_stack_for_testing()->size()); - ResetEventWaiterForSequence({DialogEvent::PROCESSING_SPINNER_HIDDEN, - DialogEvent::SPEC_DONE_UPDATING, - DialogEvent::PROCESSING_SPINNER_HIDDEN, - DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION}); + const std::string& validation_errors) { + ResetEventWaiterForSequence( + {DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::SPEC_DONE_UPDATING, + DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::DIALOG_OPENED}); ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "retry(" + validation_errors + ");")); @@ -654,13 +651,11 @@ void PaymentRequestBrowserTestBase::RetryPaymentRequest( const std::string& validation_errors, - const DialogEvent& dialog_event, - PaymentRequestDialogView* dialog_view) { - EXPECT_EQ(2U, dialog_view->view_stack_for_testing()->size()); + const DialogEvent& dialog_event) { ResetEventWaiterForSequence( {DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::SPEC_DONE_UPDATING, - DialogEvent::PROCESSING_SPINNER_HIDDEN, - DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION, dialog_event}); + DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::DIALOG_OPENED, + dialog_event}); ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "retry(" + validation_errors + ");"));
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h index 09dfb02..43b9a5c 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -209,11 +209,9 @@ void PayWithCreditCardAndWait(const base::string16& cvc, PaymentRequestDialogView* dialog_view); void PayWithCreditCard(const base::string16& cvc); + void RetryPaymentRequest(const std::string& validation_errors); void RetryPaymentRequest(const std::string& validation_errors, - PaymentRequestDialogView* dialog_view); - void RetryPaymentRequest(const std::string& validation_errors, - const DialogEvent& dialog_event, - PaymentRequestDialogView* dialog_view); + const DialogEvent& dialog_event); // Getting/setting the |value| in the textfield of a given |type|. base::string16 GetEditorTextfieldValue(autofill::ServerFieldType type);
diff --git a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc index b6d7c21..2230ad9 100644 --- a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc +++ b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
@@ -189,7 +189,7 @@ void PaymentRequestDialogView::RetryDialog() { HideProcessingSpinner(); - GoBackToPaymentSheet(); + ShowInitialPaymentSheet(); if (request_->spec()->has_shipping_address_error()) { autofill::AutofillProfile* profile =
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc index e5545ca1..74e26cde 100644 --- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -1286,7 +1286,7 @@ " city: 'CITY ERROR'" " }" "}", - DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED, dialog_view()); + DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED); EXPECT_EQ(base::ASCIIToUTF16("ADDRESS LINE ERROR"), GetErrorLabelForType(autofill::ADDRESS_HOME_STREET_ADDRESS)); @@ -1322,7 +1322,7 @@ " city: 'CITY ERROR'" " }" "}", - DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED, dialog_view()); + DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED); EXPECT_EQ(base::ASCIIToUTF16("ADDRESS LINE ERROR"), GetErrorLabelForType(autofill::ADDRESS_HOME_STREET_ADDRESS)); @@ -1349,8 +1349,7 @@ " addressLine: 'ADDRESS LINE ERROR'," " city: 'CITY ERROR'" " }" - "}", - dialog_view()); + "}"); const int kErrorLabelOffset = static_cast<int>(DialogViewID::ERROR_LABEL_OFFSET);
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc index 7dafa03d..c2b70576 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/signin/account_tracker_service_factory.h" #include "chrome/browser/signin/chrome_signin_helper.h" #include "chrome/browser/signin/gaia_cookie_manager_service_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/browser/signin/signin_error_controller_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" @@ -70,6 +71,7 @@ #include "components/signin/core/browser/signin_metrics.h" #include "components/vector_icons/vector_icons.h" #include "content/public/browser/render_widget_host_view.h" +#include "services/identity/public/cpp/identity_manager.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/material_design/material_design_controller.h" @@ -1429,16 +1431,17 @@ // TODO(rogerta): we still need to further differentiate the primary account // from the others in the UI, so more work is likely required here: // crbug.com/311124. - std::string primary_account = - SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedAccountId(); - DCHECK(!primary_account.empty()); - CreateAccountButton(layout, primary_account, true, - error_account_id == primary_account, menu_width_); - for (const std::string& account : - profiles::GetSecondaryAccountsForSignedInProfile(profile)) { - CreateAccountButton(layout, account, false, error_account_id == account, - menu_width_); - } + auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); + DCHECK(identity_manager->HasPrimaryAccount()); + AccountInfo primary_account = identity_manager->GetPrimaryAccountInfo(); + + CreateAccountButton(layout, primary_account.account_id, true, + error_account_id == primary_account.account_id, + menu_width_); + for (const AccountInfo& account : + profiles::GetSecondaryAccountsForSignedInProfile(profile)) + CreateAccountButton(layout, account.account_id, false, + error_account_id == account.account_id, menu_width_); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get(); const int vertical_spacing =
diff --git a/chrome/chrome_cleaner/os/system_util.h b/chrome/chrome_cleaner/os/system_util.h index e2a17a0..11b29b85 100644 --- a/chrome/chrome_cleaner/os/system_util.h +++ b/chrome/chrome_cleaner/os/system_util.h
@@ -7,10 +7,9 @@ #include <windows.h> -#include <wincrypt.h> - #include "base/strings/string16.h" #include "base/win/scoped_handle.h" +#include "crypto/wincrypt_shim.h" namespace chrome_cleaner {
diff --git a/chrome/common/extensions/manifest_handlers/app_icon_color_info.cc b/chrome/common/extensions/manifest_handlers/app_icon_color_info.cc index 385a596..10a9d620 100644 --- a/chrome/common/extensions/manifest_handlers/app_icon_color_info.cc +++ b/chrome/common/extensions/manifest_handlers/app_icon_color_info.cc
@@ -19,7 +19,7 @@ namespace { -const AppIconColorInfo& GetInfo(const Extension* extension) { +const AppIconColorInfo& GetAppIconColorInfo(const Extension* extension) { CR_DEFINE_STATIC_LOCAL(const AppIconColorInfo, fallback, ()); AppIconColorInfo* info = static_cast<AppIconColorInfo*>( @@ -37,13 +37,13 @@ // static SkColor AppIconColorInfo::GetIconColor(const Extension* extension) { - return GetInfo(extension).icon_color_; + return GetAppIconColorInfo(extension).icon_color_; } // static const std::string& AppIconColorInfo::GetIconColorString( const Extension* extension) { - return GetInfo(extension).icon_color_string_; + return GetAppIconColorInfo(extension).icon_color_string_; } AppIconColorHandler::AppIconColorHandler() {
diff --git a/chrome/common/extensions/manifest_handlers/linked_app_icons.cc b/chrome/common/extensions/manifest_handlers/linked_app_icons.cc index 5577821..79a6f4e 100644 --- a/chrome/common/extensions/manifest_handlers/linked_app_icons.cc +++ b/chrome/common/extensions/manifest_handlers/linked_app_icons.cc
@@ -22,12 +22,6 @@ static base::LazyInstance<LinkedAppIcons>::DestructorAtExit g_empty_linked_app_icons = LAZY_INSTANCE_INITIALIZER; -const LinkedAppIcons& GetInfo(const Extension* extension) { - LinkedAppIcons* info = static_cast<LinkedAppIcons*>( - extension->GetManifestData(keys::kLinkedAppIcons)); - return info ? *info : g_empty_linked_app_icons.Get(); -} - } // namespace LinkedAppIcons::IconInfo::IconInfo() { @@ -47,7 +41,9 @@ // static const LinkedAppIcons& LinkedAppIcons::GetLinkedAppIcons( const Extension* extension) { - return GetInfo(extension); + LinkedAppIcons* info = static_cast<LinkedAppIcons*>( + extension->GetManifestData(keys::kLinkedAppIcons)); + return info ? *info : g_empty_linked_app_icons.Get(); } LinkedAppIconsHandler::LinkedAppIconsHandler() {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 88b6cbf..ae2c859 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5221,6 +5221,8 @@ "../browser/sync/test/integration/fake_server_invalidation_service.h", "../browser/sync/test/integration/fake_server_match_status_checker.cc", "../browser/sync/test/integration/fake_server_match_status_checker.h", + "../browser/sync/test/integration/feature_toggler.cc", + "../browser/sync/test/integration/feature_toggler.h", "../browser/sync/test/integration/migration_waiter.cc", "../browser/sync/test/integration/migration_waiter.h", "../browser/sync/test/integration/migration_watcher.cc", @@ -5349,6 +5351,7 @@ "../browser/sync/test/integration/single_client_dictionary_sync_test.cc", "../browser/sync/test/integration/single_client_directory_sync_test.cc", "../browser/sync/test/integration/single_client_extensions_sync_test.cc", + "../browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc", "../browser/sync/test/integration/single_client_passwords_sync_test.cc", "../browser/sync/test/integration/single_client_polling_sync_test.cc", "../browser/sync/test/integration/single_client_preferences_sync_test.cc",
diff --git a/chrome/test/data/chromeos/file_manager/tall.html b/chrome/test/data/chromeos/file_manager/tall.html new file mode 100644 index 0000000..b9b7525 --- /dev/null +++ b/chrome/test/data/chromeos/file_manager/tall.html
@@ -0,0 +1,48 @@ +<head> +<body> +<pre> + 1 tall html + 2 tall html + 3 tall html + 4 tall html + 5 tall html + 6 tall html + 7 tall html + 8 tall html + 9 tall html +10 tall html +11 tall html +12 tall html +13 tall html +14 tall html +15 tall html +16 tall html +17 tall html +18 tall html +19 tall html +20 tall html +21 tall html +22 tall html +23 tall html +24 tall html +25 tall html +26 tall html +27 tall html +28 tall html +29 tall html +30 tall html +31 tall html +32 tall html +33 tall html +34 tall html +35 tall html +36 tall html +37 tall html +38 tall html +39 tall html +40 tall html +41 tall html +42 tall html +</pre> +</body> +</head>
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 1f4a57a..fe4ae05 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -466,6 +466,12 @@ "network/tether_constants.cc", "network/tether_constants.h", "policy_certificate_provider.h", + "policy/weekly_time/time_utils.cc", + "policy/weekly_time/time_utils.h", + "policy/weekly_time/weekly_time.cc", + "policy/weekly_time/weekly_time.h", + "policy/weekly_time/weekly_time_interval.cc", + "policy/weekly_time/weekly_time_interval.h", "printing/ppd_cache.cc", "printing/ppd_cache.h", "printing/ppd_line_reader.cc", @@ -642,6 +648,8 @@ "//chromeos/services:unit_tests", "//components/account_id", "//components/onc", + "//components/policy:generated", + "//components/policy/proto", "//components/prefs:test_support", "//components/proxy_config", "//crypto", @@ -732,6 +740,9 @@ "network/prohibited_technologies_handler_unittest.cc", "network/proxy/proxy_config_service_impl_unittest.cc", "network/shill_property_handler_unittest.cc", + "policy/weekly_time/time_utils_unittest.cc", + "policy/weekly_time/weekly_time_interval_unittest.cc", + "policy/weekly_time/weekly_time_unittest.cc", "printing/ppd_cache_unittest.cc", "printing/ppd_line_reader_unittest.cc", "printing/ppd_provider_unittest.cc",
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc index 4f255b1da..6bc5adb5 100644 --- a/chromeos/audio/cras_audio_handler.cc +++ b/chromeos/audio/cras_audio_handler.cc
@@ -910,7 +910,6 @@ cras_service_available_ = true; GetDefaultOutputBufferSizeInternal(); - GetSystemAecSupported(); GetNodes(); GetNumberOfOutputStreams(); } @@ -1676,28 +1675,4 @@ default_output_buffer_size_ = buffer_size.value(); } -bool CrasAudioHandler::system_aec_supported() const { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - return system_aec_supported_; -} - -// GetSystemAecSupported() is only called in the same thread -// as the CrasAudioHanler constructor. We are safe here without -// thread check, because unittest may not have the task runner -// for the current thread. -void CrasAudioHandler::GetSystemAecSupported() { - GetCrasAudioClient()->GetSystemAecSupported( - base::BindOnce(&CrasAudioHandler::HandleGetSystemAecSupported, - weak_ptr_factory_.GetWeakPtr())); -} - -void CrasAudioHandler::HandleGetSystemAecSupported( - base::Optional<bool> system_aec_supported) { - if (!system_aec_supported.has_value()) { - LOG(ERROR) << "Failed to retrieve system aec supported"; - return; - } - system_aec_supported_ = system_aec_supported.value(); -} - } // namespace chromeos
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h index 3cc8f2b96..dca1bd5 100644 --- a/chromeos/audio/cras_audio_handler.h +++ b/chromeos/audio/cras_audio_handler.h
@@ -274,8 +274,10 @@ // the use case. It should be called from a user initiated action. void SwitchToFrontOrRearMic(); - // Returns if system AEC is supported in CRAS. - bool system_aec_supported() const; + // All Chrome OS boards support this feature. Web applications will need + // to opt into original trial to use experimental native echo cancellation. + // Check crbug.com/853196 for usage. + bool system_aec_supported() const { return true; }; protected: explicit CrasAudioHandler( @@ -478,15 +480,6 @@ // Handle dbus callback for GetDefaultOutputBufferSize. void HandleGetDefaultOutputBufferSize(base::Optional<int> buffer_size); - // Calling dbus to get system AEC supported flag. - void GetSystemAecSupported(); - - // Calling dbus to get system AEC supported flag on main thread. - void GetSystemAecSupportedOnMainThread(); - - // Handle dbus callback for GetSystemAecSupported. - void HandleGetSystemAecSupported(base::Optional<bool> system_aec_supported); - void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing); void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing); @@ -533,8 +526,6 @@ // Default output buffer size in frames. int32_t default_output_buffer_size_; - bool system_aec_supported_ = false; - int num_active_output_streams_ = 0; // Task runner of browser main thread. All member variables should be accessed
diff --git a/chromeos/login/login_state.cc b/chromeos/login/login_state.cc index b77ca90..c84accb 100644 --- a/chromeos/login/login_state.cc +++ b/chromeos/login/login_state.cc
@@ -110,6 +110,10 @@ return logged_in_user_type_ == LOGGED_IN_USER_KIOSK_APP; } +bool LoginState::IsChildUser() const { + return logged_in_user_type_ == LOGGED_IN_USER_CHILD; +} + bool LoginState::UserHasNetworkProfile() const { if (!IsUserLoggedIn()) return false; @@ -119,12 +123,14 @@ bool LoginState::IsUserAuthenticated() const { return logged_in_user_type_ == LOGGED_IN_USER_REGULAR || logged_in_user_type_ == LOGGED_IN_USER_OWNER || - logged_in_user_type_ == LOGGED_IN_USER_SUPERVISED; + logged_in_user_type_ == LOGGED_IN_USER_SUPERVISED || + logged_in_user_type_ == LOGGED_IN_USER_CHILD; } bool LoginState::IsUserGaiaAuthenticated() const { return logged_in_user_type_ == LOGGED_IN_USER_REGULAR || - logged_in_user_type_ == LOGGED_IN_USER_OWNER; + logged_in_user_type_ == LOGGED_IN_USER_OWNER || + logged_in_user_type_ == LOGGED_IN_USER_CHILD; } // Private methods
diff --git a/chromeos/login/login_state.h b/chromeos/login/login_state.h index 173ce929..058472c 100644 --- a/chromeos/login/login_state.h +++ b/chromeos/login/login_state.h
@@ -29,7 +29,8 @@ LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED, // Public session v2. LOGGED_IN_USER_SUPERVISED, // A supervised user is logged in LOGGED_IN_USER_KIOSK_APP, // Is in kiosk app mode - LOGGED_IN_USER_ARC_KIOSK_APP // Is in ARC kiosk mode + LOGGED_IN_USER_ARC_KIOSK_APP, // Is in ARC kiosk mode + LOGGED_IN_USER_CHILD // A child is logged in }; class Observer { @@ -85,6 +86,9 @@ // Returns true if logged in as a kiosk app. bool IsKioskApp() const; + // Returns true if a child user is logged in. + bool IsChildUser() const; + // Whether a network profile is created for the user. bool UserHasNetworkProfile() const;
diff --git a/chrome/browser/chromeos/policy/weekly_time/time_utils.cc b/chromeos/policy/weekly_time/time_utils.cc similarity index 95% rename from chrome/browser/chromeos/policy/weekly_time/time_utils.cc rename to chromeos/policy/weekly_time/time_utils.cc index 2a3f8a4..ccb4f2a1 100644 --- a/chrome/browser/chromeos/policy/weekly_time/time_utils.cc +++ b/chromeos/policy/weekly_time/time_utils.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/time_utils.h" +#include "chromeos/policy/weekly_time/time_utils.h" #include <algorithm> #include <memory> @@ -12,8 +12,8 @@ #include "base/memory/ptr_util.h" #include "base/time/clock.h" #include "base/time/time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "third_party/icu/source/common/unicode/unistr.h" #include "third_party/icu/source/common/unicode/utypes.h" #include "third_party/icu/source/i18n/unicode/gregocal.h"
diff --git a/chrome/browser/chromeos/policy/weekly_time/time_utils.h b/chromeos/policy/weekly_time/time_utils.h similarity index 66% rename from chrome/browser/chromeos/policy/weekly_time/time_utils.h rename to chromeos/policy/weekly_time/time_utils.h index 65730ee..8d0d5513 100644 --- a/chrome/browser/chromeos/policy/weekly_time/time_utils.h +++ b/chromeos/policy/weekly_time/time_utils.h
@@ -1,16 +1,16 @@ - // 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 CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_ +#ifndef CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_ +#define CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_ #include <string> #include <vector> #include "base/optional.h" #include "base/strings/string16.h" +#include "chromeos/chromeos_export.h" #include "third_party/icu/source/i18n/unicode/timezone.h" namespace base { @@ -28,13 +28,13 @@ // Put time in milliseconds which is added to local time to get GMT time to // |offset| considering daylight from |clock|. Return true if there was no // error. -bool GetOffsetFromTimezoneToGmt(const std::string& timezone, - base::Clock* clock, - int* offset); +CHROMEOS_EXPORT bool GetOffsetFromTimezoneToGmt(const std::string& timezone, + base::Clock* clock, + int* offset); -bool GetOffsetFromTimezoneToGmt(const icu::TimeZone& timezone, - base::Clock* clock, - int* offset); +CHROMEOS_EXPORT bool GetOffsetFromTimezoneToGmt(const icu::TimeZone& timezone, + base::Clock* clock, + int* offset); // The output is in the format "EEEE jj:mm a". // Example: For a WeeklyTime(4 /* day_of_week */, @@ -44,16 +44,17 @@ // Similarly, the output will be "Donnerstag 05:00" in a German locale in a GMT // timezone (there may be slight changes in formatting due to different // standards in different locales). -base::string16 WeeklyTimeToLocalizedString(const WeeklyTime& weekly_time, - base::Clock* clock); +CHROMEOS_EXPORT base::string16 WeeklyTimeToLocalizedString( + const WeeklyTime& weekly_time, + base::Clock* clock); // Convert time intervals from |timezone| to GMT timezone. Timezone agnostic // intervals are not supported. -std::vector<WeeklyTimeInterval> ConvertIntervalsToGmt( +CHROMEOS_EXPORT std::vector<WeeklyTimeInterval> ConvertIntervalsToGmt( const std::vector<WeeklyTimeInterval>& intervals); // Return duration till next weekly time interval. -base::TimeDelta GetDeltaTillNextTimeInterval( +CHROMEOS_EXPORT base::TimeDelta GetDeltaTillNextTimeInterval( const WeeklyTime& current_time, const std::vector<WeeklyTimeInterval>& weekly_time_intervals); @@ -61,11 +62,11 @@ // is inside one of the intervals, then the function returns the // interval that contains |clock->Now()|. Otherwise, return |base::nullopt|. // The intervals must have a defined -base::Optional<WeeklyTimeInterval> GetIntervalForCurrentTime( +CHROMEOS_EXPORT base::Optional<WeeklyTimeInterval> GetIntervalForCurrentTime( const std::vector<WeeklyTimeInterval>& intervals, base::Clock* clock); } // namespace weekly_time_utils } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_ +#endif // CHROMEOS_POLICY_WEEKLY_TIME_TIME_UTILS_H_
diff --git a/chrome/browser/chromeos/policy/weekly_time/time_utils_unittest.cc b/chromeos/policy/weekly_time/time_utils_unittest.cc similarity index 97% rename from chrome/browser/chromeos/policy/weekly_time/time_utils_unittest.cc rename to chromeos/policy/weekly_time/time_utils_unittest.cc index 7bfa1ff..ea125cf 100644 --- a/chrome/browser/chromeos/policy/weekly_time/time_utils_unittest.cc +++ b/chromeos/policy/weekly_time/time_utils_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/time_utils.h" +#include "chromeos/policy/weekly_time/time_utils.h" #include <memory> #include <utility> @@ -13,8 +13,8 @@ #include "base/test/icu_test_util.h" #include "base/test/simple_test_clock.h" #include "base/time/time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "testing/gtest/include/gtest/gtest.h" namespace em = enterprise_management;
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time.cc b/chromeos/policy/weekly_time/weekly_time.cc similarity index 98% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time.cc rename to chromeos/policy/weekly_time/weekly_time.cc index cbacc8b..861492d 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time.cc +++ b/chromeos/policy/weekly_time/weekly_time.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time.h" #include "base/logging.h" #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time.h b/chromeos/policy/weekly_time/weekly_time.h similarity index 93% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time.h rename to chromeos/policy/weekly_time/weekly_time.h index 790a2834..0431465e3 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time.h +++ b/chromeos/policy/weekly_time/weekly_time.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_ +#ifndef CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_ +#define CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_ #include <memory> @@ -11,6 +11,7 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "base/values.h" +#include "chromeos/chromeos_export.h" #include "components/policy/proto/chrome_device_policy.pb.h" namespace policy { @@ -18,7 +19,7 @@ // WeeklyTime class contains day of week and time. Day of week is number from 1 // to 7 (1 = Monday, 2 = Tuesday, etc.) Time is in milliseconds from the // beginning of the day. -class WeeklyTime { +class CHROMEOS_EXPORT WeeklyTime { public: WeeklyTime(int day_of_week, int milliseconds, @@ -100,4 +101,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_ +#endif // CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_H_
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.cc b/chromeos/policy/weekly_time/weekly_time_interval.cc similarity index 95% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.cc rename to chromeos/policy/weekly_time/weekly_time_interval.cc index 0b822004..f10ed355 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.cc +++ b/chromeos/policy/weekly_time/weekly_time_interval.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include "base/logging.h" #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h b/chromeos/policy/weekly_time/weekly_time_interval.h similarity index 87% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h rename to chromeos/policy/weekly_time/weekly_time_interval.h index 59f2593..376b5c7 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h +++ b/chromeos/policy/weekly_time/weekly_time_interval.h
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_ +#ifndef CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_ +#define CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_ #include <memory> #include "base/optional.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/policy/weekly_time/weekly_time.h" #include "components/policy/proto/chrome_device_policy.pb.h" namespace policy { @@ -18,7 +19,7 @@ // Interval can be wrapped across the end of the week. // Interval is empty if start = end. Empty intervals aren't allowed. // Both WeeklyTimes need to have the same timezone_offset. -class WeeklyTimeInterval { +class CHROMEOS_EXPORT WeeklyTimeInterval { public: WeeklyTimeInterval(const WeeklyTime& start, const WeeklyTime& end); @@ -70,4 +71,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_ +#endif // CHROMEOS_POLICY_WEEKLY_TIME_WEEKLY_TIME_INTERVAL_H_
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval_unittest.cc b/chromeos/policy/weekly_time/weekly_time_interval_unittest.cc similarity index 98% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time_interval_unittest.cc rename to chromeos/policy/weekly_time/weekly_time_interval_unittest.cc index bcd0051..dd155510 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time_interval_unittest.cc +++ b/chromeos/policy/weekly_time/weekly_time_interval_unittest.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h" +#include "chromeos/policy/weekly_time/weekly_time_interval.h" #include <tuple> #include <utility> #include "base/time/time.h" #include "base/values.h" -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/policy/weekly_time/weekly_time_unittest.cc b/chromeos/policy/weekly_time/weekly_time_unittest.cc similarity index 99% rename from chrome/browser/chromeos/policy/weekly_time/weekly_time_unittest.cc rename to chromeos/policy/weekly_time/weekly_time_unittest.cc index b2cb69a2..5c72a1b5 100644 --- a/chrome/browser/chromeos/policy/weekly_time/weekly_time_unittest.cc +++ b/chromeos/policy/weekly_time/weekly_time_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h" +#include "chromeos/policy/weekly_time/weekly_time.h" #include <memory> #include <tuple>
diff --git a/components/arc/ime/DEPS b/components/arc/ime/DEPS index b4af81c..18dc2cd 100644 --- a/components/arc/ime/DEPS +++ b/components/arc/ime/DEPS
@@ -5,4 +5,6 @@ "+ui/events", "+ui/gfx/geometry", "+ui/keyboard", +# Revisit this dependency when crbug.com/890403 is resovled. + "+ui/views", ]
diff --git a/components/arc/ime/arc_ime_service.cc b/components/arc/ime/arc_ime_service.cc index eda17d6..37a919b6 100644 --- a/components/arc/ime/arc_ime_service.cc +++ b/components/arc/ime/arc_ime_service.cc
@@ -24,6 +24,8 @@ #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/range/range.h" #include "ui/keyboard/keyboard_controller.h" +#include "ui/views/widget/widget.h" +#include "ui/views/window/non_client_view.h" namespace arc { @@ -526,6 +528,20 @@ converted.Offset(focused_arc_window_->GetToplevelWindow() ->GetBoundsInScreen() .OffsetFromOrigin()); + } else if (focused_arc_window_) { + auto* window = focused_arc_window_->GetToplevelWindow(); + auto* widget = views::Widget::GetWidgetForNativeWindow(window); + // Check fullscreen window as well because it's possible for ARC to request + // frame regardless of window state. + bool covers_display = + widget && (widget->IsMaximized() || widget->IsFullscreen()); + if (covers_display) { + auto* frame_view = widget->non_client_view()->frame_view(); + // The frame height will be subtracted from client bounds. + gfx::Rect bounds = + frame_view->GetWindowBoundsForClientBounds(gfx::Rect()); + converted.Offset(0, -bounds.y()); + } } if (cursor_rect_ == converted)
diff --git a/components/autofill/core/browser/autofill_wallet_data_type_controller.cc b/components/autofill/core/browser/autofill_wallet_data_type_controller.cc index a717a83..24ad447 100644 --- a/components/autofill/core/browser/autofill_wallet_data_type_controller.cc +++ b/components/autofill/core/browser/autofill_wallet_data_type_controller.cc
@@ -71,23 +71,29 @@ void AutofillWalletDataTypeController::StopModels() { DCHECK(CalledOnValidThread()); - // This function is called when shutting down (nothing is changing), when - // sync is disabled completely, or when wallet sync is disabled. In the - // cases where wallet sync or sync in general is disabled, clear wallet cards - // and addresses copied from the server. This is different than other sync - // cases since this type of data reflects what's on the server rather than - // syncing local data between clients, so this extra step is required. - syncer::SyncService* service = sync_client_->GetSyncService(); + // This controller is used by two data types, we need to clear the data only + // once. (In particular, if AUTOFILL_WALLET_DATA is on USS (and thus doesn't + // use this controller), we *don't* want any ClearAllServerData call). + if (type() == syncer::AUTOFILL_WALLET_DATA) { + // This function is called when shutting down (nothing is changing), when + // sync is disabled completely, or when wallet sync is disabled. In the + // cases where wallet sync or sync in general is disabled, clear wallet + // cards and addresses copied from the server. This is different than other + // sync cases since this type of data reflects what's on the server rather + // than syncing local data between clients, so this extra step is required. + syncer::SyncService* service = sync_client_->GetSyncService(); - // CanSyncFeatureStart indicates if sync is currently enabled at all. The - // preferred data type indicates if wallet sync data/metadata is enabled, and - // currently_enabled_ indicates if the other prefs are enabled. All of these - // have to be enabled to sync wallet data/metadata. - if (!service->CanSyncFeatureStart() || - !service->GetPreferredDataTypes().Has(type()) || !currently_enabled_) { - autofill::PersonalDataManager* pdm = sync_client_->GetPersonalDataManager(); - if (pdm) - pdm->ClearAllServerData(); + // CanSyncFeatureStart indicates if sync is currently enabled at all. The + // preferred data type indicates if wallet sync data is enabled, and + // currently_enabled_ indicates if the other prefs are enabled. All of these + // have to be enabled to sync wallet data. + if (!service->CanSyncFeatureStart() || + !service->GetPreferredDataTypes().Has(type()) || !currently_enabled_) { + autofill::PersonalDataManager* pdm = + sync_client_->GetPersonalDataManager(); + if (pdm) + pdm->ClearAllServerData(); + } } }
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.cc b/components/autofill_assistant/browser/devtools/devtools_client.cc index 29a63d29..42ca72d8 100644 --- a/components/autofill_assistant/browser/devtools/devtools_client.cc +++ b/components/autofill_assistant/browser/devtools/devtools_client.cc
@@ -33,7 +33,9 @@ agent_host_->AttachClient(this); } -DevtoolsClient::~DevtoolsClient() {} +DevtoolsClient::~DevtoolsClient() { + agent_host_->DetachClient(this); +} input::Domain* DevtoolsClient::GetInput() { return &input_domain_;
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc index 556e256d..9231b0fd 100644 --- a/components/browser_sync/profile_sync_components_factory_impl.cc +++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -21,6 +21,7 @@ #include "components/browser_sync/profile_sync_service.h" #include "components/dom_distiller/core/dom_distiller_features.h" #include "components/history/core/browser/history_delete_directives_data_type_controller.h" +#include "components/history/core/browser/history_delete_directives_model_type_controller.h" #include "components/history/core/browser/typed_url_model_type_controller.h" #include "components/password_manager/core/browser/password_data_type_controller.h" #include "components/password_manager/core/browser/password_store.h" @@ -239,9 +240,17 @@ // Delete directive sync is enabled by default. if (!disabled_types.Has(syncer::HISTORY_DELETE_DIRECTIVES)) { - controllers.push_back( - std::make_unique<HistoryDeleteDirectivesDataTypeController>( - error_callback, sync_client_)); + if (base::FeatureList::IsEnabled( + switches::kSyncPseudoUSSHistoryDeleteDirectives)) { + controllers.push_back( + std::make_unique<HistoryDeleteDirectivesModelTypeController>( + sync_client_)); + + } else { + controllers.push_back( + std::make_unique<HistoryDeleteDirectivesDataTypeController>( + error_callback, sync_client_)); + } } // Session sync is enabled by default. This is disabled if history is
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn index 7f6bbb3..d0b9fd3 100644 --- a/components/history/core/browser/BUILD.gn +++ b/components/history/core/browser/BUILD.gn
@@ -40,6 +40,8 @@ "history_db_task.h", "history_delete_directives_data_type_controller.cc", "history_delete_directives_data_type_controller.h", + "history_delete_directives_model_type_controller.cc", + "history_delete_directives_model_type_controller.h", "history_model_worker.cc", "history_model_worker.h", "history_service.cc",
diff --git a/components/history/core/browser/OWNERS b/components/history/core/browser/OWNERS index 797e0dd9..52086dd 100644 --- a/components/history/core/browser/OWNERS +++ b/components/history/core/browser/OWNERS
@@ -1,2 +1,4 @@ +per-file history_delete_directives_data_type_controller*=file://components/sync/OWNERS +per-file history_delete_directives_model_type_controller*=file://components/sync/OWNERS per-file typed_url_model_type_controller*=file://components/sync/OWNERS per-file typed_url_sync_bridge*=file://components/sync/OWNERS
diff --git a/components/history/core/browser/history_delete_directives_data_type_controller.h b/components/history/core/browser/history_delete_directives_data_type_controller.h index c676515a..2e85c01 100644 --- a/components/history/core/browser/history_delete_directives_data_type_controller.h +++ b/components/history/core/browser/history_delete_directives_data_type_controller.h
@@ -6,7 +6,6 @@ #define COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_DELETE_DIRECTIVES_DATA_TYPE_CONTROLLER_H_ #include "base/macros.h" -#include "components/sync/device_info/local_device_info_provider.h" #include "components/sync/driver/async_directory_type_controller.h" #include "components/sync/driver/sync_service_observer.h"
diff --git a/components/history/core/browser/history_delete_directives_model_type_controller.cc b/components/history/core/browser/history_delete_directives_model_type_controller.cc new file mode 100644 index 0000000..7f7111c --- /dev/null +++ b/components/history/core/browser/history_delete_directives_model_type_controller.cc
@@ -0,0 +1,90 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/history/core/browser/history_delete_directives_model_type_controller.h" + +#include <utility> + +#include "base/bind.h" +#include "components/sync/driver/sync_client.h" +#include "components/sync/driver/sync_service.h" +#include "components/sync/model/model_type_store_service.h" + +namespace browser_sync { + +HistoryDeleteDirectivesModelTypeController:: + HistoryDeleteDirectivesModelTypeController(syncer::SyncClient* sync_client) + : SyncableServiceBasedModelTypeController( + syncer::HISTORY_DELETE_DIRECTIVES, + sync_client->GetModelTypeStoreService()->GetStoreFactory(), + base::BindOnce(&syncer::SyncClient::GetSyncableServiceForType, + base::Unretained(sync_client), + syncer::HISTORY_DELETE_DIRECTIVES)), + sync_client_(sync_client) {} + +HistoryDeleteDirectivesModelTypeController:: + ~HistoryDeleteDirectivesModelTypeController() {} + +bool HistoryDeleteDirectivesModelTypeController::ReadyForStart() const { + DCHECK(CalledOnValidThread()); + return !sync_client_->GetSyncService()->IsEncryptEverythingEnabled(); +} + +void HistoryDeleteDirectivesModelTypeController::LoadModels( + const syncer::ConfigureContext& configure_context, + const ModelLoadCallback& model_load_callback) { + DCHECK(CalledOnValidThread()); + DCHECK_EQ(NOT_RUNNING, state()); + + if (DisableTypeIfNecessary()) { + return; + } + + sync_client_->GetSyncService()->AddObserver(this); + SyncableServiceBasedModelTypeController::LoadModels(configure_context, + model_load_callback); +} + +void HistoryDeleteDirectivesModelTypeController::Stop( + syncer::SyncStopMetadataFate metadata_fate, + StopCallback callback) { + DCHECK(CalledOnValidThread()); + + if (sync_client_->GetSyncService()->HasObserver(this)) { + sync_client_->GetSyncService()->RemoveObserver(this); + } + + SyncableServiceBasedModelTypeController::Stop(metadata_fate, + std::move(callback)); +} + +void HistoryDeleteDirectivesModelTypeController::OnStateChanged( + syncer::SyncService* sync) { + DCHECK(CalledOnValidThread()); + DisableTypeIfNecessary(); +} + +bool HistoryDeleteDirectivesModelTypeController::DisableTypeIfNecessary() { + DCHECK(CalledOnValidThread()); + + if (!sync_client_->GetSyncService()->IsSyncFeatureActive()) { + return false; + } + + if (ReadyForStart()) { + return false; + } + + if (sync_client_->GetSyncService()->HasObserver(this)) { + sync_client_->GetSyncService()->RemoveObserver(this); + } + + ReportModelError( + syncer::SyncError::DATATYPE_POLICY_ERROR, + syncer::ModelError(FROM_HERE, + "Delete directives not supported with encryption.")); + return true; +} + +} // namespace browser_sync
diff --git a/components/history/core/browser/history_delete_directives_model_type_controller.h b/components/history/core/browser/history_delete_directives_model_type_controller.h new file mode 100644 index 0000000..07c3521e --- /dev/null +++ b/components/history/core/browser/history_delete_directives_model_type_controller.h
@@ -0,0 +1,51 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_DELETE_DIRECTIVES_MODEL_TYPE_CONTROLLER_H_ +#define COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_DELETE_DIRECTIVES_MODEL_TYPE_CONTROLLER_H_ + +#include "base/macros.h" +#include "components/sync/driver/sync_service_observer.h" +#include "components/sync/driver/syncable_service_based_model_type_controller.h" + +namespace syncer { +class SyncClient; +} // namespace syncer + +namespace browser_sync { + +// A controller for delete directives, which cannot sync when full encryption +// is enabled. +class HistoryDeleteDirectivesModelTypeController + : public syncer::SyncableServiceBasedModelTypeController, + public syncer::SyncServiceObserver { + public: + // |sync_client| must not be null and must outlive this object. + explicit HistoryDeleteDirectivesModelTypeController( + syncer::SyncClient* sync_client); + ~HistoryDeleteDirectivesModelTypeController() override; + + // DataTypeController overrides. + bool ReadyForStart() const override; + void LoadModels(const syncer::ConfigureContext& configure_context, + const ModelLoadCallback& model_load_callback) override; + void Stop(syncer::SyncStopMetadataFate metadata_fate, + StopCallback callback) override; + + // syncer::SyncServiceObserver implementation. + void OnStateChanged(syncer::SyncService* sync) override; + + private: + // Triggers a SingleDataTypeUnrecoverable error and returns true if the + // type is no longer ready, else does nothing and returns false. + bool DisableTypeIfNecessary(); + + syncer::SyncClient* const sync_client_; + + DISALLOW_COPY_AND_ASSIGN(HistoryDeleteDirectivesModelTypeController); +}; + +} // namespace browser_sync + +#endif // COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_DELETE_DIRECTIVES_MODEL_TYPE_CONTROLLER_H_
diff --git a/components/metrics/call_stack_profile_metrics_provider.cc b/components/metrics/call_stack_profile_metrics_provider.cc index 13b79694ad..5b2993a 100644 --- a/components/metrics/call_stack_profile_metrics_provider.cc +++ b/components/metrics/call_stack_profile_metrics_provider.cc
@@ -86,9 +86,6 @@ // provided to future invocations of CollectProfilesIfCollectionEnabled. void SetCollectionEnabled(bool enabled); - // True if profiles are being collected. - bool IsCollectionEnabled() const; - // Adds |profile| to the list of profiles if collection is enabled; it is // not const& because it must be passed with std::move. void CollectProfilesIfCollectionEnabled(ProfileState profile); @@ -147,11 +144,6 @@ } } -bool PendingProfiles::IsCollectionEnabled() const { - base::AutoLock scoped_lock(lock_); - return collection_enabled_; -} - void PendingProfiles::CollectProfilesIfCollectionEnabled(ProfileState profile) { base::AutoLock scoped_lock(lock_);
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js index e1d0b49..a1e3d885 100644 --- a/components/neterror/resources/offline.js +++ b/components/neterror/resources/offline.js
@@ -106,6 +106,8 @@ ACCELERATION: 0.001, BG_CLOUD_SPEED: 0.2, BOTTOM_PAD: 10, + // Scroll Y threshold at which the game can be activated. + CANVAS_IN_VIEW_OFFSET: -10, CLEAR_TIME: 3000, CLOUD_FREQUENCY: 0.5, GAMEOVER_CLEAR_TIME: 750, @@ -518,6 +520,16 @@ }, /** + * Checks whether the canvas area is in the viewport of the browser + * through the current scroll position. + * @return boolean. + */ + isCanvasInView: function() { + return this.containerEl.getBoundingClientRect().top > + Runner.config.CANVAS_IN_VIEW_OFFSET; + }, + + /** * Update the game frame and schedules the next one. */ update: function() { @@ -664,41 +676,43 @@ e.preventDefault(); } - if (!this.crashed && !this.paused) { - if (Runner.keycodes.JUMP[e.keyCode] || - e.type == Runner.events.TOUCHSTART) { - e.preventDefault(); - // Starting the game for the first time. - if (!this.playing) { - // Started by touch so create a touch controller. - if (!this.touchController && e.type == Runner.events.TOUCHSTART) { - this.createTouchController(); + if (this.isCanvasInView()) { + if (!this.crashed && !this.paused) { + if (Runner.keycodes.JUMP[e.keyCode] || + e.type == Runner.events.TOUCHSTART) { + e.preventDefault(); + // Starting the game for the first time. + if (!this.playing) { + // Started by touch so create a touch controller. + if (!this.touchController && e.type == Runner.events.TOUCHSTART) { + this.createTouchController(); + } + this.loadSounds(); + this.setPlayStatus(true); + this.update(); + if (window.errorPageController) { + errorPageController.trackEasterEgg(); + } } - this.loadSounds(); - this.setPlayStatus(true); - this.update(); - if (window.errorPageController) { - errorPageController.trackEasterEgg(); + // Start jump. + if (!this.tRex.jumping && !this.tRex.ducking) { + this.playSound(this.soundFx.BUTTON_PRESS); + this.tRex.startJump(this.currentSpeed); + } + } else if (this.playing && Runner.keycodes.DUCK[e.keyCode]) { + e.preventDefault(); + if (this.tRex.jumping) { + // Speed drop, activated only when jump key is not pressed. + this.tRex.setSpeedDrop(); + } else if (!this.tRex.jumping && !this.tRex.ducking) { + // Duck. + this.tRex.setDuck(true); } } - // Start jump. - if (!this.tRex.jumping && !this.tRex.ducking) { - this.playSound(this.soundFx.BUTTON_PRESS); - this.tRex.startJump(this.currentSpeed); - } - } else if (this.playing && Runner.keycodes.DUCK[e.keyCode]) { - e.preventDefault(); - if (this.tRex.jumping) { - // Speed drop, activated only when jump key is not pressed. - this.tRex.setSpeedDrop(); - } else if (!this.tRex.jumping && !this.tRex.ducking) { - // Duck. - this.tRex.setDuck(true); - } + } else if (this.crashed && e.type == Runner.events.TOUCHSTART && + e.currentTarget == this.containerEl) { + this.restart(); } - } else if (this.crashed && e.type == Runner.events.TOUCHSTART && - e.currentTarget == this.containerEl) { - this.restart(); } }, @@ -722,9 +736,10 @@ // Check that enough time has elapsed before allowing jump key to restart. var deltaTime = getTimeStamp() - this.time; - if (Runner.keycodes.RESTART[keyCode] || this.isLeftClickOnCanvas(e) || + if (this.isCanvasInView() && + (Runner.keycodes.RESTART[keyCode] || this.isLeftClickOnCanvas(e) || (deltaTime >= this.config.GAMEOVER_CLEAR_TIME && - Runner.keycodes.JUMP[keyCode])) { + Runner.keycodes.JUMP[keyCode]))) { this.restart(); } } else if (this.paused && isjumpKey) {
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 45daced6..3108634 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -191,6 +191,13 @@ // Feature used to fetch document suggestions. const base::Feature kDocumentProvider{"OmniboxDocumentProvider", base::FEATURE_DISABLED_BY_DEFAULT}; + +// Feature to replace the standard ZeroSuggest with icons for most visited sites +// and collections (bookmarks, history, recent tabs, reading list). Only +// available on iOS. +const base::Feature kOmniboxPopupShortcutIconsInZeroState{ + "OmniboxPopupShortcutIconsInZeroState", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace omnibox namespace {
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index e24290b..020c70ce 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -47,6 +47,7 @@ extern const base::Feature kSpeculativeServiceWorkerStartOnQueryInput; extern const base::Feature kBreakWordsAtUnderscores; extern const base::Feature kDocumentProvider; +extern const base::Feature kOmniboxPopupShortcutIconsInZeroState; } // namespace omnibox
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 985d62b..1ca48c3 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -526,6 +526,11 @@ if (client()->IsOffTheRecord()) return false; + if (base::FeatureList::IsEnabled( + omnibox::kOmniboxPopupShortcutIconsInZeroState)) { + return false; + } + // Only show zero suggest for pages with URLs the user will recognize // if it is not running in ChromeOS app_list context. // This list intentionally does not include items such as ftp: and file:
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h index 434dbb03..bda25ec 100644 --- a/components/payments/content/payment_request_spec.h +++ b/components/payments/content/payment_request_spec.h
@@ -238,7 +238,7 @@ base::ObserverList<Observer>::Unchecked observers_; mojom::AddressErrorsPtr shipping_address_errors_; - mojom::PayerErrorFieldsPtr payer_errors_; + mojom::PayerErrorsPtr payer_errors_; DISALLOW_COPY_AND_ASSIGN(PaymentRequestSpec); };
diff --git a/components/payments/content/payment_request_spec_unittest.cc b/components/payments/content/payment_request_spec_unittest.cc index 272c040..b20423e 100644 --- a/components/payments/content/payment_request_spec_unittest.cc +++ b/components/payments/content/payment_request_spec_unittest.cc
@@ -489,7 +489,7 @@ EXPECT_FALSE(spec()->has_payer_error()); - mojom::PayerErrorFieldsPtr payer_errors = mojom::PayerErrorFields::New(); + mojom::PayerErrorsPtr payer_errors = mojom::PayerErrors::New(); payer_errors->email = "Invalid email"; payer_errors->name = "Invalid name"; payer_errors->phone = "Invalid phone";
diff --git a/components/payments/content/payment_request_state_unittest.cc b/components/payments/content/payment_request_state_unittest.cc index 30db2cc..6b37dae 100644 --- a/components/payments/content/payment_request_state_unittest.cc +++ b/components/payments/content/payment_request_state_unittest.cc
@@ -462,7 +462,7 @@ EXPECT_TRUE(state()->selected_contact_profile()); EXPECT_FALSE(state()->invalid_contact_profile()); - mojom::PayerErrorFieldsPtr payer_errors = mojom::PayerErrorFields::New(); + mojom::PayerErrorsPtr payer_errors = mojom::PayerErrors::New(); payer_errors->email = "Invalid email"; payer_errors->name = "Invalid name"; payer_errors->phone = "Invalid phone";
diff --git a/components/payments/core/payments_validators.cc b/components/payments/core/payments_validators.cc index 155e5b4..b90b0db 100644 --- a/components/payments/core/payments_validators.cc +++ b/components/payments/core/payments_validators.cc
@@ -135,7 +135,7 @@ // static bool PaymentsValidators::IsValidPayerErrorsFormat( - const mojom::PayerErrorFieldsPtr& errors, + const mojom::PayerErrorsPtr& errors, std::string* optional_error_message) { return errors && IsValidErrorMsgFormat(errors->email, optional_error_message) &&
diff --git a/components/payments/core/payments_validators.h b/components/payments/core/payments_validators.h index 658b894..6570d38 100644 --- a/components/payments/core/payments_validators.h +++ b/components/payments/core/payments_validators.h
@@ -52,7 +52,7 @@ // Returns false and optionally populate |optional_error_message| if any // fields of |errors| have too long string (greater than 2048). - static bool IsValidPayerErrorsFormat(const mojom::PayerErrorFieldsPtr& errors, + static bool IsValidPayerErrorsFormat(const mojom::PayerErrorsPtr& errors, std::string* optional_error_message); // Returns false and optionally populate |optional_error_message| if any
diff --git a/components/payments/core/payments_validators_unittest.cc b/components/payments/core/payments_validators_unittest.cc index 67ec951..3e09be78 100644 --- a/components/payments/core/payments_validators_unittest.cc +++ b/components/payments/core/payments_validators_unittest.cc
@@ -285,7 +285,7 @@ mojom::PaymentValidationErrorsPtr errors = mojom::PaymentValidationErrors::New(); - mojom::PayerErrorFieldsPtr payer = mojom::PayerErrorFields::New(); + mojom::PayerErrorsPtr payer = mojom::PayerErrors::New(); payer->email = test_case.m_payer_email; payer->name = test_case.m_payer_name; payer->phone = test_case.m_payer_phone;
diff --git a/components/payments/mojom/payment_request_data.mojom b/components/payments/mojom/payment_request_data.mojom index 2b09bc3..e1e008c3 100644 --- a/components/payments/mojom/payment_request_data.mojom +++ b/components/payments/mojom/payment_request_data.mojom
@@ -49,13 +49,13 @@ // the browser process when calling retry() method in JavaScript. It contains // merchant-defined error message strings. struct PaymentValidationErrors { - PayerErrorFields payer; + PayerErrors payer; AddressErrors shipping_address; }; -// The |PayerErrorFields| is used to represent validation errors with one or +// The |PayerErrors| is used to represent validation errors with one or // more payer details. -struct PayerErrorFields { +struct PayerErrors { string email; string name; string phone;
diff --git a/components/scheduling_metrics/thread_metrics.cc b/components/scheduling_metrics/thread_metrics.cc index ac568b2..fd71838 100644 --- a/components/scheduling_metrics/thread_metrics.cc +++ b/components/scheduling_metrics/thread_metrics.cc
@@ -35,7 +35,7 @@ bool ThreadMetrics::ShouldDiscardTask( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { // TODO(altimin): Investigate the relationship between thread time and // wall time for discarded tasks. @@ -44,7 +44,7 @@ void ThreadMetrics::RecordTaskMetrics( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { DCHECK(!has_cpu_timing_for_each_task_ || task_timing.has_thread_time()); thread_task_duration_reporter_.RecordTask(thread_type_,
diff --git a/components/scheduling_metrics/thread_metrics.h b/components/scheduling_metrics/thread_metrics.h index e2f4f23..a4b2429 100644 --- a/components/scheduling_metrics/thread_metrics.h +++ b/components/scheduling_metrics/thread_metrics.h
@@ -26,13 +26,13 @@ bool ShouldDiscardTask( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); // Record task metrics which are shared between threads. void RecordTaskMetrics( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); protected:
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index 1ed14318..fcdefffa 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -215,6 +215,7 @@ "engine/polling_constants.h", "engine/sequenced_model_worker.cc", "engine/sequenced_model_worker.h", + "engine/shutdown_reason.cc", "engine/shutdown_reason.h", "engine/sync_auth_provider.h", "engine/sync_backend_registrar.cc",
diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc index dcdff0c..81dbe58 100644 --- a/components/sync/driver/data_type_manager_impl.cc +++ b/components/sync/driver/data_type_manager_impl.cc
@@ -303,7 +303,7 @@ // If we're performing a "catch up", first stop the model types to ensure the // call to Initialize triggers model association. if (catch_up_in_progress_) - model_association_manager_.Stop(KEEP_METADATA); + model_association_manager_.Stop(STOP_SYNC); download_started_ = false; model_association_manager_.Initialize( /*desired_types=*/last_enabled_types_, @@ -794,21 +794,9 @@ // Invalidate weak pointer to drop download callbacks. weak_ptr_factory_.InvalidateWeakPtrs(); - // Leave metadata If we do not disable sync completely. - SyncStopMetadataFate metadata_fate = KEEP_METADATA; - switch (reason) { - case STOP_SYNC: - break; - case DISABLE_SYNC: - metadata_fate = CLEAR_METADATA; - break; - case BROWSER_SHUTDOWN: - break; - } - // Stop all data types. This may trigger association callback but the // callback will do nothing because state is set to STOPPING above. - model_association_manager_.Stop(metadata_fate); + model_association_manager_.Stop(reason); // Individual data type controllers might still be STOPPING, but we don't // reflect that in |state_| because, for all practical matters, the manager is
diff --git a/components/sync/driver/model_association_manager.cc b/components/sync/driver/model_association_manager.cc index 99bb800..4ff34096 100644 --- a/components/sync/driver/model_association_manager.cc +++ b/components/sync/driver/model_association_manager.cc
@@ -16,6 +16,7 @@ #include "base/metrics/histogram_macros.h" #include "base/trace_event/trace_event.h" #include "components/sync/base/model_type.h" +#include "components/sync/base/sync_stop_metadata_fate.h" #include "components/sync/model/sync_merge_result.h" namespace syncer { @@ -126,7 +127,7 @@ notified_about_ready_for_configure_ = false; DVLOG(1) << "ModelAssociationManager: Stopping disabled types."; - std::map<DataTypeController*, SyncStopMetadataFate> types_to_stop; + std::map<DataTypeController*, ShutdownReason> types_to_stop; for (const auto& type_and_dtc : *controllers_) { DataTypeController* dtc = type_and_dtc.second.get(); // We stop a datatype if it's not desired. Independently of being desired, @@ -135,9 +136,9 @@ if ((dtc->state() != DataTypeController::NOT_RUNNING && !desired_types_.Has(dtc->type())) || dtc->state() == DataTypeController::STOPPING) { - const SyncStopMetadataFate metadata_fate = - preferred_types.Has(dtc->type()) ? KEEP_METADATA : CLEAR_METADATA; - types_to_stop[dtc] = metadata_fate; + const ShutdownReason reason = + preferred_types.Has(dtc->type()) ? STOP_SYNC : DISABLE_SYNC; + types_to_stop[dtc] = reason; } } @@ -149,18 +150,18 @@ base::BindOnce(&ModelAssociationManager::LoadEnabledTypes, weak_ptr_factory_.GetWeakPtr())); - for (const auto& dtc_and_metadata_fate : types_to_stop) { - DataTypeController* dtc = dtc_and_metadata_fate.first; - const SyncStopMetadataFate metadata_fate = dtc_and_metadata_fate.second; - DVLOG(1) << "ModelAssociationManager: stop " << dtc->name() << " with " - << SyncStopMetadataFateToString(metadata_fate); - StopDatatype(SyncError(), metadata_fate, dtc, barrier_closure); + for (const auto& dtc_and_reason : types_to_stop) { + DataTypeController* dtc = dtc_and_reason.first; + const ShutdownReason reason = dtc_and_reason.second; + DVLOG(1) << "ModelAssociationManager: stop " << dtc->name() << " due to " + << ShutdownReasonToString(reason); + StopDatatype(SyncError(), reason, dtc, barrier_closure); } } void ModelAssociationManager::StopDatatype( const SyncError& error, - SyncStopMetadataFate metadata_fate, + ShutdownReason shutdown_reason, DataTypeController* dtc, DataTypeController::StopCallback callback) { loaded_types_.Remove(dtc->type()); @@ -170,6 +171,25 @@ DCHECK(error.IsSet() || (dtc->state() != DataTypeController::NOT_RUNNING)); delegate_->OnSingleDataTypeWillStop(dtc->type(), error); + + // Leave metadata if we do not disable sync completely. + SyncStopMetadataFate metadata_fate = KEEP_METADATA; + switch (shutdown_reason) { + case STOP_SYNC: + // Special case: For AUTOFILL_WALLET_DATA, we want to clear all data even + // when Sync is stopped temporarily. + // TODO(crbug.com/890361): Consider moving this decision into the + // individual controller + if (dtc->type() == AUTOFILL_WALLET_DATA) { + metadata_fate = CLEAR_METADATA; + } + break; + case DISABLE_SYNC: + metadata_fate = CLEAR_METADATA; + break; + case BROWSER_SHUTDOWN: + break; + } dtc->Stop(metadata_fate, std::move(callback)); } @@ -254,7 +274,7 @@ } } -void ModelAssociationManager::Stop(SyncStopMetadataFate metadata_fate) { +void ModelAssociationManager::Stop(ShutdownReason shutdown_reason) { // Ignore callbacks from controllers. weak_ptr_factory_.InvalidateWeakPtrs(); @@ -265,7 +285,7 @@ dtc->state() != DataTypeController::STOPPING) { // We don't really wait until all datatypes have been fully stopped, which // is only required (and in fact waited for) when Initialize() is called. - StopDatatype(SyncError(), metadata_fate, dtc, base::DoNothing()); + StopDatatype(SyncError(), shutdown_reason, dtc, base::DoNothing()); DVLOG(1) << "ModelAssociationManager: Stopped " << dtc->name(); } } @@ -335,8 +355,7 @@ DVLOG(1) << "ModelAssociationManager: Type encountered an error."; desired_types_.Remove(type); DataTypeController* dtc = controllers_->find(type)->second.get(); - StopDatatype(local_merge_result.error(), KEEP_METADATA, dtc, - base::DoNothing()); + StopDatatype(local_merge_result.error(), STOP_SYNC, dtc, base::DoNothing()); NotifyDelegateIfReadyForConfigure(); // Update configuration result. @@ -410,7 +429,7 @@ static_cast<int>(MODEL_TYPE_COUNT)); StopDatatype(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, "Association timed out.", dtc->type()), - KEEP_METADATA, dtc, base::DoNothing()); + STOP_SYNC, dtc, base::DoNothing()); } }
diff --git a/components/sync/driver/model_association_manager.h b/components/sync/driver/model_association_manager.h index 07dcc5f0..aada6fee 100644 --- a/components/sync/driver/model_association_manager.h +++ b/components/sync/driver/model_association_manager.h
@@ -11,12 +11,12 @@ #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" -#include "components/sync/base/sync_stop_metadata_fate.h" #include "components/sync/base/weak_handle.h" #include "components/sync/driver/configure_context.h" #include "components/sync/driver/data_type_controller.h" #include "components/sync/driver/data_type_manager.h" #include "components/sync/engine/data_type_association_stats.h" +#include "components/sync/engine/shutdown_reason.h" namespace syncer { @@ -94,9 +94,7 @@ const ConfigureContext& context); // Can be called at any time. Synchronously stops all datatypes. - // If |metadata_fate| equals CLEAR_METADATA controllers should clear sync - // metadata. - void Stop(SyncStopMetadataFate metadata_fate); + void Stop(ShutdownReason shutdown_reason); // Should only be called after Initialize to start the actual association. // |types_to_associate| should be subset of |desired_types| in Initialize(). @@ -138,7 +136,7 @@ // A helper to stop an individual datatype. void StopDatatype(const SyncError& error, - SyncStopMetadataFate metadata_fate, + ShutdownReason shutdown_reason, DataTypeController* dtc, DataTypeController::StopCallback callback);
diff --git a/components/sync/driver/model_association_manager_unittest.cc b/components/sync/driver/model_association_manager_unittest.cc index 6d74f01..5eac7ab4 100644 --- a/components/sync/driver/model_association_manager_unittest.cc +++ b/components/sync/driver/model_association_manager_unittest.cc
@@ -120,7 +120,7 @@ EXPECT_EQ(GetController(controllers_, BOOKMARKS)->state(), DataTypeController::ASSOCIATING); - model_association_manager.Stop(KEEP_METADATA); + model_association_manager.Stop(STOP_SYNC); EXPECT_EQ(GetController(controllers_, BOOKMARKS)->state(), DataTypeController::NOT_RUNNING); EXPECT_EQ( @@ -148,7 +148,7 @@ DataTypeController::ASSOCIATING); GetController(controllers_, BOOKMARKS)->FinishStart(DataTypeController::OK); - model_association_manager.Stop(KEEP_METADATA); + model_association_manager.Stop(STOP_SYNC); EXPECT_EQ(GetController(controllers_, BOOKMARKS)->state(), DataTypeController::NOT_RUNNING); EXPECT_EQ( @@ -572,7 +572,7 @@ ASSERT_EQ(GetController(controllers_, BOOKMARKS)->state(), DataTypeController::MODEL_LOADED); - model_association_manager.Stop(CLEAR_METADATA); + model_association_manager.Stop(DISABLE_SYNC); EXPECT_EQ(GetController(controllers_, BOOKMARKS)->state(), DataTypeController::NOT_RUNNING);
diff --git a/components/sync/driver/model_type_controller.cc b/components/sync/driver/model_type_controller.cc index 80100852..a7541dd3 100644 --- a/components/sync/driver/model_type_controller.cc +++ b/components/sync/driver/model_type_controller.cc
@@ -21,14 +21,9 @@ namespace syncer { namespace { -void ReportError(ModelType model_type, - scoped_refptr<base::SequencedTaskRunner> ui_thread, +void ReportError(scoped_refptr<base::SequencedTaskRunner> ui_thread, const ModelErrorHandler& error_handler, const ModelError& error) { - // TODO(wychen): enum uma should be strongly typed. crbug.com/661401 - UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeRunFailures", - ModelTypeToHistogramInt(model_type), - static_cast<int>(MODEL_TYPE_COUNT)); ui_thread->PostTask(error.location(), base::BindOnce(error_handler, error)); } @@ -90,7 +85,7 @@ DataTypeActivationRequest request; request.error_handler = base::BindRepeating( - &ReportError, type(), base::SequencedTaskRunnerHandle::Get(), + &ReportError, base::SequencedTaskRunnerHandle::Get(), base::BindRepeating(&ModelTypeController::ReportModelError, base::AsWeakPtr(this), SyncError::DATATYPE_ERROR)); request.authenticated_account_id = configure_context.authenticated_account_id; @@ -292,6 +287,11 @@ const ModelError& error) { DCHECK(CalledOnValidThread()); + // TODO(wychen): enum uma should be strongly typed. crbug.com/661401 + UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeRunFailures", + ModelTypeToHistogramInt(type()), + static_cast<int>(MODEL_TYPE_COUNT)); + // Error could arrive too late, e.g. after the datatype has been stopped. // This is allowed for the delegate's convenience, so there's no constraints // around when exactly DataTypeActivationRequest::error_handler is supposed to
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc index 020aa1b..99dd56e 100644 --- a/components/sync/driver/sync_driver_switches.cc +++ b/components/sync/driver/sync_driver_switches.cc
@@ -58,10 +58,14 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSyncPseudoUSSFavicons{"SyncPseudoUSSFavicons", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kSyncPseudoUSSHistoryDeleteDirectives{ + "SyncPseudoUSSHistoryDeleteDirectives", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSyncPseudoUSSPreferences{ "SyncPseudoUSSPreferences", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSyncPseudoUSSPriorityPreferences{ "SyncPseudoUSSPriorityPreferences", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kSyncPseudoUSSSupervisedUsers{ + "SyncPseudoUSSSupervisedUsers", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSyncPseudoUSSThemes{"SyncPseudoUSSThemes", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h index 00b6099a..bcdaec7f 100644 --- a/components/sync/driver/sync_driver_switches.h +++ b/components/sync/driver/sync_driver_switches.h
@@ -28,8 +28,10 @@ extern const base::Feature kSyncPseudoUSSDictionary; extern const base::Feature kSyncPseudoUSSExtensions; extern const base::Feature kSyncPseudoUSSFavicons; +extern const base::Feature kSyncPseudoUSSHistoryDeleteDirectives; extern const base::Feature kSyncPseudoUSSPreferences; extern const base::Feature kSyncPseudoUSSPriorityPreferences; +extern const base::Feature kSyncPseudoUSSSupervisedUsers; extern const base::Feature kSyncPseudoUSSThemes; extern const base::Feature kSyncStandaloneTransport; extern const base::Feature kSyncSupportSecondaryAccount;
diff --git a/components/sync/engine/shutdown_reason.cc b/components/sync/engine/shutdown_reason.cc new file mode 100644 index 0000000..c95f91c --- /dev/null +++ b/components/sync/engine/shutdown_reason.cc
@@ -0,0 +1,25 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/engine/shutdown_reason.h" + +#include "base/logging.h" + +namespace syncer { + +const char* ShutdownReasonToString(ShutdownReason reason) { + switch (reason) { + case STOP_SYNC: + return "STOP_SYNC"; + case DISABLE_SYNC: + return "DISABLE_SYNC"; + case BROWSER_SHUTDOWN: + return "BROWSER_SHUTDOWN"; + } + + NOTREACHED(); + return ""; +} + +} // namespace syncer
diff --git a/components/sync/engine/shutdown_reason.h b/components/sync/engine/shutdown_reason.h index a61be8f..1a3f082 100644 --- a/components/sync/engine/shutdown_reason.h +++ b/components/sync/engine/shutdown_reason.h
@@ -14,6 +14,8 @@ BROWSER_SHUTDOWN, // Browser is closed. }; +const char* ShutdownReasonToString(ShutdownReason reason); + } // namespace syncer #endif // COMPONENTS_SYNC_ENGINE_SHUTDOWN_REASON_H_
diff --git a/components/sync/model/fake_model_type_sync_bridge.cc b/components/sync/model/fake_model_type_sync_bridge.cc index 7331a40..16e0196e 100644 --- a/components/sync/model/fake_model_type_sync_bridge.cc +++ b/components/sync/model/fake_model_type_sync_bridge.cc
@@ -360,12 +360,24 @@ return std::move(*conflict_resolution_); } +ModelTypeSyncBridge::StopSyncResponse +FakeModelTypeSyncBridge::ApplyStopSyncChanges( + std::unique_ptr<MetadataChangeList> delete_metadata_change_list) { + ModelTypeSyncBridge::ApplyStopSyncChanges( + std::move(delete_metadata_change_list)); + return stop_sync_response_; +} + void FakeModelTypeSyncBridge::SetConflictResolution( ConflictResolution resolution) { conflict_resolution_ = std::make_unique<ConflictResolution>(std::move(resolution)); } +void FakeModelTypeSyncBridge::SetStopSyncResponse(StopSyncResponse response) { + stop_sync_response_ = response; +} + void FakeModelTypeSyncBridge::ErrorOnNextCall() { EXPECT_FALSE(error_next_); error_next_ = true;
diff --git a/components/sync/model/fake_model_type_sync_bridge.h b/components/sync/model/fake_model_type_sync_bridge.h index e6f18e2..89e91f83 100644 --- a/components/sync/model/fake_model_type_sync_bridge.h +++ b/components/sync/model/fake_model_type_sync_bridge.h
@@ -126,11 +126,16 @@ ConflictResolution ResolveConflict( const EntityData& local_data, const EntityData& remote_data) const override; + StopSyncResponse ApplyStopSyncChanges( + std::unique_ptr<MetadataChangeList> delete_metadata_change_list) override; - // Store a resolution for the next call to ResolveConflict. Note that if this + // Stores a resolution for the next call to ResolveConflict. Note that if this // is a USE_NEW resolution, the data will only exist for one resolve call. void SetConflictResolution(ConflictResolution resolution); + // Stores the value returned by future calls to ApplyStopSyncChanges(). + void SetStopSyncResponse(StopSyncResponse response); + // Sets an error that the next fallible call to the bridge will generate. void ErrorOnNextCall(); @@ -139,7 +144,7 @@ // test code here, this function is needed to manually copy it. static std::unique_ptr<EntityData> CopyEntityData(const EntityData& old_data); - // Set storage key which will be ignored by bridge. + // Sets storage key which will be ignored by bridge. void SetKeyToIgnore(const std::string key); const Store& db() { return *db_; } @@ -157,6 +162,9 @@ // The conflict resolution to use for calls to ResolveConflict. std::unique_ptr<ConflictResolution> conflict_resolution_; + StopSyncResponse stop_sync_response_ = + StopSyncResponse::kModelStillReadyToSync; + // The storage keys which bridge will ignore. std::unordered_set<std::string> keys_to_ignore_;
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc index e72601ba..ad090a9 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -185,16 +185,19 @@ // For commit-only types, no updates are expected and hence we can // consider initial_sync_done(). model_type_state_.set_initial_sync_done(commit_only_); + // Notify the bridge sync is starting to simulate an enable event. + bridge_->OnSyncStarting(activation_request_); break; case ModelTypeSyncBridge::StopSyncResponse::kModelNoLongerReadyToSync: // Model not ready to sync, so wait until the bridge calls // ModelReadyToSync(). DCHECK(!model_ready_to_sync_); - break; + // Notify the bridge sync is starting to simulate an enable event. + bridge_->OnSyncStarting(activation_request_); + // Return early to avoid replying to OnSyncStarting() immediately. This + // will be handled in ModelReadyToSync(). + return; } - - // Notify the bridge sync is starting to simulate an enable event. - bridge_->OnSyncStarting(activation_request_); } // Cache GUID verification guarantees the user is the same. @@ -1178,6 +1181,10 @@ return HasLocalChanges(); } +bool ClientTagBasedModelTypeProcessor::IsModelReadyToSyncForTest() const { + return model_ready_to_sync_; +} + void ClientTagBasedModelTypeProcessor::ExpireEntriesIfNeeded( const sync_pb::DataTypeProgressMarker& progress_marker) { if (!progress_marker.has_gc_directive())
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.h b/components/sync/model_impl/client_tag_based_model_type_processor.h index 5d78063..3f35eb3 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.h +++ b/components/sync/model_impl/client_tag_based_model_type_processor.h
@@ -98,6 +98,8 @@ bool HasLocalChangesForTest() const; + bool IsModelReadyToSyncForTest() const; + private: friend class ModelTypeDebugInfo; friend class ClientTagBasedModelTypeProcessorTest;
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc index 9994bcd3..1769b9f 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
@@ -1918,14 +1918,56 @@ metadata_batch->SetModelTypeState(model_type_state); type_processor()->ModelReadyToSync(std::move(metadata_batch)); + ASSERT_TRUE(type_processor()->IsModelReadyToSyncForTest()); OnSyncStarting(); + // Model should still be ready to sync. + ASSERT_TRUE(type_processor()->IsModelReadyToSyncForTest()); + // OnSyncStarting() should have completed. + EXPECT_NE(nullptr, worker()); // Upon a mismatch, metadata should have been cleared. EXPECT_EQ(0U, db().metadata_count()); } TEST_F(ClientTagBasedModelTypeProcessorTest, + ShouldNotConnectImmediatelyAfterGuidMismatchIfNotReadyToSync) { + // Commit item. + InitializeToReadyState(); + WriteItemAndAck(kKey1, kValue1); + // Reset the processor to simulate a restart. + ResetState(/*keep_db=*/true); + + // Force future stops cause the model to become unready. + bridge()->SetStopSyncResponse( + ModelTypeSyncBridge::StopSyncResponse::kModelNoLongerReadyToSync); + + // A new processor loads the metadata after changing the cache GUID. + bridge()->SetInitialSyncDone(true); + + std::unique_ptr<MetadataBatch> metadata_batch = db().CreateMetadataBatch(); + sync_pb::ModelTypeState model_type_state(metadata_batch->GetModelTypeState()); + model_type_state.set_cache_guid("WRONG_CACHE_GUID"); + metadata_batch->SetModelTypeState(model_type_state); + + type_processor()->ModelReadyToSync(std::move(metadata_batch)); + ASSERT_TRUE(type_processor()->IsModelReadyToSyncForTest()); + + OnSyncStarting(); + + // Model should not be ready to sync. + ASSERT_FALSE(type_processor()->IsModelReadyToSyncForTest()); + // OnSyncStarting() should NOT have completed. + EXPECT_EQ(nullptr, worker()); + // Upon a mismatch, metadata should have been cleared. + EXPECT_EQ(0U, db().metadata_count()); + + // Calling ModelReadyToSync() should complete OnSyncStarting(). + type_processor()->ModelReadyToSync(std::make_unique<MetadataBatch>()); + EXPECT_NE(nullptr, worker()); +} + +TEST_F(ClientTagBasedModelTypeProcessorTest, ShouldClearOrphanMetadataInGetLocalChangesWhenDataIsMissing) { InitializeToReadyState(); bridge()->WriteItem(kKey1, kValue1);
diff --git a/components/sync/test/fake_server/android/fake_server_helper_android.cc b/components/sync/test/fake_server/android/fake_server_helper_android.cc index 452a557..50f9e910 100644 --- a/components/sync/test/fake_server/android/fake_server_helper_android.cc +++ b/components/sync/test/fake_server/android/fake_server_helper_android.cc
@@ -154,6 +154,20 @@ /*creation_time=*/now, /*last_modified_time=*/now)); } +void FakeServerHelperAndroid::SetWalletData( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jlong fake_server, + const base::android::JavaParamRef<jbyteArray>& serialized_entity) { + fake_server::FakeServer* fake_server_ptr = + reinterpret_cast<fake_server::FakeServer*>(fake_server); + + sync_pb::SyncEntity entity; + DeserializeEntity(env, serialized_entity, &entity); + + fake_server_ptr->SetWalletData({entity}); +} + void FakeServerHelperAndroid::ModifyEntitySpecifics( JNIEnv* env, const JavaParamRef<jobject>& obj, @@ -171,6 +185,17 @@ base::android::ConvertJavaStringToUTF8(env, id), entity_specifics); } +void FakeServerHelperAndroid::DeserializeEntity(JNIEnv* env, + jbyteArray serialized_entity, + sync_pb::SyncEntity* entity) { + int bytes_length = env->GetArrayLength(serialized_entity); + jbyte* bytes = env->GetByteArrayElements(serialized_entity, nullptr); + std::string string(reinterpret_cast<char*>(bytes), bytes_length); + + if (!entity->ParseFromString(string)) + NOTREACHED() << "Could not deserialize Entity"; +} + void FakeServerHelperAndroid::DeserializeEntitySpecifics( JNIEnv* env, jbyteArray serialized_entity_specifics,
diff --git a/components/sync/test/fake_server/android/fake_server_helper_android.h b/components/sync/test/fake_server/android/fake_server_helper_android.h index 9960575e..6578a8c0 100644 --- a/components/sync/test/fake_server/android/fake_server_helper_android.h +++ b/components/sync/test/fake_server/android/fake_server_helper_android.h
@@ -70,6 +70,14 @@ const base::android::JavaParamRef<jbyteArray>& serialized_entity_specifics); + // Sets the Wallet card and address data to be served in following GetUpdates + // requests. + void SetWalletData( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jlong fake_server, + const base::android::JavaParamRef<jbyteArray>& serialized_entity); + // Modifies the entity with |id| on |fake_server|. void ModifyEntitySpecifics(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, @@ -137,6 +145,11 @@ private: virtual ~FakeServerHelperAndroid(); + // Deserializes |serialized_entity| into |entity|. + void DeserializeEntity(JNIEnv* env, + jbyteArray serialized_entity, + sync_pb::SyncEntity* entity); + // Deserializes |serialized_entity_specifics| into |entity_specifics|. void DeserializeEntitySpecifics(JNIEnv* env, jbyteArray serialized_entity_specifics,
diff --git a/components/zucchini/disassembler.h b/components/zucchini/disassembler.h index ab1dafb..d60a3f1 100644 --- a/components/zucchini/disassembler.h +++ b/components/zucchini/disassembler.h
@@ -97,8 +97,6 @@ using WriterFactory = std::unique_ptr<ReferenceWriter> (Disassembler::*)( MutableBufferView image); - ReferenceGroup() = default; - // RefinedGeneratorFactory and RefinedReceptorFactory don't have to be // identical to GeneratorFactory and ReceptorFactory, but they must be // convertible. As a result, they can be pointer to member function of a
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index c9814fd..683a7f3 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1919,6 +1919,8 @@ sources += [ "gpu/ca_transaction_gpu_coordinator.cc", "gpu/ca_transaction_gpu_coordinator.h", + "web_contents/web_contents_ns_view_bridge.h", + "web_contents/web_contents_ns_view_bridge.mm", ] deps += [ "//ui/events:dom_keyboard_layout" ] }
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc index d83fc8ab..49d7f70 100644 --- a/content/browser/background_fetch/background_fetch_context.cc +++ b/content/browser/background_fetch/background_fetch_context.cc
@@ -357,6 +357,15 @@ AbandonFetches(blink::mojom::kInvalidServiceWorkerRegistrationId); } +void BackgroundFetchContext::OnFetchStorageError( + const BackgroundFetchRegistrationId& registration_id) { + auto controllers_iter = job_controllers_.find(registration_id.unique_id()); + if (controllers_iter == job_controllers_.end()) + return; + + controllers_iter->second->Abort(FailureReason::SERVICE_WORKER_UNAVAILABLE); +} + void BackgroundFetchContext::CreateController( const BackgroundFetchRegistrationId& registration_id, const BackgroundFetchRegistration& registration,
diff --git a/content/browser/background_fetch/background_fetch_context.h b/content/browser/background_fetch/background_fetch_context.h index cfafb23..663ba5ce 100644 --- a/content/browser/background_fetch/background_fetch_context.h +++ b/content/browser/background_fetch/background_fetch_context.h
@@ -144,6 +144,8 @@ int64_t service_worker_registration_id) override; void OnQuotaExceeded( const BackgroundFetchRegistrationId& registration_id) override; + void OnFetchStorageError( + const BackgroundFetchRegistrationId& registration_id) override; // ServiceWorkerContextCoreObserver implementation. void OnRegistrationDeleted(int64_t registration_id,
diff --git a/content/browser/background_fetch/background_fetch_data_manager_observer.h b/content/browser/background_fetch/background_fetch_data_manager_observer.h index ab1a9f2..192cea1c 100644 --- a/content/browser/background_fetch/background_fetch_data_manager_observer.h +++ b/content/browser/background_fetch/background_fetch_data_manager_observer.h
@@ -44,6 +44,11 @@ virtual void OnQuotaExceeded( const BackgroundFetchRegistrationId& registration_id) = 0; + // Called if a database task encountered a storage error in the context of a + // fetch workflow, such as preparing a request or storing a response. + virtual void OnFetchStorageError( + const BackgroundFetchRegistrationId& registration_id) = 0; + virtual ~BackgroundFetchDataManagerObserver() {} };
diff --git a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc index fc33a75..f5c9e11 100644 --- a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc +++ b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
@@ -574,6 +574,8 @@ void(int64_t service_worker_registration_id)); MOCK_METHOD1(OnQuotaExceeded, void(const BackgroundFetchRegistrationId& registration_id)); + MOCK_METHOD1(OnFetchStorageError, + void(const BackgroundFetchRegistrationId& registration_id)); protected: void DidGetRegistration(base::OnceClosure quit_closure, @@ -1183,6 +1185,48 @@ EXPECT_EQ(error, blink::mojom::BackgroundFetchError::NONE); } +TEST_F(BackgroundFetchDataManagerTest, MarkRegistrationForDeletion) { + int64_t sw_id = RegisterServiceWorker(); + ASSERT_NE(blink::mojom::kInvalidServiceWorkerRegistrationId, sw_id); + + BackgroundFetchRegistrationId registration_id1( + sw_id, origin(), kExampleDeveloperId, kExampleUniqueId); + + std::vector<ServiceWorkerFetchRequest> requests(2u); + BackgroundFetchOptions options; + blink::mojom::BackgroundFetchError error; + + CreateRegistration(registration_id1, requests, options, SkBitmap(), &error); + ASSERT_EQ(error, blink::mojom::BackgroundFetchError::NONE); + + // Create a |developer_id| such that the other one is a substring. + std::string developer_id2 = std::string(kExampleDeveloperId) + "!"; + BackgroundFetchRegistrationId registration_id2(sw_id, origin(), developer_id2, + kAlternativeUniqueId); + + CreateRegistration(registration_id2, requests, options, SkBitmap(), &error); + ASSERT_EQ(error, blink::mojom::BackgroundFetchError::NONE); + + // Get all active registration mappings. + { + auto registrations = GetRegistrationUserDataByKeyPrefix( + sw_id, background_fetch::ActiveRegistrationUniqueIdKey("")); + EXPECT_EQ(registrations.size(), 2u); + } + + // Deactivate the first registration. + MarkRegistrationForDeletion(registration_id1, &error); + EXPECT_EQ(error, blink::mojom::BackgroundFetchError::NONE); + + // The second registration should still exist. + { + auto registrations = GetRegistrationUserDataByKeyPrefix( + sw_id, background_fetch::ActiveRegistrationUniqueIdKey("")); + ASSERT_EQ(registrations.size(), 1u); + EXPECT_EQ(registrations[0], kAlternativeUniqueId); + } +} + TEST_F(BackgroundFetchDataManagerTest, PopNextRequestAndMarkAsComplete) { int64_t sw_id = RegisterServiceWorker(); ASSERT_NE(blink::mojom::kInvalidServiceWorkerRegistrationId, sw_id); @@ -1774,12 +1818,7 @@ RestartDataManagerFromPersistentStorage(); - // Pending Requests should be deleted after marking a registration for - // deletion. - EXPECT_EQ(0u, GetRegistrationUserDataByKeyPrefix( - sw_id, background_fetch::kPendingRequestKeyPrefix) - .size()); - EXPECT_EQ(2u, // Metadata proto + title. + EXPECT_EQ(4u, // Metadata proto + UI options + remaining pending fetches. GetRegistrationUserDataByKeyPrefix(sw_id, kUserDataPrefix).size()); // Cleanup should delete the registration.
diff --git a/content/browser/background_fetch/background_fetch_scheduler.cc b/content/browser/background_fetch/background_fetch_scheduler.cc index b71c8d7b..6038067c 100644 --- a/content/browser/background_fetch/background_fetch_scheduler.cc +++ b/content/browser/background_fetch/background_fetch_scheduler.cc
@@ -117,10 +117,7 @@ } if (error != blink::mojom::BackgroundFetchError::NONE) { - active_controller_->Finish( - blink::mojom::BackgroundFetchFailureReason::SERVICE_WORKER_UNAVAILABLE); - active_controller_ = nullptr; - ScheduleDownload(); + // This fetch is being abandoned, after which something will be scheduled. return; } @@ -154,11 +151,8 @@ return; if (error != blink::mojom::BackgroundFetchError::NONE) { + // This fetch is being abandoned, after which something will be scheduled. DCHECK_EQ(error, blink::mojom::BackgroundFetchError::STORAGE_ERROR); - active_controller_->Finish( - blink::mojom::BackgroundFetchFailureReason::SERVICE_WORKER_UNAVAILABLE); - active_controller_ = nullptr; - ScheduleDownload(); return; }
diff --git a/content/browser/background_fetch/storage/database_helpers.h b/content/browser/background_fetch/storage/database_helpers.h index bca77cd..82ea96e 100644 --- a/content/browser/background_fetch/storage/database_helpers.h +++ b/content/browser/background_fetch/storage/database_helpers.h
@@ -34,7 +34,8 @@ const char kCompletedRequestKeyPrefix[] = "bgfetch_completed_request_"; // Database Keys. -std::string ActiveRegistrationUniqueIdKey(const std::string& developer_id); +CONTENT_EXPORT std::string ActiveRegistrationUniqueIdKey( + const std::string& developer_id); CONTENT_EXPORT std::string RegistrationKey(const std::string& unique_id);
diff --git a/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc b/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc index 6007fb6b..68c9de0 100644 --- a/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc +++ b/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc
@@ -63,14 +63,10 @@ proto::BackgroundFetchMetadata metadata_proto; if (metadata_proto.ParseFromString(data[1])) { - // Mark registration as no longer active. Also deletes pending request - // keys, since those are globally sorted and requests within deactivated - // registrations are no longer eligible to be started. Pending request - // keys are not required by GetRegistration. - service_worker_context()->ClearRegistrationUserDataByKeyPrefixes( + // Mark registration as no longer active. + service_worker_context()->ClearRegistrationUserData( registration_id_.service_worker_registration_id(), - {ActiveRegistrationUniqueIdKey(registration_id_.developer_id()), - PendingRequestKeyPrefix(registration_id_.unique_id())}, + {ActiveRegistrationUniqueIdKey(registration_id_.developer_id())}, base::BindOnce(&MarkRegistrationForDeletionTask::DidDeactivate, weak_factory_.GetWeakPtr())); } else {
diff --git a/content/browser/background_fetch/storage/mark_request_complete_task.cc b/content/browser/background_fetch/storage/mark_request_complete_task.cc index 7fcf47e..5fb06db 100644 --- a/content/browser/background_fetch/storage/mark_request_complete_task.cc +++ b/content/browser/background_fetch/storage/mark_request_complete_task.cc
@@ -305,8 +305,11 @@ void MarkRequestCompleteTask::FinishWithError( blink::mojom::BackgroundFetchError error) { - if (HasStorageError()) + if (HasStorageError()) { error = blink::mojom::BackgroundFetchError::STORAGE_ERROR; + for (auto& observer : data_manager()->observers()) + observer.OnFetchStorageError(registration_id_); + } ReportStorageError(); std::move(callback_).Run(error);
diff --git a/content/browser/background_fetch/storage/start_next_pending_request_task.cc b/content/browser/background_fetch/storage/start_next_pending_request_task.cc index 7fb5d74..a28ed8a 100644 --- a/content/browser/background_fetch/storage/start_next_pending_request_task.cc +++ b/content/browser/background_fetch/storage/start_next_pending_request_task.cc
@@ -6,6 +6,7 @@ #include "base/guid.h" #include "content/browser/background_fetch/background_fetch_data_manager.h" +#include "content/browser/background_fetch/background_fetch_data_manager_observer.h" #include "content/browser/background_fetch/storage/database_helpers.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" @@ -122,6 +123,10 @@ void StartNextPendingRequestTask::FinishWithError( blink::mojom::BackgroundFetchError error) { + if (HasStorageError()) { + for (auto& observer : data_manager()->observers()) + observer.OnFetchStorageError(registration_id_); + } ReportStorageError(); std::move(callback_).Run(error, std::move(next_request_));
diff --git a/content/browser/devtools/devtools_video_consumer.cc b/content/browser/devtools/devtools_video_consumer.cc index 1dd814c..f06866c3 100644 --- a/content/browser/devtools/devtools_video_consumer.cc +++ b/content/browser/devtools/devtools_video_consumer.cc
@@ -57,7 +57,7 @@ skbitmap.allocN32Pixels(frame->visible_rect().width(), frame->visible_rect().height()); cc::SkiaPaintCanvas canvas(skbitmap); - renderer.Copy(frame, &canvas, media::Context3D(), nullptr); + renderer.Copy(frame, &canvas, media::Context3D()); return skbitmap; }
diff --git a/content/browser/media/audio_output_stream_broker.cc b/content/browser/media/audio_output_stream_broker.cc index 1ddd0ad9..2ee519d 100644 --- a/content/browser/media/audio_output_stream_broker.cc +++ b/content/browser/media/audio_output_stream_broker.cc
@@ -16,6 +16,48 @@ namespace content { +namespace { + +// Used in Media.Audio.Render.StreamBrokerDisconnectReason2 histogram, matches +// StreamBrokerDisconnectReason2 enum. +enum class StreamBrokerDisconnectReason { + kDefault = 0, + kPlatformError, + kTerminatedByClient, + kTerminatedByClientAwaitingCreated, + kStreamCreationFailed, + kDocumentDestroyed, + kDocumentDestroyedAwaitingCreated, + kMaxValue = kDocumentDestroyedAwaitingCreated +}; + +using DisconnectReason = + media::mojom::AudioOutputStreamObserver::DisconnectReason; + +StreamBrokerDisconnectReason GetDisconnectReason(DisconnectReason reason, + bool awaiting_created) { + switch (reason) { + case DisconnectReason::kPlatformError: + return StreamBrokerDisconnectReason::kPlatformError; + case DisconnectReason::kTerminatedByClient: + return awaiting_created + ? StreamBrokerDisconnectReason:: + kTerminatedByClientAwaitingCreated + : StreamBrokerDisconnectReason::kTerminatedByClient; + case DisconnectReason::kStreamCreationFailed: + return StreamBrokerDisconnectReason::kStreamCreationFailed; + case DisconnectReason::kDocumentDestroyed: + return awaiting_created + ? StreamBrokerDisconnectReason:: + kDocumentDestroyedAwaitingCreated + : StreamBrokerDisconnectReason::kDocumentDestroyed; + case DisconnectReason::kDefault: + return StreamBrokerDisconnectReason::kDefault; + } +} + +} // namespace + AudioOutputStreamBroker::AudioOutputStreamBroker( int render_process_id, int render_frame_id, @@ -49,23 +91,34 @@ media_observer->OnCreatingAudioStream(render_process_id, render_frame_id); // Unretained is safe because |this| owns |client_| - client_.set_connection_error_handler(base::BindOnce( - &AudioOutputStreamBroker::ClientBindingLost, base::Unretained(this))); + client_.set_connection_error_handler( + base::BindOnce(&AudioOutputStreamBroker::Cleanup, base::Unretained(this), + DisconnectReason::kTerminatedByClient)); } AudioOutputStreamBroker::~AudioOutputStreamBroker() { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); - if (awaiting_created_) { + const StreamBrokerDisconnectReason reason = + GetDisconnectReason(disconnect_reason_, AwaitingCreated()); + + if (AwaitingCreated()) { TRACE_EVENT_NESTABLE_ASYNC_END1("audio", "CreateStream", this, "success", "failed or cancelled"); } + TRACE_EVENT_NESTABLE_ASYNC_END1("audio", "AudioOutputStreamBroker", this, "disconnect reason", - static_cast<uint32_t>(disconnect_reason_)); + static_cast<uint32_t>(reason)); - UMA_HISTOGRAM_ENUMERATION("Media.Audio.Render.StreamBrokerDisconnectReason", - disconnect_reason_); + UMA_HISTOGRAM_ENUMERATION("Media.Audio.Render.StreamBrokerDisconnectReason2", + reason); + + if (AwaitingCreated()) { + UMA_HISTOGRAM_TIMES( + "Media.Audio.Render.StreamBrokerDocumentDestroyedAwaitingCreatedTime", + base::TimeTicks::Now() - stream_creation_start_time_); + } } void AudioOutputStreamBroker::CreateStream( @@ -74,7 +127,7 @@ DCHECK(!observer_binding_.is_bound()); TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("audio", "CreateStream", this, "device id", output_device_id_); - awaiting_created_ = true; + stream_creation_start_time_ = base::TimeTicks::Now(); // Set up observer ptr. Unretained is safe because |this| owns // |observer_binding_|. @@ -107,16 +160,15 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); TRACE_EVENT_NESTABLE_ASYNC_END1("audio", "CreateStream", this, "success", !!data_pipe); - awaiting_created_ = false; + UMA_HISTOGRAM_TIMES("Media.Audio.Render.StreamBrokerStreamCreationTime", + base::TimeTicks::Now() - stream_creation_start_time_); + stream_creation_start_time_ = base::TimeTicks(); + if (!data_pipe) { // Stream creation failed. Signal error. client_.ResetWithReason( - static_cast<uint32_t>(media::mojom::AudioOutputStreamObserver:: - DisconnectReason::kPlatformError), - std::string()); - disconnect_reason_ = media::mojom::AudioOutputStreamObserver:: - DisconnectReason::kStreamCreationFailed; - Cleanup(); + static_cast<uint32_t>(DisconnectReason::kPlatformError), std::string()); + Cleanup(DisconnectReason::kStreamCreationFailed); return; } @@ -127,39 +179,31 @@ uint32_t reason, const std::string& description) { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); - TRACE_EVENT_NESTABLE_ASYNC_INSTANT1("audio", "ObserverBindingLost", this, "reset reason", reason); - const uint32_t maxValidReason = static_cast<uint32_t>( - media::mojom::AudioOutputStreamObserver::DisconnectReason::kMaxValue); - if (reason > maxValidReason) { + if (reason > static_cast<uint32_t>(DisconnectReason::kMaxValue)) NOTREACHED() << "Invalid reason: " << reason; - } else if (disconnect_reason_ == media::mojom::AudioOutputStreamObserver:: - DisconnectReason::kDocumentDestroyed) { - disconnect_reason_ = - static_cast<media::mojom::AudioOutputStreamObserver::DisconnectReason>( - reason); - } + + DisconnectReason reason_enum = static_cast<DisconnectReason>(reason); // TODO(https://crbug.com/787806): Don't propagate errors if we can retry // instead. client_.ResetWithReason( - static_cast<uint32_t>(media::mojom::AudioOutputStreamObserver:: - DisconnectReason::kPlatformError), - std::string()); - - Cleanup(); + static_cast<uint32_t>(DisconnectReason::kPlatformError), std::string()); + Cleanup((reason_enum == DisconnectReason::kPlatformError && AwaitingCreated()) + ? DisconnectReason::kStreamCreationFailed + : reason_enum); } -void AudioOutputStreamBroker::ClientBindingLost() { - disconnect_reason_ = media::mojom::AudioOutputStreamObserver:: - DisconnectReason::kTerminatedByClient; - Cleanup(); -} - -void AudioOutputStreamBroker::Cleanup() { +void AudioOutputStreamBroker::Cleanup(DisconnectReason reason) { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + DCHECK_EQ(DisconnectReason::kDocumentDestroyed, disconnect_reason_); + disconnect_reason_ = reason; std::move(deleter_).Run(this); } +bool AudioOutputStreamBroker::AwaitingCreated() const { + return stream_creation_start_time_ != base::TimeTicks(); +} + } // namespace content
diff --git a/content/browser/media/audio_output_stream_broker.h b/content/browser/media/audio_output_stream_broker.h index 0f04408..458a78c 100644 --- a/content/browser/media/audio_output_stream_broker.h +++ b/content/browser/media/audio_output_stream_broker.h
@@ -44,11 +44,14 @@ void CreateStream(audio::mojom::StreamFactory* factory) final; private: + using DisconnectReason = + media::mojom::AudioOutputStreamObserver::DisconnectReason; + void StreamCreated(media::mojom::AudioOutputStreamPtr stream, media::mojom::ReadWriteAudioDataPipePtr data_pipe); void ObserverBindingLost(uint32_t reason, const std::string& description); - void ClientBindingLost(); - void Cleanup(); + void Cleanup(DisconnectReason reason); + bool AwaitingCreated() const; SEQUENCE_CHECKER(owning_sequence_); @@ -57,8 +60,8 @@ const base::UnguessableToken group_id_; const base::Optional<base::UnguessableToken> processing_id_; - // Indicates that CreateStream has been called, but not StreamCreated. - bool awaiting_created_ = false; + // Set while CreateStream() has been called, but not StreamCreated(). + base::TimeTicks stream_creation_start_time_; DeleterCallback deleter_; @@ -68,9 +71,7 @@ mojo::AssociatedBinding<media::mojom::AudioOutputStreamObserver> observer_binding_; - media::mojom::AudioOutputStreamObserver::DisconnectReason disconnect_reason_ = - media::mojom::AudioOutputStreamObserver::DisconnectReason:: - kDocumentDestroyed; + DisconnectReason disconnect_reason_ = DisconnectReason::kDocumentDestroyed; base::WeakPtrFactory<AudioOutputStreamBroker> weak_ptr_factory_;
diff --git a/content/browser/ns_view_bridge_factory_impl.mm b/content/browser/ns_view_bridge_factory_impl.mm index b3e6420..295191f2 100644 --- a/content/browser/ns_view_bridge_factory_impl.mm +++ b/content/browser/ns_view_bridge_factory_impl.mm
@@ -4,9 +4,12 @@ #include "content/public/browser/ns_view_bridge_factory_impl.h" +#include <utility> + #include "base/macros.h" #include "base/no_destructor.h" #include "content/browser/renderer_host/render_widget_host_ns_view_bridge_local.h" +#include "content/browser/web_contents/web_contents_ns_view_bridge.h" namespace content { @@ -40,6 +43,17 @@ std::move(client), std::move(bridge_request))); } +void NSViewBridgeFactoryImpl::CreateWebContentsNSViewBridge( + uint64_t view_id, + mojom::WebContentsNSViewClientAssociatedPtrInfo client, + mojom::WebContentsNSViewBridgeAssociatedRequest bridge_request) { + // Note that the resulting object will be destroyed when its underlying pipe + // is closed. + ignore_result(new WebContentsNSViewBridge( + view_id, mojom::WebContentsNSViewClientAssociatedPtr(std::move(client)), + std::move(bridge_request))); +} + NSViewBridgeFactoryImpl::NSViewBridgeFactoryImpl() : binding_(this) {} NSViewBridgeFactoryImpl::~NSViewBridgeFactoryImpl() {}
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.h b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.h index 8040885..3f625967 100644 --- a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.h +++ b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.h
@@ -49,6 +49,7 @@ // mojom::RenderWidgetHostNSViewBridge implementation. void InitAsPopup(const gfx::Rect& content_rect) override; + void SetParentWebContentsNSView(uint64_t parent_ns_view_id) override; void DisableDisplay() override; void MakeFirstResponder() override; void SetBounds(const gfx::Rect& rect) override;
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm index 79d8ff90..c9351780 100644 --- a/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm +++ b/content/browser/renderer_host/render_widget_host_ns_view_bridge_local.mm
@@ -10,6 +10,7 @@ #include "content/common/cursors/webcursor.h" #import "skia/ext/skia_utils_mac.h" #import "ui/base/cocoa/animation_utils.h" +#include "ui/base/cocoa/ns_view_ids.h" #include "ui/display/screen.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/gfx/mac/coordinate_conversion.h" @@ -82,6 +83,18 @@ popup_window_ = std::make_unique<PopupWindowMac>(content_rect, cocoa_view_); } +void RenderWidgetHostNSViewBridgeLocal::SetParentWebContentsNSView( + uint64_t parent_ns_view_id) { + NSView* parent_ns_view = ui::NSViewIds::GetNSView(parent_ns_view_id); + // If the browser passed an invalid handle, then there is no recovery. + CHECK(parent_ns_view); + // Set the frame and autoresizing mask of the RenderWidgetHostViewCocoa as is + // done by WebContentsViewMac. + [cocoa_view_ setFrame:[parent_ns_view bounds]]; + [cocoa_view_ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [parent_ns_view addSubview:cocoa_view_]; +} + void RenderWidgetHostNSViewBridgeLocal::MakeFirstResponder() { [[cocoa_view_ window] makeFirstResponder:cocoa_view_]; }
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index e2b2712b..bae1f36 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -42,6 +42,7 @@ namespace content { class CursorManager; +class NSViewBridgeFactoryHost; class RenderWidgetHost; class RenderWidgetHostNSViewBridgeLocal; class RenderWidgetHostViewMac; @@ -447,6 +448,12 @@ // https://crbug.com/831843 RenderWidgetHostImpl* GetWidgetForKeyboardEvent(); + // Migrate the NSView for this RenderWidgetHostView to be in the process + // hosted by |bridge_factory_host|, and make it a child view of the NSView + // referred to by |parent_ns_view_id|. + void MigrateNSViewBridge(NSViewBridgeFactoryHost* bridge_factory_host, + uint64_t parent_ns_view_id); + protected: // This class is to be deleted through the Destroy method. ~RenderWidgetHostViewMac() override; @@ -469,10 +476,6 @@ // invoke it from the message loop. void ShutdownHost(); - // Update |ns_view_bridge_| so that the instance that it points at be hosted - // in the process indicated |host_id|. - void MigrateNSViewBridge(uint64_t host_id); - // Send updated vsync parameters to the top level display. void UpdateDisplayVSyncParameters(); @@ -512,11 +515,8 @@ std::unique_ptr<RenderWidgetHostNSViewBridgeLocal> ns_view_bridge_local_; // If the NSView is hosted in a remote process and accessed via mojo then - // - |ns_view_bridge_factory_host_id_| can be used to look up the needed - // NSViewBridgeFactoryHost. // - |ns_view_bridge_| will point to |ns_view_bridge_remote_| // - |ns_view_client_binding_| is the binding provided to the bridge. - uint64_t ns_view_bridge_factory_host_id_; mojom::RenderWidgetHostNSViewBridgeAssociatedPtr ns_view_bridge_remote_; mojo::AssociatedBinding<mojom::RenderWidgetHostNSViewClient> ns_view_client_binding_;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index d826ceb..9b9e2ca 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -152,8 +152,6 @@ : RenderWidgetHostViewBase(widget), page_at_minimum_scale_(true), mouse_wheel_phase_handler_(this), - ns_view_bridge_factory_host_id_( - NSViewBridgeFactoryHost::kLocalDirectHostId), ns_view_client_binding_(this), is_loading_(false), is_guest_view_hack_(is_guest_view_hack), @@ -232,50 +230,41 @@ } } -void RenderWidgetHostViewMac::MigrateNSViewBridge(uint64_t factory_host_id) { - if (factory_host_id == ns_view_bridge_factory_host_id_) - return; - - // Look up the NSViewBridgeFactoryHost, if any, for this id. - NSViewBridgeFactoryHost* factory_host = nullptr; - if (factory_host_id != NSViewBridgeFactoryHost::kLocalDirectHostId) { - factory_host = NSViewBridgeFactoryHost::GetFromHostId(factory_host_id); - if (!factory_host) { - DLOG(ERROR) << "Failed to look up NSViewBridgeFactoryHost!"; - return; - } - } - ns_view_bridge_factory_host_id_ = factory_host_id; - +void RenderWidgetHostViewMac::MigrateNSViewBridge( + NSViewBridgeFactoryHost* bridge_factory_host, + uint64_t parent_ns_view_id) { // Disconnect from the previous bridge (this will have the effect of // destroying the associated bridge), and close the binding (to allow it // to be re-bound). Note that |ns_view_bridge_local_| remains valid. ns_view_client_binding_.Close(); ns_view_bridge_remote_.reset(); - if (factory_host) { - mojom::RenderWidgetHostNSViewClientAssociatedPtr client; - ns_view_client_binding_.Bind(mojo::MakeRequest(&client)); - mojom::RenderWidgetHostNSViewBridgeAssociatedRequest bridge_request = - mojo::MakeRequest(&ns_view_bridge_remote_); - - // Cast from mojom::RenderWidgetHostNSViewClientPtr and - // mojom::RenderWidgetHostNSViewBridgeRequest to the public interfaces - // accepted by the factory. - // TODO(ccameron): Remove the need for this cast. - // https://crbug.com/888290 - mojo::AssociatedInterfacePtrInfo<mojom::StubInterface> stub_client( - client.PassInterface().PassHandle(), 0); - mojom::StubInterfaceAssociatedRequest stub_bridge_request( - bridge_request.PassHandle()); - - factory_host->GetFactory()->CreateRenderWidgetHostNSViewBridge( - std::move(stub_client), std::move(stub_bridge_request)); - - ns_view_bridge_ = ns_view_bridge_remote_.get(); - } else { + // If no host is specified, then use the locally hosted NSView. + if (!bridge_factory_host) { ns_view_bridge_ = ns_view_bridge_local_.get(); + return; } + + mojom::RenderWidgetHostNSViewClientAssociatedPtr client; + ns_view_client_binding_.Bind(mojo::MakeRequest(&client)); + mojom::RenderWidgetHostNSViewBridgeAssociatedRequest bridge_request = + mojo::MakeRequest(&ns_view_bridge_remote_); + + // Cast from mojom::RenderWidgetHostNSViewClientPtr and + // mojom::RenderWidgetHostNSViewBridgeRequest to the public interfaces + // accepted by the factory. + // TODO(ccameron): Remove the need for this cast. + // https://crbug.com/888290 + mojo::AssociatedInterfacePtrInfo<mojom::StubInterface> stub_client( + client.PassInterface().PassHandle(), 0); + mojom::StubInterfaceAssociatedRequest stub_bridge_request( + bridge_request.PassHandle()); + + bridge_factory_host->GetFactory()->CreateRenderWidgetHostNSViewBridge( + std::move(stub_client), std::move(stub_bridge_request)); + + ns_view_bridge_ = ns_view_bridge_remote_.get(); + ns_view_bridge_remote_->SetParentWebContentsNSView(parent_ns_view_id); } void RenderWidgetHostViewMac::SetParentUiLayer(ui::Layer* parent_ui_layer) {
diff --git a/content/browser/web_contents/web_contents_ns_view_bridge.h b/content/browser/web_contents/web_contents_ns_view_bridge.h new file mode 100644 index 0000000..cb9f1f7 --- /dev/null +++ b/content/browser/web_contents/web_contents_ns_view_bridge.h
@@ -0,0 +1,54 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_NS_VIEW_BRIDGE_H_ +#define CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_NS_VIEW_BRIDGE_H_ + +#import <Cocoa/Cocoa.h> + +#include <memory> + +#import "base/mac/scoped_nsobject.h" +#include "base/macros.h" +#include "content/common/content_export.h" +#include "content/public/common/web_contents_ns_view_bridge.mojom.h" +#include "mojo/public/cpp/bindings/associated_binding.h" +#include "ui/base/cocoa/ns_view_ids.h" + +namespace content { + +// A C++ wrapper around a WebContentsView's NSView in a non-browser process. +class CONTENT_EXPORT WebContentsNSViewBridge + : public mojom::WebContentsNSViewBridge { + public: + // Create a bridge that will access its client in another process via a mojo + // interface. This object will be deleted when |bridge_request|'s connection + // closes. + WebContentsNSViewBridge( + uint64_t view_id, + mojom::WebContentsNSViewClientAssociatedPtr client, + mojom::WebContentsNSViewBridgeAssociatedRequest bridge_request); + + // mojom::WebContentsNSViewBridge: + void SetParentViewsNSView(uint64_t parent_ns_view_id) override; + void Show(const gfx::Rect& bounds_in_window) override; + void Hide() override; + void MakeFirstResponder() override; + + private: + ~WebContentsNSViewBridge() override; + void OnConnectionError(); + + base::scoped_nsobject<NSView> cocoa_view_; + mojom::WebContentsNSViewClientAssociatedPtr client_; + mojo::AssociatedBinding<mojom::WebContentsNSViewBridge> binding_; + + std::unique_ptr<ui::ScopedNSViewIdMapping> view_id_; + + DISALLOW_COPY_AND_ASSIGN(WebContentsNSViewBridge); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_NS_VIEW_BRIDGE_H_
diff --git a/content/browser/web_contents/web_contents_ns_view_bridge.mm b/content/browser/web_contents/web_contents_ns_view_bridge.mm new file mode 100644 index 0000000..109e175 --- /dev/null +++ b/content/browser/web_contents/web_contents_ns_view_bridge.mm
@@ -0,0 +1,62 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/web_contents/web_contents_ns_view_bridge.h" + +namespace content { + +WebContentsNSViewBridge::WebContentsNSViewBridge( + uint64_t view_id, + mojom::WebContentsNSViewClientAssociatedPtr client, + mojom::WebContentsNSViewBridgeAssociatedRequest bridge_request) + : client_(std::move(client)), binding_(this) { + binding_.Bind(std::move(bridge_request)); + // This object will be destroyed when its connection is closed. + binding_.set_connection_error_handler(base::BindOnce( + &WebContentsNSViewBridge::OnConnectionError, base::Unretained(this))); + + // Note that this is an ordinary NSView (as opposed to a full + // WebContentsViewCocoa). + cocoa_view_.reset([[NSView alloc] initWithFrame:NSZeroRect]); + view_id_ = + std::make_unique<ui::ScopedNSViewIdMapping>(view_id, cocoa_view_.get()); +} + +WebContentsNSViewBridge::~WebContentsNSViewBridge() { + [cocoa_view_ removeFromSuperview]; +} + +void WebContentsNSViewBridge::OnConnectionError() { + delete this; +} + +void WebContentsNSViewBridge::SetParentViewsNSView(uint64_t parent_ns_view_id) { + NSView* parent_ns_view = ui::NSViewIds::GetNSView(parent_ns_view_id); + // If the browser passed an invalid handle, then there is no recovery. + CHECK(parent_ns_view); + [parent_ns_view addSubview:cocoa_view_]; +} + +void WebContentsNSViewBridge::Show(const gfx::Rect& bounds_in_window) { + NSRect ns_bounds_in_window = + NSMakeRect(bounds_in_window.x(), + [[[cocoa_view_ window] contentView] frame].size.height - + bounds_in_window.y() - bounds_in_window.height(), + bounds_in_window.width(), bounds_in_window.height()); + NSRect ns_bounds_in_superview = + [[cocoa_view_ superview] convertRect:ns_bounds_in_window fromView:nil]; + [cocoa_view_ setFrame:ns_bounds_in_superview]; + [cocoa_view_ setHidden:NO]; +} + +void WebContentsNSViewBridge::Hide() { + [cocoa_view_ setHidden:YES]; +} + +void WebContentsNSViewBridge::MakeFirstResponder() { + if ([cocoa_view_ acceptsFirstResponder]) + [[cocoa_view_ window] makeFirstResponder:cocoa_view_]; +} + +} // namespace content
diff --git a/content/browser/web_contents/web_contents_view_mac.h b/content/browser/web_contents/web_contents_view_mac.h index 498ec1d..d08876f 100644 --- a/content/browser/web_contents/web_contents_view_mac.h +++ b/content/browser/web_contents/web_contents_view_mac.h
@@ -19,6 +19,8 @@ #include "content/browser/web_contents/web_contents_view.h" #include "content/common/content_export.h" #include "content/common/drag_event_source_info.h" +#include "content/public/common/web_contents_ns_view_bridge.mojom.h" +#include "mojo/public/cpp/bindings/associated_binding.h" #import "ui/base/cocoa/base_view.h" #import "ui/base/cocoa/views_hostable.h" #include "ui/gfx/geometry/size.h" @@ -37,10 +39,6 @@ class Vector2d; } -namespace ui { -class Layer; -} - CONTENT_EXPORT @interface WebContentsViewCocoa : BaseView<ViewsHostable> { @private @@ -76,6 +74,7 @@ class WebContentsViewMac : public WebContentsView, public RenderViewHostDelegateView, public PopupMenuHelper::Delegate, + public mojom::WebContentsNSViewClient, public ui::ViewsHostableView { public: // The corresponding WebContentsImpl is passed in the constructor, and manages @@ -142,6 +141,9 @@ // ViewsHostableView: void OnViewsHostableAttached(ViewsHostableView::Host* host) override; void OnViewsHostableDetached() override; + void OnViewsHostableShow(const gfx::Rect& bounds_in_window) override; + void OnViewsHostableHide() override; + void OnViewsHostableMakeFirstResponder() override; // A helper method for closing the tab in the // CloseTabAfterEventTracking() implementation. @@ -158,7 +160,9 @@ RenderWidgetHostViewCreateFunction create_render_widget_host_view); private: - void SetParentUiLayer(ui::Layer* parent_ui_layer); + // Return the list of child RenderWidgetHostViewMacs. This will remove any + // destroyed instances before returning. + std::list<RenderWidgetHostViewMac*> GetChildViews(); // Returns the fullscreen view, if one exists; otherwise, returns the content // native view. This ensures that the view currently attached to a NSWindow is @@ -186,6 +190,14 @@ std::unique_ptr<PopupMenuHelper> popup_menu_helper_; + // The id that may be used to look up this NSView. + const uint64_t ns_view_id_; + + // Mojo bindings for an out of process instance of this NSView. + mojom::WebContentsNSViewBridgeAssociatedPtr ns_view_bridge_remote_; + mojo::AssociatedBinding<mojom::WebContentsNSViewClient> + ns_view_client_binding_; + DISALLOW_COPY_AND_ASSIGN(WebContentsViewMac); };
diff --git a/content/browser/web_contents/web_contents_view_mac.mm b/content/browser/web_contents/web_contents_view_mac.mm index 176aa38..3374d2b 100644 --- a/content/browser/web_contents/web_contents_view_mac.mm +++ b/content/browser/web_contents/web_contents_view_mac.mm
@@ -23,12 +23,15 @@ #import "content/browser/web_contents/web_drag_source_mac.h" #include "content/common/view_messages.h" #include "content/public/browser/interstitial_page.h" +#include "content/public/browser/ns_view_bridge_factory_host.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_view_delegate.h" +#include "mojo/public/cpp/bindings/interface_request.h" #include "skia/ext/skia_utils_mac.h" #import "third_party/mozilla/NSPasteboard+Utils.h" #include "ui/base/clipboard/custom_data_helper.h" #include "ui/base/cocoa/cocoa_base_utils.h" +#include "ui/base/cocoa/ns_view_ids.h" #include "ui/base/dragdrop/cocoa_dnd_util.h" #include "ui/display/screen.h" #include "ui/gfx/image/image_skia_util_mac.h" @@ -105,7 +108,10 @@ WebContentsViewMac::WebContentsViewMac(WebContentsImpl* web_contents, WebContentsViewDelegate* delegate) - : web_contents_(web_contents), delegate_(delegate) {} + : web_contents_(web_contents), + delegate_(delegate), + ns_view_id_(ui::NSViewIds::GetNewId()), + ns_view_client_binding_(this) {} WebContentsViewMac::~WebContentsViewMac() { if (views_host_) @@ -357,8 +363,14 @@ // Add the RenderWidgetHostView to the ui::Layer heirarchy. child_views_.push_back(view->GetWeakPtr()); - if (views_host_) - SetParentUiLayer(views_host_->GetUiLayer()); + if (views_host_) { + NSViewBridgeFactoryHost* factory_host = + NSViewBridgeFactoryHost::GetFromHostId( + views_host_->GetViewsFactoryHostId()); + + view->MigrateNSViewBridge(factory_host, ns_view_id_); + view->SetParentUiLayer(views_host_->GetUiLayer()); + } // Fancy layout comes later; for now just make it our size and resize it // with us. In case there are other siblings of the content area, we want @@ -434,14 +446,18 @@ web_contents_->Close(web_contents_->GetRenderViewHost()); } -void WebContentsViewMac::SetParentUiLayer(ui::Layer* parent_ui_layer) { +std::list<RenderWidgetHostViewMac*> WebContentsViewMac::GetChildViews() { // Remove any child NSViews that have been destroyed. + std::list<RenderWidgetHostViewMac*> result; for (auto iter = child_views_.begin(); iter != child_views_.end();) { - if (*iter) - (*iter++)->SetParentUiLayer(parent_ui_layer); - else + if (*iter) { + result.push_back(reinterpret_cast<RenderWidgetHostViewMac*>(iter->get())); + iter++; + } else { iter = child_views_.erase(iter); + } } + return result; } //////////////////////////////////////////////////////////////////////////////// @@ -450,22 +466,71 @@ void WebContentsViewMac::OnViewsHostableAttached( ViewsHostableView::Host* host) { views_host_ = host; - - SetParentUiLayer(views_host_->GetUiLayer()); [cocoa_view_ setAccessibilityParentElement:views_host_->GetAccessibilityElement()]; + + // Create an NSView in the target process, if one exists. + uint64_t factory_host_id = views_host_->GetViewsFactoryHostId(); + NSViewBridgeFactoryHost* factory_host = + NSViewBridgeFactoryHost::GetFromHostId(factory_host_id); + if (factory_host) { + mojom::WebContentsNSViewClientAssociatedPtr client; + ns_view_client_binding_.Bind(mojo::MakeRequest(&client)); + mojom::WebContentsNSViewBridgeAssociatedRequest bridge_request = + mojo::MakeRequest(&ns_view_bridge_remote_); + + factory_host->GetFactory()->CreateWebContentsNSViewBridge( + ns_view_id_, client.PassInterface(), std::move(bridge_request)); + + ns_view_bridge_remote_->SetParentViewsNSView(views_host_->GetNSViewId()); + } else if (factory_host_id != NSViewBridgeFactoryHost::kLocalDirectHostId) { + LOG(ERROR) << "Failed to look up NSViewBridgeFactoryHost!"; + } + + for (auto* rwhv_mac : GetChildViews()) { + rwhv_mac->MigrateNSViewBridge(factory_host, ns_view_id_); + rwhv_mac->SetParentUiLayer(views_host_->GetUiLayer()); + } } void WebContentsViewMac::OnViewsHostableDetached() { DCHECK(views_host_); views_host_ = nullptr; - SetParentUiLayer(nullptr); + for (auto* rwhv_mac : GetChildViews()) { + rwhv_mac->MigrateNSViewBridge(nullptr, 0); + rwhv_mac->SetParentUiLayer(nullptr); + } + [cocoa_view_ setAccessibilityParentElement:nil]; + + // Disconnect from the bridge. This will have the effect of destroying the + // associated bridge instance with its NSView. + ns_view_client_binding_.Close(); + ns_view_bridge_remote_.reset(); +} + +void WebContentsViewMac::OnViewsHostableShow( + const gfx::Rect& bounds_in_window) { + if (ns_view_bridge_remote_) + ns_view_bridge_remote_->Show(bounds_in_window); +} + +void WebContentsViewMac::OnViewsHostableHide() { + if (ns_view_bridge_remote_) + ns_view_bridge_remote_->Hide(); +} + +void WebContentsViewMac::OnViewsHostableMakeFirstResponder() { + if (ns_view_bridge_remote_) + ns_view_bridge_remote_->MakeFirstResponder(); } } // namespace content +//////////////////////////////////////////////////////////////////////////////// +// WebContentsViewCocoa + @implementation WebContentsViewCocoa - (id)initWithWebContentsViewMac:(WebContentsViewMac*)w {
diff --git a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc index c1e6ee6..0da4cb7 100644 --- a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc +++ b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
@@ -411,32 +411,58 @@ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); } - bool ShouldHaveSXGAcceptHeaderInEnabledOrigin() { + bool ShouldHaveSXGAcceptHeaderInEnabledOrigin() const { return GetParam().sxg_enabled || (GetParam().sxg_origin_trial_enabled && GetParam().sxg_accept_header_enabled); } - void CheckNavigationAcceptHeader(const GURL& url, bool should_have_sxg) { - if (should_have_sxg) { - EXPECT_EQ(GetInterceptedAcceptHeader(url), - std::string(network::kFrameAcceptHeader) + - std::string(kAcceptHeaderSignedExchangeSuffix)); - } else { - EXPECT_EQ(GetInterceptedAcceptHeader(url), - std::string(network::kFrameAcceptHeader)); + bool ShouldHaveSXGAcceptHeaderInDisabledOrigin() const { + return GetParam().sxg_enabled; + } + + void CheckAcceptHeader(const GURL& url, bool is_navigation) { + const bool is_enabled_origin = + url.IntPort() == enabled_https_server_.port(); + const bool should_have_sxg = + is_enabled_origin ? ShouldHaveSXGAcceptHeaderInEnabledOrigin() + : ShouldHaveSXGAcceptHeaderInDisabledOrigin(); + const auto accept_header = GetInterceptedAcceptHeader(url); + ASSERT_TRUE(accept_header); + EXPECT_EQ( + *accept_header, + should_have_sxg + ? (is_navigation + ? std::string(network::kFrameAcceptHeader) + + std::string(kAcceptHeaderSignedExchangeSuffix) + : std::string(kExpectedSXGEnabledAcceptHeaderForPrefetch)) + : (is_navigation ? std::string(network::kFrameAcceptHeader) + : std::string(network::kDefaultAcceptHeader))); + } + + void CheckNavigationAcceptHeader(const std::vector<GURL>& urls) { + for (const auto& url : urls) { + SCOPED_TRACE(url); + CheckAcceptHeader(url, true /* is_navigation */); } } - void CheckPrefetchAcceptHeader(const GURL& url, bool should_have_sxg) { - if (should_have_sxg) { - EXPECT_EQ(GetInterceptedAcceptHeader(url), - std::string(kExpectedSXGEnabledAcceptHeaderForPrefetch)); - } else { - EXPECT_EQ(GetInterceptedAcceptHeader(url), - std::string(network::kDefaultAcceptHeader)); + void CheckPrefetchAcceptHeader(const std::vector<GURL>& urls) { + for (const auto& url : urls) { + SCOPED_TRACE(url); + CheckAcceptHeader(url, false /* is_navigation */); } } + base::Optional<std::string> GetInterceptedAcceptHeader( + const GURL& url) const { + const auto it = url_accept_header_map_.find(url); + if (it == url_accept_header_map_.end()) + return base::nullopt; + return it->second; + } + + void ClearInterceptedAcceptHeaders() { url_accept_header_map_.clear(); } + net::EmbeddedTestServer enabled_https_server_; net::EmbeddedTestServer disabled_https_server_; @@ -451,6 +477,7 @@ new net::test_server::BasicHttpResponse); http_response->set_code(net::HTTP_MOVED_PERMANENTLY); http_response->AddCustomHeader("Location", request.relative_url.substr(3)); + http_response->AddCustomHeader("Cache-Control", "no-cache"); return std::move(http_response); } @@ -462,10 +489,6 @@ it->second; } - std::string GetInterceptedAcceptHeader(const GURL& url) { - return url_accept_header_map_[url]; - } - base::test::ScopedFeatureList feature_list_; base::test::ScopedFeatureList feature_list_for_accept_header_; @@ -478,8 +501,7 @@ signed_exchange_utils::ShouldAdvertiseAcceptHeader( url::Origin::Create(enabled_test_url))); NavigateAndWaitForTitle(enabled_test_url, enabled_test_url.spec()); - CheckNavigationAcceptHeader(enabled_test_url, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); + CheckNavigationAcceptHeader({enabled_test_url}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, DisabledOrigin) { @@ -490,7 +512,7 @@ url::Origin::Create(disabled_test_url))); NavigateAndWaitForTitle(disabled_test_url, disabled_test_url.spec()); - CheckNavigationAcceptHeader(disabled_test_url, GetParam().sxg_enabled); + CheckNavigationAcceptHeader({disabled_test_url}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -504,12 +526,9 @@ NavigateAndWaitForTitle(redirect_enabled_to_disabled_to_enabled_url, enabled_test_url.spec()); - CheckNavigationAcceptHeader(redirect_enabled_to_disabled_to_enabled_url, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); - CheckNavigationAcceptHeader(redirect_disabled_to_enabled_url, - GetParam().sxg_enabled); - CheckNavigationAcceptHeader(enabled_test_url, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); + CheckNavigationAcceptHeader({redirect_enabled_to_disabled_to_enabled_url, + redirect_disabled_to_enabled_url, + enabled_test_url}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -524,11 +543,9 @@ NavigateAndWaitForTitle(redirect_disabled_to_enabled_to_disabled_url, disabled_test_url.spec()); - CheckNavigationAcceptHeader(redirect_disabled_to_enabled_to_disabled_url, - GetParam().sxg_enabled); - CheckNavigationAcceptHeader(redirect_enabled_to_disabled_url, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); - CheckNavigationAcceptHeader(disabled_test_url, GetParam().sxg_enabled); + CheckNavigationAcceptHeader({redirect_disabled_to_enabled_to_disabled_url, + redirect_enabled_to_disabled_url, + disabled_test_url}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -537,8 +554,7 @@ const GURL enabled_page_url = enabled_https_server_.GetURL( std::string("/sxg/prefetch.html#") + enabled_target.spec()); NavigateAndWaitForTitle(enabled_page_url, "OK"); - CheckPrefetchAcceptHeader(enabled_target, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); + CheckPrefetchAcceptHeader({enabled_target}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -547,7 +563,7 @@ const GURL enabled_page_url = enabled_https_server_.GetURL( std::string("/sxg/prefetch.html#") + disabled_target.spec()); NavigateAndWaitForTitle(enabled_page_url, "OK"); - CheckPrefetchAcceptHeader(disabled_target, GetParam().sxg_enabled); + CheckPrefetchAcceptHeader({disabled_target}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -556,8 +572,7 @@ const GURL disabled_page_url = disabled_https_server_.GetURL( std::string("/sxg/prefetch.html#") + enabled_target.spec()); NavigateAndWaitForTitle(disabled_page_url, "OK"); - CheckPrefetchAcceptHeader(enabled_target, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); + CheckPrefetchAcceptHeader({enabled_target}); } IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, @@ -566,7 +581,7 @@ const GURL disabled_page_url = disabled_https_server_.GetURL( std::string("/sxg/prefetch.html#") + disabled_target.spec()); NavigateAndWaitForTitle(disabled_page_url, "OK"); - CheckPrefetchAcceptHeader(disabled_target, GetParam().sxg_enabled); + CheckPrefetchAcceptHeader({disabled_target}); } IN_PROC_BROWSER_TEST_P( @@ -585,11 +600,188 @@ NavigateAndWaitForTitle(enabled_page_url, "OK"); - CheckPrefetchAcceptHeader(redirect_disabled_to_enabled_to_disabled_url, - GetParam().sxg_enabled); - CheckPrefetchAcceptHeader(redirect_enabled_to_disabled_url, - ShouldHaveSXGAcceptHeaderInEnabledOrigin()); - CheckPrefetchAcceptHeader(disabled_target, GetParam().sxg_enabled); + CheckPrefetchAcceptHeader({redirect_disabled_to_enabled_to_disabled_url, + redirect_enabled_to_disabled_url, + disabled_target}); +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, ServiceWorker) { + NavigateAndWaitForTitle( + enabled_https_server_.GetURL("/sxg/service-worker.html"), "Done"); + NavigateAndWaitForTitle( + disabled_https_server_.GetURL("/sxg/service-worker.html"), "Done"); + + const std::string frame_accept = std::string(network::kFrameAcceptHeader); + const std::string frame_accept_with_sxg = + frame_accept + std::string(kAcceptHeaderSignedExchangeSuffix); + const std::vector<std::string> scopes = {"/sxg/sw-scope-generated/", + "/sxg/sw-scope-navigation-preload/", + "/sxg/sw-scope-no-respond-with/"}; + for (const auto& scope : scopes) { + SCOPED_TRACE(scope); + const bool is_generated_scope = + scope == std::string("/sxg/sw-scope-generated/"); + const GURL enabled_target_url = + enabled_https_server_.GetURL(scope + "test.html"); + const GURL disabled_target_url = + disabled_https_server_.GetURL(scope + "test.html"); + const GURL redirect_disabled_to_enabled_target_url = + disabled_https_server_.GetURL("/r?" + enabled_target_url.spec()); + const GURL redirect_enabled_to_disabled_to_enabled_target_url = + enabled_https_server_.GetURL( + "/r?" + redirect_disabled_to_enabled_target_url.spec()); + const GURL redirect_enabled_to_disabled_target_url = + enabled_https_server_.GetURL("/r?" + disabled_target_url.spec()); + const GURL redirect_disabled_to_enabled_to_disabled_target_url = + disabled_https_server_.GetURL( + "/r?" + redirect_enabled_to_disabled_target_url.spec()); + + const std::string expected_enabled_title = + is_generated_scope ? (ShouldHaveSXGAcceptHeaderInEnabledOrigin() + ? frame_accept_with_sxg + : frame_accept) + : "Done"; + const std::string expected_disabled_title = + is_generated_scope ? (ShouldHaveSXGAcceptHeaderInDisabledOrigin() + ? frame_accept_with_sxg + : frame_accept) + : "Done"; + const base::Optional<std::string> expected_enabled_target_accept_header = + is_generated_scope ? base::nullopt + : base::Optional<std::string>( + ShouldHaveSXGAcceptHeaderInEnabledOrigin() + ? frame_accept_with_sxg + : frame_accept); + const base::Optional<std::string> expected_disabled_target_accept_header = + is_generated_scope ? base::nullopt + : base::Optional<std::string>( + ShouldHaveSXGAcceptHeaderInDisabledOrigin() + ? frame_accept_with_sxg + : frame_accept); + + NavigateAndWaitForTitle(enabled_target_url, expected_enabled_title); + EXPECT_EQ(expected_enabled_target_accept_header, + GetInterceptedAcceptHeader(enabled_target_url)); + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(disabled_target_url, expected_disabled_title); + EXPECT_EQ(expected_disabled_target_accept_header, + GetInterceptedAcceptHeader(disabled_target_url)); + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(redirect_disabled_to_enabled_target_url, + expected_enabled_title); + CheckNavigationAcceptHeader({redirect_disabled_to_enabled_target_url}); + EXPECT_EQ(expected_enabled_target_accept_header, + GetInterceptedAcceptHeader(enabled_target_url)); + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(redirect_enabled_to_disabled_target_url, + expected_disabled_title); + CheckNavigationAcceptHeader({redirect_enabled_to_disabled_target_url}); + EXPECT_EQ(expected_disabled_target_accept_header, + GetInterceptedAcceptHeader(disabled_target_url)); + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(redirect_enabled_to_disabled_to_enabled_target_url, + expected_enabled_title); + CheckNavigationAcceptHeader( + {redirect_enabled_to_disabled_to_enabled_target_url, + redirect_disabled_to_enabled_target_url}); + EXPECT_EQ(expected_enabled_target_accept_header, + GetInterceptedAcceptHeader(enabled_target_url)); + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(redirect_disabled_to_enabled_to_disabled_target_url, + expected_disabled_title); + CheckNavigationAcceptHeader( + {redirect_disabled_to_enabled_to_disabled_target_url, + redirect_enabled_to_disabled_target_url}); + EXPECT_EQ(expected_disabled_target_accept_header, + GetInterceptedAcceptHeader(disabled_target_url)); + } +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeAcceptHeaderBrowserTest, + ServiceWorkerPrefetch) { + NavigateAndWaitForTitle( + enabled_https_server_.GetURL("/sxg/service-worker-prefetch.html"), + "Done"); + NavigateAndWaitForTitle( + disabled_https_server_.GetURL("/sxg/service-worker-prefetch.html"), + "Done"); + const std::string scope = "/sxg/sw-prefetch-scope/"; + const GURL enabled_target_url = + enabled_https_server_.GetURL(scope + "test.html"); + const GURL disabled_target_url = + disabled_https_server_.GetURL(scope + "test.html"); + + const GURL enabled_prefetch_target = + enabled_https_server_.GetURL(std::string("/sxg/hello.txt")); + const GURL disabled_prefetch_target = + disabled_https_server_.GetURL(std::string("/sxg/hello.txt")); + const std::string load_prefetch_script = base::StringPrintf( + "(function loadPrefetch(urls) {" + " for (let url of urls) {" + " let link = document.createElement('link');" + " link.rel = 'prefetch';" + " link.href = url;" + " document.body.appendChild(link);" + " }" + " function check() {" + " const entries = performance.getEntriesByType('resource');" + " const url_set = new Set(urls);" + " for (let entry of entries) {" + " url_set.delete(entry.name);" + " }" + " if (!url_set.size) {" + " window.domAutomationController.send(true);" + " } else {" + " setTimeout(check, 100);" + " }" + " }" + " check();" + "})(['%s','%s'])", + enabled_prefetch_target.spec().c_str(), + disabled_prefetch_target.spec().c_str()); + bool unused = false; + + NavigateAndWaitForTitle(enabled_target_url, "Done"); + EXPECT_TRUE(ExecuteScriptAndExtractBool(shell()->web_contents(), + load_prefetch_script, &unused)); + if (base::FeatureList::IsEnabled(network::features::kNetworkService) && + (GetParam().sxg_enabled || (GetParam().sxg_origin_trial_enabled && + GetParam().sxg_accept_header_enabled))) { + // TODO(crbug/890748): Currently SignedExchange prefetch requests from + // Service Worker controlled pages aren't handled by + // SignedExchangePrefetchHandler when NetworkService is enabled. + EXPECT_EQ(std::string(network::kDefaultAcceptHeader), + GetInterceptedAcceptHeader(enabled_prefetch_target)); + EXPECT_EQ(std::string(network::kDefaultAcceptHeader), + GetInterceptedAcceptHeader(disabled_prefetch_target)); + } else { + CheckPrefetchAcceptHeader( + {enabled_prefetch_target, disabled_prefetch_target}); + } + ClearInterceptedAcceptHeaders(); + + NavigateAndWaitForTitle(disabled_target_url, "Done"); + EXPECT_TRUE(ExecuteScriptAndExtractBool(shell()->web_contents(), + load_prefetch_script, &unused)); + if (base::FeatureList::IsEnabled(network::features::kNetworkService) && + (GetParam().sxg_enabled || (GetParam().sxg_origin_trial_enabled && + GetParam().sxg_accept_header_enabled))) { + // TODO(crbug/890748): Currently SignedExchange prefetch requests from + // Service Worker controlled pages aren't handled by + // SignedExchangePrefetchHandler when NetworkService is enabled. + EXPECT_EQ(std::string(network::kDefaultAcceptHeader), + GetInterceptedAcceptHeader(enabled_prefetch_target)); + EXPECT_EQ(std::string(network::kDefaultAcceptHeader), + GetInterceptedAcceptHeader(disabled_prefetch_target)); + } else { + CheckPrefetchAcceptHeader( + {enabled_prefetch_target, disabled_prefetch_target}); + } } INSTANTIATE_TEST_CASE_P(
diff --git a/content/browser/web_package/signed_exchange_signature_verifier.cc b/content/browser/web_package/signed_exchange_signature_verifier.cc index 1fc3df4c..0ff23c42 100644 --- a/content/browser/web_package/signed_exchange_signature_verifier.cc +++ b/content/browser/web_package/signed_exchange_signature_verifier.cc
@@ -233,6 +233,7 @@ scoped_refptr<net::X509Certificate> certificate, const base::Time& verification_time, SignedExchangeDevToolsProxy* devtools_proxy) { + SCOPED_UMA_HISTOGRAM_TIMER("SignedExchange.Time.SignatureVerify"); TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"), "SignedExchangeSignatureVerifier::Verify");
diff --git a/content/common/render_widget_host_ns_view.mojom b/content/common/render_widget_host_ns_view.mojom index b1f2300..ba73fbe 100644 --- a/content/common/render_widget_host_ns_view.mojom +++ b/content/common/render_widget_host_ns_view.mojom
@@ -24,6 +24,10 @@ // create its own NSWindow. InitAsPopup(gfx.mojom.Rect content_rect); + // Set this to be a child NSView of the NSView mapped to by + // |parent_ns_view_id|. + SetParentWebContentsNSView(uint64 parent_ns_view_id); + // Disable displaying any content (including the background color). This is // to be called on views that are to be displayed via a parent ui::Compositor. DisableDisplay();
diff --git a/content/public/browser/ns_view_bridge_factory_impl.h b/content/public/browser/ns_view_bridge_factory_impl.h index 13f76be..0ebebc7 100644 --- a/content/public/browser/ns_view_bridge_factory_impl.h +++ b/content/public/browser/ns_view_bridge_factory_impl.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "content/common/content_export.h" #include "content/public/common/ns_view_bridge_factory.mojom.h" +#include "content/public/common/web_contents_ns_view_bridge.mojom.h" #include "mojo/public/cpp/bindings/associated_binding.h" namespace content { @@ -26,6 +27,10 @@ void CreateRenderWidgetHostNSViewBridge( mojom::StubInterfaceAssociatedPtrInfo client, mojom::StubInterfaceAssociatedRequest bridge_request) override; + void CreateWebContentsNSViewBridge( + uint64_t view_id, + mojom::WebContentsNSViewClientAssociatedPtrInfo client, + mojom::WebContentsNSViewBridgeAssociatedRequest bridge_request) override; private: friend class base::NoDestructor<NSViewBridgeFactoryImpl>;
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn index 706ff36..3869b8d4 100644 --- a/content/public/common/BUILD.gn +++ b/content/public/common/BUILD.gn
@@ -363,7 +363,10 @@ } if (is_mac) { - sources += [ "ns_view_bridge_factory.mojom" ] + sources += [ + "ns_view_bridge_factory.mojom", + "web_contents_ns_view_bridge.mojom", + ] } public_deps = [
diff --git a/content/public/common/ns_view_bridge_factory.mojom b/content/public/common/ns_view_bridge_factory.mojom index f1a9ee6..29402f3 100644 --- a/content/public/common/ns_view_bridge_factory.mojom +++ b/content/public/common/ns_view_bridge_factory.mojom
@@ -4,6 +4,8 @@ module content.mojom; +import "content/public/common/web_contents_ns_view_bridge.mojom"; + // Empty interface that is used by NSViewBridgeFactory in place of // RenderWidgetHostNSViewBridge and RenderWidgetHostNSViewClient (which are the // real interface that should be used). The reason that the correct interfaces @@ -17,9 +19,18 @@ interface NSViewBridgeFactory { // Create and take ownership of the NSView for a RenderWidgetHostView. The - // resulting object is to be destroyed by calling its Destroy method. + // resulting object will be destroyed when the connection is closed. CreateRenderWidgetHostNSViewBridge( associated StubInterface client, associated StubInterface& bridge_request); + + // Create and take ownership of the NSView for a WebContentsView. The + // resulting object will be destroyed when the connection is closed. + // The value of |view_id| may be used to look up the NSView (e.g, to add + // child NSViews. + CreateWebContentsNSViewBridge( + uint64 view_id, + associated WebContentsNSViewClient client, + associated WebContentsNSViewBridge& bridge_request); };
diff --git a/content/public/common/web_contents_ns_view_bridge.mojom b/content/public/common/web_contents_ns_view_bridge.mojom new file mode 100644 index 0000000..abd85c2e --- /dev/null +++ b/content/public/common/web_contents_ns_view_bridge.mojom
@@ -0,0 +1,31 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module content.mojom; + +import "ui/gfx/geometry/mojo/geometry.mojom"; + +// Interface through which a WebContentsViewMac communicates with its NSView in +// another process. +interface WebContentsNSViewBridge { + // Set this to be a child NSView of the NSView mapped to by + // |parent_ns_view_id|. In practice, this NSView will always be from a + // views::View. + SetParentViewsNSView(uint64 parent_ns_view_id); + + // Un-hide the NSView and set its frame in its window to |bounds_in_window|. + Show(gfx.mojom.Rect bounds_in_window); + + // Hide the NSView. + Hide(); + + // Make the NSView be the first responder for its window. + MakeFirstResponder(); +}; + +// Interface through which the NSView in another process communicates with its +// owning WebContentsViewMac. This interface has no methods yet, but is included +// for symmetry and future use. +interface WebContentsNSViewClient {}; +
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 7baa128..e93af24 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -416,8 +416,6 @@ "media/webrtc/transceiver_state_surfacer.cc", "media/webrtc/transceiver_state_surfacer.h", "media/webrtc/two_keys_adapter_map.h", - "media/webrtc/video_codec_factory.cc", - "media/webrtc/video_codec_factory.h", "media/webrtc/webrtc_audio_device_impl.cc", "media/webrtc/webrtc_audio_device_impl.h", "media/webrtc/webrtc_audio_device_not_impl.cc", @@ -736,7 +734,6 @@ "//third_party/webrtc/api/video:video_bitrate_allocation", "//third_party/webrtc/api/video:video_frame", "//third_party/webrtc/api/video:video_frame_i420", - "//third_party/webrtc/api/video_codecs:rtc_software_fallback_wrappers", "//third_party/webrtc/api/video_codecs:video_codecs_api", "//third_party/webrtc/common_video:common_video", "//third_party/webrtc/media:rtc_internal_video_codecs",
diff --git a/content/renderer/media/stream/media_stream_audio_processor.cc b/content/renderer/media/stream/media_stream_audio_processor.cc index 72fe240..b3989eb 100644 --- a/content/renderer/media/stream/media_stream_audio_processor.cc +++ b/content/renderer/media/stream/media_stream_audio_processor.cc
@@ -471,11 +471,6 @@ int sample_rate, int audio_delay_milliseconds) { DCHECK(render_thread_checker_.CalledOnValidThread()); -#if defined(OS_ANDROID) - DCHECK(!audio_processing_->echo_cancellation()->is_enabled()); -#else - DCHECK(!audio_processing_->echo_control_mobile()->is_enabled()); -#endif DCHECK_GE(audio_bus->channels(), 1); DCHECK_LE(audio_bus->channels(), 2); int frames_per_10_ms = sample_rate / 100; @@ -792,7 +787,8 @@ void MediaStreamAudioProcessor::UpdateAecStats() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); if (echo_information_) - echo_information_->UpdateAecStats(audio_processing_->echo_cancellation()); + echo_information_->UpdateAecStats( + audio_processing_->GetStatistics(true /* has_remote_tracks */)); } } // namespace content
diff --git a/content/renderer/media/stream/media_stream_audio_processor_options.cc b/content/renderer/media/stream/media_stream_audio_processor_options.cc index eceaaee4..e6b525b 100644 --- a/content/renderer/media/stream/media_stream_audio_processor_options.cc +++ b/content/renderer/media/stream/media_stream_audio_processor_options.cc
@@ -91,25 +91,11 @@ } void EnableEchoCancellation(AudioProcessing* audio_processing) { - // TODO(bugs.webrtc.org/9535): Remove double-booking AEC toggle when the - // config applies (from 2018-08-16). webrtc::AudioProcessing::Config apm_config = audio_processing->GetConfig(); apm_config.echo_canceller.enabled = true; #if defined(OS_ANDROID) - // Mobile devices are using AECM. - CHECK_EQ(0, audio_processing->echo_control_mobile()->set_routing_mode( - webrtc::EchoControlMobile::kSpeakerphone)); - CHECK_EQ(0, audio_processing->echo_control_mobile()->Enable(true)); apm_config.echo_canceller.mobile_mode = true; #else - int err = audio_processing->echo_cancellation()->set_suppression_level( - webrtc::EchoCancellation::kHighSuppression); - - // Enable the metrics for AEC. - err |= audio_processing->echo_cancellation()->enable_metrics(true); - err |= audio_processing->echo_cancellation()->enable_delay_logging(true); - err |= audio_processing->echo_cancellation()->Enable(true); - CHECK_EQ(err, 0); apm_config.echo_canceller.mobile_mode = false; #endif audio_processing->ApplyConfig(apm_config);
diff --git a/content/renderer/media/stream/media_stream_audio_processor_unittest.cc b/content/renderer/media/stream/media_stream_audio_processor_unittest.cc index 7dc5ad67..a36eac2 100644 --- a/content/renderer/media/stream/media_stream_audio_processor_unittest.cc +++ b/content/renderer/media/stream/media_stream_audio_processor_unittest.cc
@@ -117,13 +117,7 @@ // |audio_processor| does nothing when the audio processing is off in // the processor. webrtc::AudioProcessing* ap = audio_processor->audio_processing_.get(); -#if defined(OS_ANDROID) - const bool is_aec_enabled = ap && ap->echo_control_mobile()->is_enabled(); - // AEC should be turned off for mobiles. - DCHECK(!ap || !ap->echo_cancellation()->is_enabled()); -#else - const bool is_aec_enabled = ap && ap->echo_cancellation()->is_enabled(); -#endif + const bool is_aec_enabled = ap && ap->GetConfig().echo_canceller.enabled; if (is_aec_enabled) { if (params.channels() > kMaxNumberOfPlayoutDataChannels) { for (int i = 0; i < kMaxNumberOfPlayoutDataChannels; ++i) { @@ -159,22 +153,15 @@ void VerifyDefaultComponents(MediaStreamAudioProcessor* audio_processor) { webrtc::AudioProcessing* audio_processing = audio_processor->audio_processing_.get(); - const webrtc::AudioProcessing::Config apm_config = + const webrtc::AudioProcessing::Config config = audio_processing->GetConfig(); - EXPECT_TRUE(apm_config.high_pass_filter.enabled); + EXPECT_TRUE(config.echo_canceller.enabled); #if defined(OS_ANDROID) - EXPECT_TRUE(audio_processing->echo_control_mobile()->is_enabled()); - EXPECT_TRUE(audio_processing->echo_control_mobile()->routing_mode() == - webrtc::EchoControlMobile::kSpeakerphone); - EXPECT_FALSE(audio_processing->echo_cancellation()->is_enabled()); + EXPECT_TRUE(config.echo_canceller.mobile_mode); #else - EXPECT_TRUE(audio_processing->echo_cancellation()->is_enabled()); - EXPECT_TRUE(audio_processing->echo_cancellation()->suppression_level() == - webrtc::EchoCancellation::kHighSuppression); - EXPECT_TRUE(audio_processing->echo_cancellation()->are_metrics_enabled()); - EXPECT_TRUE( - audio_processing->echo_cancellation()->is_delay_logging_enabled()); + EXPECT_FALSE(config.echo_canceller.mobile_mode); #endif + EXPECT_TRUE(config.high_pass_filter.enabled); EXPECT_TRUE(audio_processing->noise_suppression()->is_enabled()); EXPECT_TRUE(audio_processing->noise_suppression()->level() ==
diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc index 8d5a6ab..d2b6ef2 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.cc +++ b/content/renderer/media/stream/webmediaplayer_ms.cc
@@ -829,7 +829,6 @@ compositor_->GetCurrentFrameWithoutUpdatingStatistics(); media::Context3D context_3d; - gpu::ContextSupport* context_support = nullptr; if (frame && frame->HasTextures()) { auto* provider = RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); @@ -837,11 +836,11 @@ if (!provider) return; context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); - context_support = provider->ContextSupport(); + DCHECK(context_3d.gl); } const gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); video_renderer_.Paint(frame, canvas, dest_rect, flags, video_rotation_, - context_3d, context_support); + context_3d); } bool WebMediaPlayerMS::DidGetOpaqueResponseFromServiceWorker() const { @@ -1017,8 +1016,8 @@ DCHECK(context_3d.gl); return video_renderer_.CopyVideoFrameTexturesToGLTexture( - context_3d, provider->ContextSupport(), gl, video_frame.get(), target, - texture, internal_format, format, type, level, premultiply_alpha, flip_y); + context_3d, gl, video_frame.get(), target, texture, internal_format, + format, type, level, premultiply_alpha, flip_y); } bool WebMediaPlayerMS::CopyVideoYUVDataToPlatformTexture(
diff --git a/content/renderer/media/stream/webmediaplayer_ms_compositor.cc b/content/renderer/media/stream/webmediaplayer_ms_compositor.cc index 92b6b60..c53c0be2 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_compositor.cc +++ b/content/renderer/media/stream/webmediaplayer_ms_compositor.cc
@@ -68,8 +68,7 @@ DCHECK(provider->ContextGL()); video_renderer->Copy( frame.get(), &paint_canvas, - media::Context3D(provider->ContextGL(), provider->GrContext()), - provider->ContextSupport()); + media::Context3D(provider->ContextGL(), provider->GrContext())); SkPixmap pixmap; const bool result = bitmap.peekPixels(&pixmap);
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index dd8f4c2f..1368fe1d 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -34,8 +34,9 @@ #include "content/renderer/media/stream/media_stream_video_track.h" #include "content/renderer/media/webrtc/audio_codec_factory.h" #include "content/renderer/media/webrtc/rtc_peer_connection_handler.h" +#include "content/renderer/media/webrtc/rtc_video_decoder_factory.h" +#include "content/renderer/media/webrtc/rtc_video_encoder_factory.h" #include "content/renderer/media/webrtc/stun_field_trial.h" -#include "content/renderer/media/webrtc/video_codec_factory.h" #include "content/renderer/media/webrtc/webrtc_audio_device_impl.h" #include "content/renderer/media/webrtc/webrtc_uma_histograms.h" #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" @@ -61,12 +62,19 @@ #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/webrtc/api/mediaconstraintsinterface.h" +#include "third_party/webrtc/api/video_codecs/video_decoder_factory.h" +#include "third_party/webrtc/api/video_codecs/video_encoder_factory.h" #include "third_party/webrtc/api/videosourceproxy.h" +#include "third_party/webrtc/media/engine/convert_legacy_video_factory.h" #include "third_party/webrtc/media/engine/multiplexcodecfactory.h" #include "third_party/webrtc/modules/video_coding/codecs/h264/include/h264.h" #include "third_party/webrtc/rtc_base/refcountedobject.h" #include "third_party/webrtc/rtc_base/ssladapter.h" +#if defined(OS_ANDROID) +#include "media/base/android/media_codec_util.h" +#endif + namespace content { namespace { @@ -282,12 +290,31 @@ socket_factory_.reset(new IpcPacketSocketFactory(p2p_socket_dispatcher_.get(), traffic_annotation)); - const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); + std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory; + std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory; + const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); + if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) { + if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) + decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); + + if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) + encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); + } + +#if defined(OS_ANDROID) + if (!media::MediaCodecUtil::SupportsSetParameters()) + encoder_factory.reset(); +#endif + + // TODO(magjed): Update RTCVideoEncoderFactory/RTCVideoDecoderFactory to new + // interface and let Chromium be responsible in what order video codecs are + // listed, instead of using + // cricket::ConvertVideoEncoderFactory/cricket::ConvertVideoDecoderFactory. std::unique_ptr<webrtc::VideoEncoderFactory> webrtc_encoder_factory = - CreateWebrtcVideoEncoderFactory(gpu_factories); + ConvertVideoEncoderFactory(std::move(encoder_factory)); std::unique_ptr<webrtc::VideoDecoderFactory> webrtc_decoder_factory = - CreateWebrtcVideoDecoderFactory(gpu_factories); + ConvertVideoDecoderFactory(std::move(decoder_factory)); // Enable Multiplex codec in SDP optionally. if (base::FeatureList::IsEnabled(features::kWebRtcMultiplexCodec)) {
diff --git a/content/renderer/media/webrtc/rtc_video_decoder.cc b/content/renderer/media/webrtc/rtc_video_decoder.cc index 69a8546..2cb2a0b 100644 --- a/content/renderer/media/webrtc/rtc_video_decoder.cc +++ b/content/renderer/media/webrtc/rtc_video_decoder.cc
@@ -137,6 +137,12 @@ return decoder; } +// static +void RTCVideoDecoder::Destroy(webrtc::VideoDecoder* decoder, + media::GpuVideoAcceleratorFactories* factories) { + factories->GetTaskRunner()->DeleteSoon(FROM_HERE, decoder); +} + int32_t RTCVideoDecoder::InitDecode(const webrtc::VideoCodec* codecSettings, int32_t /*numberOfCores*/) { DVLOG(2) << "InitDecode";
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_factory.cc b/content/renderer/media/webrtc/rtc_video_decoder_factory.cc index a8e141c..c7561597 100644 --- a/content/renderer/media/webrtc/rtc_video_decoder_factory.cc +++ b/content/renderer/media/webrtc/rtc_video_decoder_factory.cc
@@ -7,162 +7,38 @@ #include <memory> #include "base/feature_list.h" -#include "base/memory/ptr_util.h" -#include "build/build_config.h" #include "content/renderer/media/webrtc/rtc_video_decoder.h" #include "content/renderer/media/webrtc/rtc_video_decoder_adapter.h" #include "media/base/media_switches.h" #include "media/video/gpu_video_accelerator_factories.h" -#include "third_party/webrtc/api/video_codecs/sdp_video_format.h" -#include "third_party/webrtc/common_video/h264/profile_level_id.h" -#include "third_party/webrtc/media/base/codec.h" namespace content { -namespace { - -const int kDefaultFps = 30; - -// Translate from media::VideoDecodeAccelerator::SupportedProfile to -// webrtc::SdpVideoFormat, or return nothing if the profile isn't supported. -base::Optional<webrtc::SdpVideoFormat> VDAToWebRTCFormat( - const media::VideoDecodeAccelerator::SupportedProfile& profile) { - if (profile.profile >= media::VP8PROFILE_MIN && - profile.profile <= media::VP8PROFILE_MAX) { - return webrtc::SdpVideoFormat("VP8"); - } else if (profile.profile >= media::VP9PROFILE_MIN && - profile.profile <= media::VP9PROFILE_MAX) { - return webrtc::SdpVideoFormat("VP9"); - } else if (profile.profile >= media::H264PROFILE_MIN && - profile.profile <= media::H264PROFILE_MAX) { - webrtc::H264::Profile h264_profile; - switch (profile.profile) { - case media::H264PROFILE_BASELINE: -#if defined(OS_ANDROID) - // Force HW H264 on Android to be CBP for most compatibility, since: - // - Only HW H264 is available on Android at present. - // - MediaCodec only advise BP, which works same as CBP in most cases. - // - Some peers only expect CBP in negotiation. - h264_profile = webrtc::H264::kProfileConstrainedBaseline; -#else - h264_profile = webrtc::H264::kProfileBaseline; -#endif - break; - case media::H264PROFILE_MAIN: - h264_profile = webrtc::H264::kProfileMain; - break; - case media::H264PROFILE_HIGH: - h264_profile = webrtc::H264::kProfileHigh; - break; - default: - // Unsupported H264 profile in WebRTC. - return base::nullopt; - } - - const int width = profile.max_resolution.width(); - const int height = profile.max_resolution.height(); - - const absl::optional<webrtc::H264::Level> h264_level = - webrtc::H264::SupportedLevel(width * height, kDefaultFps); - const webrtc::H264::ProfileLevelId profile_level_id( - h264_profile, h264_level.value_or(webrtc::H264::kLevel1)); - - webrtc::SdpVideoFormat format("H264"); - format.parameters = { - {cricket::kH264FmtpProfileLevelId, - *webrtc::H264::ProfileLevelIdToString(profile_level_id)}, - {cricket::kH264FmtpLevelAsymmetryAllowed, "1"}, - {cricket::kH264FmtpPacketizationMode, "1"}}; - return format; - } - return base::nullopt; -} - -// This extra indirection is needed so that we can delete the decoder on the -// correct thread. -class ScopedVideoDecoder : public webrtc::VideoDecoder { - public: - ScopedVideoDecoder( - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, - std::unique_ptr<webrtc::VideoDecoder> decoder) - : task_runner_(task_runner), decoder_(std::move(decoder)) {} - - int32_t InitDecode(const webrtc::VideoCodec* codec_settings, - int32_t number_of_cores) override { - return decoder_->InitDecode(codec_settings, number_of_cores); - } - int32_t RegisterDecodeCompleteCallback( - webrtc::DecodedImageCallback* callback) override { - return decoder_->RegisterDecodeCompleteCallback(callback); - } - int32_t Release() override { return decoder_->Release(); } - int32_t Decode(const webrtc::EncodedImage& input_image, - bool missing_frames, - const webrtc::CodecSpecificInfo* codec_specific_info, - int64_t render_time_ms) override { - return decoder_->Decode(input_image, missing_frames, codec_specific_info, - render_time_ms); - } - bool PrefersLateDecoding() const override { - return decoder_->PrefersLateDecoding(); - } - const char* ImplementationName() const override { - return decoder_->ImplementationName(); - } - - // Runs on Chrome_libJingle_WorkerThread. The child thread is blocked while - // this runs. - ~ScopedVideoDecoder() override { - task_runner_->DeleteSoon(FROM_HERE, decoder_.release()); - } - - private: - scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - std::unique_ptr<webrtc::VideoDecoder> decoder_; -}; - -} // namespace - RTCVideoDecoderFactory::RTCVideoDecoderFactory( media::GpuVideoAcceleratorFactories* gpu_factories) : gpu_factories_(gpu_factories) { DVLOG(2) << __func__; - const media::VideoDecodeAccelerator::SupportedProfiles profiles = - gpu_factories_->GetVideoDecodeAcceleratorCapabilities() - .supported_profiles; - for (const auto& profile : profiles) { - base::Optional<webrtc::SdpVideoFormat> format = VDAToWebRTCFormat(profile); - if (format) - supported_formats_.push_back(std::move(*format)); - } -} - -std::vector<webrtc::SdpVideoFormat> -RTCVideoDecoderFactory::GetSupportedFormats() const { - return supported_formats_; } RTCVideoDecoderFactory::~RTCVideoDecoderFactory() { DVLOG(2) << __func__; } -std::unique_ptr<webrtc::VideoDecoder> -RTCVideoDecoderFactory::CreateVideoDecoder( - const webrtc::SdpVideoFormat& format) { +webrtc::VideoDecoder* RTCVideoDecoderFactory::CreateVideoDecoder( + webrtc::VideoCodecType type) { DVLOG(2) << __func__; - std::unique_ptr<webrtc::VideoDecoder> decoder; + if (base::FeatureList::IsEnabled(media::kRTCVideoDecoderAdapter)) { - decoder = RTCVideoDecoderAdapter::Create( - gpu_factories_, webrtc::PayloadStringToCodecType(format.name)); + return RTCVideoDecoderAdapter::Create(gpu_factories_, type).release(); } else { - decoder = RTCVideoDecoder::Create( - webrtc::PayloadStringToCodecType(format.name), gpu_factories_); + return RTCVideoDecoder::Create(type, gpu_factories_).release(); } - // ScopedVideoDecoder uses the task runner to make sure the decoder is - // destructed on the correct thread. - return decoder ? std::make_unique<ScopedVideoDecoder>( - gpu_factories_->GetTaskRunner(), std::move(decoder)) - : nullptr; +} + +void RTCVideoDecoderFactory::DestroyVideoDecoder( + webrtc::VideoDecoder* decoder) { + DVLOG(2) << __func__; + gpu_factories_->GetTaskRunner()->DeleteSoon(FROM_HERE, decoder); } } // namespace content
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_factory.h b/content/renderer/media/webrtc/rtc_video_decoder_factory.h index 8dc0ce8..e51498f 100644 --- a/content/renderer/media/webrtc/rtc_video_decoder_factory.h +++ b/content/renderer/media/webrtc/rtc_video_decoder_factory.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "base/threading/thread.h" #include "content/common/content_export.h" -#include "third_party/webrtc/api/video_codecs/video_decoder_factory.h" +#include "third_party/webrtc/media/engine/webrtcvideodecoderfactory.h" #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.h" namespace webrtc { @@ -23,7 +23,7 @@ // TODO(wuchengli): add unittest. class CONTENT_EXPORT RTCVideoDecoderFactory - : public webrtc::VideoDecoderFactory { + : public cricket::WebRtcVideoDecoderFactory { public: explicit RTCVideoDecoderFactory( media::GpuVideoAcceleratorFactories* gpu_factories); @@ -31,14 +31,15 @@ // Runs on Chrome_libJingle_WorkerThread. The child thread is blocked while // this runs. - std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( - const webrtc::SdpVideoFormat& format) override; + webrtc::VideoDecoder* CreateVideoDecoder( + webrtc::VideoCodecType type) override; - std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override; + // Runs on Chrome_libJingle_WorkerThread. The child thread is blocked while + // this runs. + void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override; private: media::GpuVideoAcceleratorFactories* gpu_factories_; - std::vector<webrtc::SdpVideoFormat> supported_formats_; DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderFactory); };
diff --git a/content/renderer/media/webrtc/rtc_video_encoder_factory.cc b/content/renderer/media/webrtc/rtc_video_encoder_factory.cc index 52b384c2..7b89e610 100644 --- a/content/renderer/media/webrtc/rtc_video_encoder_factory.cc +++ b/content/renderer/media/webrtc/rtc_video_encoder_factory.cc
@@ -14,24 +14,23 @@ #include "content/renderer/media/webrtc/rtc_video_encoder.h" #include "media/media_buildflags.h" #include "media/video/gpu_video_accelerator_factories.h" -#include "third_party/webrtc/api/video_codecs/sdp_video_format.h" #include "third_party/webrtc/common_video/h264/profile_level_id.h" -#include "third_party/webrtc/media/base/codec.h" namespace content { namespace { // Translate from media::VideoEncodeAccelerator::SupportedProfile to -// webrtc::SdpVideoFormat, or return nothing if the profile isn't supported. -base::Optional<webrtc::SdpVideoFormat> VEAToWebRTCFormat( +// cricket::WebRtcVideoEncoderFactory::VideoCodec, or return nothing if the +// profile isn't supported. +base::Optional<cricket::VideoCodec> VEAToWebRTCCodec( const media::VideoEncodeAccelerator::SupportedProfile& profile) { DCHECK_EQ(profile.max_framerate_denominator, 1U); if (profile.profile >= media::VP8PROFILE_MIN && profile.profile <= media::VP8PROFILE_MAX) { if (base::FeatureList::IsEnabled(features::kWebRtcHWVP8Encoding)) { - return webrtc::SdpVideoFormat("VP8"); + return base::Optional<cricket::VideoCodec>(cricket::VideoCodec("VP8")); } } else if (profile.profile >= media::H264PROFILE_MIN && profile.profile <= media::H264PROFILE_MAX) { @@ -66,7 +65,7 @@ break; default: // Unsupported H264 profile in WebRTC. - return base::nullopt; + return base::Optional<cricket::VideoCodec>(); } const int width = profile.max_resolution.width(); @@ -79,22 +78,15 @@ const webrtc::H264::ProfileLevelId profile_level_id( h264_profile, h264_level.value_or(webrtc::H264::kLevel1)); - webrtc::SdpVideoFormat format("H264"); - format.parameters = { - {cricket::kH264FmtpProfileLevelId, - *webrtc::H264::ProfileLevelIdToString(profile_level_id)}, - {cricket::kH264FmtpLevelAsymmetryAllowed, "1"}, - {cricket::kH264FmtpPacketizationMode, "1"}}; - return format; + cricket::VideoCodec codec("H264"); + codec.SetParam(cricket::kH264FmtpProfileLevelId, + *webrtc::H264::ProfileLevelIdToString(profile_level_id)); + codec.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1"); + codec.SetParam(cricket::kH264FmtpPacketizationMode, "1"); + return base::Optional<cricket::VideoCodec>(codec); } } - return base::nullopt; -} - -bool IsSameFormat(const webrtc::SdpVideoFormat& format1, - const webrtc::SdpVideoFormat& format2) { - return cricket::IsSameCodec(format1.name, format2.parameters, format2.name, - format2.parameters); + return base::Optional<cricket::VideoCodec>(); } } // anonymous namespace @@ -105,39 +97,47 @@ const media::VideoEncodeAccelerator::SupportedProfiles& profiles = gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles(); for (const auto& profile : profiles) { - base::Optional<webrtc::SdpVideoFormat> format = VEAToWebRTCFormat(profile); - if (format) { - supported_formats_.push_back(std::move(*format)); + base::Optional<cricket::VideoCodec> codec = VEAToWebRTCCodec(profile); + if (codec) { + supported_codecs_.push_back(std::move(*codec)); profiles_.push_back(profile.profile); } } + // There should be a 1:1 mapping between media::VideoCodecProfile and + // cricket::VideoCodec. + CHECK_EQ(profiles_.size(), supported_codecs_.size()); } RTCVideoEncoderFactory::~RTCVideoEncoderFactory() {} -std::unique_ptr<webrtc::VideoEncoder> -RTCVideoEncoderFactory::CreateVideoEncoder( - const webrtc::SdpVideoFormat& format) { - for (size_t i = 0; i < supported_formats_.size(); ++i) { - if (IsSameFormat(format, supported_formats_[i])) { - return std::make_unique<RTCVideoEncoder>(profiles_[i], gpu_factories_); +webrtc::VideoEncoder* RTCVideoEncoderFactory::CreateVideoEncoder( + const cricket::VideoCodec& codec) { + for (size_t i = 0; i < supported_codecs_.size(); ++i) { + if (!cricket::CodecNamesEq(codec.name, supported_codecs_[i].name)) + continue; + // Check H264 profile. + using webrtc::H264::ParseSdpProfileLevelId; + if (cricket::CodecNamesEq(codec.name.c_str(), cricket::kH264CodecName) && + ParseSdpProfileLevelId(codec.params)->profile != + ParseSdpProfileLevelId(supported_codecs_[i].params)->profile) { + continue; } + // There should be a 1:1 mapping between media::VideoCodecProfile and + // cricket::VideoCodec. + CHECK_EQ(profiles_.size(), supported_codecs_.size()); + return new RTCVideoEncoder(profiles_[i], gpu_factories_); } return nullptr; } -std::vector<webrtc::SdpVideoFormat> -RTCVideoEncoderFactory::GetSupportedFormats() const { - return supported_formats_; +const std::vector<cricket::VideoCodec>& +RTCVideoEncoderFactory::supported_codecs() const { + return supported_codecs_; } -webrtc::VideoEncoderFactory::CodecInfo -RTCVideoEncoderFactory::QueryVideoEncoder( - const webrtc::SdpVideoFormat& format) const { - CodecInfo info; - info.has_internal_source = false; - info.is_hardware_accelerated = true; - return info; +void RTCVideoEncoderFactory::DestroyVideoEncoder( + webrtc::VideoEncoder* encoder) { + delete encoder; } } // namespace content
diff --git a/content/renderer/media/webrtc/rtc_video_encoder_factory.h b/content/renderer/media/webrtc/rtc_video_encoder_factory.h index a68c37a0..68041f2 100644 --- a/content/renderer/media/webrtc/rtc_video_encoder_factory.h +++ b/content/renderer/media/webrtc/rtc_video_encoder_factory.h
@@ -12,7 +12,7 @@ #include "base/memory/ref_counted.h" #include "content/common/content_export.h" #include "media/base/video_codecs.h" -#include "third_party/webrtc/api/video_codecs/video_encoder_factory.h" +#include "third_party/webrtc/media/engine/webrtcvideoencoderfactory.h" namespace media { class GpuVideoAcceleratorFactories; @@ -23,27 +23,26 @@ // This class creates RTCVideoEncoder instances (each wrapping a // media::VideoEncodeAccelerator) on behalf of the WebRTC stack. class CONTENT_EXPORT RTCVideoEncoderFactory - : public webrtc::VideoEncoderFactory { + : public cricket::WebRtcVideoEncoderFactory { public: explicit RTCVideoEncoderFactory( media::GpuVideoAcceleratorFactories* gpu_factories); ~RTCVideoEncoderFactory() override; - // webrtc::VideoEncoderFactory implementation. - std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder( - const webrtc::SdpVideoFormat& format) override; - std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override; - webrtc::VideoEncoderFactory::CodecInfo QueryVideoEncoder( - const webrtc::SdpVideoFormat& format) const override; + // cricket::WebRtcVideoEncoderFactory implementation. + webrtc::VideoEncoder* CreateVideoEncoder( + const cricket::VideoCodec& codec) override; + const std::vector<cricket::VideoCodec>& supported_codecs() const override; + void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override; private: media::GpuVideoAcceleratorFactories* gpu_factories_; - // List of supported webrtc::SdpVideoFormat. |profiles_| and - // |supported_formats_| have the same length and the profile for - // |supported_formats_[i]| is |profiles_[i]|. + // List of supported cricket::WebRtcVideoEncoderFactory::VideoCodec. + // |profiles_| and |supported_codecs_| have the same length and the profile + // for |supported_codecs_[i]| is |profiles_[i]|. std::vector<media::VideoCodecProfile> profiles_; - std::vector<webrtc::SdpVideoFormat> supported_formats_; + std::vector<cricket::VideoCodec> supported_codecs_; DISALLOW_COPY_AND_ASSIGN(RTCVideoEncoderFactory); };
diff --git a/content/renderer/media/webrtc/video_codec_factory.cc b/content/renderer/media/webrtc/video_codec_factory.cc deleted file mode 100644 index 790f379..0000000 --- a/content/renderer/media/webrtc/video_codec_factory.cc +++ /dev/null
@@ -1,211 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/webrtc/video_codec_factory.h" - -#include "base/base_switches.h" -#include "base/command_line.h" -#include "base/memory/ptr_util.h" -#include "build/build_config.h" -#include "content/public/common/content_switches.h" -#include "content/renderer/media/webrtc/rtc_video_decoder_factory.h" -#include "content/renderer/media/webrtc/rtc_video_encoder_factory.h" -#include "third_party/webrtc/api/video_codecs/video_decoder_software_fallback_wrapper.h" -#include "third_party/webrtc/api/video_codecs/video_encoder_software_fallback_wrapper.h" -#include "third_party/webrtc/media/base/codec.h" -#include "third_party/webrtc/media/engine/internaldecoderfactory.h" -#include "third_party/webrtc/media/engine/internalencoderfactory.h" -#include "third_party/webrtc/media/engine/simulcast_encoder_adapter.h" -#include "third_party/webrtc/media/engine/vp8_encoder_simulcast_proxy.h" - -#if defined(OS_ANDROID) -#include "media/base/android/media_codec_util.h" -#endif - -namespace content { - -namespace { - -bool IsFormatSupported( - const std::vector<webrtc::SdpVideoFormat>& supported_formats, - const webrtc::SdpVideoFormat& format) { - for (const webrtc::SdpVideoFormat& supported_format : supported_formats) { - if (cricket::IsSameCodec(format.name, format.parameters, - supported_format.name, - supported_format.parameters)) { - return true; - } - } - return false; -} - -template <typename Factory> -bool IsFormatSupported(const Factory* factory, - const webrtc::SdpVideoFormat& format) { - return factory && IsFormatSupported(factory->GetSupportedFormats(), format); -} - -// Merge |formats1| and |formats2|, but avoid adding duplicate formats. -std::vector<webrtc::SdpVideoFormat> MergeFormats( - std::vector<webrtc::SdpVideoFormat> formats1, - const std::vector<webrtc::SdpVideoFormat>& formats2) { - for (const webrtc::SdpVideoFormat& format : formats2) { - // Don't add same format twice. - if (!IsFormatSupported(formats1, format)) - formats1.push_back(format); - } - return formats1; -} - -std::unique_ptr<webrtc::VideoDecoder> CreateDecoder( - webrtc::VideoDecoderFactory* factory, - const webrtc::SdpVideoFormat& format) { - return IsFormatSupported(factory, format) - ? factory->CreateVideoDecoder(format) - : nullptr; -} - -std::unique_ptr<webrtc::VideoDecoder> Wrap( - std::unique_ptr<webrtc::VideoDecoder> software_decoder, - std::unique_ptr<webrtc::VideoDecoder> hardware_decoder) { - if (software_decoder && hardware_decoder) { - return webrtc::CreateVideoDecoderSoftwareFallbackWrapper( - std::move(software_decoder), std::move(hardware_decoder)); - } - return hardware_decoder ? std::move(hardware_decoder) - : std::move(software_decoder); -} - -std::unique_ptr<webrtc::VideoEncoder> Wrap( - std::unique_ptr<webrtc::VideoEncoder> software_encoder, - std::unique_ptr<webrtc::VideoEncoder> hardware_encoder) { - if (software_encoder && hardware_encoder) { - return webrtc::CreateVideoEncoderSoftwareFallbackWrapper( - std::move(software_encoder), std::move(hardware_encoder)); - } - return hardware_encoder ? std::move(hardware_encoder) - : std::move(software_encoder); -} - -// This class combines a hardware factory with the internal factory and adds -// internal SW codecs, simulcast, and SW fallback wrappers. -class EncoderAdapter : public webrtc::VideoEncoderFactory { - public: - explicit EncoderAdapter( - std::unique_ptr<webrtc::VideoEncoderFactory> hardware_encoder_factory) - : hardware_encoder_factory_(std::move(hardware_encoder_factory)) {} - - webrtc::VideoEncoderFactory::CodecInfo QueryVideoEncoder( - const webrtc::SdpVideoFormat& format) const override { - const webrtc::VideoEncoderFactory* factory = - IsFormatSupported(hardware_encoder_factory_.get(), format) - ? hardware_encoder_factory_.get() - : &software_encoder_factory_; - return factory->QueryVideoEncoder(format); - } - - std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder( - const webrtc::SdpVideoFormat& format) override { - std::unique_ptr<webrtc::VideoEncoder> software_encoder; - if (IsFormatSupported(&software_encoder_factory_, format)) { - software_encoder = - cricket::CodecNamesEq(format.name.c_str(), cricket::kVp8CodecName) - ? std::make_unique<webrtc::VP8EncoderSimulcastProxy>( - &software_encoder_factory_) - : software_encoder_factory_.CreateVideoEncoder(format); - } - - std::unique_ptr<webrtc::VideoEncoder> hardware_encoder; - if (IsFormatSupported(hardware_encoder_factory_.get(), format)) { - hardware_encoder = - cricket::CodecNamesEq(format.name.c_str(), cricket::kVp8CodecName) - ? std::make_unique<webrtc::SimulcastEncoderAdapter>( - hardware_encoder_factory_.get(), format) - : hardware_encoder_factory_->CreateVideoEncoder(format); - } - - return Wrap(std::move(software_encoder), std::move(hardware_encoder)); - } - - std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override { - std::vector<webrtc::SdpVideoFormat> software_formats = - software_encoder_factory_.GetSupportedFormats(); - return hardware_encoder_factory_ - ? MergeFormats(software_formats, - hardware_encoder_factory_->GetSupportedFormats()) - : software_formats; - } - - private: - webrtc::InternalEncoderFactory software_encoder_factory_; - const std::unique_ptr<webrtc::VideoEncoderFactory> hardware_encoder_factory_; -}; - -// This class combines a hardware codec factory with the internal factory and -// adds internal SW codecs and SW fallback wrappers. -class DecoderAdapter : public webrtc::VideoDecoderFactory { - public: - explicit DecoderAdapter( - std::unique_ptr<webrtc::VideoDecoderFactory> hardware_decoder_factory) - : hardware_decoder_factory_(std::move(hardware_decoder_factory)) {} - - std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( - const webrtc::SdpVideoFormat& format) override { - std::unique_ptr<webrtc::VideoDecoder> software_decoder = - CreateDecoder(&software_decoder_factory_, format); - - std::unique_ptr<webrtc::VideoDecoder> hardware_decoder = - CreateDecoder(hardware_decoder_factory_.get(), format); - - return Wrap(std::move(software_decoder), std::move(hardware_decoder)); - } - - std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override { - std::vector<webrtc::SdpVideoFormat> software_formats = - software_decoder_factory_.GetSupportedFormats(); - return hardware_decoder_factory_ - ? MergeFormats(software_formats, - hardware_decoder_factory_->GetSupportedFormats()) - : software_formats; - } - - private: - webrtc::InternalDecoderFactory software_decoder_factory_; - const std::unique_ptr<webrtc::VideoDecoderFactory> hardware_decoder_factory_; -}; - -} // namespace - -std::unique_ptr<webrtc::VideoEncoderFactory> CreateWebrtcVideoEncoderFactory( - media::GpuVideoAcceleratorFactories* gpu_factories) { - std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory; - - const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); - if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled() && - !cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) { - encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); - } - -#if defined(OS_ANDROID) - if (!media::MediaCodecUtil::SupportsSetParameters()) - encoder_factory.reset(); -#endif - - return std::make_unique<EncoderAdapter>(std::move(encoder_factory)); -} - -std::unique_ptr<webrtc::VideoDecoderFactory> CreateWebrtcVideoDecoderFactory( - media::GpuVideoAcceleratorFactories* gpu_factories) { - std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory; - - const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); - if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled() && - !cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) { - decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); - } - - return std::make_unique<DecoderAdapter>(std::move(decoder_factory)); -} - -} // namespace content
diff --git a/content/renderer/media/webrtc/video_codec_factory.h b/content/renderer/media/webrtc/video_codec_factory.h deleted file mode 100644 index 07904c1..0000000 --- a/content/renderer/media/webrtc/video_codec_factory.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_VIDEO_CODEC_FACTORY_H_ -#define CONTENT_RENDERER_MEDIA_WEBRTC_VIDEO_CODEC_FACTORY_H_ - -#include "media/video/gpu_video_accelerator_factories.h" -#include "third_party/webrtc/api/video_codecs/video_decoder_factory.h" -#include "third_party/webrtc/api/video_codecs/video_encoder_factory.h" - -namespace content { - -std::unique_ptr<webrtc::VideoEncoderFactory> CreateWebrtcVideoEncoderFactory( - media::GpuVideoAcceleratorFactories* gpu_factories); -std::unique_ptr<webrtc::VideoDecoderFactory> CreateWebrtcVideoDecoderFactory( - media::GpuVideoAcceleratorFactories* gpu_factories); - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_WEBRTC_VIDEO_CODEC_FACTORY_H_
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc index caa1974..1bfd71b 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc +++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc
@@ -72,6 +72,21 @@ WebRtcMediaStreamTrackAdapter::~WebRtcMediaStreamTrackAdapter() { DCHECK(!remote_track_can_complete_initialization_.IsSignaled()); DCHECK(is_disposed_); + // Ensured by destructor traits. + DCHECK(main_thread_->BelongsToCurrentThread()); +} + +// static +void WebRtcMediaStreamTrackAdapterTraits::Destruct( + const WebRtcMediaStreamTrackAdapter* adapter) { + if (!adapter->main_thread_->BelongsToCurrentThread()) { + adapter->main_thread_->PostTask( + FROM_HERE, + base::BindOnce(&WebRtcMediaStreamTrackAdapterTraits::Destruct, + base::Unretained(adapter))); + return; + } + delete adapter; } void WebRtcMediaStreamTrackAdapter::Dispose() {
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h index 8be75b5..fbf4210 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h +++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h
@@ -21,6 +21,7 @@ namespace content { class PeerConnectionDependencyFactory; +struct WebRtcMediaStreamTrackAdapterTraits; // This is a mapping between a webrtc and blink media stream track. It takes // care of creation, initialization and disposing of tracks independently of @@ -29,7 +30,8 @@ // and whether it is an audio or video track; this adapter hides that fact and // lets you use a single class for any type of track. class CONTENT_EXPORT WebRtcMediaStreamTrackAdapter - : public base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter> { + : public base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter, + WebRtcMediaStreamTrackAdapterTraits> { public: // Invoke on the main thread. The returned adapter is fully initialized, see // |is_initialized|. The adapter will keep a reference to the |main_thread|. @@ -76,7 +78,9 @@ } protected: - friend class base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter>; + friend class base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter, + WebRtcMediaStreamTrackAdapterTraits>; + friend struct WebRtcMediaStreamTrackAdapterTraits; WebRtcMediaStreamTrackAdapter( PeerConnectionDependencyFactory* factory, @@ -132,6 +136,16 @@ DISALLOW_COPY_AND_ASSIGN(WebRtcMediaStreamTrackAdapter); }; +struct CONTENT_EXPORT WebRtcMediaStreamTrackAdapterTraits { + private: + friend class base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter, + WebRtcMediaStreamTrackAdapterTraits>; + + // Ensure destruction occurs on main thread so that "Web" and other resources + // are destroyed on the correct thread. + static void Destruct(const WebRtcMediaStreamTrackAdapter* adapter); +}; + } // namespace content #endif // CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc index 74f586d4..1bccc57 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc +++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc
@@ -79,6 +79,12 @@ dependency_factory_.get(), main_thread_, webrtc_track); } + void HoldOntoAdapterReference( + base::WaitableEvent* waitable_event, + scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter) { + waitable_event->Wait(); + } + // Runs message loops on the webrtc signaling thread and optionally the main // thread until idle. void RunMessageLoopsUntilIdle(bool run_loop_on_main_thread = true) { @@ -228,4 +234,33 @@ track_adapter_->GetRemoteAudioTrackAdapterForTesting()->initialized()); } +TEST_F(WebRtcMediaStreamTrackAdapterTest, LastReferenceOnSignalingThread) { + scoped_refptr<MockWebRtcAudioTrack> webrtc_track = + MockWebRtcAudioTrack::Create("remote_audio_track"); + dependency_factory_->GetWebRtcSignalingThread()->PostTask( + FROM_HERE, + base::BindOnce( + &WebRtcMediaStreamTrackAdapterTest::CreateRemoteTrackAdapter, + base::Unretained(this), base::Unretained(webrtc_track.get()))); + // The adapter is initialized implicitly in a PostTask, allow it to run. + RunMessageLoopsUntilIdle(); + DCHECK(track_adapter_); + EXPECT_TRUE(track_adapter_->is_initialized()); + + base::WaitableEvent waitable_event( + base::WaitableEvent::ResetPolicy::MANUAL, + base::WaitableEvent::InitialState::NOT_SIGNALED); + dependency_factory_->GetWebRtcSignalingThread()->PostTask( + FROM_HERE, + base::BindOnce( + &WebRtcMediaStreamTrackAdapterTest::HoldOntoAdapterReference, + base::Unretained(this), base::Unretained(&waitable_event), + track_adapter_)); + // Clear last reference on main thread. + track_adapter_->Dispose(); + track_adapter_ = nullptr; + waitable_event.Signal(); + RunMessageLoopsUntilIdle(); +} + } // namespace content
diff --git a/content/renderer/media_recorder/video_track_recorder.cc b/content/renderer/media_recorder/video_track_recorder.cc index ef28d3170..c7fb3465 100644 --- a/content/renderer/media_recorder/video_track_recorder.cc +++ b/content/renderer/media_recorder/video_track_recorder.cc
@@ -313,8 +313,7 @@ DCHECK(context_provider->ContextGL()); video_renderer_->Copy(video_frame.get(), canvas_.get(), media::Context3D(context_provider->ContextGL(), - context_provider->GrContext()), - context_provider->ContextSupport()); + context_provider->GrContext())); SkPixmap pixmap; if (!bitmap_.peekPixels(&pixmap)) {
diff --git a/content/test/data/sxg/service-worker-prefetch.html b/content/test/data/sxg/service-worker-prefetch.html new file mode 100644 index 0000000..7fda401 --- /dev/null +++ b/content/test/data/sxg/service-worker-prefetch.html
@@ -0,0 +1,13 @@ +<script> +async function register(script, scope) { + const registration = await navigator.serviceWorker.register( + script, {scope: scope}) + await new Promise(resolve => + registration.installing.addEventListener('statechange', resolve)); +} +async function initialize() { + await register('service-worker-prefetch.js', './sw-prefetch-scope/'); + document.title = "Done"; +} +initialize(); +</script>
diff --git a/content/test/data/sxg/service-worker-prefetch.js b/content/test/data/sxg/service-worker-prefetch.js new file mode 100644 index 0000000..1ee6404 --- /dev/null +++ b/content/test/data/sxg/service-worker-prefetch.js
@@ -0,0 +1,6 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +self.addEventListener('fetch', (event) => { +});
diff --git a/content/test/data/sxg/service-worker.html b/content/test/data/sxg/service-worker.html new file mode 100644 index 0000000..f10f3ef --- /dev/null +++ b/content/test/data/sxg/service-worker.html
@@ -0,0 +1,17 @@ +<script> +async function register(script, scope) { + const registration = await navigator.serviceWorker.register( + script, {scope: scope}) + await new Promise(resolve => + registration.installing.addEventListener('statechange', resolve)); +} +async function initialize() { + await register('service-worker.js?generated', './sw-scope-generated/'); + await register('service-worker.js?navigation-preload', + './sw-scope-navigation-preload/'); + await register('service-worker.js?no-respond-with', + './sw-scope-no-respond-with/'); + document.title = "Done"; +} +initialize(); +</script>
diff --git a/content/test/data/sxg/service-worker.js b/content/test/data/sxg/service-worker.js new file mode 100644 index 0000000..46367b4 --- /dev/null +++ b/content/test/data/sxg/service-worker.js
@@ -0,0 +1,21 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +self.addEventListener('activate', (e) => { + if (location.href.endsWith('?navigation-preload')) { + e.waitUntil(self.registration.navigationPreload.enable()) + } +}) + +self.addEventListener('fetch', (event) => { + if (location.href.endsWith('?generated')) { + event.respondWith(new Response( + '<script>\n' + + 'window.parent.document.title =\'' + + event.request.headers.get('accept') + '\';\n</script>', + {headers:[['content-type', 'text/html']]})); + } else if (location.href.endsWith('?navigation-preload')) { + event.respondWith(event.preloadResponse); + } +});
diff --git a/content/test/data/sxg/sw-prefetch-scope/test.html b/content/test/data/sxg/sw-prefetch-scope/test.html new file mode 100644 index 0000000..90135c1 --- /dev/null +++ b/content/test/data/sxg/sw-prefetch-scope/test.html
@@ -0,0 +1 @@ +<title>Done</title>
diff --git a/content/test/data/sxg/sw-scope-navigation-preload/test.html b/content/test/data/sxg/sw-scope-navigation-preload/test.html new file mode 100644 index 0000000..90135c1 --- /dev/null +++ b/content/test/data/sxg/sw-scope-navigation-preload/test.html
@@ -0,0 +1 @@ +<title>Done</title>
diff --git a/content/test/data/sxg/sw-scope-no-respond-with/test.html b/content/test/data/sxg/sw-scope-no-respond-with/test.html new file mode 100644 index 0000000..90135c1 --- /dev/null +++ b/content/test/data/sxg/sw-scope-no-respond-with/test.html
@@ -0,0 +1 @@ +<title>Done</title>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm index dc6d4606..b0939c5 100644 --- a/ios/chrome/browser/about_flags.mm +++ b/ios/chrome/browser/about_flags.mm
@@ -363,9 +363,11 @@ {"toolbar-container", flag_descriptions::kToolbarContainerName, flag_descriptions::kToolbarContainerDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(toolbar_container::kToolbarContainerEnabled)}, - {"omnibox-popup-shortcuts", flag_descriptions::kOmniboxPopupShortcutsName, - flag_descriptions::kOmniboxPopupShortcutsDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kOmniboxPopupShortcuts)}, + {"omnibox-popup-shortcuts", + flag_descriptions::kOmniboxPopupShortcutIconsInZeroStateName, + flag_descriptions::kOmniboxPopupShortcutIconsInZeroStateDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(omnibox::kOmniboxPopupShortcutIconsInZeroState)}, {"sso-with-wkwebview", flag_descriptions::kSSOWithWKWebViewName, flag_descriptions::kSSOWithWKWebViewDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kSSOWithWKWebView)},
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc index 2847ed3f..ab7e8d8 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -203,8 +203,9 @@ "currently under development. WARNING: when enabled Password Manager might " "stop working"; -const char kOmniboxPopupShortcutsName[] = "Show zero-state omnibox shortcuts"; -const char kOmniboxPopupShortcutsDescription[] = +const char kOmniboxPopupShortcutIconsInZeroStateName[] = + "Show zero-state omnibox shortcuts"; +const char kOmniboxPopupShortcutIconsInZeroStateDescription[] = "Instead of ZeroSuggest, show most visited sites and collection shortcuts " "in the omnibox popup.";
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h index afefa2d..fa74a6e 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -167,8 +167,8 @@ // Title and description for the flag to show most visited sites and collection // shortcuts in the omnibox popup instead of ZeroSuggest. -extern const char kOmniboxPopupShortcutsName[]; -extern const char kOmniboxPopupShortcutsDescription[]; +extern const char kOmniboxPopupShortcutIconsInZeroStateName[]; +extern const char kOmniboxPopupShortcutIconsInZeroStateDescription[]; // Title and description for the flag to enable elision of the URL path, query, // and ref in omnibox URL suggestions.
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm index 1e90248..197d2e5 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/no_destructor.h" #include "components/autofill/core/common/password_form.h" #include "components/browser_sync/profile_sync_service.h" #include "components/keyed_service/core/service_access_type.h" @@ -15,6 +16,7 @@ #include "components/password_manager/core/browser/password_manager.h" #include "components/password_manager/core/browser/password_manager_internals_service.h" #include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/browser/store_metrics_reporter.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/signin/core/browser/signin_manager_base.h" #include "ios/chrome/browser/application_context.h" @@ -62,6 +64,9 @@ helper_(this) { saving_passwords_enabled_.Init( password_manager::prefs::kCredentialsEnableService, GetPrefs()); + static base::NoDestructor<password_manager::StoreMetricsReporter> reporter( + *saving_passwords_enabled_, this, GetSyncService(delegate_.browserState), + GetSigninManager(delegate_.browserState), GetPrefs()); log_manager_ = password_manager::LogManager::Create( ios::PasswordManagerInternalsServiceFactory::GetForBrowserState( delegate_.browserState),
diff --git a/ios/chrome/browser/ui/BUILD.gn b/ios/chrome/browser/ui/BUILD.gn index ab58c5c..fd2d0da 100644 --- a/ios/chrome/browser/ui/BUILD.gn +++ b/ios/chrome/browser/ui/BUILD.gn
@@ -369,6 +369,7 @@ "//ios/chrome/browser/ui/history", "//ios/chrome/browser/ui/image_util", "//ios/chrome/browser/ui/keyboard", + "//ios/chrome/browser/ui/location_bar:toolbar_model_delegate", "//ios/chrome/browser/ui/main:tab_switcher", "//ios/chrome/browser/ui/main_content:main_content_ui", "//ios/chrome/browser/ui/main_content:main_content_ui_broadcasting_util", @@ -398,7 +399,6 @@ "//ios/chrome/browser/ui/tabs:coordinator", "//ios/chrome/browser/ui/tabs/requirements", "//ios/chrome/browser/ui/toolbar", - "//ios/chrome/browser/ui/toolbar:toolbar_model_delegate", "//ios/chrome/browser/ui/toolbar:toolbar_ui", "//ios/chrome/browser/ui/toolbar/buttons", "//ios/chrome/browser/ui/toolbar/fullscreen", @@ -530,9 +530,9 @@ "//ios/chrome/browser/tabs", "//ios/chrome/browser/tabs:tabs_internal", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/location_bar:toolbar_model_delegate", "//ios/chrome/browser/ui/omnibox:omnibox_internal", "//ios/chrome/browser/ui/toolbar", - "//ios/chrome/browser/ui/toolbar:toolbar_model_delegate", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:test_support",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm index 27059c8..070684d 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -382,13 +382,11 @@ // SearchController is active will fail. self.definesPresentationContext = YES; - self.scrimView = [[UIControl alloc] initWithFrame:self.tableView.bounds]; + self.scrimView = [[UIControl alloc] init]; self.scrimView.backgroundColor = [UIColor colorWithWhite:0 alpha:kTableViewNavigationWhiteAlphaForSearchScrim]; self.scrimView.translatesAutoresizingMaskIntoConstraints = NO; - self.scrimView.autoresizingMask = - UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.scrimView.accessibilityIdentifier = kBookmarkHomeSearchScrimIdentifier; [self.scrimView addTarget:self action:@selector(dismissSearchController:) @@ -946,7 +944,7 @@ // Early return if the controller has been deallocated. if (!strongSelf) return; - [UIView animateWithDuration:kTableViewNavigationScrimFadeDuration + [UIView animateWithDuration:0.2f animations:^{ strongSelf.spinnerView.alpha = 0.0; } @@ -1291,14 +1289,15 @@ - (void)showScrim { self.navigationController.toolbarHidden = YES; self.scrimView.alpha = 0.0f; - CGSize contentSize = self.tableView.contentSize; - self.scrimView.frame = - CGRectMake(0.0f, 0.0f, contentSize.width, - std::max(contentSize.height, self.view.bounds.size.height)); [self.tableView addSubview:self.scrimView]; + // We attach our constraints to the superview because the tableView is + // a scrollView and it seems that we get an empty frame when attaching to it. + AddSameConstraints(self.scrimView, self.view.superview); + self.tableView.scrollEnabled = NO; [UIView animateWithDuration:kTableViewNavigationScrimFadeDuration animations:^{ self.scrimView.alpha = 1.0f; + [self.view layoutIfNeeded]; }]; } @@ -1310,6 +1309,7 @@ } completion:^(BOOL finished) { [self.scrimView removeFromSuperview]; + self.tableView.scrollEnabled = YES; }]; [self setupContextBar]; }
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index 6a89e7b..49d6f33 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -160,6 +160,7 @@ #import "ios/chrome/browser/ui/image_util/image_copier.h" #import "ios/chrome/browser/ui/image_util/image_saver.h" #import "ios/chrome/browser/ui/key_commands_provider.h" +#include "ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h" #import "ios/chrome/browser/ui/location_bar_notification_names.h" #import "ios/chrome/browser/ui/main_content/main_content_ui.h" #import "ios/chrome/browser/ui/main_content/main_content_ui_broadcasting_util.h" @@ -204,7 +205,6 @@ #import "ios/chrome/browser/ui/toolbar/public/primary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h" -#include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h" #import "ios/chrome/browser/ui/translate/language_selection_coordinator.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/ui/ui_util.h" @@ -1836,6 +1836,15 @@ self.currentWebState->GetWebViewProxy().contentInset = contentPadding; } + // If the device's size class has changed from RegularXRegular to another and + // vice-versa, the find bar should switch between regular mode and compact + // mode accordingly. Hide the findbar here and it will be reshown in [self + // updateToobar]; + if (ShouldShowCompactToolbar(previousTraitCollection) != + ShouldShowCompactToolbar()) { + [self hideFindBarWithAnimation:NO]; + } + // Update the toolbar visibility. [self updateToolbar]; @@ -2679,21 +2688,9 @@ selectText:(BOOL)selectText shouldFocus:(BOOL)shouldFocus { DCHECK(_findBarController); - CGRect referenceFrame = CGRectZero; - if ([self canShowTabStrip]) { - DCHECK(_model.currentTab); - referenceFrame = [self visibleFrameForTab:_model.currentTab]; - } else { - referenceFrame = self.contentArea.frame; - } - - CGRect omniboxFrame = - [NamedGuide guideWithName:kOmniboxGuide view:self.view].layoutFrame; [_findBarController addFindBarViewToParentView:self.view usingToolbarView:_primaryToolbarCoordinator.viewController.view - alignWithFrame:omniboxFrame - frame:referenceFrame selectText:selectText animated:animate]; [self updateFindBar:YES shouldFocus:shouldFocus]; @@ -4445,10 +4442,6 @@ return _toolbarModel.get(); } -- (BOOL)shouldDisplayHintText { - return [[_model currentTab].webController wantsLocationBarHintText]; -} - #pragma mark - BrowserCommands - (void)goBack {
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h index 28ab52b..9a8bd5c3 100644 --- a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h +++ b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h
@@ -35,17 +35,12 @@ // Updates the results count in Find Bar. - (void)updateResultsCount:(FindInPageModel*)model; -// Display find bar view. For legacy UI on iPad, it makes best effort to -// horizontally align find bar with alignment frame, unless alignment frame is -// too wide or too narrow. When too wide, the find bar is shorter and -// right-aligned. When |alignmentFrame| is too narrow, the find bar will -// horizontally fill |parentView|. For new UI on iPad, the find bar aligns with -// the right border of |parentView| and below |toolbarView|. If |selectText| -// flag is YES, the text in the text input field will be selected. +// Display find bar view. For regular size, the find bar aligns with the right +// border of |parentView| and below |toolbarView|. For compact size, the find +// bar overlaps the |toolbarView|. If |selectText| flag is YES, the text in the +// text input field will be selected. - (void)addFindBarViewToParentView:(UIView*)parentView usingToolbarView:(UIView*)toolbarView - alignWithFrame:(CGRect)alignmentFrame - frame:(CGRect)findBarFrame selectText:(BOOL)selectText animated:(BOOL)animated; // Hide find bar view.
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm index bb669de..83c8dc1 100644 --- a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm +++ b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
@@ -112,8 +112,6 @@ #pragma mark View Setup & Teardown -// TODO(crbug.com/879136): Remove code of legacy view and unnecessary args once -// UIRefreshPhase1 is 100% enabled. - (UIView*)constructFindBarView { UIView* findBarBackground = nil; @@ -234,12 +232,8 @@ self.findBarView.previousButton.enabled = enabled; } -// TODO(crbug.com/879136): Remove code of legacy view and unnecessary args once -// UIRefreshPhase1 is 100% enabled. - (void)addFindBarViewToParentView:(UIView*)parentView usingToolbarView:(UIView*)toolbarView - alignWithFrame:(CGRect)alignmentFrame - frame:(CGRect)findBarFrame selectText:(BOOL)selectText animated:(BOOL)animated { // If already showing find bar, update the height constraint only for iOS 10
diff --git a/ios/chrome/browser/ui/history/history_table_view_controller.mm b/ios/chrome/browser/ui/history/history_table_view_controller.mm index 394e2c7e..d75fb66 100644 --- a/ios/chrome/browser/ui/history/history_table_view_controller.mm +++ b/ios/chrome/browser/ui/history/history_table_view_controller.mm
@@ -37,6 +37,7 @@ #import "ios/chrome/browser/ui/util/pasteboard_util.h" #import "ios/chrome/browser/ui/util/top_view_controller.h" #import "ios/chrome/common/favicon/favicon_view.h" +#import "ios/chrome/common/ui_util/constraints_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/web/public/navigation_manager.h" #import "ios/web/public/referrer.h" @@ -231,14 +232,12 @@ // SearchController is active will fail. self.definesPresentationContext = YES; - self.scrimView = [[UIControl alloc] initWithFrame:self.tableView.bounds]; + self.scrimView = [[UIControl alloc] init]; self.scrimView.alpha = 0.0f; self.scrimView.backgroundColor = [UIColor colorWithWhite:0 alpha:kTableViewNavigationWhiteAlphaForSearchScrim]; self.scrimView.translatesAutoresizingMaskIntoConstraints = NO; - self.scrimView.autoresizingMask = - UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.scrimView.accessibilityIdentifier = kHistorySearchScrimIdentifier; [self.scrimView addTarget:self action:@selector(dismissSearchController:) @@ -918,14 +917,16 @@ if (self.scrimView.alpha < 1.0f) { self.navigationController.toolbarHidden = YES; self.scrimView.alpha = 0.0f; - CGSize contentSize = self.tableView.contentSize; - self.scrimView.frame = - CGRectMake(0.0f, 0.0f, contentSize.width, - std::max(contentSize.height, self.view.bounds.size.height)); [self.tableView addSubview:self.scrimView]; + // We attach our constraints to the superview because the tableView is + // a scrollView and it seems that we get an empty frame when attaching to + // it. + AddSameConstraints(self.scrimView, self.view.superview); + self.tableView.scrollEnabled = NO; [UIView animateWithDuration:kTableViewNavigationScrimFadeDuration animations:^{ self.scrimView.alpha = 1.0f; + [self.view layoutIfNeeded]; }]; } } @@ -940,6 +941,7 @@ } completion:^(BOOL finished) { [self.scrimView removeFromSuperview]; + self.tableView.scrollEnabled = YES; }]; } }
diff --git a/ios/chrome/browser/ui/location_bar/BUILD.gn b/ios/chrome/browser/ui/location_bar/BUILD.gn index 1f296ca2c..57bb12f 100644 --- a/ios/chrome/browser/ui/location_bar/BUILD.gn +++ b/ios/chrome/browser/ui/location_bar/BUILD.gn
@@ -91,6 +91,27 @@ [ "//ios/chrome/browser/ui/omnibox:omnibox_internal" ] } +source_set("toolbar_model_delegate") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "toolbar_model_delegate_ios.h", + "toolbar_model_delegate_ios.mm", + ] + deps = [ + "//base", + "//components/omnibox/browser", + "//components/prefs", + "//components/toolbar", + "//ios/chrome/browser", + "//ios/chrome/browser/autocomplete", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/ssl", + "//ios/chrome/browser/web_state_list", + "//ios/web/public", + ] + libs = [ "UIKit.framework" ] +} + source_set("constants") { configs += [ "//build/config/compiler:enable_arc" ] sources = [
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm index 9c178f7..423f5c3 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm
@@ -52,10 +52,6 @@ return _model.get(); } -- (BOOL)shouldDisplayHintText { - return NO; -} - @end namespace {
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm index cf4fabab..7b6cc3b 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm
@@ -194,8 +194,6 @@ - (void)updateOmniboxState { if (!_locationBarController) return; - _locationBarController->SetShouldShowHintText( - [self.delegate shouldDisplayHintText]); _locationBarController->OnToolbarUpdated(); }
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h b/ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h similarity index 84% rename from ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h rename to ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h index da242b14..e90ae6ea 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h +++ b/ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MODEL_DELEGATE_IOS_H_ -#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MODEL_DELEGATE_IOS_H_ +#ifndef IOS_CHROME_BROWSER_UI_LOCATION_BAR_TOOLBAR_MODEL_DELEGATE_IOS_H_ +#define IOS_CHROME_BROWSER_UI_LOCATION_BAR_TOOLBAR_MODEL_DELEGATE_IOS_H_ #include "base/macros.h" #include "components/toolbar/toolbar_model_delegate.h" @@ -13,10 +13,10 @@ namespace web { class NavigationItem; class WebState; -} +} // namespace web // Implementation of ToolbarModelDelegate which uses an instance of -// TabModel in order to fulfil its duties. +// TabModel in order to fulfill its duties. class ToolbarModelDelegateIOS : public ToolbarModelDelegate { public: // |web_state_list| must outlive this ToolbarModelDelegateIOS object. @@ -49,4 +49,4 @@ DISALLOW_COPY_AND_ASSIGN(ToolbarModelDelegateIOS); }; -#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MODEL_DELEGATE_IOS_H_ +#endif // IOS_CHROME_BROWSER_UI_LOCATION_BAR_TOOLBAR_MODEL_DELEGATE_IOS_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.mm b/ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.mm similarity index 98% rename from ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.mm rename to ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.mm index bfd55b3..ceb59ef2 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.mm +++ b/ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h" +#import "ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h" #include "base/logging.h" #include "components/omnibox/browser/autocomplete_classifier.h"
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_controller.h b/ios/chrome/browser/ui/omnibox/location_bar_controller.h index bdb66e74..25ac37a9 100644 --- a/ios/chrome/browser/ui/omnibox/location_bar_controller.h +++ b/ios/chrome/browser/ui/omnibox/location_bar_controller.h
@@ -25,6 +25,7 @@ virtual void HideKeyboardAndEndEditing() = 0; // Tells the omnibox if it can show the hint text or not. + // TODO(crbug.com/889400): Remove this method. virtual void SetShouldShowHintText(bool show_hint_text) = 0; // Returns a pointer to the text entry view.
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn index 6bed79b..a99211a 100644 --- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn +++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -64,3 +64,19 @@ ] configs += [ "//build/config/compiler:enable_arc" ] } + +source_set("unit_tests") { + configs += [ "//build/config/compiler:enable_arc" ] + testonly = true + sources = [ + "omnibox_popup_view_controller_unittest.mm", + ] + deps = [ + ":popup", + "//base", + "//ios/chrome/app/strings", + "//ios/chrome/browser", + "//testing/gtest", + "//ui/base", + ] +}
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h index 1838380..0cdf86ba 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h
@@ -22,6 +22,12 @@ @interface OmniboxPopupViewController : UIViewController<AutocompleteResultConsumer, OmniboxSuggestionCommands> +// When enabled, this view controller will display shortcuts when no suggestions +// are available. +// This can be toggled at runtime, for example to only show shortcuts on regular +// pages and not show them on NTP. +@property(nonatomic, assign) BOOL shortcutsEnabled; + @property(nonatomic, assign) BOOL incognito; @property(nonatomic, weak) id<AutocompleteResultConsumerDelegate> delegate; @property(nonatomic, weak) id<ImageRetriever> imageRetriever;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm index f157ea5..0cff6487 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -26,6 +26,7 @@ namespace { const int kRowCount = 6; const CGFloat kRowHeight = 48.0; +const CGFloat kShortcutsRowHeight = 100; const CGFloat kAnswerRowHeight = 64.0; const CGFloat kTopAndBottomPadding = 8.0; UIColor* BackgroundColorTablet() { @@ -211,6 +212,15 @@ _incognito = incognito; } +- (void)setShortcutsEnabled:(BOOL)shortcutsEnabled { + if (shortcutsEnabled == _shortcutsEnabled) { + return; + } + + _shortcutsEnabled = shortcutsEnabled; + [self.tableView reloadData]; +} + #pragma mark - AutocompleteResultConsumer - (void)updateMatches:(NSArray<id<AutocompleteSuggestion>>*)result @@ -608,6 +618,11 @@ - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { + if (self.shortcutsEnabled && indexPath.row == 0 && + _currentResult.count == 0) { + return kShortcutsRowHeight; + } + DCHECK_EQ(0U, (NSUInteger)indexPath.section); DCHECK_LT((NSUInteger)indexPath.row, _currentResult.count); return ((OmniboxPopupRow*)(_rows[indexPath.row])).rowHeight; @@ -620,6 +635,9 @@ - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { DCHECK_EQ(0, section); + if (self.shortcutsEnabled && _currentResult.count == 0) { + return 1; + } return _currentResult.count; } @@ -627,6 +645,17 @@ - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { DCHECK_EQ(0U, (NSUInteger)indexPath.section); + + if (self.shortcutsEnabled && indexPath.row == 0 && + _currentResult.count == 0) { + // This is a placeholder cell. + UITableViewCell* cell = + [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:nil]; + cell.textLabel.text = @"Shortcuts placeholder"; + return cell; + } + DCHECK_LT((NSUInteger)indexPath.row, _currentResult.count); return _rows[indexPath.row]; } @@ -634,6 +663,12 @@ - (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath { DCHECK_EQ(0U, (NSUInteger)indexPath.section); + + if (self.shortcutsEnabled && indexPath.row == 0 && + _currentResult.count == 0) { + return NO; + } + // iOS doesn't check -numberOfRowsInSection before checking // -canEditRowAtIndexPath in a reload call. If |indexPath.row| is too large, // simple return |NO|.
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller_unittest.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller_unittest.mm new file mode 100644 index 0000000..7e709d9 --- /dev/null +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller_unittest.mm
@@ -0,0 +1,51 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h" + +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +class OmniboxPopupViewControllerTest : public PlatformTest { + protected: + void SetUp() override { + PlatformTest::SetUp(); + popup_view_controller_ = [[OmniboxPopupViewController alloc] init]; + }; + + OmniboxPopupViewController* popup_view_controller_; +}; + +TEST_F(OmniboxPopupViewControllerTest, hasCellsWhenShortcutsEnabled) { + // This test makes an assumption that this view controller is a datasource for + // a table view. Rewrite this test if this is not the case anymore. + EXPECT_TRUE([popup_view_controller_ + conformsToProtocol:@protocol(UITableViewDataSource)]); + id<UITableViewDataSource> datasource = + (id<UITableViewDataSource>)popup_view_controller_; + UITableView* tableView = [[UITableView alloc] init]; + + // Shortcuts are not enabled by default. + EXPECT_FALSE(popup_view_controller_.shortcutsEnabled); + + // Check that the shorcuts row doesn't appear. + [popup_view_controller_ updateMatches:@[] withAnimation:NO]; + EXPECT_EQ([datasource tableView:tableView numberOfRowsInSection:0], 0); + + // Enable shortcuts and verify they appear. + popup_view_controller_.shortcutsEnabled = YES; + EXPECT_EQ([datasource tableView:tableView numberOfRowsInSection:0], 1); + + // Disable and verify it disappears again. + popup_view_controller_.shortcutsEnabled = NO; + EXPECT_EQ([datasource tableView:tableView numberOfRowsInSection:0], 0); +} + +} // namespace
diff --git a/ios/chrome/browser/ui/omnibox_perftest.mm b/ios/chrome/browser/ui/omnibox_perftest.mm index 64298e90..8cd84903 100644 --- a/ios/chrome/browser/ui/omnibox_perftest.mm +++ b/ios/chrome/browser/ui/omnibox_perftest.mm
@@ -14,10 +14,10 @@ #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/search_engines/template_url_service_factory.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#include "ios/chrome/browser/ui/location_bar/toolbar_model_delegate_ios.h" #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h" #import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h" -#include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h" #import "ios/chrome/browser/ui/util/named_guide.h" #import "ios/chrome/browser/ui/util/named_guide_util.h" #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm index abb57d4..b2e30af 100644 --- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm +++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
@@ -93,8 +93,6 @@ // The value to use as the R, B, and B components for the action label text and // selection layer animation. const CGFloat kSelectionColor = 0.4; -// The values to use for the R, G, and B components for the -const CGFloat kSelectionColorLegacy[] = {66.0 / 256, 133.0 / 256, 244.0 / 256}; // This function maps a value from a range to another. CGFloat MapValueToRange(FloatRange from, FloatRange to, CGFloat value) { @@ -314,47 +312,42 @@ [_highlightMaskLayer addSublayer:_reloadActionImageViewHighlighted.layer]; [_highlightMaskLayer addSublayer:_closeTabActionImageViewHighlighted.layer]; - if (IsUIRefreshPhase1Enabled()) { - _addTabLabel = [[UILabel alloc] init]; - _addTabLabel.numberOfLines = 0; - _addTabLabel.lineBreakMode = NSLineBreakByWordWrapping; - _addTabLabel.textAlignment = NSTextAlignmentLeft; - _addTabLabel.alpha = 0.0; - _addTabLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; - _addTabLabel.adjustsFontForContentSizeCategory = NO; - _addTabLabel.textColor = - [UIColor colorWithWhite:kSelectionColor alpha:1.0]; - _addTabLabel.text = - l10n_util::GetNSString(IDS_IOS_OVERSCROLL_NEW_TAB_LABEL); - [self addSubview:_addTabLabel]; - _reloadLabel = [[UILabel alloc] init]; - _reloadLabel.numberOfLines = 0; - _reloadLabel.lineBreakMode = NSLineBreakByWordWrapping; - _reloadLabel.textAlignment = NSTextAlignmentCenter; - _reloadLabel.alpha = 0.0; - _reloadLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; - _reloadLabel.adjustsFontForContentSizeCategory = NO; - _reloadLabel.textColor = - [UIColor colorWithWhite:kSelectionColor alpha:1.0]; - _reloadLabel.text = - l10n_util::GetNSString(IDS_IOS_OVERSCROLL_RELOAD_LABEL); - [self addSubview:_reloadLabel]; - _closeTabLabel = [[UILabel alloc] init]; - _closeTabLabel.numberOfLines = 0; - _closeTabLabel.lineBreakMode = NSLineBreakByWordWrapping; - _closeTabLabel.textAlignment = NSTextAlignmentRight; - _closeTabLabel.alpha = 0.0; - _closeTabLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; - _closeTabLabel.adjustsFontForContentSizeCategory = NO; - _closeTabLabel.textColor = - [UIColor colorWithWhite:kSelectionColor alpha:1.0]; - _closeTabLabel.text = - l10n_util::GetNSString(IDS_IOS_OVERSCROLL_CLOSE_TAB_LABEL); - [self addSubview:_closeTabLabel]; - } + _addTabLabel = [[UILabel alloc] init]; + _addTabLabel.numberOfLines = 0; + _addTabLabel.lineBreakMode = NSLineBreakByWordWrapping; + _addTabLabel.textAlignment = NSTextAlignmentLeft; + _addTabLabel.alpha = 0.0; + _addTabLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; + _addTabLabel.adjustsFontForContentSizeCategory = NO; + _addTabLabel.textColor = [UIColor colorWithWhite:kSelectionColor alpha:1.0]; + _addTabLabel.text = + l10n_util::GetNSString(IDS_IOS_OVERSCROLL_NEW_TAB_LABEL); + [self addSubview:_addTabLabel]; + _reloadLabel = [[UILabel alloc] init]; + _reloadLabel.numberOfLines = 0; + _reloadLabel.lineBreakMode = NSLineBreakByWordWrapping; + _reloadLabel.textAlignment = NSTextAlignmentCenter; + _reloadLabel.alpha = 0.0; + _reloadLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; + _reloadLabel.adjustsFontForContentSizeCategory = NO; + _reloadLabel.textColor = [UIColor colorWithWhite:kSelectionColor alpha:1.0]; + _reloadLabel.text = l10n_util::GetNSString(IDS_IOS_OVERSCROLL_RELOAD_LABEL); + [self addSubview:_reloadLabel]; + _closeTabLabel = [[UILabel alloc] init]; + _closeTabLabel.numberOfLines = 0; + _closeTabLabel.lineBreakMode = NSLineBreakByWordWrapping; + _closeTabLabel.textAlignment = NSTextAlignmentRight; + _closeTabLabel.alpha = 0.0; + _closeTabLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; + _closeTabLabel.adjustsFontForContentSizeCategory = NO; + _closeTabLabel.textColor = + [UIColor colorWithWhite:kSelectionColor alpha:1.0]; + _closeTabLabel.text = + l10n_util::GetNSString(IDS_IOS_OVERSCROLL_CLOSE_TAB_LABEL); + [self addSubview:_closeTabLabel]; _backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; [self addSubview:_backgroundView]; @@ -579,9 +572,6 @@ } - (void)layoutActionLabels { - if (!IsUIRefreshPhase1Enabled()) - return; - // The text is truncated to be a maximum of half the width of the view. CGSize boundingSize = self.bounds.size; boundingSize.width /= 2.0; @@ -996,13 +986,7 @@ setImage:[UIImage imageNamed:kCloseActionActiveImage]]; _selectionCircleLayer.fillColor = - IsUIRefreshPhase1Enabled() - ? [UIColor colorWithWhite:kSelectionColor alpha:1.0].CGColor - : [UIColor colorWithRed:kSelectionColorLegacy[0] - green:kSelectionColorLegacy[1] - blue:kSelectionColorLegacy[2] - alpha:1] - .CGColor; + [UIColor colorWithWhite:kSelectionColor alpha:1.0].CGColor; _selectionCircleMaskLayer.fillColor = [[UIColor blackColor] CGColor]; } [_addTabActionImageView sizeToFit]; @@ -1080,7 +1064,7 @@ - (void)fadeInActionLabel:(UILabel*)actionLabel previousActionLabel:(UILabel*)previousLabel { NSUInteger labelCount = (actionLabel ? 1 : 0) + (previousLabel ? 1 : 0); - if (!IsUIRefreshPhase1Enabled() || !labelCount) + if (!labelCount) return; NSTimeInterval duration = labelCount * kActionLabelFadeDuration;
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn index 690c36d..3ab4852 100644 --- a/ios/chrome/browser/ui/toolbar/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -105,27 +105,6 @@ configs += [ "//build/config/compiler:enable_arc" ] } -source_set("toolbar_model_delegate") { - configs += [ "//build/config/compiler:enable_arc" ] - sources = [ - "toolbar_model_delegate_ios.h", - "toolbar_model_delegate_ios.mm", - ] - deps = [ - "//base", - "//components/omnibox/browser", - "//components/prefs", - "//components/toolbar", - "//ios/chrome/browser", - "//ios/chrome/browser/autocomplete", - "//ios/chrome/browser/browser_state", - "//ios/chrome/browser/ssl", - "//ios/chrome/browser/web_state_list", - "//ios/web/public", - ] - libs = [ "UIKit.framework" ] -} - source_set("unit_tests") { testonly = true
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h index d6bc110..968025a7 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h +++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h
@@ -21,9 +21,6 @@ - (void)locationBarBeganEdit; // Returns the toolbar model. - (ToolbarModel*)toolbarModel; -// Whether the hint text should be displayed in the location bar. -// TODO(crbug.com/800266): This is not needed with the adaptive toolbar. -- (BOOL)shouldDisplayHintText; @end
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc index 11c366d7..3f5bc5a 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.cc +++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -9,7 +9,7 @@ const base::Feature kCopyImage{"CopyImage", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kOmniboxPopupShortcuts{"OmniboxPopupShortcuts", - base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kOmniboxPopupShortcutIconsInZeroState{ + "OmniboxPopupShortcutIconsInZeroState", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kWKWebViewSnapshots{"WKWebViewSnapshots", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h index 2079a15..abdb4c7 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.h +++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -17,7 +17,7 @@ // Feature to show most visited sites and collection shortcuts in the omnibox // popup instead of ZeroSuggest. -extern const base::Feature kOmniboxPopupShortcuts; +extern const base::Feature kOmniboxPopupShortcutIconsInZeroState; // Used to enable using the WKWebView snapshotting API for iOS 11+. extern const base::Feature kWKWebViewSnapshots;
diff --git a/ios/chrome/browser/ui/uikit_ui_util.h b/ios/chrome/browser/ui/uikit_ui_util.h index a05ba39..976bf18 100644 --- a/ios/chrome/browser/ui/uikit_ui_util.h +++ b/ios/chrome/browser/ui/uikit_ui_util.h
@@ -205,16 +205,20 @@ // Whether the |environment| has a compact vertical size class. bool IsCompactHeight(id<UITraitEnvironment> environment); +// Whether toolbar should be shown in compact mode. +bool ShouldShowCompactToolbar(); +// Whether toolbar should be shown in compact mode in |traitCollection|. +bool ShouldShowCompactToolbar(UITraitCollection* traitCollection); + // Whether the the main application window's rootViewController has a regular // vertical and regular horizontal size class. bool IsRegularXRegularSizeClass(); - -// Whether toolbar should be shown in compact mode. -bool ShouldShowCompactToolbar(); - // Whether the |environment| has a regular vertical and regular horizontal -// size class. the main application window's rootViewController +// size class. bool IsRegularXRegularSizeClass(id<UITraitEnvironment> environment); +// Whether the |traitCollection| has a regular vertical and regular horizontal +// size class. +bool IsRegularXRegularSizeClass(UITraitCollection* traitCollection); // Returns whether the toolbar is split between top and bottom toolbar or if it // is displayed as only one toolbar.
diff --git a/ios/chrome/browser/ui/uikit_ui_util.mm b/ios/chrome/browser/ui/uikit_ui_util.mm index 1b13e3251..e04ba59 100644 --- a/ios/chrome/browser/ui/uikit_ui_util.mm +++ b/ios/chrome/browser/ui/uikit_ui_util.mm
@@ -560,16 +560,20 @@ } bool IsRegularXRegularSizeClass(id<UITraitEnvironment> environment) { - UITraitCollection* traitCollection = environment.traitCollection; + return IsRegularXRegularSizeClass(environment.traitCollection); +} + +bool IsRegularXRegularSizeClass(UITraitCollection* traitCollection) { return traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular && traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular; } +bool ShouldShowCompactToolbar(UITraitCollection* traitCollection) { + return !IsRegularXRegularSizeClass(traitCollection); +} + bool ShouldShowCompactToolbar() { - if (IsUIRefreshPhase1Enabled()) { - return !IsRegularXRegularSizeClass(); - } - return !IsIPadIdiom(); + return !IsRegularXRegularSizeClass(); } bool IsSplitToolbarMode() { @@ -577,8 +581,7 @@ } bool IsSplitToolbarMode(id<UITraitEnvironment> environment) { - return IsUIRefreshPhase1Enabled() && IsCompactWidth(environment) && - !IsCompactHeight(environment); + return IsCompactWidth(environment) && !IsCompactHeight(environment); } // Returns the first responder in the subviews of |view|, or nil if no view in
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index d9127ef..4121f34 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -214,6 +214,7 @@ "//ios/chrome/browser/ui/ntp:unit_tests", "//ios/chrome/browser/ui/ntp/recent_tabs:unit_tests", "//ios/chrome/browser/ui/omnibox:unit_tests", + "//ios/chrome/browser/ui/omnibox/popup:unit_tests", "//ios/chrome/browser/ui/overlays:unit_tests", "//ios/chrome/browser/ui/payments:unit_tests", "//ios/chrome/browser/ui/payments/cells:unit_tests",
diff --git a/ios/web/public/web_state/ui/crw_native_content.h b/ios/web/public/web_state/ui/crw_native_content.h index 667c23df..ec5f23c 100644 --- a/ios/web/public/web_state/ui/crw_native_content.h +++ b/ios/web/public/web_state/ui/crw_native_content.h
@@ -56,11 +56,6 @@ - (void)executeJavaScript:(NSString*)script completionHandler:(web::JavaScriptResultBlock)handler; -// Returns |YES| if CRWNativeContent wants the hint text displayed. -// TODO(crbug.com/374984): Remove this. This is chrome level concept and should -// not exist in the web/ layer. -- (BOOL)wantsLocationBarHintText; - // Dismisses any outstanding modal interaction elements (e.g. modal view // controllers, context menus, etc). - (void)dismissModals;
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h index fdeb9fa61..301c0c1 100644 --- a/ios/web/web_state/ui/crw_web_controller.h +++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -191,9 +191,6 @@ // Notifies the CRWWebController that it has been hidden. - (void)wasHidden; -// Returns |YES| if the current page should should the location bar hint text. -- (BOOL)wantsLocationBarHintText; - // Adds |recognizer| as a gesture recognizer to the web view. - (void)addGestureRecognizerToWebView:(UIGestureRecognizer*)recognizer; // Removes |recognizer| from the web view.
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index ae8bca796..8e0f17b 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -2895,14 +2895,6 @@ #pragma mark - -- (BOOL)wantsLocationBarHintText { - if ([self.nativeController - respondsToSelector:@selector(wantsLocationBarHintText)]) { - return [self.nativeController wantsLocationBarHintText]; - } - return YES; -} - // TODO(stuartmorgan): This method conflates document changes and URL changes; // we should be distinguishing better, and be clear about the expected // WebDelegate and WCO callbacks in each case.
diff --git a/media/blink/run_all_unittests.cc b/media/blink/run_all_unittests.cc index 2ac885c..50cd304 100644 --- a/media/blink/run_all_unittests.cc +++ b/media/blink/run_all_unittests.cc
@@ -40,7 +40,8 @@ public: BlinkPlatformWithTaskEnvironment() : main_thread_scheduler_( - blink::scheduler::CreateWebMainThreadSchedulerForTests()) {} + blink::scheduler::WebThreadScheduler::CreateMainThreadScheduler()) { + } ~BlinkPlatformWithTaskEnvironment() override { main_thread_scheduler_->Shutdown();
diff --git a/media/blink/video_decode_stats_reporter_unittest.cc b/media/blink/video_decode_stats_reporter_unittest.cc index 562f1c6..d6ec074 100644 --- a/media/blink/video_decode_stats_reporter_unittest.cc +++ b/media/blink/video_decode_stats_reporter_unittest.cc
@@ -19,7 +19,6 @@ #include "mojo/public/cpp/bindings/strong_binding.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" #include "ui/gfx/geometry/rect.h" using ::testing::Invoke; @@ -186,8 +185,7 @@ std::move(recorder_ptr), base::Bind(&VideoDecodeStatsReporterTest::GetPipelineStatsCB, base::Unretained(this)), - MakeDefaultVideoConfig(), - blink::scheduler::GetSingleThreadTaskRunnerForTesting(), + MakeDefaultVideoConfig(), task_runner_, task_runner_->GetMockTickClock()); }
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index c6d0d94..253f3fd 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -1131,12 +1131,10 @@ gfx::Rect gfx_rect(rect); Context3D context_3d; - gpu::ContextSupport* context_support = nullptr; if (video_frame.get() && video_frame->HasTextures()) { if (context_provider_) { context_3d = Context3D(context_provider_->ContextGL(), context_provider_->GrContext()); - context_support = context_provider_->ContextSupport(); } if (!context_3d.gl) return; // Unable to get/create a shared main thread context. @@ -1154,8 +1152,7 @@ } video_renderer_.Paint( video_frame, canvas, gfx::RectF(gfx_rect), flags, - pipeline_metadata_.video_decoder_config.video_rotation(), context_3d, - context_support); + pipeline_metadata_.video_decoder_config.video_rotation(), context_3d); } bool WebMediaPlayerImpl::DidGetOpaqueResponseFromServiceWorker() const { @@ -1241,15 +1238,13 @@ } Context3D context_3d; - gpu::ContextSupport* context_support = nullptr; if (context_provider_) { context_3d = Context3D(context_provider_->ContextGL(), context_provider_->GrContext()); - context_support = context_provider_->ContextSupport(); } return video_renderer_.CopyVideoFrameTexturesToGLTexture( - context_3d, context_support, gl, video_frame.get(), target, texture, - internal_format, format, type, level, premultiply_alpha, flip_y); + context_3d, gl, video_frame.get(), target, texture, internal_format, + format, type, level, premultiply_alpha, flip_y); } // static
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index ddb7827..0e653af 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -326,6 +326,8 @@ "format_utils.cc", "format_utils.h", "gpu_video_decode_accelerator_helpers.h", + "gpu_video_encode_accelerator_helpers.cc", + "gpu_video_encode_accelerator_helpers.h", "h264_decoder.cc", "h264_decoder.h", "h264_dpb.cc",
diff --git a/media/gpu/gpu_video_encode_accelerator_helpers.cc b/media/gpu/gpu_video_encode_accelerator_helpers.cc new file mode 100644 index 0000000..8c7ab30 --- /dev/null +++ b/media/gpu/gpu_video_encode_accelerator_helpers.cc
@@ -0,0 +1,70 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/gpu/gpu_video_encode_accelerator_helpers.h" + +#include <algorithm> + +#include "base/logging.h" + +namespace media { +namespace { +// The maximum size for output buffer, which is chosen empirically for +// 1080p video. +constexpr size_t kMaxBitstreamBufferSizeInBytes = 2 * 1024 * 1024; // 2MB + +// The mapping from resolution, bitrate, framerate to the bitstream buffer size. +struct BitstreamBufferSizeInfo { + int coded_size_area; + uint32_t bitrate_in_bps; + uint32_t framerate; + uint32_t buffer_size_in_bytes; +}; + +// The bitstream buffer size for each resolution. The table must be sorted in +// increasing order by the resolution. The value is decided by measuring the +// biggest buffer size, and then double the size as margin. (crbug.com/889739) +// TODO(akahuang): Measure the buffer size when we support 4K encoding. +constexpr BitstreamBufferSizeInfo kBitstreamBufferSizeTable[] = { + {320 * 180, 100000, 30, 15000}, + {640 * 360, 500000, 30, 52000}, + {1280 * 720, 1200000, 30, 110000}, + {1920 * 1080, 4000000, 30, 380000}, +}; + +} // namespace + +size_t GetEncodeBitstreamBufferSize(const gfx::Size& size, + uint32_t bitrate, + uint32_t framerate) { + DCHECK_NE(framerate, 0u); + for (auto& data : kBitstreamBufferSizeTable) { + if (size.GetArea() <= data.coded_size_area) { + // The buffer size is proportional to (bitrate / framerate), but linear + // interpolation for smaller ratio is not enough. Therefore we only use + // linear extrapolation for larger ratio. + double ratio = std::max( + 1.0f * (bitrate / framerate) / (data.bitrate_in_bps / data.framerate), + 1.0f); + return std::min(static_cast<size_t>(data.buffer_size_in_bytes * ratio), + kMaxBitstreamBufferSizeInBytes); + } + } + return kMaxBitstreamBufferSizeInBytes; +} + +// Get the maximum output bitstream buffer size. Because we don't change +// the buffer size when we update bitrate and framerate, we have to calculate +// the buffer size by the maximum bitrate. +// However, the maximum bitrate for intel chipset is 40Mbps. The buffer size +// calculated with this bitrate is always larger than 2MB. Therefore we just +// return the value. +// TODO(crbug.com/889739): Deprecate this function after we can update the +// buffer size while requesting new bitrate and framerate. +size_t GetEncodeBitstreamBufferSize() { + // GetEncodeBitstreamBufferSize(size, 40000000, 30) + return kMaxBitstreamBufferSizeInBytes; +} + +} // namespace media
diff --git a/media/gpu/gpu_video_encode_accelerator_helpers.h b/media/gpu/gpu_video_encode_accelerator_helpers.h new file mode 100644 index 0000000..3f754a3 --- /dev/null +++ b/media/gpu/gpu_video_encode_accelerator_helpers.h
@@ -0,0 +1,28 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_GPU_GPU_VIDEO_ENCODE_ACCELERATOR_HELPERS_H_ +#define MEDIA_GPU_GPU_VIDEO_ENCODE_ACCELERATOR_HELPERS_H_ + +#include "media/gpu/media_gpu_export.h" +#include "ui/gfx/geometry/size.h" + +namespace media { + +// Helper functions for VideoEncodeAccelerator implementations in GPU process. + +// Calculate the bitstream buffer size for VideoEncodeAccelerator. +// |size|: the resolution of video stream +// |bitrate|: the bit rate in bps +// |framerate|: the frame rate in fps +MEDIA_GPU_EXPORT size_t GetEncodeBitstreamBufferSize(const gfx::Size& size, + uint32_t bitrate, + uint32_t framerate); + +// Get the maximum bitstream buffer size for VideoEncodeAccelerator. +MEDIA_GPU_EXPORT size_t GetEncodeBitstreamBufferSize(); + +} // namespace media + +#endif // MEDIA_GPU_GPU_VIDEO_ENCODE_ACCELERATOR_HELPERS_H_
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc index 407d72d..04e1376 100644 --- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -337,6 +337,7 @@ VLOGF(2); DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); DCHECK_EQ(decoder_state_, kAwaitingPictureBuffers); + DCHECK(output_queue_); if (IsDestroyPending()) return; @@ -1099,6 +1100,7 @@ // Try to get an available input buffer. if (!current_input_buffer_.IsValid()) { DCHECK(decoder_current_bitstream_buffer_ != NULL); + DCHECK(input_queue_); // See if we can get more free buffers from HW. if (input_queue_->FreeBuffersCount() == 0) @@ -1176,6 +1178,8 @@ DVLOGF(4); DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); DCHECK_NE(decoder_state_, kUninitialized); + DCHECK(input_queue_); + DCHECK(output_queue_); TRACE_EVENT0("media,gpu", "V4L2VDA::ServiceDeviceTask"); if (IsDestroyPending()) @@ -1262,6 +1266,8 @@ DVLOGF(4); DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); DCHECK_NE(decoder_state_, kUninitialized); + DCHECK(input_queue_); + DCHECK(output_queue_); TRACE_EVENT0("media,gpu", "V4L2VDA::Enqueue"); // Drain the pipe of completed decode buffers. @@ -1375,6 +1381,8 @@ DVLOGF(4); DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); DCHECK_NE(decoder_state_, kUninitialized); + DCHECK(input_queue_); + DCHECK(output_queue_); TRACE_EVENT0("media,gpu", "V4L2VDA::Dequeue"); while (input_queue_->QueuedBuffersCount() > 0) { @@ -1390,6 +1398,7 @@ bool V4L2VideoDecodeAccelerator::DequeueInputBuffer() { DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); + DCHECK(input_queue_); DCHECK_GT(input_queue_->QueuedBuffersCount(), 0u); // Dequeue a completed input (VIDEO_OUTPUT) buffer, and recycle to the free @@ -1409,6 +1418,7 @@ bool V4L2VideoDecodeAccelerator::DequeueOutputBuffer() { DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); + DCHECK(output_queue_); DCHECK_GT(output_queue_->QueuedBuffersCount(), 0u); DCHECK(output_queue_->IsStreaming()); @@ -1494,6 +1504,7 @@ } bool V4L2VideoDecodeAccelerator::EnqueueOutputRecord() { + DCHECK(output_queue_); V4L2WritableBufferRef buffer = output_queue_->GetFreeBuffer(); DCHECK(buffer.IsValid()); @@ -1630,6 +1641,7 @@ void V4L2VideoDecodeAccelerator::NotifyFlushDoneIfNeeded() { DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); + DCHECK(input_queue_); if (!decoder_flushing_) return; @@ -1902,7 +1914,7 @@ bool V4L2VideoDecodeAccelerator::StopOutputStream() { VLOGF(2); - if (!output_queue_->IsStreaming()) + if (!output_queue_ || !output_queue_->IsStreaming()) return true; if (!output_queue_->Streamoff()) { @@ -1928,7 +1940,7 @@ bool V4L2VideoDecodeAccelerator::StopInputStream() { VLOGF(2); - if (!input_queue_->IsStreaming()) + if (!input_queue_ || !input_queue_->IsStreaming()) return true; if (!input_queue_->Streamoff()) { @@ -2180,6 +2192,7 @@ DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); // We always run this as we prepare to initialize. DCHECK_EQ(decoder_state_, kInitialized); + DCHECK(input_queue_); if (input_queue_->AllocateBuffers(kInputBufferCount, V4L2_MEMORY_MMAP) == 0) { NOTIFY_ERROR(PLATFORM_FAILURE); @@ -2431,6 +2444,7 @@ VLOGF(2); DCHECK(decoder_state_ == kInitialized || decoder_state_ == kChangingResolution); + DCHECK(output_queue_); DCHECK(!output_queue_->IsStreaming()); DCHECK(output_buffer_map_.empty()); @@ -2480,6 +2494,9 @@ DCHECK(!decoder_thread_.IsRunning() || decoder_thread_.task_runner()->BelongsToCurrentThread()); + if (!input_queue_) + return; + input_queue_->DeallocateBuffers(); } @@ -2487,10 +2504,10 @@ VLOGF(2); DCHECK(!decoder_thread_.IsRunning() || decoder_thread_.task_runner()->BelongsToCurrentThread()); - DCHECK(!output_queue_->IsStreaming()); + DCHECK(!output_queue_ || !output_queue_->IsStreaming()); bool success = true; - if (output_buffer_map_.empty()) + if (!output_queue_ || output_buffer_map_.empty()) return true; // Release all buffers waiting for an import buffer event
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc index a8b91e9..5050f70c 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -26,6 +26,7 @@ #include "media/base/scopedfd_helper.h" #include "media/base/unaligned_shared_memory.h" #include "media/base/video_types.h" +#include "media/gpu/gpu_video_encode_accelerator_helpers.h" #include "media/gpu/v4l2/v4l2_image_processor.h" #include "media/video/h264_parser.h" @@ -1051,7 +1052,7 @@ DCHECK(!input_streamon_); DCHECK(!output_streamon_); - output_buffer_byte_size_ = kOutputBufferSize; + output_buffer_byte_size_ = GetEncodeBitstreamBufferSize(); struct v4l2_format format; memset(&format, 0, sizeof(format));
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h index 8c71a2be..abd3671 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
@@ -96,7 +96,6 @@ kInputBufferCount = 2, kOutputBufferCount = 2, kImageProcBufferCount = 2, - kOutputBufferSize = (2 * 1024 * 1024), }; // Internal state of the encoder.
diff --git a/media/gpu/vaapi/accelerated_video_encoder.cc b/media/gpu/vaapi/accelerated_video_encoder.cc index 2600cab0..107399c 100644 --- a/media/gpu/vaapi/accelerated_video_encoder.cc +++ b/media/gpu/vaapi/accelerated_video_encoder.cc
@@ -4,20 +4,12 @@ #include "media/gpu/vaapi/accelerated_video_encoder.h" -#include <algorithm> - #include "media/base/video_frame.h" +#include "media/gpu/gpu_video_encode_accelerator_helpers.h" #include "media/video/video_encode_accelerator.h" namespace media { -namespace { -// The maximum size for bitstream buffer, which is chosen empirically for the -// video smaller than 1080p. -// TODO(akahuang): Refactor it when we support 4K encoding. -constexpr size_t kMaxBitstreamBufferSizeInBytes = 2 * 1024 * 1024; // 2MB -} // namespace - AcceleratedVideoEncoder::EncodeJob::EncodeJob( scoped_refptr<VideoFrame> input_frame, bool keyframe, @@ -64,11 +56,7 @@ } size_t AcceleratedVideoEncoder::GetBitstreamBufferSize() const { - // The buffer size of uncompressed stream is a feasible estimation of the - // output buffer size. However, the estimation is loose in high resolution. - // Therefore we set an empirical upper bound. - size_t uncompressed_buffer_size = GetCodedSize().GetArea() * 3 / 2; - return std::min(uncompressed_buffer_size, kMaxBitstreamBufferSizeInBytes); + return GetEncodeBitstreamBufferSize(); } } // namespace media
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 3a181ba1..8d12b5f 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -14,7 +14,6 @@ #include "cc/paint/paint_image.h" #include "cc/paint/paint_image_builder.h" #include "gpu/GLES2/gl2extchromium.h" -#include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/common/capabilities.h" #include "gpu/command_buffer/common/mailbox_holder.h" @@ -276,35 +275,6 @@ } } -void OnQueryDone(scoped_refptr<VideoFrame> video_frame, - gpu::gles2::GLES2Interface* gl, - unsigned query_id) { - gl->DeleteQueriesEXT(1, &query_id); - // |video_frame| is dropped here. -} - -void SynchronizeVideoFrameRead(scoped_refptr<VideoFrame> video_frame, - gpu::gles2::GLES2Interface* gl, - gpu::ContextSupport* context_support) { - DCHECK(gl); - DCHECK(context_support); - - SyncTokenClientImpl client(gl); - video_frame->UpdateReleaseSyncToken(&client); - - if (video_frame->metadata()->IsTrue( - VideoFrameMetadata::READ_LOCK_FENCES_ENABLED)) { - // |video_frame| must be kept alive during read operations. - unsigned query_id = 0; - gl->GenQueriesEXT(1, &query_id); - DCHECK(query_id); - gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id); - gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); - context_support->SignalQuery( - query_id, base::BindOnce(&OnQueryDone, video_frame, gl, query_id)); - } -} - } // anonymous namespace // Generates an RGB image from a VideoFrame. Convert YUV to RGB plain on GPU. @@ -446,8 +416,7 @@ const gfx::RectF& dest_rect, cc::PaintFlags& flags, VideoRotation video_rotation, - const Context3D& context_3d, - gpu::ContextSupport* context_support) { + const Context3D& context_3d) { DCHECK(thread_checker_.CalledOnValidThread()); if (flags.getAlpha() == 0) { return; @@ -540,23 +509,22 @@ canvas->flush(); if (video_frame->HasTextures()) { - // Synchronize |video_frame| with the read operations in UpdateLastImage(), - // which are triggered by canvas->flush(). - SynchronizeVideoFrameRead(video_frame, gl, context_support); + DCHECK(gl); + SyncTokenClientImpl client(gl); + video_frame->UpdateReleaseSyncToken(&client); } } void PaintCanvasVideoRenderer::Copy( const scoped_refptr<VideoFrame>& video_frame, cc::PaintCanvas* canvas, - const Context3D& context_3d, - gpu::ContextSupport* context_support) { + const Context3D& context_3d) { cc::PaintFlags flags; flags.setBlendMode(SkBlendMode::kSrc); flags.setFilterQuality(kLow_SkFilterQuality); Paint(video_frame, canvas, gfx::RectF(gfx::SizeF(video_frame->visible_rect().size())), flags, - media::VIDEO_ROTATION_0, context_3d, context_support); + media::VIDEO_ROTATION_0, context_3d); } namespace { @@ -933,14 +901,14 @@ target, texture, internal_format, format, type, level, premultiply_alpha, flip_y); gl->DeleteTextures(1, &source_texture); - gl->ShallowFlushCHROMIUM(); - // The caller must call SynchronizeVideoFrameRead() after this operation, but - // we can't do that because we don't have the ContextSupport. + gl->Flush(); + + SyncTokenClientImpl client(gl); + video_frame->UpdateReleaseSyncToken(&client); } bool PaintCanvasVideoRenderer::CopyVideoFrameTexturesToGLTexture( const Context3D& context_3d, - gpu::ContextSupport* context_support, gpu::gles2::GLES2Interface* destination_gl, const scoped_refptr<VideoFrame>& video_frame, unsigned int target, @@ -954,9 +922,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(video_frame); DCHECK(video_frame->HasTextures()); - if (video_frame->NumTextures() > 1 || - video_frame->metadata()->IsTrue( - VideoFrameMetadata::READ_LOCK_FENCES_ENABLED)) { + if (video_frame->NumTextures() > 1) { if (!context_3d.gr_context) return false; if (!UpdateLastImage(video_frame, context_3d)) @@ -970,11 +936,7 @@ if (!backend_texture.getGLTextureInfo(&texture_info)) return false; - // Synchronize |video_frame| with the read operations in UpdateLastImage(), - // which are triggered by getBackendTexture(). gpu::gles2::GLES2Interface* canvas_gl = context_3d.gl; - SynchronizeVideoFrameRead(video_frame, canvas_gl, context_support); - gpu::MailboxHolder mailbox_holder; mailbox_holder.texture_target = texture_info.fTarget; canvas_gl->ProduceTextureDirectCHROMIUM(texture_info.fID, @@ -1002,6 +964,9 @@ gpu::SyncToken dest_sync_token; destination_gl->GenUnverifiedSyncTokenCHROMIUM(dest_sync_token.GetData()); canvas_gl->WaitSyncTokenCHROMIUM(dest_sync_token.GetConstData()); + + SyncTokenClientImpl client(canvas_gl); + video_frame->UpdateReleaseSyncToken(&client); } else { CopyVideoFrameSingleTextureToGLTexture( destination_gl, video_frame.get(), target, texture, internal_format, @@ -1243,9 +1208,8 @@ return false; last_id_ = video_frame->unique_id(); } - - DCHECK(last_image_); last_image_deleting_timer_.Reset(); + DCHECK(!!last_image_); return true; }
diff --git a/media/renderers/paint_canvas_video_renderer.h b/media/renderers/paint_canvas_video_renderer.h index d4752f3..d732111 100644 --- a/media/renderers/paint_canvas_video_renderer.h +++ b/media/renderers/paint_canvas_video_renderer.h
@@ -29,7 +29,6 @@ namespace gpu { struct Capabilities; -class ContextSupport; } namespace media { @@ -40,29 +39,25 @@ PaintCanvasVideoRenderer(); ~PaintCanvasVideoRenderer(); - // Paints |video_frame| translated and scaled to |dest_rect| on |canvas|. - // + // Paints |video_frame| on |canvas|, scaling and rotating the result to fit + // dimensions specified by |dest_rect|. // If the format of |video_frame| is PIXEL_FORMAT_NATIVE_TEXTURE, |context_3d| - // and |context_support| must be provided. + // must be provided. // - // If |video_frame| is nullptr or an unsupported format, |dest_rect| will be - // painted black. + // Black will be painted on |canvas| if |video_frame| is null. void Paint(const scoped_refptr<VideoFrame>& video_frame, cc::PaintCanvas* canvas, const gfx::RectF& dest_rect, cc::PaintFlags& flags, VideoRotation video_rotation, - const Context3D& context_3d, - gpu::ContextSupport* context_support); + const Context3D& context_3d); - // Paints |video_frame| scaled to its visible size on |canvas|. - // + // Copy |video_frame| on |canvas|. // If the format of |video_frame| is PIXEL_FORMAT_NATIVE_TEXTURE, |context_3d| - // and |context_support| must be provided. + // must be provided. void Copy(const scoped_refptr<VideoFrame>& video_frame, cc::PaintCanvas* canvas, - const Context3D& context_3d, - gpu::ContextSupport* context_support); + const Context3D& context_3d); // Convert the contents of |video_frame| to raw RGB pixels. |rgb_pixels| // should point into a buffer large enough to hold as many 32 bit RGBA pixels @@ -87,12 +82,15 @@ bool premultiply_alpha, bool flip_y); - // Copy the contents of |video_frame| to |texture| of |destination_gl|. - // + // Copy the contents of texture of |video_frame| to texture |texture| in + // context |destination_gl|. + // |level|, |internal_format|, |type| specify target texture |texture|. // The format of |video_frame| must be VideoFrame::NATIVE_TEXTURE. + // |context_3d| has a GrContext that may be used during the copy. + // CorrectLastImageDimensions() ensures that the source texture will be + // cropped to |visible_rect|. Returns true on success. bool CopyVideoFrameTexturesToGLTexture( const Context3D& context_3d, - gpu::ContextSupport* context_support, gpu::gles2::GLES2Interface* destination_gl, const scoped_refptr<VideoFrame>& video_frame, unsigned int target, @@ -170,6 +168,8 @@ // never be painted again, so we can release the resource. void ResetCache(); + void CorrectLastImageDimensions(const SkIRect& visible_rect); + // Used for unit test. SkISize LastImageDimensionsForTesting(); @@ -179,8 +179,6 @@ bool UpdateLastImage(const scoped_refptr<VideoFrame>& video_frame, const Context3D& context_3d); - void CorrectLastImageDimensions(const SkIRect& visible_rect); - // Last image used to draw to the canvas. cc::PaintImage last_image_;
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc index bd321305..3bca993 100644 --- a/media/renderers/paint_canvas_video_renderer_unittest.cc +++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -225,7 +225,7 @@ cc::PaintFlags flags; flags.setFilterQuality(kLow_SkFilterQuality); renderer_.Paint(nullptr, canvas, kNaturalRect, flags, VIDEO_ROTATION_0, - Context3D(), nullptr); + Context3D()); } void PaintCanvasVideoRendererTest::Paint( @@ -260,13 +260,13 @@ flags.setBlendMode(mode); flags.setFilterQuality(kLow_SkFilterQuality); renderer_.Paint(video_frame, canvas, dest_rect, flags, video_rotation, - Context3D(), nullptr); + Context3D()); } void PaintCanvasVideoRendererTest::Copy( const scoped_refptr<VideoFrame>& video_frame, cc::PaintCanvas* canvas) { - renderer_.Copy(video_frame, canvas, Context3D(), nullptr); + renderer_.Copy(video_frame, canvas, Context3D()); } TEST_F(PaintCanvasVideoRendererTest, NoFrame) { @@ -564,7 +564,7 @@ flags.setFilterQuality(kNone_SkFilterQuality); renderer_.Paint(video_frame, &canvas, gfx::RectF(bitmap.width(), bitmap.height()), flags, - VIDEO_ROTATION_0, Context3D(), nullptr); + VIDEO_ROTATION_0, Context3D()); for (int j = 0; j < bitmap.height(); j++) { for (int i = 0; i < bitmap.width(); i++) { const int value = i + j * bitmap.width(); @@ -657,32 +657,43 @@ cc::PaintFlags flags; flags.setFilterQuality(kLow_SkFilterQuality); renderer_.Paint(video_frame, &canvas, kNaturalRect, flags, VIDEO_ROTATION_90, - context_3d, nullptr); + context_3d); } void EmptyCallback(const gpu::SyncToken& sync_token) {} TEST_F(PaintCanvasVideoRendererTest, CorrectFrameSizeToVisibleRect) { - constexpr int fWidth{16}, fHeight{16}; + int fWidth{16}, fHeight{16}; SkImageInfo imInfo = SkImageInfo::MakeN32(fWidth, fHeight, kOpaque_SkAlphaType); - cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); + sk_sp<const GrGLInterface> glInterface(GrGLCreateNullInterface()); + sk_sp<GrContext> grContext = GrContext::MakeGL(std::move(glInterface)); + sk_sp<SkSurface> surface = + SkSurface::MakeRenderTarget(grContext.get(), SkBudgeted::kYes, imInfo); + cc::SkiaPaintCanvas canvas(surface->getCanvas()); + + TestGLES2Interface gles2; + Context3D context_3d(&gles2, grContext.get()); gfx::Size coded_size(fWidth, fHeight); gfx::Size visible_size(fWidth / 2, fHeight / 2); - uint8_t memory[fWidth * fHeight * 2] = {0}; + gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes]; + for (size_t i = 0; i < VideoFrame::kMaxPlanes; i++) { + mailbox_holders[i] = gpu::MailboxHolder( + gpu::Mailbox::Generate(), gpu::SyncToken(), GL_TEXTURE_RECTANGLE_ARB); + } - auto video_frame = media::VideoFrame::WrapExternalData( - media::PIXEL_FORMAT_Y16, coded_size, gfx::Rect(visible_size), - visible_size, &memory[0], fWidth * fHeight * 2, + auto video_frame = VideoFrame::WrapNativeTextures( + PIXEL_FORMAT_I420, mailbox_holders, base::Bind(EmptyCallback), coded_size, + gfx::Rect(visible_size), visible_size, base::TimeDelta::FromMilliseconds(4)); gfx::RectF visible_rect(visible_size.width(), visible_size.height()); cc::PaintFlags flags; renderer_.Paint(video_frame, &canvas, visible_rect, flags, VIDEO_ROTATION_0, - Context3D(), nullptr); + context_3d); EXPECT_EQ(fWidth / 2, renderer_.LastImageDimensionsForTesting().width()); EXPECT_EQ(fWidth / 2, renderer_.LastImageDimensionsForTesting().height());
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index 5b4abce..952c9a7 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -866,7 +866,7 @@ // This is software path, so canvas and video_frame are always backed // by software. - video_renderer_->Copy(video_frame, &canvas, Context3D(), nullptr); + video_renderer_->Copy(video_frame, &canvas, Context3D()); } else { HardwarePlaneResource* hardware_resource = plane_resource->AsHardware(); size_t bytes_per_row = viz::ResourceSizes::CheckedWidthInBytes<size_t>(
diff --git a/media/webrtc/audio_processor.cc b/media/webrtc/audio_processor.cc index 7a1e4d6..71bd74e 100644 --- a/media/webrtc/audio_processor.cc +++ b/media/webrtc/audio_processor.cc
@@ -129,7 +129,8 @@ void AudioProcessor::UpdateInternalStats() { if (audio_processing_) - echo_information_.UpdateAecStats(audio_processing_->echo_cancellation()); + echo_information_.UpdateAecStats( + audio_processing_->GetStatistics(has_reverse_stream_)); } void AudioProcessor::GetStats(GetStatsCB callback) { @@ -250,22 +251,6 @@ // Audio processing module construction. audio_processing_ = base::WrapUnique(ap_builder.Create(ap_config)); - // AEC setup part 2. - switch (settings_.echo_cancellation) { - case EchoCancellationType::kSystemAec: - case EchoCancellationType::kDisabled: - break; - case EchoCancellationType::kAec2: - case EchoCancellationType::kAec3: - int err = audio_processing_->echo_cancellation()->set_suppression_level( - webrtc::EchoCancellation::kHighSuppression); - err |= audio_processing_->echo_cancellation()->enable_metrics(true); - err |= audio_processing_->echo_cancellation()->enable_delay_logging(true); - err |= audio_processing_->echo_cancellation()->Enable(true); - DCHECK_EQ(err, 0); - break; - } - // Noise suppression setup part 2. if (settings_.noise_suppression != NoiseSuppressionType::kDisabled) { int err = audio_processing_->noise_suppression()->set_level( @@ -302,8 +287,7 @@ webrtc::AudioProcessing::Config apm_config = audio_processing_->GetConfig(); - // AEC setup part 3. - // New-fangled echo cancellation setup. (see: https://bugs.webrtc.org/9535). + // AEC setup part 2. apm_config.echo_canceller.enabled = settings_.echo_cancellation == EchoCancellationType::kAec2 || settings_.echo_cancellation == EchoCancellationType::kAec3;
diff --git a/media/webrtc/audio_processor_unittest.cc b/media/webrtc/audio_processor_unittest.cc index 6a4f0b9..b9b70daf 100644 --- a/media/webrtc/audio_processor_unittest.cc +++ b/media/webrtc/audio_processor_unittest.cc
@@ -105,7 +105,7 @@ // |audio_processor| does nothing when the audio processing is off in // the processor. webrtc::AudioProcessing* ap = audio_processor->audio_processing_.get(); - const bool is_aec_enabled = ap && ap->echo_cancellation()->is_enabled(); + const bool is_aec_enabled = ap && ap->GetConfig().echo_canceller.enabled; if (is_aec_enabled) { if (params.channels() > kMaxNumberOfPlayoutDataChannels) { for (int i = 0; i < kMaxNumberOfPlayoutDataChannels; ++i) { @@ -128,12 +128,9 @@ void VerifyEnabledComponents(AudioProcessor* audio_processor) { webrtc::AudioProcessing* audio_processing = audio_processor->audio_processing_.get(); - EXPECT_TRUE(audio_processing->echo_cancellation()->is_enabled()); - EXPECT_TRUE(audio_processing->echo_cancellation()->suppression_level() == - webrtc::EchoCancellation::kHighSuppression); - EXPECT_TRUE(audio_processing->echo_cancellation()->are_metrics_enabled()); - EXPECT_TRUE( - audio_processing->echo_cancellation()->is_delay_logging_enabled()); + webrtc::AudioProcessing::Config ap_config = audio_processing->GetConfig(); + EXPECT_TRUE(ap_config.echo_canceller.enabled); + EXPECT_FALSE(ap_config.echo_canceller.mobile_mode); EXPECT_TRUE(audio_processing->noise_suppression()->is_enabled()); EXPECT_TRUE(audio_processing->noise_suppression()->level() ==
diff --git a/media/webrtc/echo_information.cc b/media/webrtc/echo_information.cc index 3cf9ed0f..b5a3fb2 100644 --- a/media/webrtc/echo_information.cc +++ b/media/webrtc/echo_information.cc
@@ -9,44 +9,8 @@ namespace media { -namespace { - -// Used to log echo quality based on delay estimates. -enum DelayBasedEchoQuality { - DELAY_BASED_ECHO_QUALITY_GOOD = 0, - DELAY_BASED_ECHO_QUALITY_SPURIOUS, - DELAY_BASED_ECHO_QUALITY_BAD, - DELAY_BASED_ECHO_QUALITY_INVALID, - DELAY_BASED_ECHO_QUALITY_MAX = DELAY_BASED_ECHO_QUALITY_INVALID -}; - -DelayBasedEchoQuality EchoDelayFrequencyToQuality(float delay_frequency) { - const float kEchoDelayFrequencyLowerLimit = 0.1f; - const float kEchoDelayFrequencyUpperLimit = 0.8f; - // DELAY_BASED_ECHO_QUALITY_GOOD - // delay is out of bounds during at most 10 % of the time. - // DELAY_BASED_ECHO_QUALITY_SPURIOUS - // delay is out of bounds 10-80 % of the time. - // DELAY_BASED_ECHO_QUALITY_BAD - // delay is mostly out of bounds >= 80 % of the time. - // DELAY_BASED_ECHO_QUALITY_INVALID - // delay_frequency is negative which happens if we have insufficient data. - if (delay_frequency < 0) - return DELAY_BASED_ECHO_QUALITY_INVALID; - else if (delay_frequency <= kEchoDelayFrequencyLowerLimit) - return DELAY_BASED_ECHO_QUALITY_GOOD; - else if (delay_frequency < kEchoDelayFrequencyUpperLimit) - return DELAY_BASED_ECHO_QUALITY_SPURIOUS; - else - return DELAY_BASED_ECHO_QUALITY_BAD; -} - -} // namespace - EchoInformation::EchoInformation() - : delay_stats_time_ms_(0), - echo_frames_received_(false), - divergent_filter_stats_time_ms_(0), + : divergent_filter_stats_time_ms_(0), num_divergent_filter_fraction_(0), num_non_zero_divergent_filter_fraction_(0) {} @@ -56,84 +20,29 @@ } void EchoInformation::UpdateAecStats( - webrtc::EchoCancellation* echo_cancellation) { + const webrtc::AudioProcessingStats& audio_processing_stats) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (!echo_cancellation->is_enabled()) - return; - - UpdateAecDelayStats(echo_cancellation); - UpdateAecDivergentFilterStats(echo_cancellation); -} - -void EchoInformation::UpdateAecDelayStats( - webrtc::EchoCancellation* echo_cancellation) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - // Only start collecting stats if we know echo cancellation has measured an - // echo. Otherwise we clutter the stats with for example cases where only the - // microphone is used. - if (!echo_frames_received_ & !echo_cancellation->stream_has_echo()) - return; - - echo_frames_received_ = true; - - // In WebRTC, three echo delay metrics are calculated and updated every - // five seconds. We use one of them, |fraction_poor_delays| to log in a UMA - // histogram an Echo Cancellation quality metric. The stat in WebRTC has a - // fixed aggregation window of five seconds, so we use the same query - // frequency to avoid logging old values. - if (!echo_cancellation->is_delay_logging_enabled()) - return; - - delay_stats_time_ms_ += webrtc::AudioProcessing::kChunkSizeMs; - if (delay_stats_time_ms_ < - 500 * webrtc::AudioProcessing::kChunkSizeMs) { // 5 seconds + if (!audio_processing_stats.divergent_filter_fraction) { return; } - int dummy_median = 0, dummy_std = 0; - float fraction_poor_delays = 0; - if (echo_cancellation->GetDelayMetrics(&dummy_median, &dummy_std, - &fraction_poor_delays) == - webrtc::AudioProcessing::kNoError) { - delay_stats_time_ms_ = 0; - // Map |fraction_poor_delays| to an Echo Cancellation quality and log in UMA - // histogram. See DelayBasedEchoQuality for information on histogram - // buckets. - UMA_HISTOGRAM_ENUMERATION("WebRTC.AecDelayBasedQuality", - EchoDelayFrequencyToQuality(fraction_poor_delays), - DELAY_BASED_ECHO_QUALITY_MAX + 1); - } -} - -void EchoInformation::UpdateAecDivergentFilterStats( - webrtc::EchoCancellation* echo_cancellation) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - if (!echo_cancellation->are_metrics_enabled()) - return; - divergent_filter_stats_time_ms_ += webrtc::AudioProcessing::kChunkSizeMs; if (divergent_filter_stats_time_ms_ < 100 * webrtc::AudioProcessing::kChunkSizeMs) { // 1 second return; } - webrtc::EchoCancellation::Metrics metrics; - if (echo_cancellation->GetMetrics(&metrics) == - webrtc::AudioProcessing::kNoError) { - // If not yet calculated, |metrics.divergent_filter_fraction| is -1.0. After - // being calculated the first time, it is updated periodically. - if (metrics.divergent_filter_fraction < 0.0f) { - DCHECK_EQ(num_divergent_filter_fraction_, 0); - return; - } - if (metrics.divergent_filter_fraction > 0.0f) { - ++num_non_zero_divergent_filter_fraction_; - } - } else { - DLOG(WARNING) << "Get echo cancellation metrics failed."; + double divergent_filter_fraction = + *audio_processing_stats.divergent_filter_fraction; + // If not yet calculated, |metrics.divergent_filter_fraction| is -1.0. After + // being calculated the first time, it is updated periodically. + if (divergent_filter_fraction < 0.0f) { + DCHECK_EQ(num_divergent_filter_fraction_, 0); + return; + } + if (divergent_filter_fraction > 0.0f) { + ++num_non_zero_divergent_filter_fraction_; } ++num_divergent_filter_fraction_; divergent_filter_stats_time_ms_ = 0;
diff --git a/media/webrtc/echo_information.h b/media/webrtc/echo_information.h index c69f2cf..49460bf 100644 --- a/media/webrtc/echo_information.h +++ b/media/webrtc/echo_information.h
@@ -11,32 +11,24 @@ namespace media { -// A helper class to log echo information in general and Echo Cancellation +// A helper class to log echo information in general and AEC2 // quality in particular. class COMPONENT_EXPORT(MEDIA_WEBRTC) EchoInformation { public: EchoInformation(); virtual ~EchoInformation(); - // Updates stats, and reports delay metrics as UMA stats every 5 seconds. + // Updates stats, and reports metrics as UMA stats every 5 seconds. // Must be called every time AudioProcessing::ProcessStream() is called. - void UpdateAecStats(webrtc::EchoCancellation* echo_cancellation); + void UpdateAecStats( + const webrtc::AudioProcessingStats& audio_processing_stats); // Reports AEC divergent filter metrics as UMA and resets the associated data. void ReportAndResetAecDivergentFilterStats(); private: - void UpdateAecDelayStats(webrtc::EchoCancellation* echo_cancellation); - void UpdateAecDivergentFilterStats( - webrtc::EchoCancellation* echo_cancellation); - - // Counter to track 5 seconds of data in order to query a new metric from - // webrtc::EchoCancellation::GetEchoDelayMetrics(). - int delay_stats_time_ms_; - bool echo_frames_received_; - - // Counter to track 1 second of data in order to query a new divergent filter - // fraction metric from webrtc::EchoCancellation::GetMetrics(). + // Counter to store a new value for the divergent filter fraction metric in + // AEC2, once every second. int divergent_filter_stats_time_ms_; // Total number of times we queried for the divergent filter fraction metric.
diff --git a/services/ws/drag_drop_delegate_unittest.cc b/services/ws/drag_drop_delegate_unittest.cc index f8d1084..1c52bf2 100644 --- a/services/ws/drag_drop_delegate_unittest.cc +++ b/services/ws/drag_drop_delegate_unittest.cc
@@ -26,15 +26,6 @@ #include "ui/wm/core/default_screen_position_client.h" #include "url/gurl.h" -namespace ui { - -// An equal-to operator to make EXPECT_EQ happy. -bool operator==(const FileInfo& info1, const FileInfo& info2) { - return info1.path == info2.path && info1.display_name == info2.display_name; -} - -} // namespace ui - namespace ws { class DragDropDelegateTest : public testing::Test {
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 3199ff3..0dc358d 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -155,6 +155,11 @@ #define SK_SUPPORT_LEGACY_TILED_BITMAPS #endif +// remove after rebaselining svg layout tests +#ifndef SK_SUPPORT_LEGACY_SVG_ARC_TO +#define SK_SUPPORT_LEGACY_SVG_ARC_TO +#endif + // Max. verb count for paths rendered by the edge-AA tessellating path renderer. #define GR_AA_TESSELLATOR_MAX_VERB_COUNT 100
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 0643ebab..54ca084c2 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -249,9 +249,6 @@ crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-2j.html [ Failure ] -crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ] -crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-percentage.html [ Failure ] -crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-inline-sizing/svg-inline.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrack/addCue.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrack/removeCue.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime.html [ Pass ] @@ -455,7 +452,6 @@ crbug.com/591099 paint/invalidation/position/relayout-fixed-position-after-scale.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Failure ] crbug.com/591099 paint/invalidation/svg/animated-path-inside-transformed-html.xhtml [ Failure Pass ] -crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Failure ] crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ] crbug.com/591099 paint/invalidation/table/table-extra-bottom-grow.html [ Failure ] crbug.com/591099 paint/invalidation/table/table-two-pass-layout-overpaint.html [ Failure ] @@ -464,10 +460,7 @@ crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ] crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Pass ] crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass ] -crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ] -crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ] crbug.com/591099 svg/hixie/error/013.xml [ Failure ] -crbug.com/591099 svg/in-html/sizing/svg-inline.html [ Failure ] crbug.com/591099 svg/transforms/svg-css-transforms.xhtml [ Failure ] crbug.com/591099 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ] crbug.com/591099 svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 2eb709a..f0a93dc 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -306,9 +306,7 @@ crbug.com/880802 external/wpt/css/css-contain/contain-paint-021.html [ Failure ] crbug.com/882367 external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure ] crbug.com/882367 external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure ] -crbug.com/855263 external/wpt/css/css-contain/contain-size-breaks-001.html [ Failure ] crbug.com/855261 external/wpt/css/css-contain/contain-size-grid-002.html [ Failure ] -crbug.com/855263 external/wpt/css/css-contain/contain-size-monolithic-001.html [ Failure ] crbug.com/863454 external/wpt/css/css-contain/contain-size-multicol-001.html [ Failure ] crbug.com/869296 external/wpt/css/css-contain/contain-style-counters-004.html [ Failure ] crbug.com/882383 external/wpt/css/css-contain/counter-scoping-001.html [ Failure ] @@ -318,11 +316,9 @@ crbug.com/882385 external/wpt/css/css-contain/quote-scoping-002.html [ Failure ] crbug.com/882385 external/wpt/css/css-contain/quote-scoping-003.html [ Failure ] crbug.com/882385 external/wpt/css/css-contain/quote-scoping-004.html [ Failure ] -crbug.com/882322 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-002.html [ Failure ] crbug.com/881057 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-003.html [ Failure ] crbug.com/881057 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-004.html [ Failure ] crbug.com/881057 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-005.html [ Failure ] -crbug.com/882322 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-006.html [ Failure ] crbug.com/880802 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Failure ] crbug.com/881057 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-stacking-context-001b.html [ Failure ] crbug.com/882333 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-001.html [ Failure ] @@ -2287,9 +2283,6 @@ crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/xssAuditor/cached-frame.html [ Failure ] crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/xssAuditor/chunked-big-script.html [ Failure ] -# Part of a larger issue referenced in the bug. This specific issue will be fixed shortly. -crbug.com/408159 accessibility/is-ignored-change-sends-notification.html [ Timeout ] - # When drawing subpixel smoothed glyphs, CoreGraphics will fake bold the glyphs. # In this configuration, the pixel smoothed glyphs will be created from subpixel smoothed glyphs. # This means that CoreGraphics may draw outside the reported glyph bounds, and in this case does. @@ -3423,9 +3416,6 @@ crbug.com/626703 [ Android Win ] external/wpt/css/css-fonts/font-kerning-02.html [ Failure ] crbug.com/626703 external/wpt/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm [ Failure ] crbug.com/626703 external/wpt/2dcontext/building-paths/canvas_complexshapes_beziercurveto_001.htm [ Failure ] -crbug.com/626703 external/wpt/beacon/beacon-cors.sub.window.html [ Timeout ] -crbug.com/626703 external/wpt/beacon/beacon-navigate.html [ Timeout ] -crbug.com/626703 external/wpt/beacon/beacon-redirect.window.html [ Timeout ] crbug.com/626703 external/wpt/compat/webkit-text-fill-color-property-005.html [ Failure ] crbug.com/626703 external/wpt/css/CSS2/text/text-decoration-va-length-001.xht [ Failure ] crbug.com/626703 external/wpt/css/CSS2/text/text-decoration-va-length-002.xht [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-relations-should-ignore-hidden-targets.html b/third_party/WebKit/LayoutTests/accessibility/aria-relations-should-ignore-hidden-targets.html index a5be151..1932d72 100644 --- a/third_party/WebKit/LayoutTests/accessibility/aria-relations-should-ignore-hidden-targets.html +++ b/third_party/WebKit/LayoutTests/accessibility/aria-relations-should-ignore-hidden-targets.html
@@ -19,16 +19,28 @@ var axTab = accessibilityController.accessibleElementById('tab'); var panel = document.getElementById('panel'); var axPanel = accessibilityController.accessibleElementById('panel'); - assert_equals(axTab.ariaControlsElementAtIndex(0), axPanel); + assert_not_equals(axPanel, undefined, + 'axPanel not undefined, Initial state'); + assert_equals(axTab.ariaControlsElementAtIndex(0), axPanel, + 'Initial state'); + panel.style.display = 'none'; - assert_not_equals(axTab.ariaControlsElementAtIndex(0), axPanel); + assert_not_equals(axPanel, undefined, + 'axPanel not undefined, display: none'); + assert_not_equals(axTab.ariaControlsElementAtIndex(0), axPanel, + 'display: none'); // Restore the "display" attribute and test with "visibility". panel.style.display = 'initial'; axPanel = accessibilityController.accessibleElementById('panel'); - assert_equals(axTab.ariaControlsElementAtIndex(0), axPanel); + assert_not_equals(axPanel, undefined, + 'axPanel not undefined, display: initial'); + assert_equals(axTab.ariaControlsElementAtIndex(0), axPanel, + 'display: initial'); + panel.style.visibility = 'hidden'; - assert_not_equals(axTab.ariaControlsElementAtIndex(0), axPanel); + assert_equals(axTab.ariaControlsElementAtIndex(0), undefined, + 'visibility: hidden'); }, 'aria-controls should ignore hidden targets.'); </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification-expected.txt b/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification-expected.txt index 2f88f06..138cb54a 100644 --- a/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification-expected.txt
@@ -7,23 +7,17 @@ PASS accessibleElementById('hiddenDiv') != null is false PASS accessibleElementById('invisibleDivContainer') != null is true PASS accessibleElementById('invisibleDiv') != null is false -PASS accessibleElementById('emptyDivContainer') != null is true -PASS accessibleElementById('emptyDiv') != null is false +PASS accessibleElementById('emptyDiv') != null is true PASS accessibleElementById('divWithoutRoleContainer') != null is true -PASS accessibleElementById('divWithoutRole') != null is false -PASS accessibleElementById('divWithoutLabelContainer') != null is true -PASS accessibleElementById('divWithoutLabel') != null is false Got ChildrenChanged notification on hiddenDivContainer PASS accessibleElementById('hiddenDivContainer').childrenCount is 1 Got ChildrenChanged notification on invisibleDivContainer PASS accessibleElementById('invisibleDivContainer').childrenCount is 1 -Got ChildrenChanged notification on emptyDivContainer -PASS accessibleElementById('emptyDivContainer').childrenCount is 1 +Got ChildrenChanged notification on emptyDiv +PASS accessibleElementById('emptyDiv').childrenCount is 1 Got ChildrenChanged notification on divWithoutRoleContainer PASS accessibleElementById('divWithoutRoleContainer').childrenCount is 1 -Got ChildrenChanged notification on divWithoutLabelContainer -PASS accessibleElementById('divWithoutLabelContainer').childrenCount is 1 All notifications received successfully. PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification.html b/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification.html index cecba83..9614b39 100644 --- a/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification.html +++ b/third_party/WebKit/LayoutTests/accessibility/is-ignored-change-sends-notification.html
@@ -6,7 +6,6 @@ <body> <div id="container"> - <div id="hiddenDivContainer" aria-label="hiddenDivContainer"> <div id="hiddenDiv" hidden> <div> @@ -35,14 +34,6 @@ </div> </div> - <div id="divWithoutLabelContainer" aria-label="divWithoutLabelContainer"> - <div id="divWithoutLabel"> - <div> - <button>Button</button> - </div> - </div> - </div> - </div> <div id="console"></div> @@ -51,24 +42,30 @@ window.jsTestIsAsync = true; if (window.testRunner && window.accessibilityController) { + window.setTimeout(finishJSTest, 1000); testRunner.dumpAsText(); function accessibleElementById(id) { return accessibilityController.accessibleElementById(id); } - window.successCount = 0; - function gotSuccessfulNotification() { - successCount++; - if (successCount != 5) + + window.pendingSuccesses = new Set([ + 'hiddenDivContainer', + 'invisibleDivContainer', + 'emptyDiv', + 'divWithoutRoleContainer', + ]); + + function gotSuccessfulNotification(id) { + if (!pendingSuccesses.has(id)) + debug('Unexpected notification for ' + id); + pendingSuccesses.delete(id); + accessibleElementById(id).removeNotificationListener(); + if (pendingSuccesses.size !== 0) return; debug('All notifications received successfully.'); - accessibleElementById('hiddenDivContainer').removeNotificationListener(); - accessibleElementById('invisibleDivContainer').removeNotificationListener(); - accessibleElementById('emptyDivContainer').removeNotificationListener(); - accessibleElementById('divWithoutRoleContainer').removeNotificationListener(); - accessibleElementById('divWithoutLabelContainer').removeNotificationListener(); document.getElementById('container').hidden = true; finishJSTest(); } @@ -78,7 +75,7 @@ accessibleElementById('hiddenDivContainer').addNotificationListener(function(notification) { debug('Got ' + notification + ' notification on hiddenDivContainer'); shouldBe("accessibleElementById('hiddenDivContainer').childrenCount", "1"); - gotSuccessfulNotification(); + gotSuccessfulNotification('hiddenDivContainer'); }); document.getElementById('hiddenDiv').hidden = false; @@ -87,42 +84,30 @@ accessibleElementById('invisibleDivContainer').addNotificationListener(function(notification) { debug('Got ' + notification + ' notification on invisibleDivContainer'); shouldBe("accessibleElementById('invisibleDivContainer').childrenCount", "1"); - gotSuccessfulNotification(); + gotSuccessfulNotification('invisibleDivContainer'); }); document.getElementById('invisibleDiv').style.visibility = 'visible'; - shouldBeTrue("accessibleElementById('emptyDivContainer') != null"); - shouldBeFalse("accessibleElementById('emptyDiv') != null"); - accessibleElementById('emptyDivContainer').addNotificationListener(function(notification) { - debug('Got ' + notification + ' notification on emptyDivContainer'); - shouldBe("accessibleElementById('emptyDivContainer').childrenCount", "1"); - gotSuccessfulNotification(); + shouldBeTrue("accessibleElementById('emptyDiv') != null"); + accessibleElementById('emptyDiv').addNotificationListener(function(notification) { + debug('Got ' + notification + ' notification on emptyDiv'); + shouldBe("accessibleElementById('emptyDiv').childrenCount", "1"); + gotSuccessfulNotification('emptyDiv'); }); document.getElementById('emptyDiv').innerText = 'Not empty anymore.'; document.getElementById('emptyDiv').offsetLeft; shouldBeTrue("accessibleElementById('divWithoutRoleContainer') != null"); - shouldBeFalse("accessibleElementById('divWithoutRole') != null"); accessibleElementById('divWithoutRoleContainer').addNotificationListener(function(notification) { debug('Got ' + notification + ' notification on divWithoutRoleContainer'); shouldBe("accessibleElementById('divWithoutRoleContainer').childrenCount", "1"); - gotSuccessfulNotification(); + gotSuccessfulNotification('divWithoutRoleContainer'); }); document.getElementById('divWithoutRole').setAttribute('role', 'heading'); - shouldBeTrue("accessibleElementById('divWithoutLabelContainer') != null"); - shouldBeFalse("accessibleElementById('divWithoutLabel') != null"); - accessibleElementById('divWithoutLabelContainer').addNotificationListener(function(notification) { - debug('Got ' + notification + ' notification on divWithoutLabelContainer'); - shouldBe("accessibleElementById('divWithoutLabelContainer').childrenCount", "1"); - gotSuccessfulNotification(); - }); - document.getElementById('divWithoutLabel').setAttribute('aria-label', 'Label'); - debug(''); } - </script> </body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/role-change.html b/third_party/WebKit/LayoutTests/accessibility/role-change.html index 09738208..8d9b14a 100644 --- a/third_party/WebKit/LayoutTests/accessibility/role-change.html +++ b/third_party/WebKit/LayoutTests/accessibility/role-change.html
@@ -70,9 +70,11 @@ test(function(t) { assert_equals(axElementById('opt1').role, "AXRole: AXListBoxOption"); + assert_equals(axElementById('select1').role, "AXRole: AXListBox"); // Change @size to "1" document.getElementById('select1').setAttribute('size', '1'); + assert_equals(axElementById('select1').role, 'AXRole: AXPopUpButton'); assert_equals(axElementById('opt1').role, 'AXRole: AXMenuListOption'); // Change @size back to "2"
diff --git a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt index eae10b4..8ba497f 100644 --- a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt
@@ -12,7 +12,7 @@ PASS axElement('control4').nameElementAtIndex(0).isEqual(axElement('label4')) is true PASS label4Element.parentElement.removeChild(label4Element); hasTitleUIElement(axElement('control4')) is false PASS hasTitleUIElement(axElement('control5')) is false -PASS reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').nameElementAtIndex(0) != null is true +PASS reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); document.body.offsetTop; axElement('control5').nameElementAtIndex(0) != null is true PASS axElement('control5').nameElementAtIndex(0).isEqual(axElement('label5')) is true PASS axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b')) is true PASS newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6a')) is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html index c0ebfd7c..1bdfb16 100644 --- a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html +++ b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html
@@ -95,7 +95,7 @@ // Test label that gets a control reparented into it. shouldBe("hasTitleUIElement(axElement('control5'))", "false"); - shouldBe("reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').nameElementAtIndex(0) != null", "true"); + shouldBe("reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); document.body.offsetTop; axElement('control5').nameElementAtIndex(0) != null", "true"); shouldBe("axElement('control5').nameElementAtIndex(0).isEqual(axElement('label5'))", "true"); // Make sure the first label is returned, even as labels are added and removed.
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json index 7bcf562b..b6c5e90 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
@@ -163467,51 +163467,6 @@ {} ] ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.worker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask.any-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask.any.worker-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/microtask-queuing/queue-microtask.window-expected.txt": [ - [ - {} - ] - ], "html/webappapis/scripting/event-loops/OWNERS": [ [ {} @@ -167612,16 +167567,6 @@ {} ] ], - "payment-request/PaymentMethodChangeEvent/methodDetails-attribute.https-expected.txt": [ - [ - {} - ] - ], - "payment-request/PaymentMethodChangeEvent/methodName-attribute.https-expected.txt": [ - [ - {} - ] - ], "payment-request/allowpaymentrequest/common.sub.js": [ [ {} @@ -167667,11 +167612,6 @@ {} ] ], - "payment-request/onpaymentmenthodchange-attribute.https-expected.txt": [ - [ - {} - ] - ], "payment-request/payment-request-abort-method.https-expected.txt": [ [ {} @@ -175847,11 +175787,6 @@ {} ] ], - "svg/types/scripted/event-handler-all-document-element-events-expected.txt": [ - [ - {} - ] - ], "svg/types/scripted/resources/SVGLengthList-helper.js": [ [ {} @@ -220818,11 +220753,15 @@ "fetch/api/redirect/redirect-count.any.js": [ [ "/fetch/api/redirect/redirect-count.any.html", - {} + { + "timeout": "long" + } ], [ "/fetch/api/redirect/redirect-count.any.worker.html", - {} + { + "timeout": "long" + } ] ], "fetch/api/redirect/redirect-empty-location.any.js": [ @@ -261371,6 +261310,12 @@ {} ] ], + "shadow-dom/slots-outside-shadow-dom.html": [ + [ + "/shadow-dom/slots-outside-shadow-dom.html", + {} + ] + ], "shadow-dom/slots.html": [ [ "/shadow-dom/slots.html", @@ -373685,7 +373630,7 @@ "testharness" ], "fetch/api/redirect/redirect-count.any.js": [ - "7fa6dd1d0ed5579cc66c16297a61a57cbadd1c74", + "0c45d8d87ce44e0ebdde4d10d974681384d47c09", "testharness" ], "fetch/api/redirect/redirect-empty-location-expected.txt": [ @@ -379805,7 +379750,7 @@ "testharness" ], "html/dom/interfaces.https_exclude=(Document_Window_HTML._)-expected.txt": [ - "264a2913dfa4eb9e3fc0b392b32f1a97dad0fec6", + "9a0eccc5ebc1bd9647b34eee8f35c681044471fa", "support" ], "html/dom/interfaces.https_include=(Document_Window)-expected.txt": [ @@ -379813,7 +379758,7 @@ "support" ], "html/dom/interfaces.https_include=HTML._-expected.txt": [ - "26e4d070813d10a05d6561fede341a2cbd1f46e3", + "e1b19c2071a7cd48b50a96c9d8ab156d546b209a", "support" ], "html/dom/interfaces.worker-expected.txt": [ @@ -394256,50 +394201,14 @@ "4e7c649f4533958112e6bd1dd59537619d7cc62d", "testharness" ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any-expected.txt": [ - "177eb925f125aded411077eb2bed26c877a20888", - "support" - ], "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.js": [ "01f32ac9ba14962fa99d4b263a8ca0f5a0daa161", "testharness" ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.serviceworker-expected.txt": [ - "177eb925f125aded411077eb2bed26c877a20888", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.sharedworker-expected.txt": [ - "177eb925f125aded411077eb2bed26c877a20888", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask-exceptions.any.worker-expected.txt": [ - "177eb925f125aded411077eb2bed26c877a20888", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask.any-expected.txt": [ - "d3c518a8ef01c01c99a43207025eff11b293c1d0", - "support" - ], "html/webappapis/microtask-queuing/queue-microtask.any.js": [ "b39931719a88ad525511d8f8745a9b752a6a6465", "testharness" ], - "html/webappapis/microtask-queuing/queue-microtask.any.serviceworker-expected.txt": [ - "d3c518a8ef01c01c99a43207025eff11b293c1d0", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask.any.sharedworker-expected.txt": [ - "d3c518a8ef01c01c99a43207025eff11b293c1d0", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask.any.worker-expected.txt": [ - "d3c518a8ef01c01c99a43207025eff11b293c1d0", - "support" - ], - "html/webappapis/microtask-queuing/queue-microtask.window-expected.txt": [ - "ea23e1e6e01715027a8ccb130991d89f49d88a32", - "support" - ], "html/webappapis/microtask-queuing/queue-microtask.window.js": [ "78cdcfc5d989a81882a10b7d70050408aadfe924", "testharness" @@ -395869,7 +395778,7 @@ "support" ], "interfaces/payment-request.idl": [ - "d930b57291e5301e4056d30192726023e9306512", + "843c66107b34bbb90aa64411487a09b2fa95e508", "support" ], "interfaces/performance-timeline.idl": [ @@ -407728,18 +407637,10 @@ "dc62a83f597a0b53c686689fb8f549130982242a", "testharness" ], - "payment-request/PaymentMethodChangeEvent/methodDetails-attribute.https-expected.txt": [ - "bc231cde6b20c732dd5a82cb9dc8ced8a50d3e05", - "support" - ], "payment-request/PaymentMethodChangeEvent/methodDetails-attribute.https.html": [ "ec0aa96dddb46b26617064ab54e9d02e2a588cbb", "testharness" ], - "payment-request/PaymentMethodChangeEvent/methodName-attribute.https-expected.txt": [ - "88f65651bf464d864b9e5b4230366dc5793d22af", - "support" - ], "payment-request/PaymentMethodChangeEvent/methodName-attribute.https.html": [ "176638c7852f6f0f8fd7a8c3dfefdf439a829d22", "testharness" @@ -407869,7 +407770,7 @@ "testharness" ], "payment-request/idlharness.https.window-expected.txt": [ - "a0fa47231190dcfd67e8f8ba9dbf37be2a4923ad", + "ba43028cdf0a38e727b631d03fba8e5e789b004c", "support" ], "payment-request/idlharness.https.window.js": [ @@ -407888,10 +407789,6 @@ "c0ed23167ed9378ec32e769bd4f3e3afaef5040c", "testharness" ], - "payment-request/onpaymentmenthodchange-attribute.https-expected.txt": [ - "5caf91078d2c795b953addbd8dbe0b488d473156", - "support" - ], "payment-request/onpaymentmenthodchange-attribute.https.html": [ "0484eb868f983e3cdb0efceab5fe2b3c6084b4ab", "testharness" @@ -419621,7 +419518,7 @@ "testharness" ], "service-workers/service-worker/claim-worker-fetch.https.html": [ - "c2c254ca65c36aea942a8a77bd630f2a66dcf982", + "4b49a8152a42c9e45104139b46b9fa56762de6bb", "testharness" ], "service-workers/service-worker/client-id.https.html": [ @@ -422052,6 +421949,10 @@ "e705e18f4a9747d0ffffe0909bfa4d85bd8f7ad4", "testharness" ], + "shadow-dom/slots-outside-shadow-dom.html": [ + "a6fa2b27f760d1daf6e7390c6e582108b035e57e", + "testharness" + ], "shadow-dom/slots.html": [ "948d389298f46cc906fa998c8b495ad55bd50a1a", "testharness" @@ -424972,10 +424873,6 @@ "c81a23394468f2e4d586d4e6ece5be713470d485", "testharness" ], - "svg/types/scripted/event-handler-all-document-element-events-expected.txt": [ - "e60970b4aef00fee4caf0b06585df71d6f903281", - "support" - ], "svg/types/scripted/event-handler-all-document-element-events.svg": [ "fa813dd1dd31987d2792aaa14a5f7ea996a8054d", "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-common.sub.js b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-common.sub.js index 0a36283..ae2f169 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-common.sub.js +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-common.sub.js
@@ -138,33 +138,23 @@ // Schedules async_test's for each of the test cases, treating them as a single session, // and wires up the continueAfterSendingBeacon() and waitForResults() calls. // The method looks for several "extension" functions in the global scope: -// - self.buildId: if present, can change the display name of a test. // - self.buildBaseUrl: if present, can change the base URL of a beacon target URL (this // is the scheme, hostname, and port). // - self.buildTargetUrl: if present, can modify a beacon target URL (for example wrap it). // Parameters: // testCases: An array of test cases. -function runTests(testCases) { - var session = initSession(testCases); +// sendData [optional]: A function that sends the beacon. +function runTests(testCases, sendData = self.sendData) { + const session = initSession(testCases); testCases.forEach(function(testCase, testIndex) { // Make a copy of the test case as we'll be storing some metadata on it, // such as which session it belongs to. - var testCaseCopy = Object.assign({ session: session }, testCase); + const testCaseCopy = Object.assign({ session: session }, testCase); - // Extension point: generate the test id. - var testId = testCase.id; - if (self.buildId) { - testId = self.buildId(testId); - } - testCaseCopy.origId = testCaseCopy.id; - testCaseCopy.id = testId; testCaseCopy.index = testIndex; - session.add(testCaseCopy); - - // Schedule the sendbeacon in an async test. - async_test(function(test) { + async_test((test) => { // Save the testharness.js 'test' object, so that we only have one object // to pass around. testCaseCopy.test = test; @@ -174,22 +164,15 @@ if (self.buildBaseUrl) { baseUrl = self.buildBaseUrl(baseUrl); } - var targetUrl = `${baseUrl}/beacon/resources/beacon.py?cmd=store&sid=${session.id}&tid=${testId}&tidx=${testIndex}`; + var targetUrl = `${baseUrl}/beacon/resources/beacon.py?cmd=store&sid=${session.id}&tid=${testCaseCopy.id}&tidx=${testIndex}`; if (self.buildTargetUrl) { targetUrl = self.buildTargetUrl(targetUrl); } // Attach the URL to the test object for debugging purposes. testCaseCopy.url = targetUrl; - // Extension point: send the beacon immediately, or defer. - var sendFunc = test.step_func(function sendImmediately(testCase) { - var sendResult = sendData(testCase); - continueAfterSendingBeacon(sendResult, testCase); - }); - if (self.sendFunc) { - sendFunc = test.step_func(self.sendFunc); - } - sendFunc(testCaseCopy); + assert_true(sendData(testCaseCopy), 'sendBeacon should succeed'); + waitForResult(testCaseCopy).then(() => test.done(), test.step_func((e) => {throw e;})); }, `Verify 'navigator.sendbeacon()' successfully sends for variant: ${testCaseCopy.id}`); }); } @@ -201,161 +184,54 @@ // the test. // Returns the result of the 'sendbeacon()' function call, true or false. function sendData(testCase) { - var sent = false; - if (testCase.data) { - sent = self.navigator.sendBeacon(testCase.url, testCase.data); - } else { - sent = self.navigator.sendBeacon(testCase.url) - } - return sent; + return self.navigator.sendBeacon(testCase.url, testCase.data); } -// Continues a single test after the beacon has been sent for that test. -// Will trigger waitForResults() for the session if this is the last test -// in the session to send its beacon. -// Assumption: will be called on the test's step_func so that assert's do -// not have to be wrapped. -function continueAfterSendingBeacon(sendResult, testCase) { - var session = testCase.session; +// Poll the server for the test result. +async function waitForResult(testCase) { + const session = testCase.session; + const index = testCase.index; + const url = `resources/beacon.py?cmd=stat&sid=${session.id}&tidx_min=${index}&tidx_max=${index}`; + for (let i = 0; i < 30; ++i) { + const response = await fetch(url); + const text = await response.text(); + const results = JSON.parse(text); - // Recaclulate the sent vs. total counts. - if (sendResult) { - session.sentCount++; - } else { - session.totalCount--; - } - - // If this was the last test in the session to send its beacon, start polling for results. - // Note that we start polling even if just one test in the session sends successfully, - // so that if any of the others fail, we still get results from the tests that did send. - if (session.sentCount == session.totalCount) { - // Exit the current test's execution context in order to run the poll - // loop from the harness context. - step_timeout(waitForResults.bind(this, session), 0); - } - - // Now fail this test if the beacon did not send. It will be excluded from the poll - // loop because of the calculation adjustment above. - assert_true(sendResult, "'sendbeacon' function call must succeed"); -} - -// Kicks off an asynchronous monitor to poll the server for test results. As we -// verify that the server has received and validated a beacon, we will complete -// its testharness test. -function waitForResults(session) { - // Poll for status until all of the results come in. - fetch(`resources/beacon.py?cmd=stat&sid=${session.id}&tidx_min=0&tidx_max=${session.totalCount-1}`).then( - function(response) { - // Parse as text(), not json(), so that we can log the raw response if - // it's invalid. - response.text().then(function(rawResponse) { - // Check that we got a response we expect and know how to handle. - var results; - var failure; - try { - results = JSON.parse(rawResponse); - - if (results.length === undefined) { - failure = `bad validation response schema: rawResponse='${rawResponse}'`; - } - } catch (e) { - failure = `bad validation response: rawResponse='${rawResponse}', got parse error '${e}'`; - } - - if (failure) { - // At this point we can't deterministically get results for all of the - // tests in the session, so fail the entire session. - failSession(session, failure); - return; - } - - // The 'stat' call will return an array of zero or more results - // of sendbeacon() calls that the server has received and validated. - results.forEach(function(result) { - var testCase = session.testCaseLookup[result.id]; - - // While stash.take on the server is supposed to honor read-once, since we're - // polling so frequently it is possible that we will receive the same test result - // more than once. - if (!testCase.done) { - testCase.done = true; - session.doneCount++; - } - - // Validate that the sendbeacon() was actually sent to the server. - var test = testCase.test; - test.step(function() { - // null JSON values parse as null, not undefined - assert_equals(result.error, null, "'sendbeacon' data must not fail validation"); - }); - - test.done(); - }); - - // Continue polling until all of the results come in. - if (session.doneCount < session.sentCount) { - // testharness.js frowns upon the use of explicit timeouts, but there is no way - // around the need to poll for these tests, and there is no use spamming the server - // with requestAnimationFrame() just to avoid the use of step_timeout. - step_timeout(waitForResults.bind(this, session), 100); - } - }).catch(function(error) { - failSession(session, `unexpected error reading response, error='${error}'`); - }); + if (results.length === 0) { + await new Promise(resolve => step_timeout(resolve, 100)); + continue; } - ); -} - -// Fails all of the tests in the session, meant to be called when an infrastructural -// issue prevents us from deterministically completing the individual tests. -function failSession(session, reason) { - session.testCases.forEach(function(testCase) { - var test = testCase.test; - test.unreached_func(reason)(); - }); + assert_equals(results.length, 1, `bad response: '${text}'`);; + // null JSON values parse as null, not undefined + assert_equals(results[0].error, null, "'sendbeacon' data must not fail validation"); + return; + } + assert_true(false, 'timeout'); } // Creates an iframe on the document's body and runs the sample tests from the iframe. // The iframe is navigated immediately after it sends the data, and the window verifies // that the data is still successfully sent. -// funcName: "beacon" to send the data via navigator.sendBeacon(), -// "fetch" to send the data via fetch() with the keepalive flag. -function runSendInIframeAndNavigateTests(funcName) { +function runSendInIframeAndNavigateTests() { var iframe = document.createElement("iframe"); iframe.id = "iframe"; iframe.onload = function() { - var tests = Array(); - // Clear our onload handler to prevent re-running the tests as we navigate away. - this.onload = null; - - // Implement the self.buildId extension to identify the parameterized - // test in the report. - self.buildId = function(baseId) { - return `${baseId}-${funcName}-NAVIGATE`; - }; - - window.onmessage = function(e) { - // The iframe will execute sendData() for us and return the result. - var testCase = tests[e.data]; - continueAfterSendingBeacon(true /* sendResult */, testCase); - }; - - // Implement the self.sendFunc extension to send the beacon indirectly, - // from an iFrame that we can then navigate. - self.sendFunc = function(testCase) { - var iframeWindow = document.getElementById("iframe").contentWindow; - // We run into problems passing the testCase over the document boundary, - // because of structured cloning constraints. Instead we'll send over the - // test case id, and the iFrame can load the static test case by including - // beacon-common.js. - tests[testCase.origId] = testCase; - iframeWindow.postMessage([testCase.origId, testCase.url, funcName], "*"); - }; - - runTests(sampleTests); + iframe.onload = null; + function sendData(testCase) { + return iframe.contentWindow.navigator.sendBeacon(testCase.url, testCase.data); + } + const tests = []; + for (const test of sampleTests) { + const copy = Object.assign({}, test); + copy.id = `${test.id}-NAVIGATE`; + tests.push(copy); + } + runTests(tests, sendData); + // Now navigate ourselves. + iframe.contentWindow.location = "http://{{host}}:{{ports[http][0]}}/"; }; - iframe.src = "navigate.iFrame.sub.html"; + iframe.srcdoc = '<html></html>'; document.body.appendChild(iframe); }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window-expected.txt new file mode 100644 index 0000000..7d9f711 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NoData-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NullData-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: UndefinedData-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallString-CORS-ALLOW +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBlob-CORS-ALLOW Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBufferSource-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallFormData-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeEncoded-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeForm-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeText-CORS-ALLOW +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NoData-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NullData-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: UndefinedData-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallString-CORS-FORBID +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBlob-CORS-FORBID Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBufferSource-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallFormData-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeEncoded-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeForm-CORS-FORBID +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeText-CORS-FORBID +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallCORSContentTypeText-PREFLIGHT-ALLOW Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window.js b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window.js index f4bccf1..411cd1c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-cors.sub.window.js
@@ -7,12 +7,6 @@ // the beacon handler will return CORS headers. This test ensures that the // sendBeacon() succeeds in either case. [true, false].forEach(function(allowCors) { - // Implement the self.buildId extension to identify the parameterized - // test in the report. - self.buildId = function(baseId) { - return `${baseId}-${allowCors ? "CORS-ALLOW" : "CORS-FORBID"}`; - }; - // Implement the self.buildBaseUrl and self.buildTargetUrl extensions // to change the target URL to use a cross-origin domain name. self.buildBaseUrl = function(baseUrl) { @@ -35,7 +29,13 @@ return allowCors ? `${targetUrl}&origin=http://{{host}}:{{ports[http][0]}}&credentials=true` : targetUrl; } - runTests(sampleTests); + const tests = []; + for (const test of sampleTests) { + const copy = Object.assign({}, test); + copy.id = `${test.id}-${allowCors ? "CORS-ALLOW" : "CORS-FORBID"}`; + tests.push(copy); + } + runTests(tests); }); // Now test a cross-origin request that doesn't use a safelisted Content-Type and ensure @@ -43,12 +43,6 @@ // header is used there should be a preflight/options request and we should only succeed // send the payload if the proper CORS headers are used. { - // Implement the self.buildId extension to identify the parameterized - // test in the report. - self.buildId = function (baseId) { - return `${baseId}-PREFLIGHT-ALLOW`; - }; - // Implement the self.buildBaseUrl and self.buildTargetUrl extensions // to change the target URL to use a cross-origin domain name. self.buildBaseUrl = function (baseUrl) { @@ -60,8 +54,13 @@ self.buildTargetUrl = function (targetUrl) { return `${targetUrl}&origin=http://{{host}}:{{ports[http][0]}}&credentials=true&preflightExpected=true`; } - - runTests(preflightTests); + const tests = []; + for (const test of preflightTests) { + const copy = Object.assign({}, test); + copy.id = `${test.id}-PREFLIGHT-ALLOW`; + tests.push(copy); + } + runTests(tests); } -done(); \ No newline at end of file +done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-navigate-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-navigate-expected.txt new file mode 100644 index 0000000..36c8b10 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-navigate-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NoData-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NullData-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: UndefinedData-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallString-NAVIGATE +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBlob-NAVIGATE Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBufferSource-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallFormData-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeEncoded-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeForm-NAVIGATE +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeText-NAVIGATE +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window-expected.txt new file mode 100644 index 0000000..e38d0c2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window-expected.txt
@@ -0,0 +1,23 @@ +This is a testharness.js-based test. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NoData-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NullData-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: UndefinedData-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallString-307 +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBlob-307 Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBufferSource-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallFormData-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeEncoded-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeForm-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeText-307 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NoData-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: NullData-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: UndefinedData-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallString-308 +FAIL Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBlob-308 Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details. +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallBufferSource-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallFormData-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeEncoded-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeForm-308 +PASS Verify 'navigator.sendbeacon()' successfully sends for variant: SmallSafeContentTypeText-308 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window.js b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window.js index 659759b..53f229a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/beacon/beacon-redirect.window.js
@@ -7,19 +7,18 @@ // Note that status codes 307 and 308 are the only codes that will maintain POST data // through a redirect. [307, 308].forEach(function(status) { - // Implement the self.buildId extension to identify the parameterized - // test in the report. - self.buildId = function(baseId) { - return `${baseId}-${status}`; - }; - // Implement the self.buildTargetUrl extension to inject a redirect to // the sendBeacon target. self.buildTargetUrl = function(targetUrl) { return `/common/redirect.py?status=${status}&location=${encodeURIComponent(targetUrl)}`; }; - - runTests(sampleTests); + const tests = []; + for (const test of sampleTests) { + const copy = Object.assign({}, test); + copy.id = `${test.id}-${status}`; + tests.push(copy); + } + runTests(tests); }); done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/beacon/navigate.iFrame.sub.html b/third_party/WebKit/LayoutTests/external/wpt/beacon/navigate.iFrame.sub.html deleted file mode 100644 index f4c7846..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/beacon/navigate.iFrame.sub.html +++ /dev/null
@@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon As Fetch (Fetch KeepAlive) Navigate Test</title> -</head> -<body> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - - // An array should be passed through postMessage to this iFrame, where - // [0] contains a test case id as defined in beacon-common.js. - // [1] is the URL for the keep alive fetch() or sendBeacon(). - // [2] string indicating the function to call - "fetch" to call fetch() or "beacon" to call sendBeacon(). - // The testcase id is returned back to the window through postMesage. - var tests = 0; - window.onmessage = function(e) { - var testCaseId = e.data[0]; - var url = e.data[1]; - var func = e.data[2]; - tests++; - - // Reconstruct enough of the test case to send the keep alive fetch (data and url). - var testCase = testLookup[testCaseId]; - testCase.url = url; - - if (func === "beacon") { - // sendData calls sendBeacon - sendData(testCase); - } - else { - throw new Error(func + " is an invalid function"); - } - - // Let the main page continue the test if we don't immediately throw an exception. - parent.postMessage(testCaseId, "*"); - - // Now navigate ourselves. - if (tests == sampleTests.length) { - window.location = "http://{{host}}:{{ports[http][0]}}/"; - } - } - </script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/redirect/redirect-count.any.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/redirect/redirect-count.any.js index 7fa6dd1..0c45d8d8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/redirect/redirect-count.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/redirect/redirect-count.any.js
@@ -1,5 +1,6 @@ // META: script=../resources/utils.js // META: script=/common/utils.js +// META: timeout=long function redirectCount(desc, redirectUrl, redirectLocation, redirectStatus, maxCount, shouldPass) { var uuid_token = token();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/form-margin-quirk-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/form-margin-quirk-expected.txt deleted file mode 100644 index e2ee2f7..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/form-margin-quirk-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL form margin quirk assert_equals: marginRight expected "16px" but got "0px" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl index d930b57..843c661 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl
@@ -49,7 +49,7 @@ DOMString error; PaymentItem total; AddressErrors shippingAddressErrors; - PayerErrorFields payerErrors; + PayerErrors payerErrors; object paymentMethodErrors; }; @@ -169,13 +169,13 @@ }; dictionary PaymentValidationErrors { - PayerErrorFields payer; + PayerErrors payer; AddressErrors shippingAddress; DOMString error; object paymentMethod; }; -dictionary PayerErrorFields { +dictionary PayerErrors { DOMString email; DOMString name; DOMString phone;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/claim-worker-fetch.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/claim-worker-fetch.https.html index c2c254c..4b49a81 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/claim-worker-fetch.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/claim-worker-fetch.https.html
@@ -15,20 +15,22 @@ return runTest(t, 'resources/claim-nested-worker-fetch-iframe.html'); }, 'fetch() in nested Worker should be intercepted after the client is claimed.'); -var frame; -var registration; - function runTest(t, iframe_url) { var resource = 'simple.txt'; + var frame; + var registration; var worker; var scope = 'resources/'; var script = 'resources/claim-worker.js'; - const test_result = Promise.resolve() + return Promise.resolve() // Create the test iframe with a dedicated worker. .then(() => with_iframe(iframe_url)) - .then(f => frame = f) + .then(f => { + t.add_cleanup(() => f.remove()); + frame = f; + }) // Check the controller and test with fetch in the worker. .then(() => assert_equals(frame.contentWindow.navigator.controller, @@ -40,7 +42,10 @@ 'fetch() should not be intercepted.')) // Register a service worker. .then(() => service_worker_unregister_and_register(t, script, scope)) - .then(r => worker = r.installing) + .then(r => { + t.add_cleanup(() => r.unregister()); + worker = r.installing; + }) .then(() => wait_for_state(t, worker, 'activated')) // Let the service worker claim the iframe and the worker. @@ -69,18 +74,6 @@ assert_equals(response_text, 'Intercepted!', 'fetch() in the worker should be intercepted.')); - - // Cleanup this testcase. - return Promise.resolve() - .then(cleanup, cleanup) - .then(() => { return test_result; }); -} - -const cleanup = async () => { - if (registration) - await registration.unregister(); - if (frame) - frame.remove(); } </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/shadow-dom/slots-outside-shadow-dom.html b/third_party/WebKit/LayoutTests/external/wpt/shadow-dom/slots-outside-shadow-dom.html new file mode 100644 index 0000000..a6fa2b2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/shadow-dom/slots-outside-shadow-dom.html
@@ -0,0 +1,16 @@ +<!doctype html> +<meta charset=utf-8> +<title></title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="host1"><slot>foo</slot></div> +<script> + +test(() => { + var host1 = document.getElementById("host1"); + var sr = host1.attachShadow({mode: "open"}); + sr.innerHTML = "<slot></slot>"; + assert_array_equals(sr.firstChild.assignedNodes({ flatten: true }), [host1.firstChild]); +}, "Light DOM slot element should be in flattened assignedNodes"); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCIceTransport-extension.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCIceTransport-extension.https.html index c01883f..5adee9f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCIceTransport-extension.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCIceTransport-extension.https.html
@@ -15,6 +15,12 @@ // makeIceTransport // makeGatherAndStartTwoIceTransports +function makeIceTransport(t) { + const iceTransport = new RTCIceTransport(); + t.add_cleanup(() => iceTransport.stop()); + return iceTransport; +} + test(() => { const iceTransport = new RTCIceTransport(); }, 'RTCIceTransport constructor does not throw'); @@ -254,49 +260,4 @@ ]); }, 'Two RTCIceTransports connect to each other'); -promise_test(async t => { - async function waitForConnectedThenSelectedCandidatePairChange(t, transport, - transportName) { - const watcher = new EventWatcher(t, localTransport, - [ 'statechange', 'selectedcandidatepairchange' ]); - await watcher.wait_for('statechange'); - assert_equals(transport.state, 'connected', - `${transportName} state should be 'connected'`); - await watcher.wait_for('selectedcandidatepairchange'); - const selectedCandidatePair = transport.getSelectedCandidatePair(); - assert_not_equals(selectedCandidatePair, null, - `${transportName} selected candidate pair should not be null once ` + - 'the selectedcandidatepairchange event fires'); - assert_true( - transport.getLocalCandidates().some( - ({ candidate }) => - candidate === selectedCandidatePair.local.candidate), - `${transportName} selected candidate pair local should be in the ` + - 'list of local candidates'); - assert_true( - transport.getRemoteCandidates().some( - ({ candidate }) => - candidate === selectedCandidatePair.remote.candidate), - `${transportName} selected candidate pair local should be in the ` + - 'list of remote candidates'); - } - const [ localTransport, remoteTransport ] = - makeGatherAndStartTwoIceTransports(t); - await Promise.all([ - waitForConnectedThenSelectedCandidatePairChange(t, localTransport, - 'local transport'), - waitForConnectedThenSelectedCandidatePairChange(t, remoteTransport, - 'remote transport'), - ]); -}, 'Selected candidate pair changes once the RTCIceTransports connect.'); - -promise_test(async t => { - const [ transport, ] = makeGatherAndStartTwoIceTransports(t); - const watcher = new EventWatcher(t, transport, 'selectedcandidatepairchange'); - await watcher.wait_for('selectedcandidatepairchange'); - transport.stop(); - assert_equals(transport.getSelectedCandidatePair(), null); -}, 'getSelectedCandidatePair() returns null once the RTCIceTransport is ' + - 'stopped.'); - </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt index 2730fbb3..32d6255 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt
@@ -338,7 +338,7 @@ PASS RTCIceTransport interface: operation getRemoteParameters() PASS RTCIceTransport interface: attribute onstatechange PASS RTCIceTransport interface: attribute ongatheringstatechange -PASS RTCIceTransport interface: attribute onselectedcandidatepairchange +FAIL RTCIceTransport interface: attribute onselectedcandidatepairchange assert_true: The prototype object must have a property "onselectedcandidatepairchange" expected true got false FAIL RTCIceTransport must be primary interface of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click-expected.txt new file mode 100644 index 0000000..7ef72d2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click-expected.txt
@@ -0,0 +1,8 @@ +PASS autoscroll started +Mouse cursor shape: type=SouthPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click.html index c0a644a..eb8ad4e 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-click.html
@@ -1,31 +1,32 @@ -<!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> -<script src="./resources/middleClickAutoscroll.js"></script> +<html> +<head> <style type="text/css"> #scrollable { - height: 200px; - overflow: auto; - border: solid 3px #cc0000; - font-size: 80px; + height: 200px; + overflow: auto; + border: solid 3px #cc0000; + font-size: 80px; } </style> +<script src="../../resources/js-test.js"></script> +<script src="./resources/middleClickAutoscroll.js"></script> <script> -function start() { - testSetUp({ - 'clickOrDrag': 'click', - 'scrollable': $('scrollable'), - }); +function start() +{ + description('Check pan scroll by click mouse'); + testPanScroll({ + 'clickOrDrag': 'click', + 'scrollable': $('scrollable'), + }); } </script> - +</head> <body onload="start()"> <div id="container"> <p id="description"></p> -For manual testing, click middle button in scrollable and move around mouse pointer for scrolling, then click middle button again to stop scrolling. +For manual testing, hold middle button in scrollable and move aroudn mouse pointer for scrolling, then release middle button to stop scrolling. <div id="scrollable"></div> </div> <div id="console"></div> </body> - +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag-expected.txt new file mode 100644 index 0000000..7ef72d2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag-expected.txt
@@ -0,0 +1,8 @@ +PASS autoscroll started +Mouse cursor shape: type=SouthPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag.html index bce49ae5..0ef958f 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-drag.html
@@ -1,25 +1,26 @@ -<!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> -<script src="./resources/middleClickAutoscroll.js"></script> +<html> +<head> <style type="text/css"> #scrollable { - height: 200px; - overflow: auto; - border: solid 3px #cc0000; - font-size: 80px; + height: 200px; + overflow: auto; + border: solid 3px #cc0000; + font-size: 80px; } </style> +<script src="../../resources/js-test.js"></script> +<script src="./resources/middleClickAutoscroll.js"></script> <script> -function start() { - testSetUp({ - 'clickOrDrag': 'drag', - 'scrollable': $('scrollable'), - }); +function start() +{ + description('Check pan scroll by drag mouse'); + testPanScroll({ + 'clickOrDrag': 'drag', + 'scrollable': $('scrollable'), + }); } </script> - +</head> <body onload="start()"> <div id="container"> <p id="description"></p> @@ -28,3 +29,4 @@ </div> <div id="console"></div> </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired-expected.txt new file mode 100644 index 0000000..7ef72d2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired-expected.txt
@@ -0,0 +1,8 @@ +PASS autoscroll started +Mouse cursor shape: type=SouthPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired.html index 243c5c9..bd6b9eb 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-event-fired.html
@@ -1,32 +1,29 @@ -<!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> -<script src="./resources/middleClickAutoscroll.js"></script> +<html> +<head> <style type="text/css"> #scrollable { - height: 200px; - overflow: auto; - border: solid 3px #cc0000; - font-size: 80px; + height: 200px; + overflow: auto; + border: solid 3px #cc0000; + font-size: 80px; } </style> +<script src="../../resources/js-test.js"></script> +<script src="./resources/middleClickAutoscroll.js"></script> <script> -var mousedown_fired = false; window.addEventListener('mousedown', function(event) { - mousedown_fired = true; }); -function start() { - testSetUp({ - 'clickOrDrag': 'drag', - 'scrollable': $('scrollable'), - 'finishTest': function() { - assert_true(mousedown_fired); - }, - }); +function start() +{ + description('Check pan scroll with mousedown event handler'); + testPanScroll({ + 'clickOrDrag': 'drag', + 'scrollable': $('scrollable'), + }); } </script> +</head> <body onload="start()"> <div id="container"> <p id="description"></p> @@ -37,3 +34,4 @@ </div> <div id="console"></div> </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe-expected.txt new file mode 100644 index 0000000..7ef72d2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe-expected.txt
@@ -0,0 +1,8 @@ +PASS autoscroll started +Mouse cursor shape: type=SouthPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe.html index b79526c5..24996b0 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-in-iframe.html
@@ -1,29 +1,31 @@ -<!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> +<html> +<head> +<script src="../../resources/js-test.js"></script> <script src="./resources/middleClickAutoscroll.js"></script> <script> function start() { - var iframe = $('iframe'); - var offsetLeft = iframe.offsetLeft; - var offsetTop = iframe.offsetTop; - testSetUp({ - 'clickOrDrag': 'click', - 'endX': offsetLeft + 5, - 'endY': offsetTop + 50, - 'scrollable': iframe.contentDocument.body, - 'scrolledObject': iframe.contentWindow.document.scrollingElement, - 'startX': offsetLeft + 5, - 'startY': offsetTop + 5, - }); + description('Check pan scroll in iframe'); + var iframe = $('iframe'); + var offsetLeft = iframe.offsetLeft; + var offsetTop = iframe.offsetTop; + + testPanScroll({ + 'clickOrDrag': 'click', + 'endX': offsetLeft + 5, + 'endY': offsetTop + 50, + 'scrollable': iframe.contentDocument.body, + 'scrolledObject': iframe.contentWindow, + 'startX': offsetLeft + 5, + 'startY': offsetTop + 5, + }); } </script> - +</head> <body onload="start()"> <div id="container"> <p id="description"></p> <iframe id="iframe" width="640" height="100"></iframe> </div> </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-expected.txt new file mode 100644 index 0000000..7ef72d2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-expected.txt
@@ -0,0 +1,8 @@ +PASS autoscroll started +Mouse cursor shape: type=SouthPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden-expected.txt b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden-expected.txt new file mode 100644 index 0000000..8607ed0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden-expected.txt
@@ -0,0 +1,18 @@ +Top of outer div. + +Inner div. + +Bottom of outer div. + +Test for bug 232965 This tests that vertical pan scrolling does not propagate from the inner div to the outer div when the outer div has no vertical overflow. + +PASS autoscroll started +Mouse cursor shape: type=NorthEastPanning hotSpot=0,0 +PASS autoscroll stopped +PASS Mouse cursor cleared +PASS outerdiv.scrollLeft is not 0 +PASS outerdiv.scrollTop is 0 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden.html index 05228ae..5519373 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs-forbidden.html
@@ -1,34 +1,35 @@ <!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> -<script src="./resources/middleClickAutoscroll.js"></script> +<html> +<head> <style type="text/css"> div { - line-height: 50px; + line-height: 50px; } #outerdiv { - overflow:auto; - border: 2px solid #000FFF; + overflow:auto; + border: 2px solid #000FFF; } #innerdiv { - overflow:auto; - border: 2px solid #000000; - width: 121%; - padding: 5px; + overflow:auto; + border: 2px solid #000000; + width: 121%; + padding: 5px; } </style> +<script src="../../resources/js-test.js"></script> +<script src="./resources/middleClickAutoscroll.js"></script> <script> -function start() { +function start() +{ outerdiv = $('outerdiv'); - testSetUp({ + testPanScroll({ 'clickOrDrag': 'drag', 'endX': 225, 'endY': 75, 'finishTest': function() { - assert_not_equals(outerdiv.scrollLeft, 0); - assert_equals(outerdiv.scrollTop, 0); + shouldNotBe('outerdiv.scrollLeft', '0'); + shouldBeZero('outerdiv.scrollTop'); }, 'scrollable': outerdiv, 'startX': 150, @@ -36,14 +37,16 @@ }); } </script> +</head> <body onload="start()"> <div id="outerdiv"> - <p>Top of outer div.</p> - <div id="innerdiv"> - <p>Inner div.</p> - </div> - <p>Bottom of outer div.</p> + <p>Top of outer div.</p> + <div id="innerdiv"> + <p>Inner div.</p> + </div> + <p>Bottom of outer div.</p> </div> <p>Test for <a href="http://crbug.com/232965">bug 232965</a> This tests that vertical pan scrolling does not propagate from the inner div to the outer div when the outer div has no vertical overflow.</p> <div id="console"></div> </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs.html b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs.html index 6c39bd4..f1b882e 100644 --- a/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs.html +++ b/third_party/WebKit/LayoutTests/fast/events/middleClickAutoscroll-nested-divs.html
@@ -1,44 +1,46 @@ -<!DOCTYPE html> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/gesture-util.js"></script> -<script src="./resources/middleClickAutoscroll.js"></script> +<html> +<head> <style type="text/css"> #scrollable { - width:500px; - height:300px; - overflow:auto; - border:2px solid red; - padding:10px; + width:500px; + height:300px; + overflow:auto; + border:2px solid red; + padding:10px"; } </style> - +<script src="../../resources/js-test.js"></script> +<script src="./resources/middleClickAutoscroll.js"></script> <script> -function start() { - testSetUp({ - 'clickOrDrag': 'click', - 'scrollable': $('scrollable'), - }); +function start() +{ + description('Check pan scroll in nested divs'); + testPanScroll({ + 'clickOrDrag': 'click', + 'scrollable': $('scrollable'), + }); } </script> - +</head> <body onload="start()"> <div id="container"> <p id="description"></p> Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=28023">bug 28023</a> This tests that pan scrolling propagates correctly up the DOM tree. On success, our scroll offset should be non-zero. <div id="scrollable"> - <div style="height:200px; position:relative;"> - <div style="height:150px; border:1px blue solid; overflow:auto;"> - Panscrolling starting in the blue box should scroll the outer div. + <div style="height:200px; position:relative;"> + <div style="height:150px; border:1px blue solid; overflow:auto;"> + Panscrolling starting in the blue box should scroll the outer div. + </div> + Panscrolling outside the blue boxes should scroll the outer div. </div> - Panscrolling outside the blue boxes should scroll the outer div. - </div> - <div style="height:200px; position:relative;"> - <div style="height:150px; border:1px blue solid; overflow:auto;"> - Panscrolling starting in the blue box should scroll the outer div. + <div style="height:200px; position:relative;"> + <div style="height:150px; border:1px blue solid; overflow:auto;"> + Panscrolling starting in the blue box should scroll the outer div. + </div> </div> - </div> </div> </div> +<div id="console"></div> </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/resources/middleClickAutoscroll.js b/third_party/WebKit/LayoutTests/fast/events/resources/middleClickAutoscroll.js index b28dd57..f58baf64 100644 --- a/third_party/WebKit/LayoutTests/fast/events/resources/middleClickAutoscroll.js +++ b/third_party/WebKit/LayoutTests/fast/events/resources/middleClickAutoscroll.js
@@ -1,65 +1,90 @@ +var autoscrollInterval = 50; +var middleButton = 1; var middleClickAutoscrollRadius = 15; // from FrameView::noPanScrollRadius -var waitTimeBeforeMoveInSeconds = 0.1; -var scrollable; -var scrolledObject; -var startX; -var startY; -var endX; -var endY; -var autoscrollParam; -function $(id) { - return document.getElementById(id); +window.jsTestIsAsync = true; + +function $(id) +{ + return document.getElementById(id); } -function testSetUp(param) { - scrollable = param.scrollable; - scrolledObject = param.scrolledObject || scrollable; - startX = param.startX || scrollable.offsetLeft + 5; - startY = param.startY || scrollable.offsetTop + 5; - endX = param.endX || scrollable.offsetLeft + 5; - endY = param.endY || scrollable.offsetTop + middleClickAutoscrollRadius + 6; - autoscrollParam = param; - if (!scrollable.innerHTML) { - for (var i = 0; i < 100; ++i) { - var line = document.createElement('div'); - line.innerHTML = "line " + i; - scrollable.appendChild(line); - } - } - promise_test (async () => { - // Start atuoscrolling. - if (autoscrollParam.clickOrDrag == 'click') { - await mouseMoveTo(startX, startY); - await mouseClickOn(startX, startY, 'middle'); - await mouseMoveTo(endX, endY); - } else { - assert_equals('drag', autoscrollParam.clickOrDrag); - mouseDragAndDrop(startX, startY, endX, endY, 'middle', - waitTimeBeforeMoveInSeconds); +function testPanScroll(param) +{ + function finishTest() + { + if ($('container')) + $('container').innerHTML = ''; + if (param.finishTest) + param.finishTest(); + if (window.finishJSTest) { + finishJSTest(); + return; + } + if (window.testRunner) + testRunner.notifyDone(); } - // Wait for some scrolling, then end the autoscroll. - await waitFor(() => { - return scrolledObject.scrollTop > 0 || scrolledObject.scrollLeft > 0; - }); - if (autoscrollParam.clickOrDrag == 'click') - await mouseClickOn(endX, endY, 'middle'); + var scrollable = param.scrollable; + var scrolledObject = param.scrolledObject || scrollable; - // Wait for the cursor shape to go back to normal. - await waitFor(() => { - var cursorInfo = internals.getCurrentCursorInfo(); - return cursorInfo == "type=Pointer hotSpot=0,0" || - cursorInfo == "type=IBeam hotSpot=0,0"; - }); + if (!scrollable.innerHTML) { + for (var i = 0; i < 100; ++i) { + var line = document.createElement('div'); + line.innerHTML = "line " + i; + scrollable.appendChild(line); + } + } - finishTest(); - }); -} + var noModeScroll = false; + var scrolled = false; -function finishTest() { - if ($('container')) - $('container').innerHTML = ''; - if (autoscrollParam.finishTest) - autoscrollParam.finishTest(); + scrolledObject.onscroll = function() { + if (noModeScroll) { + testFailed('still autoscroll'); + finishTest(); + return; + } + + if (scrolled) + return; + scrolled = true; + testPassed('autoscroll started'); + var cursorInfo = internals.getCurrentCursorInfo(); + debug("Mouse cursor shape: " + cursorInfo); + + if (window.eventSender) { + if (param.clickOrDrag == 'click') + eventSender.mouseDown(middleButton); + eventSender.mouseUp(middleButton); + } + }; + + scrollable.ownerDocument.onmouseup = function(e) { + if (!scrolled || e.button != middleButton) + return; + noMoreScroll = true; + window.setTimeout(function() { + testPassed('autoscroll stopped'); + var cursorInfo = internals.getCurrentCursorInfo(); + if (cursorInfo == "type=Pointer hotSpot=0,0" || cursorInfo == "type=IBeam hotSpot=0,0") + testPassed('Mouse cursor cleared'); + else + testFailed('Mouse cursor shape: ' + cursorInfo); + + finishTest(); + }, autoscrollInterval * 2); + }; + + if (!window.eventSender) + return; + var startX = param.startX || scrollable.offsetLeft + 5; + var startY = param.startY || scrollable.offsetTop + 5; + var endX = param.endX || scrollable.offsetLeft + 5; + var endY = param.endY || scrollable.offsetTop + middleClickAutoscrollRadius + 6; + eventSender.mouseMoveTo(startX, startY); + eventSender.mouseDown(middleButton); + if (param.clickOrDrag == 'click') + eventSender.mouseUp(middleButton); + eventSender.mouseMoveTo(endX, endY); }
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png new file mode 100644 index 0000000..5f81318 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.txt new file mode 100644 index 0000000..8158dcc --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.txt
@@ -0,0 +1,50 @@ +layer at (0,0) size 800x600 scrollHeight 634 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x536 + LayoutNGBlockFlow {html} at (0,0) size 800x536 + LayoutNGBlockFlow {body} at (8,16) size 784x470 + LayoutNGBlockFlow {p} at (0,0) size 784x20 + LayoutText {#text} at (0,0) size 548x19 + text run at (0,0) width 548: "CSS Transformed HTML div with SVG inside it. objectBoundingBox patterns on text." +layer at (58,86) size 400x400 + LayoutNGBlockFlow {div} at (50,70) size 400x400 + LayoutSVGRoot {svg} at (0,0) size 400x300 + LayoutSVGResourcePattern {pattern} [id="pat1"] [patternUnits=objectBoundingBox] [patternContentUnits=userSpaceOnUse] + LayoutSVGRect {rect} at (5,5) size 10x10 [fill={[type=SOLID] [color=#FF0000]}] [x=5.00] [y=5.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (10,10) size 10x10 [fill={[type=SOLID] [color=#008000]}] [x=10.00] [y=10.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (25,10) size 430x60 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=PATTERN] [id="pat1"]}] [x=25.00] [y=10.00] [width=430.00] [height=60.00] + LayoutSVGText {text} at (25,73) size 406.80x15.59 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,73) size 406.80x15.59 + chunk 1 text run 1 at (25.00,85.00) startOffset 0 endOffset 75 width 406.80: "Pattern created using red and green rectangles applied to fill of rectangle" + LayoutSVGResourcePattern {pattern} [id="pat2"] [patternUnits=objectBoundingBox] [patternContentUnits=userSpaceOnUse] + LayoutSVGRect {rect} at (0,0) size 10x10 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (10,0) size 10x10 [fill={[type=SOLID] [color=#008000]}] [x=10.00] [y=0.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (0,10) size 10x10 [fill={[type=SOLID] [color=#0000FF]}] [x=0.00] [y=10.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (10,10) size 10x10 [fill={[type=SOLID] [color=#FFFF00]}] [x=10.00] [y=10.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (35,110) size 410x40 [stroke={[type=PATTERN] [id="pat2"] [stroke width=20.00]}] [x=35.00] [y=110.00] [width=410.00] [height=40.00] + LayoutSVGText {text} at (25,163) size 318x15.59 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,163) size 318x15.59 + chunk 1 text run 1 at (25.00,175.00) startOffset 0 endOffset 59 width 318.00: "Pattern of 4 rectangles applied to a stroke of a rectangle." + LayoutSVGResourcePattern {pattern} [id="pat3"] [patternUnits=objectBoundingBox] [patternContentUnits=userSpaceOnUse] + LayoutSVGRect {rect} at (0,0) size 10x10 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (0,10) size 10x10 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=10.00] [height=10.00] + LayoutSVGText {text} at (25,174.39) size 292.80x56.39 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,174.39) size 292.80x56.39 + chunk 1 text run 1 at (25.00,220.00) startOffset 0 endOffset 15 width 292.80: "Pattern on fill" + LayoutSVGText {text} at (25,223) size 214.80x15.59 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,223) size 214.80x15.59 + chunk 1 text run 1 at (25.00,235.00) startOffset 0 endOffset 38 width 214.80: "Pattern consists of red and green rows" + LayoutSVGResourcePattern {pattern} [id="pat4"] [patternUnits=objectBoundingBox] [patternContentUnits=userSpaceOnUse] + LayoutSVGRect {rect} at (0,0) size 10x10 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=10.00] [height=10.00] + LayoutSVGRect {rect} at (10,0) size 10x10 [fill={[type=SOLID] [color=#0000FF]}] [x=10.00] [y=0.00] [width=10.00] [height=10.00] + LayoutSVGText {text} at (25,237.80) size 298.80x45.59 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,237.80) size 298.80x45.59 + chunk 1 text run 1 at (25.00,275.00) startOffset 0 endOffset 17 width 298.80: "Pattern on stroke" + LayoutSVGText {text} at (25,278) size 226.80x15.59 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (25,278) size 226.80x15.59 + chunk 1 text run 1 at (25.00,290.00) startOffset 0 endOffset 40 width 226.80: "Pattern consists of red and blue columns" + LayoutSVGText {text} at (10,305.19) size 264x44.39 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (10,305.19) size 264x44.39 + chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 16 width 264.00: "$Revision: 1.6 $" + LayoutSVGRect {rect} at (1,1) size 478x358 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00] + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-inner-svg-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-inner-svg-expected.png index d078b034..eb0a7fe5 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-inner-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-inner-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png index bb880ee9..8e91e0cd 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png index d078b034..eb0a7fe5 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.png index 50b605b4..8348412 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png index 41cd85f..b41ad5ca 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/paths-data-03-f-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/paths-data-03-f-expected.png index 6181f2d..0a97fc3e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/paths-data-03-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/paths-data-03-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/use-on-symbol-inside-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/use-on-symbol-inside-pattern-expected.png index 5fbdafb..34b1906 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/use-on-symbol-inside-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/use-on-symbol-inside-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-inner-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-inner-svg-expected.png deleted file mode 100644 index 179d5f6..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-inner-svg-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png deleted file mode 100644 index 682d773..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png deleted file mode 100644 index 179d5f6..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/tabgroup-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/tabgroup-expected.png deleted file mode 100644 index 2dc0351..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/paint/invalidation/svg/tabgroup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png deleted file mode 100644 index 1958a56a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/paths-data-03-f-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/paths-data-03-f-expected.png deleted file mode 100644 index 45593ca..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/W3C-SVG-1.1/paths-data-03-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png deleted file mode 100644 index f98f8b4c..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-image/img-preserveAspectRatio-support-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-image/img-preserveAspectRatio-support-1-expected.png deleted file mode 100644 index 407a741..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/as-image/img-preserveAspectRatio-support-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/custom/use-on-symbol-inside-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/custom/use-on-symbol-inside-pattern-expected.png deleted file mode 100644 index f0509ba..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/custom/use-on-symbol-inside-pattern-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png deleted file mode 100644 index 028bbf5..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-inner-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-inner-svg-expected.png index 7d3b5fbf..179d5f6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-inner-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-inner-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png index 1a31637..682d773 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png index 7d3b5fbf..179d5f6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.png index b990a7a..2dc0351 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png index bee225a..1958a56a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/paths-data-03-f-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/paths-data-03-f-expected.png index bc63788..45593ca 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/paths-data-03-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/paths-data-03-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index d59c692..f98f8b4c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/as-image/img-preserveAspectRatio-support-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/as-image/img-preserveAspectRatio-support-1-expected.png index fb0d3ff..407a741 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/as-image/img-preserveAspectRatio-support-1-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/as-image/img-preserveAspectRatio-support-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/use-on-symbol-inside-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/use-on-symbol-inside-pattern-expected.png index a9da061b..f0509ba 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/use-on-symbol-inside-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/use-on-symbol-inside-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png index 34e09e6..028bbf5 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-inner-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-inner-svg-expected.png index caa9bdb..973cef02 100644 --- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-inner-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-inner-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png index 837ef4c8..1071d5c1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png index caa9bdb..973cef02 100644 --- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.png index dbb25e1..c9491029 100644 --- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png index 835cae3..eb6d47e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/paths-data-03-f-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/paths-data-03-f-expected.png index 9caedb9d..5a2db0f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/paths-data-03-f-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/paths-data-03-f-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/use-on-symbol-inside-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/use-on-symbol-inside-pattern-expected.png index cd7fed7..3fb071a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/use-on-symbol-inside-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/use-on-symbol-inside-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/resources/gesture-util.js b/third_party/WebKit/LayoutTests/resources/gesture-util.js index 51a9ddc9..0484df3 100644 --- a/third_party/WebKit/LayoutTests/resources/gesture-util.js +++ b/third_party/WebKit/LayoutTests/resources/gesture-util.js
@@ -242,7 +242,7 @@ // Simulate a mouse drag and drop. mouse down at {start_x, start_y}, move to // {end_x, end_y} and release. -function mouseDragAndDrop(start_x, start_y, end_x, end_y, button = 'left', t = 0) { +function mouseDragAndDrop(start_x, start_y, end_x, end_y, button = 'left') { return new Promise((resolve, reject) => { if (chrome && chrome.gpuBenchmarking) { let pointerActions = [{ @@ -250,9 +250,7 @@ actions: [ { 'name': 'pointerMove', 'x': start_x, 'y': start_y }, { 'name': 'pointerDown', 'x': start_x, 'y': start_y, 'button': button }, - { 'name': 'pause', 'duration': t}, { 'name': 'pointerMove', 'x': end_x, 'y': end_y }, - { 'name': 'pause', 'duration': t}, { 'name': 'pointerUp', 'button': button }, ] }];
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt index 3f29529e..e62ace20 100644 --- a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt
@@ -338,7 +338,7 @@ PASS RTCIceTransport interface: operation getRemoteParameters() PASS RTCIceTransport interface: attribute onstatechange PASS RTCIceTransport interface: attribute ongatheringstatechange -PASS RTCIceTransport interface: attribute onselectedcandidatepairchange +FAIL RTCIceTransport interface: attribute onselectedcandidatepairchange assert_true: The prototype object must have a property "onselectedcandidatepairchange" expected true got false FAIL RTCIceTransport must be primary interface of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index c0dab6f1..6eb3e4b 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -5496,7 +5496,6 @@ getter gatheringState getter ongatheringstatechange getter onicecandidate - getter onselectedcandidatepairchange getter onstatechange getter role getter state @@ -5512,7 +5511,6 @@ method stop setter ongatheringstatechange setter onicecandidate - setter onselectedcandidatepairchange setter onstatechange interface RTCPeerConnection : EventTarget static method generateCertificate
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index b7d2aff..9d29ab05 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -421,9 +421,6 @@ virtual void SetIsolatedWorldContentSecurityPolicy(int world_id, const WebString&) = 0; - // Calls window.gc() if it is defined. - virtual void CollectGarbage() = 0; - // Executes script in the context of the current page and returns the value // that the script evaluated to. // DEPRECATED: Use WebLocalFrame::requestExecuteScriptAndReturnValue.
diff --git a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc index 8a22d00..e10ff17 100644 --- a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
@@ -37,11 +37,11 @@ DOMWrapperWorld::Create(isolate, DOMWrapperWorld::WorldType::kWorker)); worlds.push_back( DOMWrapperWorld::Create(isolate, DOMWrapperWorld::WorldType::kWorker)); - worlds.push_back(DOMWrapperWorld::Create( - isolate, DOMWrapperWorld::WorldType::kGarbageCollector)); + worlds.push_back( + DOMWrapperWorld::Create(isolate, DOMWrapperWorld::WorldType::kWorker)); EXPECT_TRUE(worlds[0]->IsWorkerWorld()); EXPECT_TRUE(worlds[1]->IsWorkerWorld()); - EXPECT_FALSE(worlds[2]->IsWorkerWorld()); + EXPECT_TRUE(worlds[2]->IsWorkerWorld()); // World ids should be unique. HashSet<int> world_ids; @@ -70,11 +70,6 @@ EXPECT_EQ(worlds.size(), retrieved_worlds.size()); retrieved_worlds.clear(); - // Dispose of the last world. - worlds.pop_back(); - DOMWrapperWorld::AllWorldsInCurrentThread(retrieved_worlds); - EXPECT_EQ(worlds.size(), retrieved_worlds.size()); - // Dispose of remaining worlds. for (scoped_refptr<DOMWrapperWorld>& world : worlds) { if (world->IsWorkerWorld())
diff --git a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc index a7aba318..6f23e27b 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc
@@ -79,12 +79,11 @@ V8Function* disconnected_callback, V8Function* adopted_callback, V8Function* attribute_changed_callback, - HashSet<AtomicString>&& observed_attributes, - CSSStyleSheet* default_style_sheet) { + HashSet<AtomicString>&& observed_attributes) { ScriptCustomElementDefinition* definition = new ScriptCustomElementDefinition( script_state, descriptor, constructor, connected_callback, disconnected_callback, adopted_callback, attribute_changed_callback, - std::move(observed_attributes), default_style_sheet); + std::move(observed_attributes)); // Tag the JavaScript constructor object with its ID. v8::Local<v8::Value> id_value = @@ -106,11 +105,8 @@ V8Function* disconnected_callback, V8Function* adopted_callback, V8Function* attribute_changed_callback, - HashSet<AtomicString>&& observed_attributes, - CSSStyleSheet* default_style_sheet) - : CustomElementDefinition(descriptor, - default_style_sheet, - std::move(observed_attributes)), + HashSet<AtomicString>&& observed_attributes) + : CustomElementDefinition(descriptor, std::move(observed_attributes)), script_state_(script_state), constructor_(constructor), connected_callback_(connected_callback),
diff --git a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.h b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.h index 2c72214..b27f725 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.h +++ b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.h
@@ -40,8 +40,7 @@ V8Function* disconnected_callback, V8Function* adopted_callback, V8Function* attribute_changed_callback, - HashSet<AtomicString>&& observed_attributes, - CSSStyleSheet*); + HashSet<AtomicString>&& observed_attributes); ~ScriptCustomElementDefinition() override = default; @@ -74,8 +73,7 @@ V8Function* disconnected_callback, V8Function* adopted_callback, V8Function* attribute_changed_callback, - HashSet<AtomicString>&& observed_attributes, - CSSStyleSheet*); + HashSet<AtomicString>&& observed_attributes); // Implementations of |CustomElementDefinition| ScriptValue GetConstructorForScript() final;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.cc b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.cc index a990781f..e57011a1 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.cc
@@ -11,7 +11,6 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_custom_element_constructor.h" #include "third_party/blink/renderer/bindings/core/v8/v8_function.h" -#include "third_party/blink/renderer/core/css/css_style_sheet.h" #include "third_party/blink/renderer/platform/bindings/callback_method_retriever.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -23,13 +22,11 @@ ScriptCustomElementDefinitionBuilder::ScriptCustomElementDefinitionBuilder( ScriptState* script_state, CustomElementRegistry* registry, - CSSStyleSheet* default_style_sheet, V8CustomElementConstructor* constructor, ExceptionState& exception_state) : script_state_(script_state), exception_state_(exception_state), registry_(registry), - default_style_sheet_(default_style_sheet), constructor_(constructor) {} bool ScriptCustomElementDefinitionBuilder::CheckConstructorIntrinsics() { @@ -135,8 +132,7 @@ return ScriptCustomElementDefinition::Create( script_state_, registry_, descriptor, id, constructor_, connected_callback_, disconnected_callback_, adopted_callback_, - attribute_changed_callback_, std::move(observed_attributes_), - default_style_sheet_); + attribute_changed_callback_, std::move(observed_attributes_)); } } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.h b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.h index f794d60..eeb9094 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.h +++ b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition_builder.h
@@ -19,7 +19,6 @@ namespace blink { -class CSSStyleSheet; class CustomElementRegistry; class ExceptionState; class ScriptState; @@ -34,7 +33,6 @@ public: ScriptCustomElementDefinitionBuilder(ScriptState*, CustomElementRegistry*, - CSSStyleSheet*, V8CustomElementConstructor* constructor, ExceptionState&); ~ScriptCustomElementDefinitionBuilder() = default; @@ -49,7 +47,6 @@ Member<ScriptState> script_state_; ExceptionState& exception_state_; Member<CustomElementRegistry> registry_; - const Member<CSSStyleSheet> default_style_sheet_; const Member<V8CustomElementConstructor> constructor_; // These v8::Local handles on stack make the function objects alive until we // finish building the CustomElementDefinition and wrapper-tracing on it gets
diff --git a/third_party/blink/renderer/bindings/core/v8/script_wrappable_v8_gc_integration_test.cc b/third_party/blink/renderer/bindings/core/v8/script_wrappable_v8_gc_integration_test.cc index e2f550d5..dc15fa3a 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_wrappable_v8_gc_integration_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_wrappable_v8_gc_integration_test.cc
@@ -18,12 +18,19 @@ ThreadState::Current()->CollectAllGarbage(); } -void RunV8Scavenger(v8::Isolate* isolate) { - V8GCController::CollectGarbage(isolate, true); +// The following directly calls testing GCs in V8 to avoid cluttering a globally +// visible interface with calls that have to be carefully staged. + +void RunV8MinorGC(v8::Isolate* isolate) { + CHECK(isolate); + isolate->RequestGarbageCollectionForTesting( + v8::Isolate::GarbageCollectionType::kMinorGarbageCollection); } -void RunV8FullGc(v8::Isolate* isolate) { - V8GCController::CollectGarbage(isolate, false); +void RunV8FullGC(v8::Isolate* isolate) { + CHECK(isolate); + isolate->RequestGarbageCollectionForTesting( + v8::Isolate::GarbageCollectionType::kFullGarbageCollection); } } // namespace v8_gc_integration_test @@ -47,7 +54,7 @@ holder.Reset(isolate, ToV8(object, scope.GetContext()->Global(), isolate)); } - v8_gc_integration_test::RunV8FullGc(isolate); + v8_gc_integration_test::RunV8MinorGC(isolate); v8_gc_integration_test::PreciselyCollectGarbage(); EXPECT_FALSE(observer.WasCollected()); holder.Reset(); @@ -78,7 +85,7 @@ // Scavenger should not collect JavaScript wrappers that are modified, even if // they are otherwise unreachable. - v8_gc_integration_test::RunV8Scavenger(isolate); + v8_gc_integration_test::RunV8MinorGC(isolate); v8_gc_integration_test::PreciselyCollectGarbage(); EXPECT_FALSE(observer.WasCollected()); @@ -100,8 +107,8 @@ holder.Reset(isolate, ToV8(object, scope.GetContext()->Global(), isolate)); } - v8_gc_integration_test::RunV8Scavenger(isolate); - v8_gc_integration_test::RunV8FullGc(isolate); + v8_gc_integration_test::RunV8MinorGC(isolate); + v8_gc_integration_test::RunV8FullGC(isolate); v8_gc_integration_test::PreciselyCollectGarbage(); EXPECT_FALSE(observer.WasCollected()); @@ -123,8 +130,8 @@ ToV8(object, scope.GetContext()->Global(), isolate); } - v8_gc_integration_test::RunV8Scavenger(isolate); - v8_gc_integration_test::RunV8FullGc(isolate); + v8_gc_integration_test::RunV8MinorGC(isolate); + v8_gc_integration_test::RunV8FullGC(isolate); v8_gc_integration_test::PreciselyCollectGarbage(); EXPECT_TRUE(observer.WasCollected());
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc index ec6095e..c0d36b3 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -75,6 +75,8 @@ return node; } +namespace { + bool IsDOMWrapperClassId(uint16_t class_id) { return class_id == WrapperTypeInfo::kNodeClassId || class_id == WrapperTypeInfo::kObjectClassId || @@ -134,14 +136,12 @@ v8::Isolate* isolate_; }; -static unsigned long long UsedHeapSize(v8::Isolate* isolate) { +size_t UsedHeapSize(v8::Isolate* isolate) { v8::HeapStatistics heap_statistics; isolate->GetHeapStatistics(&heap_statistics); return heap_statistics.used_heap_size(); } -namespace { - void VisitWeakHandlesForMinorGC(v8::Isolate* isolate) { MinorGCUnmodifiedWrapperVisitor visitor(isolate); isolate->VisitWeakHandles(&visitor); @@ -305,24 +305,6 @@ InspectorUpdateCountersEvent::Data()); } -void V8GCController::CollectGarbage(v8::Isolate* isolate, bool only_minor_gc) { - v8::HandleScope handle_scope(isolate); - ScriptState* script_state = ScriptState::Create( - v8::Context::New(isolate), - DOMWrapperWorld::Create(isolate, - DOMWrapperWorld::WorldType::kGarbageCollector)); - ScriptState::Scope scope(script_state); - StringBuilder builder; - builder.Append("if (gc) gc("); - builder.Append(only_minor_gc ? "true" : "false"); - builder.Append(");"); - V8ScriptRunner::CompileAndRunInternalScript( - isolate, script_state, - ScriptSourceCode(builder.ToString(), ScriptSourceLocationType::kInternal, - nullptr, KURL(), TextPosition())); - script_state->DisposePerContextData(); -} - void V8GCController::CollectAllGarbageForTesting( v8::Isolate* isolate, v8::EmbedderHeapTracer::EmbedderStackState stack_state) {
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h index 456be58..8a99e25 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h
@@ -45,21 +45,24 @@ STATIC_ONLY(V8GCController); public: + static Node* OpaqueRootForGC(v8::Isolate*, Node*); + + // Prologue and epilogue callbacks for V8 garbage collections. static void GcPrologue(v8::Isolate*, v8::GCType, v8::GCCallbackFlags); static void GcEpilogue(v8::Isolate*, v8::GCType, v8::GCCallbackFlags); - static void CollectGarbage(v8::Isolate*, bool only_minor_gc = false); - - // Collects V8 and Blink objects in multiple garbage collectin passes. Also + // Collects V8 and Blink objects in multiple garbage collection passes. Also // triggers follow up garbage collections in Oilpan to collect chains of // persistent handles. + // + // Usage: Testing that objects do indeed get collected. Note that this may + // depend on the EmbedderStackState, i.e., Blink may keep objects alive that + // are reachabe from the stack if necessary. static void CollectAllGarbageForTesting( v8::Isolate*, v8::EmbedderHeapTracer::EmbedderStackState stack_state = v8::EmbedderHeapTracer::EmbedderStackState::kUnknown); - static Node* OpaqueRootForGC(v8::Isolate*, Node*); - // Called when Oilpan traces references from V8 wrappers to DOM wrappables. static void TraceDOMWrappers(v8::Isolate*, Visitor*);
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc index 74a15a6d..e4a5008 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -153,10 +153,9 @@ } return script; } - case v8::ScriptCompiler::kProduceCodeCache: - case v8::ScriptCompiler::kProduceFullCodeCache: - case v8::ScriptCompiler::kProduceParserCache: - case v8::ScriptCompiler::kConsumeParserCache: + // TODO(v8:8252): Remove the default case once deprecated options are + // removed from v8::ScriptCompiler::CompileOptions. + default: NOTREACHED(); break; }
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h index 3c5dc96..5913d693 100644 --- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h +++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -104,6 +104,9 @@ virtual void HandleClicked(Node*) = 0; virtual void HandleAutofillStateChanged(Element*, bool) = 0; + // Handle any notifications which arrived while layout was dirty. + virtual void ProcessUpdatesAfterLayout(Document&) = 0; + // Changes to virtual Accessibility Object Model nodes. virtual void HandleAttributeChanged(const QualifiedName& attr_name, AccessibleNode*) = 0;
diff --git a/third_party/blink/renderer/core/css/quirks.css b/third_party/blink/renderer/core/css/quirks.css index 90f654c..e880fe0e 100644 --- a/third_party/blink/renderer/core/css/quirks.css +++ b/third_party/blink/renderer/core/css/quirks.css
@@ -50,5 +50,5 @@ /* Set margin-bottom for form element in quirks mode. */ /* Compatible with Gecko. (Doing this only for quirks mode is a fix for bug 17696.) */ form { - margin-bottom: 1em + margin-block-end: 1em }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index cdd6968..978a1ff 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2456,6 +2456,9 @@ if (Lifecycle().GetState() < DocumentLifecycle::kLayoutClean) Lifecycle().AdvanceTo(DocumentLifecycle::kLayoutClean); + if (AXObjectCache* cache = ExistingAXObjectCache()) + cache->ProcessUpdatesAfterLayout(*this); + if (LocalFrameView* frame_view_anchored = View()) frame_view_anchored->PerformScrollAnchoringAdjustments(); }
diff --git a/third_party/blink/renderer/core/events/event_type_names.json5 b/third_party/blink/renderer/core/events/event_type_names.json5 index f52729a..d922745 100644 --- a/third_party/blink/renderer/core/events/event_type_names.json5 +++ b/third_party/blink/renderer/core/events/event_type_names.json5
@@ -236,7 +236,6 @@ "seeked", "seeking", "select", - "selectedcandidatepairchange", "selectionchange", "selectstart", "selectend",
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h index f5c4ae9..54bffc31 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.h +++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -29,7 +29,6 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" -#include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/platform/web_insecure_request_policy.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/sandbox_flags.h" @@ -53,6 +52,7 @@ enum class ReportOptions { kReportOnFailure, kDoNotReport }; namespace mojom { +enum class FeaturePolicyFeature : int32_t; enum class IPAddressSpace : int32_t; }
diff --git a/third_party/blink/renderer/core/exported/prerendering_test.cc b/third_party/blink/renderer/core/exported/prerendering_test.cc index ea1dec4..7df33de 100644 --- a/third_party/blink/renderer/core/exported/prerendering_test.cc +++ b/third_party/blink/renderer/core/exported/prerendering_test.cc
@@ -184,7 +184,7 @@ } void Close() { - web_view_helper_.LocalMainFrame()->CollectGarbage(); + web_view_helper_.LocalMainFrame()->CollectGarbageForTesting(); web_view_helper_.Reset(); WebCache::Clear();
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index b939907..585734c6 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -10527,7 +10527,7 @@ FrameTestHelpers::WebViewHelper web_view_helper; WebViewImpl* web_view_impl = web_view_helper.InitializeAndLoad(base_url_ + "max-frames-detach.html"); - web_view_impl->MainFrameImpl()->CollectGarbage(); + web_view_impl->MainFrameImpl()->CollectGarbageForTesting(); } TEST_F(WebFrameTest, ImageDocumentLoadFinishTime) {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 883ea60..f0c7bc84b 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -936,8 +936,10 @@ if (AXObjectCache* cache = document->ExistingAXObjectCache()) { const KURL& url = document->Url(); - if (url.IsValid() && !url.IsAboutBlankURL()) + if (url.IsValid() && !url.IsAboutBlankURL()) { cache->HandleLayoutComplete(document); + cache->ProcessUpdatesAfterLayout(*document); + } } UpdateDocumentAnnotatedRegions(); CheckDoesNotNeedLayout(); @@ -3035,6 +3037,9 @@ if (Lifecycle().GetState() < DocumentLifecycle::kLayoutClean) Lifecycle().AdvanceTo(DocumentLifecycle::kLayoutClean); + if (AXObjectCache* cache = GetFrame().GetDocument()->ExistingAXObjectCache()) + cache->ProcessUpdatesAfterLayout(*GetFrame().GetDocument()); + // Ensure that we become visually non-empty eventually. // TODO(esprehn): This should check isRenderingReady() instead. if (GetFrame().GetDocument()->HasFinishedParsing() &&
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index f76d227..690a3bf 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -791,12 +791,12 @@ return GetFrame()->DomWindow()->prompt(script_state, message, default_value); } -void WebLocalFrameImpl::CollectGarbage() { +void WebLocalFrameImpl::CollectGarbageForTesting() { if (!GetFrame()) return; if (!GetFrame()->GetSettings()->GetScriptEnabled()) return; - V8GCController::CollectGarbage(v8::Isolate::GetCurrent()); + V8GCController::CollectAllGarbageForTesting(v8::Isolate::GetCurrent()); } v8::Local<v8::Value> WebLocalFrameImpl::ExecuteScriptAndReturnValue(
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index d4ed7b4..383fd8c 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -122,7 +122,7 @@ WebString Prompt(const WebString& message, const WebString& default_value) override; - void CollectGarbage() override; + void CollectGarbageForTesting(); v8::Local<v8::Value> ExecuteScriptAndReturnValue( const WebScriptSource&) override; void RequestExecuteScriptAndReturnValue(const WebScriptSource&,
diff --git a/third_party/blink/renderer/core/frame/window.idl b/third_party/blink/renderer/core/frame/window.idl index 54ef7ac..57211eb6 100644 --- a/third_party/blink/renderer/core/frame/window.idl +++ b/third_party/blink/renderer/core/frame/window.idl
@@ -37,9 +37,9 @@ [Affects=Nothing, Unforgeable, CrossOrigin] readonly attribute Window window; [Replaceable, CrossOrigin] readonly attribute Window self; [Affects=Nothing, Unforgeable, CachedAccessor] readonly attribute Document document; - [Replaceable] readonly attribute DOMString origin; attribute DOMString name; [Affects=Nothing, PutForwards=href, Unforgeable, CrossOrigin=(Getter,Setter), Custom=Getter] readonly attribute Location location; + [CallWith=ScriptState] readonly attribute CustomElementRegistry customElements; [Affects=Nothing] readonly attribute History history; [Replaceable, MeasureAs=BarPropLocationbar] readonly attribute BarProp locationbar; [Replaceable, MeasureAs=BarPropMenubar] readonly attribute BarProp menubar; @@ -94,22 +94,19 @@ [Measure, CallWith=ScriptState] DOMString? prompt(optional DOMString message = "", optional DOMString defaultValue = ""); [Measure, CallWith=ScriptState] void print(); - [MeasureAs=UnprefixedRequestAnimationFrame] long requestAnimationFrame(FrameRequestCallback callback); - void cancelAnimationFrame(long handle); - - [Measure] long requestIdleCallback(IdleRequestCallback callback, optional IdleRequestOptions options); - void cancelIdleCallback(long handle); - [CrossOrigin, CallWith=CurrentWindow, RaisesException] void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []); [CrossOrigin, CallWith=CurrentWindow, RaisesException, RuntimeEnabled=PostMessageOptions] void postMessage(any message, optional WindowPostMessageOptions options); + // WindowOrWorkerGlobalScope mixin // https://html.spec.whatwg.org/#windoworworkerglobalscope-mixin + [Replaceable] readonly attribute DOMString origin; void queueMicrotask(VoidFunction callback); - // Custom elements - // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-api - [CallWith=ScriptState] readonly attribute CustomElementRegistry customElements; + // AnimationFrameProvider mixin + // https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames + [MeasureAs=UnprefixedRequestAnimationFrame] long requestAnimationFrame(FrameRequestCallback callback); + void cancelAnimationFrame(long handle); // HTML obsolete features // https://html.spec.whatwg.org/#Window-partial @@ -118,6 +115,11 @@ [Replaceable, SameObject] readonly attribute External external; + // Cooperative Scheduling of Background Tasks + // https://www.w3.org/TR/requestidlecallback/#window_extensions + [Measure] long requestIdleCallback(IdleRequestCallback callback, optional IdleRequestOptions options); + void cancelIdleCallback(long handle); + // CSS Object Model (CSSOM) // https://drafts.csswg.org/cssom/#extensions-to-the-window-interface [Affects=Nothing, NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional DOMString? pseudoElt);
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc index faed436..1e301ad1 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
@@ -30,19 +30,11 @@ CustomElementDefinition::CustomElementDefinition( const CustomElementDescriptor& descriptor, - CSSStyleSheet* default_style_sheet) - : descriptor_(descriptor), default_style_sheet_(default_style_sheet) {} - -CustomElementDefinition::CustomElementDefinition( - const CustomElementDescriptor& descriptor, - CSSStyleSheet* default_style_sheet, const HashSet<AtomicString>& observed_attributes) : descriptor_(descriptor), observed_attributes_(observed_attributes), has_style_attribute_changed_callback_( - observed_attributes.Contains(HTMLNames::styleAttr.LocalName())), - default_style_sheet_(default_style_sheet) {} - + observed_attributes.Contains(HTMLNames::styleAttr.LocalName())) {} CustomElementDefinition::~CustomElementDefinition() = default; void CustomElementDefinition::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.h b/third_party/blink/renderer/core/html/custom/custom_element_definition.h index 8709de4..3ecea92 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_definition.h +++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.h
@@ -91,6 +91,10 @@ const AtomicString& old_value, const AtomicString& new_value); + void SetDefaultStyleSheet(CSSStyleSheet& default_style_sheet) { + default_style_sheet_ = default_style_sheet; + } + CSSStyleSheet* DefaultStyleSheet() const { return default_style_sheet_; } class CORE_EXPORT ConstructionStackScope final { @@ -110,10 +114,7 @@ protected: CustomElementDefinition(const CustomElementDescriptor&); - CustomElementDefinition(const CustomElementDescriptor&, CSSStyleSheet*); - CustomElementDefinition(const CustomElementDescriptor&, - CSSStyleSheet*, const HashSet<AtomicString>& observed_attributes); void AddDefaultStyle(Element*); @@ -132,7 +133,7 @@ bool has_style_attribute_changed_callback_; bool added_default_style_sheet_ = false; - const Member<CSSStyleSheet> default_style_sheet_; + Member<CSSStyleSheet> default_style_sheet_; void EnqueueAttributeChangedCallbackForAllAttributes(Element*);
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry.cc index ca9fedf..ebff421 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_registry.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_registry.cc
@@ -109,12 +109,8 @@ V8CustomElementConstructor* constructor, const ElementDefinitionOptions& options, ExceptionState& exception_state) { - CSSStyleSheet* style_sheet = nullptr; - if (RuntimeEnabledFeatures::CustomElementDefaultStyleEnabled() && - options.hasStyle()) - style_sheet = options.style(); - ScriptCustomElementDefinitionBuilder builder(script_state, this, style_sheet, - constructor, exception_state); + ScriptCustomElementDefinitionBuilder builder(script_state, this, constructor, + exception_state); return DefineInternal(script_state, name, builder, options, exception_state); } @@ -215,6 +211,9 @@ CustomElementDefinition* definition = builder.Build(descriptor, id); CHECK(!exception_state.HadException()); CHECK(definition->Descriptor() == descriptor); + if (RuntimeEnabledFeatures::CustomElementDefaultStyleEnabled() && + options.hasStyle()) + definition->SetDefaultStyleSheet(*options.style()); definitions_.emplace_back(definition); NameIdMap::AddResult result = name_id_map_.insert(descriptor.GetName(), id); CHECK(result.is_new_entry); @@ -230,6 +229,7 @@ entry->value->Resolve(); when_defined_promise_map_.erase(entry); } + return definition; }
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc index 6baa77b..7cef1b70 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
@@ -440,41 +440,6 @@ EXPECT_EQ(nullptr, definition) << "a-a, div should not be registered"; } -TEST_F(CustomElementRegistryTest, defineCustomElementWithStyle) { - RuntimeEnabledFeatures::SetConstructableStylesheetsEnabled(true); - V8TestingScope scope; - NonThrowableExceptionState should_not_throw; - ElementDefinitionOptions options; - CSSStyleSheet* sheet = GetDocument().createEmptyCSSStyleSheet( - scope.GetScriptState(), CSSStyleSheetInit(), should_not_throw); - options.setStyle(sheet); - TestCustomElementDefinitionBuilder builder(sheet); - CustomElementDefinition* definition_a = - Define("a-a", builder, options, should_not_throw); - EXPECT_EQ(definition_a, Registry().DefinitionForName("a-a")); - EXPECT_NE(nullptr, Registry().DefinitionForName("a-a")->DefaultStyleSheet()); - StyleSheetContents* contents = - Registry().DefinitionForName("a-a")->DefaultStyleSheet()->Contents(); - EXPECT_NE(nullptr, contents); - EXPECT_EQ(sheet->Contents()->ChildRules().size(), - contents->ChildRules().size()); - EXPECT_EQ(sheet->Contents()->ImportRules().size(), - contents->ImportRules().size()); - EXPECT_EQ(sheet->Contents()->NamespaceRules().size(), - contents->NamespaceRules().size()); - EXPECT_EQ(sheet->Contents()->OriginalURL(), contents->OriginalURL()); - EXPECT_EQ(sheet->Contents()->DefaultNamespace(), - contents->DefaultNamespace()); - EXPECT_EQ(sheet->Contents()->HasFontFaceRule(), contents->HasFontFaceRule()); - EXPECT_EQ(sheet->Contents()->HasViewportRule(), contents->HasViewportRule()); - EXPECT_EQ(sheet->Contents()->HasMediaQueries(), contents->HasMediaQueries()); - EXPECT_EQ(sheet->Contents()->HasSyntacticallyValidCSSHeader(), - contents->HasSyntacticallyValidCSSHeader()); - EXPECT_EQ( - sheet->ownerRule(), - Registry().DefinitionForName("a-a")->DefaultStyleSheet()->ownerRule()); -} - // The embedder may define its own elements via the CustomElementRegistry // whose names are not valid custom element names. Ensure that such a // definition may be done.
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.cc b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.cc index ae9f2ef..37ee736c 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.cc
@@ -9,7 +9,7 @@ CustomElementDefinition* TestCustomElementDefinitionBuilder::Build( const CustomElementDescriptor& descriptor, CustomElementDefinition::Id) { - return new TestCustomElementDefinition(descriptor, default_style_sheet_); + return new TestCustomElementDefinition(descriptor); } } // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h index c39f3960..97d6c59 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h +++ b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h
@@ -23,7 +23,6 @@ namespace blink { -class CSSStyleSheet; class CustomElementDescriptor; class TestCustomElementDefinitionBuilder @@ -32,9 +31,6 @@ public: TestCustomElementDefinitionBuilder() = default; - explicit TestCustomElementDefinitionBuilder( - CSSStyleSheet* default_style_sheet) - : default_style_sheet_(default_style_sheet) {} bool CheckConstructorIntrinsics() override { return true; } bool CheckConstructorNotRegistered() override { return true; } @@ -43,24 +39,18 @@ CustomElementDefinition::Id) override; private: - const Member<CSSStyleSheet> default_style_sheet_; DISALLOW_COPY_AND_ASSIGN(TestCustomElementDefinitionBuilder); }; class TestCustomElementDefinition : public CustomElementDefinition { public: - TestCustomElementDefinition(const CustomElementDescriptor& descriptor, - CSSStyleSheet* default_style_sheet) - : CustomElementDefinition(descriptor, default_style_sheet) {} - TestCustomElementDefinition(const CustomElementDescriptor& descriptor) : CustomElementDefinition(descriptor) {} TestCustomElementDefinition(const CustomElementDescriptor& descriptor, HashSet<AtomicString>&& observed_attributes) : CustomElementDefinition(descriptor, - nullptr, std::move(observed_attributes)) {} ~TestCustomElementDefinition() override = default;
diff --git a/third_party/blink/renderer/core/html/parser/background_html_parser.cc b/third_party/blink/renderer/core/html/parser/background_html_parser.cc index 3df0ec66..b4a5845 100644 --- a/third_party/blink/renderer/core/html/parser/background_html_parser.cc +++ b/third_party/blink/renderer/core/html/parser/background_html_parser.cc
@@ -233,7 +233,7 @@ // Break chunks before a script tag is inserted and flag the chunk as // starting a script so the main parser can decide if it should yield // before processing the chunk. - if (simulated_token == HTMLTreeBuilderSimulator::kScriptStart) { + if (simulated_token == HTMLTreeBuilderSimulator::kValidScriptStart) { EnqueueTokenizedChunk(); starting_script_ = true; }
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc index ace64a51..0d84be7 100644 --- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc +++ b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/core/html/parser/html_tree_builder.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/mathml_names.h" +#include "third_party/blink/renderer/core/script/script_loader.h" #include "third_party/blink/renderer/core/svg_names.h" namespace blink { @@ -152,7 +153,23 @@ tokenizer->SetState(HTMLTokenizer::kRCDATAState); } else if (ThreadSafeMatch(tag_name, scriptTag)) { tokenizer->SetState(HTMLTokenizer::kScriptDataState); - simulated_token = kScriptStart; + + String type_attribute_value; + if (auto* item = token.GetAttributeItem(typeAttr)) { + type_attribute_value = item->Value(); + } + + String language_attribute_value; + if (auto* item = token.GetAttributeItem(languageAttr)) { + language_attribute_value = item->Value(); + } + + ScriptType script_type; + if (ScriptLoader::IsValidScriptTypeAndLanguage( + type_attribute_value, language_attribute_value, + ScriptLoader::kAllowLegacyTypeInTypeAttribute, script_type)) { + simulated_token = kValidScriptStart; + } } else if (ThreadSafeMatch(tag_name, linkTag)) { simulated_token = kLink; } else if (!in_select_insertion_mode_) {
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h index de9040a8..bfbd116 100644 --- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h +++ b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h
@@ -44,7 +44,7 @@ public: enum SimulatedToken { - kScriptStart, + kValidScriptStart, kScriptEnd, kLink, kStyleEnd,
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc index 2012c016d..373bfd9 100644 --- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc +++ b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc
@@ -24,7 +24,7 @@ token.Clear(); EXPECT_TRUE(tokenizer->NextToken(input, token)); - EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptStart, + EXPECT_EQ(HTMLTreeBuilderSimulator::kValidScriptStart, simulator.Simulate(CompactHTMLToken(&token, TextPosition()), tokenizer.get())); @@ -50,7 +50,7 @@ token.Clear(); EXPECT_TRUE(tokenizer->NextToken(input, token)); - EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptStart, + EXPECT_EQ(HTMLTreeBuilderSimulator::kValidScriptStart, simulator.Simulate(CompactHTMLToken(&token, TextPosition()), tokenizer.get())); @@ -63,4 +63,22 @@ tokenizer.get())); } +TEST(HTMLTreeBuilderSimulatorTest, DetectInvalidScriptType) { + HTMLParserOptions options; + HTMLTreeBuilderSimulator simulator(options); + std::unique_ptr<HTMLTokenizer> tokenizer = HTMLTokenizer::Create(options); + SegmentedString input("<script type=\"text/html\"></script>"); + HTMLToken token; + EXPECT_TRUE(tokenizer->NextToken(input, token)); + EXPECT_NE(HTMLTreeBuilderSimulator::kValidScriptStart, + simulator.Simulate(CompactHTMLToken(&token, TextPosition()), + tokenizer.get())); + + token.Clear(); + EXPECT_TRUE(tokenizer->NextToken(input, token)); + EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptEnd, + simulator.Simulate(CompactHTMLToken(&token, TextPosition()), + tokenizer.get())); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc index 3c40ac19..61f68b3 100644 --- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc +++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -350,10 +350,9 @@ return "code"; case v8::ScriptCompiler::kEagerCompile: return "full code"; - case v8::ScriptCompiler::kProduceParserCache: - case v8::ScriptCompiler::kConsumeParserCache: - case v8::ScriptCompiler::kProduceCodeCache: - case v8::ScriptCompiler::kProduceFullCodeCache: + // TODO(v8:8252): Remove the default branch once deprecated options are + // removed from v8::ScriptCompiler::CompileOptions. + default: NOTREACHED(); } NOTREACHED();
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index e58ebc7..3db24e6 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -872,21 +872,6 @@ } } -IntRect LayoutBox::AbsoluteContentBox() const { - // This is wrong with transforms and flipped writing modes. - IntRect rect = PixelSnappedIntRect(PhysicalContentBoxRect()); - FloatPoint abs_pos = LocalToAbsolute(); - rect.Move(abs_pos.X(), abs_pos.Y()); - return rect; -} - -IntSize LayoutBox::AbsoluteContentBoxOffset() const { - IntPoint offset = RoundedIntPoint(PhysicalContentBoxOffset()); - FloatPoint abs_pos = LocalToAbsolute(); - offset.Move(abs_pos.X(), abs_pos.Y()); - return ToIntSize(offset); -} - FloatQuad LayoutBox::AbsoluteContentQuad(MapCoordinatesFlags flags) const { LayoutRect rect = PhysicalContentBoxRect(); return LocalToAbsoluteQuad(FloatRect(rect), flags); @@ -1890,7 +1875,8 @@ ResourcePriority LayoutBox::ComputeResourcePriority() const { LayoutRect view_bounds = ViewRect(); - LayoutRect object_bounds = LayoutRect(AbsoluteContentBox()); + LayoutRect object_bounds = PhysicalContentBoxRect(); + object_bounds.MoveBy(LayoutPoint(LocalToAbsolute())); // The object bounds might be empty right now, so intersects will fail since // it doesn't deal with empty rects. Use LayoutRect::contains in that case. @@ -5419,7 +5405,8 @@ if (IsAtomicInlineLevel() || HasUnsplittableScrollingOverflow() || (Parent() && IsWritingModeRoot()) || (IsOutOfFlowPositioned() && - StyleRef().GetPosition() == EPosition::kFixed)) + StyleRef().GetPosition() == EPosition::kFixed) || + ShouldApplySizeContainment()) return kForbidBreaks; EBreakInside break_value = BreakInside();
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index 7c3658c..8f753d7c 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -433,10 +433,6 @@ LayoutSize PhysicalContentBoxOffset() const { return LayoutSize(ContentLeft(), ContentTop()); } - // The content box in absolute coords. Ignores transforms. - IntRect AbsoluteContentBox() const; - // The offset of the content box in absolute coords, ignoring transforms. - IntSize AbsoluteContentBoxOffset() const; // The content box converted to absolute coords (taking transforms into // account). FloatQuad AbsoluteContentQuad(MapCoordinatesFlags = 0) const;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 7c5aee1..efec63a 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2131,8 +2131,12 @@ if (visibility_changed || style_->ZIndex() != new_style.ZIndex() || style_->IsStackingContext() != new_style.IsStackingContext()) { GetDocument().SetAnnotatedRegionsDirty(true); - if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) - cache->ChildrenChanged(Parent()); + if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) { + if (GetNode()) + cache->ChildrenChanged(GetNode()->parentNode()); + else + cache->ChildrenChanged(Parent()); + } } if (diff.TransformChanged()) {
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc index 6bf257e..7169488 100644 --- a/third_party/blink/renderer/core/layout/layout_replaced.cc +++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -683,7 +683,7 @@ // 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + // 'padding-right' + 'border-right-width' + 'margin-right' = width of // containing block - LayoutUnit logical_width = ContainingBlock()->AvailableLogicalWidth(); + LayoutUnit logical_width = ContainingBlockLogicalWidthForContent(); // This solves above equation for 'width' (== logicalWidth). LayoutUnit margin_start =
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.idl b/third_party/blink/renderer/core/workers/worker_global_scope.idl index 424b2a6e..8ff553b 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.idl +++ b/third_party/blink/renderer/core/workers/worker_global_scope.idl
@@ -63,17 +63,20 @@ // https://w3c.github.io/webappsec-secure-contexts/#dom-windoworworkerglobalscope-issecurecontext [ImplementedAs=isSecureContextForBindings] readonly attribute boolean isSecureContext; + // WindowOrWorkerGlobalScope mixin // https://html.spec.whatwg.org/#windoworworkerglobalscope-mixin [Replaceable] readonly attribute DOMString origin; - - // https://html.spec.whatwg.org/#windoworworkerglobalscope-mixin void queueMicrotask(VoidFunction callback); - // TODO(fserb): temporarly until we can enable the interface below. - [RuntimeEnabled=OffscreenCanvasText] readonly attribute FontFaceSet fonts; - + // AnimationFrameProvider mixin + // https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames [RuntimeEnabled=OffscreenCanvas, RaisesException] long requestAnimationFrame(FrameRequestCallback callback); [RuntimeEnabled=OffscreenCanvas] void cancelAnimationFrame(long handle); + + // FontFaceSource + // https://drafts.csswg.org/css-font-loading-3/#font-face-source + // TODO(fserb): temporarly until we can enable the interface below. + [RuntimeEnabled=OffscreenCanvasText] readonly attribute FontFaceSet fonts; }; WorkerGlobalScope implements WindowBase64;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 61535bc..2753e204 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -707,20 +707,64 @@ } void AXObjectCacheImpl::ChildrenChanged(Node* node) { + if (!node) + return; + + if (node->GetDocument().NeedsLayoutTreeUpdateForNode(*node)) { + if (!nodes_changed_during_layout_.Contains(&node->GetDocument())) { + HeapVector<Member<Node>> nodes; + nodes_changed_during_layout_.insert(&node->GetDocument(), nodes); + } + nodes_changed_during_layout_.at(&node->GetDocument()).push_back(node); + } ChildrenChanged(Get(node), node); } void AXObjectCacheImpl::ChildrenChanged(LayoutObject* layout_object) { - if (layout_object) { - AXObject* object = Get(layout_object); - ChildrenChanged(object, layout_object->GetNode()); + if (!layout_object) + return; + Node* node = layout_object->GetNode(); + LayoutObject* parent = layout_object->Parent(); + while (!node && parent) { + node = layout_object->GetNode(); + parent = parent->Parent(); } + + if (!node) + return; + + if (node->GetDocument().NeedsLayoutTreeUpdateForNode(*node)) { + if (!nodes_changed_during_layout_.Contains(&node->GetDocument())) { + HeapVector<Member<Node>> nodes; + nodes_changed_during_layout_.insert(&node->GetDocument(), nodes); + } + nodes_changed_during_layout_.at(&node->GetDocument()).push_back(node); + return; + } + + AXObject* object = Get(layout_object); + ChildrenChanged(object, layout_object->GetNode()); } void AXObjectCacheImpl::ChildrenChanged(AccessibleNode* accessible_node) { + if (!accessible_node) + return; AXObject* object = Get(accessible_node); - if (object) - ChildrenChanged(object, object->GetNode()); + if (!object) + return; + Node* node = object->GetNode(); + if (node && node->GetDocument().NeedsLayoutTreeUpdateForNode(*node)) { + Document& document = node->GetDocument(); + if (!accessible_nodes_changed_during_layout_.Contains(&document)) { + HeapVector<Member<AccessibleNode>> accessible_nodes; + accessible_nodes_changed_during_layout_.insert(&document, + accessible_nodes); + } + accessible_nodes_changed_during_layout_.at(&document).push_back( + accessible_node); + return; + } + ChildrenChanged(object, object->GetNode()); } void AXObjectCacheImpl::ChildrenChanged(AXObject* obj, Node* optional_node) { @@ -733,6 +777,25 @@ } } +void AXObjectCacheImpl::ProcessUpdatesAfterLayout(Document& document) { + if (document.Lifecycle().GetState() < DocumentLifecycle::kLayoutClean) + return; + + if (nodes_changed_during_layout_.Contains(&document)) { + for (auto& node : nodes_changed_during_layout_.at(&document)) + ChildrenChanged(node); + } + if (accessible_nodes_changed_during_layout_.Contains(&document)) { + for (auto& accessible_node : + accessible_nodes_changed_during_layout_.at(&document)) { + ChildrenChanged(accessible_node); + } + } + + nodes_changed_during_layout_.erase(&document); + accessible_nodes_changed_during_layout_.erase(&document); +} + void AXObjectCacheImpl::NotificationPostTimerFired(TimerBase*) { notification_post_timer_.Stop(); @@ -935,8 +998,12 @@ if (!node) return; // Virtual AOM node. + AXObject* obj = Get(node); + if (!obj && IsHTMLSelectElement(node)) + obj = GetOrCreate(node); + // Invalidate the current object and make the parent reconsider its children. - if (AXObject* obj = Get(node)) { + if (obj) { // Save parent for later use. AXObject* parent = obj->ParentObject(); @@ -1353,6 +1420,8 @@ visitor->Trace(objects_); visitor->Trace(notifications_to_post_); + visitor->Trace(nodes_changed_during_layout_); + visitor->Trace(accessible_nodes_changed_during_layout_); AXObjectCache::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 05868a2..5ec5de9 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -128,6 +128,7 @@ const LayoutRect&) override; void InlineTextBoxesUpdated(LineLayoutItem) override; + void ProcessUpdatesAfterLayout(Document&) override; // Called when the scroll offset changes. void HandleScrollPositionChanged(LocalFrameView*) override; @@ -294,6 +295,11 @@ mojom::blink::PermissionServicePtr permission_service_; mojo::Binding<mojom::blink::PermissionObserver> permission_observer_binding_; + HeapHashMap<WeakMember<Document>, HeapVector<Member<Node>>> + nodes_changed_during_layout_; + HeapHashMap<WeakMember<Document>, HeapVector<Member<AccessibleNode>>> + accessible_nodes_changed_during_layout_; + DISALLOW_COPY_AND_ASSIGN(AXObjectCacheImpl); };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc index 395f229..4f30248 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h" #include "third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.h" +#include "third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h" namespace blink { @@ -96,7 +96,11 @@ for (const auto& id : ids) { if (Element* id_element = scope.getElementById(AtomicString(id))) { AXObject* ax_id_element = obj.AXObjectCache().GetOrCreate(id_element); - if (ax_id_element && !ax_id_element->AccessibilityIsIgnored()) + if (!ax_id_element) + continue; + if (AXObject* parent = ax_id_element->ParentObject()) + parent->UpdateChildrenIfNecessary(); + if (!ax_id_element->AccessibilityIsIgnored()) objects.push_back(ax_id_element); } }
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc index 837a0a2..1c982f3 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
@@ -168,13 +168,10 @@ DCHECK(task_runner); DCHECK(data); - // Explicitly pass in the |icon_display_size_pixels_| to benefit from decoders - // that have optimizations for partial decoding. std::unique_ptr<ImageDecoder> decoder = ImageDecoder::Create( std::move(data), /* data_complete= */ true, ImageDecoder::kAlphaPremultiplied, ImageDecoder::kDefaultBitDepth, - ColorBehavior::TransformToSRGB(), - {icon_display_size_pixels_.width, icon_display_size_pixels_.height}); + ColorBehavior::TransformToSRGB()); int64_t ideal_to_chosen_icon_size_times_hundred = -1; if (decoder) {
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc index a50620f..3674c02 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -356,7 +356,8 @@ // We first map canvas coordinates to layout coordinates. LayoutRect path_rect(bounding_rect); - IntRect canvas_rect = layout_box->AbsoluteContentBox(); + LayoutRect canvas_rect = layout_box->PhysicalContentBoxRect(); + canvas_rect.MoveBy(LayoutPoint(layout_box->LocalToAbsolute())); path_rect.SetX( (canvas_rect.X() + path_rect.X() * canvas_rect.Width() / Width())); path_rect.SetY( @@ -365,7 +366,7 @@ path_rect.SetHeight((path_rect.Height() * canvas_rect.Height() / Height())); // Then we clip the bounding box to the canvas visible range. - path_rect.Intersect(LayoutRect(canvas_rect)); + path_rect.Intersect(canvas_rect); bool is_horizontal_writing_mode = canvas()->EnsureComputedStyle()->IsHorizontalWritingMode();
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index ad89588..eb7effe 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -583,7 +583,7 @@ "payments/basic_card_request.idl", "payments/can_make_payment_event_init.idl", "payments/image_object.idl", - "payments/payer_error_fields.idl", + "payments/payer_errors.idl", "payments/payment_currency_amount.idl", "payments/payment_details_base.idl", "payments/payment_details_init.idl",
diff --git a/third_party/blink/renderer/modules/payments/payer_error_fields.idl b/third_party/blink/renderer/modules/payments/payer_errors.idl similarity index 69% rename from third_party/blink/renderer/modules/payments/payer_error_fields.idl rename to third_party/blink/renderer/modules/payments/payer_errors.idl index a56a889..5598afa 100644 --- a/third_party/blink/renderer/modules/payments/payer_error_fields.idl +++ b/third_party/blink/renderer/modules/payments/payer_errors.idl
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://w3c.github.io/payment-request/#payererrorfields-dictionary +// https://w3c.github.io/payment-request/#payererrors-dictionary -dictionary PayerErrorFields { +dictionary PayerErrors { DOMString email; DOMString name; DOMString phone;
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc index 1fbfcaf..c4c9212 100644 --- a/third_party/blink/renderer/modules/payments/payment_request.cc +++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -40,7 +40,7 @@ #include "third_party/blink/renderer/modules/payments/basic_card_helper.h" #include "third_party/blink/renderer/modules/payments/basic_card_request.h" #include "third_party/blink/renderer/modules/payments/html_iframe_element_payments.h" -#include "third_party/blink/renderer/modules/payments/payer_error_fields.h" +#include "third_party/blink/renderer/modules/payments/payer_errors.h" #include "third_party/blink/renderer/modules/payments/payment_address.h" #include "third_party/blink/renderer/modules/payments/payment_details_init.h" #include "third_party/blink/renderer/modules/payments/payment_details_update.h" @@ -64,8 +64,8 @@ using ::payments::mojom::blink::AddressErrors; using ::payments::mojom::blink::AddressErrorsPtr; using ::payments::mojom::blink::CanMakePaymentQueryResult; -using ::payments::mojom::blink::PayerErrorFields; -using ::payments::mojom::blink::PayerErrorFieldsPtr; +using ::payments::mojom::blink::PayerErrors; +using ::payments::mojom::blink::PayerErrorsPtr; using ::payments::mojom::blink::PaymentAddress; using ::payments::mojom::blink::PaymentAddressPtr; using ::payments::mojom::blink::PaymentCurrencyAmount; @@ -149,9 +149,8 @@ const blink::PaymentValidationErrors& input) { PaymentValidationErrorsPtr output = payments::mojom::blink::PaymentValidationErrors::New(); - output->payer = input.hasPayer() - ? PayerErrorFields::From(input.payer()) - : PayerErrorFields::From(blink::PayerErrorFields()); + output->payer = input.hasPayer() ? PayerErrors::From(input.payer()) + : PayerErrors::From(blink::PayerErrors()); output->shipping_address = input.hasShippingAddress() ? AddressErrors::From(input.shippingAddress()) @@ -161,10 +160,9 @@ }; template <> -struct TypeConverter<PayerErrorFieldsPtr, blink::PayerErrorFields> { - static PayerErrorFieldsPtr Convert(const blink::PayerErrorFields& input) { - PayerErrorFieldsPtr output = - payments::mojom::blink::PayerErrorFields::New(); +struct TypeConverter<PayerErrorsPtr, blink::PayerErrors> { + static PayerErrorsPtr Convert(const blink::PayerErrors& input) { + PayerErrorsPtr output = payments::mojom::blink::PayerErrors::New(); output->email = input.hasEmail() ? input.email() : g_empty_string; output->name = input.hasName() ? input.name() : g_empty_string; output->phone = input.hasPhone() ? input.phone() : g_empty_string;
diff --git a/third_party/blink/renderer/modules/payments/payment_validation_errors.idl b/third_party/blink/renderer/modules/payments/payment_validation_errors.idl index d25f2882..518ea1d 100644 --- a/third_party/blink/renderer/modules/payments/payment_validation_errors.idl +++ b/third_party/blink/renderer/modules/payments/payment_validation_errors.idl
@@ -5,6 +5,6 @@ // https://w3c.github.io/payment-request/#dom-paymentvalidationerrors dictionary PaymentValidationErrors { - PayerErrorFields payer; + PayerErrors payer; AddressErrors shippingAddress; };
diff --git a/third_party/blink/renderer/modules/payments/payments_validators.cc b/third_party/blink/renderer/modules/payments/payments_validators.cc index a90ef34..467d970f 100644 --- a/third_party/blink/renderer/modules/payments/payments_validators.cc +++ b/third_party/blink/renderer/modules/payments/payments_validators.cc
@@ -6,7 +6,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_regexp.h" #include "third_party/blink/renderer/modules/payments/address_errors.h" -#include "third_party/blink/renderer/modules/payments/payer_error_fields.h" +#include "third_party/blink/renderer/modules/payments/payer_errors.h" #include "third_party/blink/renderer/modules/payments/payment_validation_errors.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/string_impl.h" @@ -163,7 +163,7 @@ // static bool PaymentsValidators::IsValidPayerErrorsFormat( - const PayerErrorFields& errors, + const PayerErrors& errors, String* optional_error_message) { return (!errors.hasEmail() || IsValidErrorMsgFormat(errors.email(), optional_error_message)) &&
diff --git a/third_party/blink/renderer/modules/payments/payments_validators.h b/third_party/blink/renderer/modules/payments/payments_validators.h index 92d36e33..1a7d384 100644 --- a/third_party/blink/renderer/modules/payments/payments_validators.h +++ b/third_party/blink/renderer/modules/payments/payments_validators.h
@@ -13,7 +13,7 @@ namespace blink { class AddressErrors; -class PayerErrorFields; +class PayerErrors; class PaymentValidationErrors; class MODULES_EXPORT PaymentsValidators final { @@ -61,7 +61,7 @@ String* optional_error_message); // Returns false if |errors| has too long string (greater than 2048). - static bool IsValidPayerErrorsFormat(const PayerErrorFields& errors, + static bool IsValidPayerErrorsFormat(const PayerErrors& errors, String* optional_error_message); // Returns false if |errors| has too long string (greater than 2048).
diff --git a/third_party/blink/renderer/modules/payments/payments_validators_test.cc b/third_party/blink/renderer/modules/payments/payments_validators_test.cc index 3f2928c34..431c7751 100644 --- a/third_party/blink/renderer/modules/payments/payments_validators_test.cc +++ b/third_party/blink/renderer/modules/payments/payments_validators_test.cc
@@ -296,7 +296,7 @@ ValidationErrorsTestCase test_case) { PaymentValidationErrors errors; - PayerErrorFields payer; + PayerErrors payer; payer.setEmail(test_case.m_payer_email); payer.setName(test_case.m_payer_name); payer.setPhone(test_case.m_payer_phone);
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter.h b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter.h index 7735411..a07ea25d 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter.h
@@ -47,12 +47,6 @@ // Called asynchronously when the ICE connection state has changed. virtual void OnStateChanged(cricket::IceTransportState new_state) {} - - // Called asynchronously when the ICE agent selects a different candidate - // pair for the active connection. - virtual void OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) {} }; virtual ~IceTransportAdapter() = default;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.cc index 4cdc8cb..1fc096ec 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.cc
@@ -106,8 +106,6 @@ this, &IceTransportAdapterImpl::OnCandidateGathered); p2p_transport_channel_->SignalStateChanged.connect( this, &IceTransportAdapterImpl::OnStateChanged); - p2p_transport_channel_->SignalNetworkRouteChanged.connect( - this, &IceTransportAdapterImpl::OnNetworkRouteChanged); // The ICE tiebreaker is used to determine which side is controlling/ // controlled when both sides start in the same role. The number is randomly // generated so that each peer can calculate a.tiebreaker <= b.tiebreaker @@ -194,21 +192,4 @@ delegate_->OnStateChanged(p2p_transport_channel_->GetState()); } -void IceTransportAdapterImpl::OnNetworkRouteChanged( - absl::optional<rtc::NetworkRoute> new_network_route) { - const cricket::CandidatePairInterface* selected_connection = - p2p_transport_channel_->selected_connection(); - if (!selected_connection) { - // The selected connection will only be null if the ICE connection has - // totally failed, at which point we'll get a StateChanged signal. The - // client will implicitly clear the selected candidate pair when it receives - // the failed state change, so we don't need to give an explicit callback - // here. - return; - } - delegate_->OnSelectedCandidatePairChanged( - std::make_pair(selected_connection->local_candidate(), - selected_connection->remote_candidate())); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.h b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.h index 0b92df8..52fed69 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_adapter_impl.h
@@ -45,8 +45,6 @@ void OnCandidateGathered(cricket::IceTransportInternal* transport, const cricket::Candidate& candidate); void OnStateChanged(cricket::IceTransportInternal* transport); - void OnNetworkRouteChanged( - absl::optional<rtc::NetworkRoute> new_network_route); Delegate* const delegate_; std::unique_ptr<cricket::PortAllocator> port_allocator_;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.cc b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.cc index 79eba08..5db8163 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.cc
@@ -108,14 +108,4 @@ CrossThreadBind(&IceTransportProxy::OnStateChanged, proxy_, new_state)); } -void IceTransportHost::OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - PostCrossThreadTask( - *proxy_thread_, FROM_HERE, - CrossThreadBind(&IceTransportProxy::OnSelectedCandidatePairChanged, - proxy_, selected_candidate_pair)); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h index 919a27f..08ac5458 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h
@@ -73,9 +73,6 @@ void OnGatheringStateChanged(cricket::IceGatheringState new_state) override; void OnCandidateGathered(const cricket::Candidate& candidate) override; void OnStateChanged(cricket::IceTransportState new_state) override; - void OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) override; const scoped_refptr<base::SingleThreadTaskRunner> proxy_thread_; std::unique_ptr<IceTransportAdapter> transport_;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.cc b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.cc index 5e0cea8b..3ff6fd7 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.cc
@@ -140,11 +140,4 @@ delegate_->OnStateChanged(new_state); } -void IceTransportProxy::OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - delegate_->OnSelectedCandidatePairChanged(selected_candidate_pair); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.h b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.h index d10b866..1b90fde 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.h
@@ -50,9 +50,6 @@ } virtual void OnCandidateGathered(const cricket::Candidate& candidate) {} virtual void OnStateChanged(cricket::IceTransportState new_state) {} - virtual void OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) {} }; // Construct a Proxy with the underlying ICE implementation running on the @@ -97,9 +94,6 @@ void OnGatheringStateChanged(cricket::IceGatheringState new_state); void OnCandidateGathered(const cricket::Candidate& candidate); void OnStateChanged(cricket::IceTransportState new_state); - void OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair); const scoped_refptr<base::SingleThreadTaskRunner> proxy_thread_; const scoped_refptr<base::SingleThreadTaskRunner> host_thread_;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h b/third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h index 73ab10b2..05b1cd5 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h
@@ -79,13 +79,6 @@ STATIC_ONLY(CrossThreadCopier); }; -template <> -struct CrossThreadCopier<std::pair<cricket::Candidate, cricket::Candidate>> - : public CrossThreadCopierPassThrough< - std::pair<cricket::Candidate, cricket::Candidate>> { - STATIC_ONLY(CrossThreadCopier); -}; - } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_ADAPTERS_WEB_RTC_CROSS_THREAD_COPIER_H_
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc index 6f5365d9..6d9af12a 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
@@ -380,7 +380,6 @@ // Stopping the consumer should cause it to disconnect. DCHECK(!HasConsumer()); state_ = RTCIceTransportState::kClosed; - selected_candidate_pair_ = base::nullopt; proxy_.reset(); } @@ -456,25 +455,9 @@ return; } state_ = local_new_state; - if (state_ == RTCIceTransportState::kFailed) { - selected_candidate_pair_ = base::nullopt; - } DispatchEvent(*Event::Create(EventTypeNames::statechange)); } -void RTCIceTransport::OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) { - RTCIceCandidate* local = - ConvertToRtcIceCandidate(selected_candidate_pair.first); - RTCIceCandidate* remote = - ConvertToRtcIceCandidate(selected_candidate_pair.second); - selected_candidate_pair_ = RTCIceCandidatePair(); - selected_candidate_pair_->setLocal(local); - selected_candidate_pair_->setRemote(remote); - DispatchEvent(*Event::Create(EventTypeNames::selectedcandidatepairchange)); -} - bool RTCIceTransport::RaiseExceptionIfClosed( ExceptionState& exception_state) const { if (IsClosed()) {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.h b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.h index 2a39f0c..364b120 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.h +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.h
@@ -99,7 +99,6 @@ ExceptionState& exception_state); DEFINE_ATTRIBUTE_EVENT_LISTENER(statechange); DEFINE_ATTRIBUTE_EVENT_LISTENER(gatheringstatechange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(selectedcandidatepairchange); DEFINE_ATTRIBUTE_EVENT_LISTENER(icecandidate); // EventTarget overrides. @@ -126,9 +125,6 @@ void OnGatheringStateChanged(cricket::IceGatheringState new_state) override; void OnCandidateGathered(const cricket::Candidate& candidate) override; void OnStateChanged(cricket::IceTransportState new_state) override; - void OnSelectedCandidatePairChanged( - const std::pair<cricket::Candidate, cricket::Candidate>& - selected_candidate_pair) override; // Fills in |local_parameters_| with a random usernameFragment and a random // password.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.idl b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.idl index 76656b1..a2aca1f 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.idl +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.idl
@@ -47,7 +47,7 @@ RTCIceParameters? getRemoteParameters(); attribute EventHandler onstatechange; attribute EventHandler ongatheringstatechange; - attribute EventHandler onselectedcandidatepairchange; + // TODO(crbug.com/864871): Implement onselectedcandidatepairchange. // The following is defined in the WebRTC-ICE extension specification. // https://w3c.github.io/webrtc-ice/#rtcicetransport*
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport_test.cc index 627ca32..d205c6c 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport_test.cc
@@ -25,7 +25,6 @@ using testing::_; using testing::Assign; using testing::AllOf; -using testing::DoDefault; using testing::ElementsAre; using testing::Field; using testing::InSequence; @@ -56,23 +55,8 @@ return ice_parameters; } -constexpr char kRemoteUsernameFragment2[] = "secondUsernameFragment"; -constexpr char kRemotePassword2[] = "secondPassword"; - -RTCIceParameters CreateRemoteRTCIceParameters2() { - RTCIceParameters ice_parameters; - ice_parameters.setUsernameFragment(kRemoteUsernameFragment2); - ice_parameters.setPassword(kRemotePassword2); - return ice_parameters; -} - -constexpr char kLocalIceCandidateStr1[] = - "candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2"; constexpr char kRemoteIceCandidateStr1[] = - "candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host generation 2"; -constexpr char kRemoteIceCandidateStr2[] = - "candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx raddr " - "192.168.1.5 rport 2346 generation 2"; + "candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2"; RTCIceCandidate* RTCIceCandidateFromString(V8TestingScope& scope, const String& candidate_str) { @@ -82,15 +66,6 @@ ASSERT_NO_EXCEPTION); } -cricket::Candidate CricketCandidateFromString( - const std::string& candidate_str) { - cricket::Candidate candidate; - bool success = - webrtc::SdpDeserializeCandidate("", candidate_str, &candidate, nullptr); - DCHECK(success); - return candidate; -} - class MockIceTransportAdapterCrossThreadFactory : public IceTransportAdapterCrossThreadFactory { public: @@ -366,255 +341,4 @@ ASSERT_NO_EXCEPTION); } -// Test that receiving an OnStateChanged callback with the completed state -// updates the RTCIceTransport state to 'connected' and fires a statechange -// event. -TEST_F(RTCIceTransportTest, OnStateChangedCompletedUpdatesStateAndFiresEvent) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> event_listener = CreateMockEventListener(); - EXPECT_CALL(*event_listener, handleEvent(_, _)) - .WillOnce(InvokeWithoutArgs( - [ice_transport] { EXPECT_EQ("connected", ice_transport->state()); })); - ice_transport->addEventListener(EventTypeNames::statechange, event_listener); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - - delegate->OnStateChanged(cricket::IceTransportState::STATE_COMPLETED); - - RunUntilIdle(); -} - -// Test that receiving an OnStateChanged callback with the failed state updates -// the RTCIceTransport state to 'failed' and fires a statechange event. -TEST_F(RTCIceTransportTest, OnStateChangedFailedUpdatesStateAndFiresEvent) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> event_listener = CreateMockEventListener(); - EXPECT_CALL(*event_listener, handleEvent(_, _)) - .WillOnce(InvokeWithoutArgs( - [ice_transport] { EXPECT_EQ("failed", ice_transport->state()); })); - ice_transport->addEventListener(EventTypeNames::statechange, event_listener); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - - delegate->OnStateChanged(cricket::IceTransportState::STATE_FAILED); - - RunUntilIdle(); -} - -// Test that calling OnSelectedCandidatePairChanged the first time fires the -// selectedcandidatepairchange event and sets the selected candidate pair. -TEST_F(RTCIceTransportTest, InitialOnSelectedCandidatePairChangedFiresEvent) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> event_listener = CreateMockEventListener(); - EXPECT_CALL(*event_listener, handleEvent(_, _)) - .WillOnce(InvokeWithoutArgs([ice_transport] { - base::Optional<RTCIceCandidatePair> selected_candidate_pair; - ice_transport->getSelectedCandidatePair(selected_candidate_pair); - ASSERT_TRUE(selected_candidate_pair); - EXPECT_EQ(ice_transport->getLocalCandidates()[0]->candidate(), - selected_candidate_pair->local()->candidate()); - EXPECT_EQ(ice_transport->getRemoteCandidates()[0]->candidate(), - selected_candidate_pair->remote()->candidate()); - })); - ice_transport->addEventListener(EventTypeNames::selectedcandidatepairchange, - event_listener); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - delegate->OnSelectedCandidatePairChanged( - std::make_pair(CricketCandidateFromString(kLocalIceCandidateStr1), - CricketCandidateFromString(kRemoteIceCandidateStr1))); - - RunUntilIdle(); -} - -// Test that calling OnSelectedCandidatePairChanged with a different remote -// candidate fires the event and updates the selected candidate pair. -TEST_F(RTCIceTransportTest, - OnSelectedCandidatePairChangedWithDifferentRemoteCandidateFiresEvent) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> event_listener = CreateMockEventListener(); - EXPECT_CALL(*event_listener, handleEvent(_, _)) - .WillOnce(DoDefault()) // First event is already tested above. - .WillOnce(InvokeWithoutArgs([ice_transport] { - base::Optional<RTCIceCandidatePair> selected_candidate_pair; - ice_transport->getSelectedCandidatePair(selected_candidate_pair); - ASSERT_TRUE(selected_candidate_pair); - EXPECT_EQ(ice_transport->getLocalCandidates()[0]->candidate(), - selected_candidate_pair->local()->candidate()); - EXPECT_EQ(ice_transport->getRemoteCandidates()[1]->candidate(), - selected_candidate_pair->remote()->candidate()); - })); - ice_transport->addEventListener(EventTypeNames::selectedcandidatepairchange, - event_listener); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - - delegate->OnSelectedCandidatePairChanged( - std::make_pair(CricketCandidateFromString(kLocalIceCandidateStr1), - CricketCandidateFromString(kRemoteIceCandidateStr1))); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr2), - ASSERT_NO_EXCEPTION); - delegate->OnSelectedCandidatePairChanged( - std::make_pair(CricketCandidateFromString(kLocalIceCandidateStr1), - CricketCandidateFromString(kRemoteIceCandidateStr2))); - - RunUntilIdle(); -} - -// Test that receiving an OnStateChange callback to the failed state once a -// connection has been established clears the selected candidate pair without -// firing the selectedcandidatepairchange event. -TEST_F(RTCIceTransportTest, - OnStateChangeFailedAfterConnectedClearsSelectedCandidatePair) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> state_change_event_listener = - CreateMockEventListener(); - EXPECT_CALL(*state_change_event_listener, handleEvent(_, _)) - .WillOnce(DoDefault()) // First event is for 'connected'. - .WillOnce(InvokeWithoutArgs([ice_transport] { - EXPECT_EQ("failed", ice_transport->state()); - base::Optional<RTCIceCandidatePair> selected_candidate_pair; - ice_transport->getSelectedCandidatePair(selected_candidate_pair); - EXPECT_EQ(base::nullopt, selected_candidate_pair); - })); - ice_transport->addEventListener(EventTypeNames::statechange, - state_change_event_listener); - - Persistent<MockEventListener> selected_candidate_pair_change_event_listener = - CreateMockEventListener(); - EXPECT_CALL(*selected_candidate_pair_change_event_listener, handleEvent(_, _)) - .Times(1); // First event is for the connected pair. - ice_transport->addEventListener( - EventTypeNames::selectedcandidatepairchange, - selected_candidate_pair_change_event_listener); - - // Establish the connection - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - delegate->OnStateChanged(cricket::IceTransportState::STATE_COMPLETED); - delegate->OnSelectedCandidatePairChanged( - std::make_pair(CricketCandidateFromString(kLocalIceCandidateStr1), - CricketCandidateFromString(kRemoteIceCandidateStr1))); - - // Transition to failed. - delegate->OnStateChanged(cricket::IceTransportState::STATE_FAILED); - - RunUntilIdle(); -} - -// Test that receiving an OnSelectedCandidatePairChange callback after a remote -// ICE restart still updates the selected candidate pair. -TEST_F(RTCIceTransportTest, - RemoteIceRestartRaceWithSelectedCandidatePairChange) { - V8TestingScope scope; - - IceTransportAdapter::Delegate* delegate = nullptr; - Persistent<RTCIceTransport> ice_transport = - CreateIceTransport(scope, &delegate); - ice_transport->start(CreateRemoteRTCIceParameters1(), "controlling", - ASSERT_NO_EXCEPTION); - RunUntilIdle(); - ASSERT_TRUE(delegate); - - Persistent<MockEventListener> event_listener = CreateMockEventListener(); - EXPECT_CALL(*event_listener, handleEvent(_, _)) - .WillOnce(InvokeWithoutArgs([ice_transport] { - base::Optional<RTCIceCandidatePair> selected_candidate_pair; - ice_transport->getSelectedCandidatePair(selected_candidate_pair); - ASSERT_TRUE(selected_candidate_pair); - EXPECT_EQ(kLocalIceCandidateStr1, - selected_candidate_pair->local()->candidate()); - EXPECT_EQ(kRemoteIceCandidateStr1, - selected_candidate_pair->remote()->candidate()); - })); - ice_transport->addEventListener(EventTypeNames::selectedcandidatepairchange, - event_listener); - - ice_transport->addRemoteCandidate( - RTCIceCandidateFromString(scope, kRemoteIceCandidateStr1), - ASSERT_NO_EXCEPTION); - - // Changing remote ICE parameters indicate a remote ICE restart. This clears - // the stored list of remote candidates. - ice_transport->start(CreateRemoteRTCIceParameters2(), "controlling", - ASSERT_NO_EXCEPTION); - - // These callbacks are part of the previous generation but should still take - // effect. - delegate->OnCandidateGathered( - CricketCandidateFromString(kLocalIceCandidateStr1)); - delegate->OnStateChanged(cricket::IceTransportState::STATE_COMPLETED); - delegate->OnSelectedCandidatePairChanged( - std::make_pair(CricketCandidateFromString(kLocalIceCandidateStr1), - CricketCandidateFromString(kRemoteIceCandidateStr1))); - - RunUntilIdle(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc index 52934680e..afc9e46de 100644 --- a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc +++ b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
@@ -85,7 +85,6 @@ break; case WorldType::kIsolated: case WorldType::kInspectorIsolated: - case WorldType::kGarbageCollector: case WorldType::kRegExp: case WorldType::kTesting: case WorldType::kForV8ContextSnapshotNonMain: @@ -284,7 +283,6 @@ return WorldId::kInvalidWorldId; return next_devtools_isolated_world_id++; } - case WorldType::kGarbageCollector: case WorldType::kRegExp: case WorldType::kTesting: case WorldType::kForV8ContextSnapshotNonMain:
diff --git a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h index d4b610dc..04ca480 100644 --- a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h +++ b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.h
@@ -71,7 +71,6 @@ kMain, kIsolated, kInspectorIsolated, - kGarbageCollector, kRegExp, kTesting, kForV8ContextSnapshotNonMain,
diff --git a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.cc index 3755be275..a06c71d 100644 --- a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.cc
@@ -71,7 +71,7 @@ bool MetricsHelper::ShouldDiscardTask( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { // TODO(altimin): Investigate the relationship between thread time and // wall time for discarded tasks. @@ -80,7 +80,7 @@ void MetricsHelper::RecordCommonTaskMetrics( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { thread_metrics_.RecordTaskMetrics(queue, task, task_timing);
diff --git a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h index e2f6697e..d4f0cc53 100644 --- a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h
@@ -42,13 +42,13 @@ protected: bool ShouldDiscardTask( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); // Record task metrics which are shared between threads. void RecordCommonTaskMetrics( base::sequence_manager::TaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); protected:
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc index 5934812a..7da5a4f 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc
@@ -195,7 +195,7 @@ void MainThreadMetricsHelper::RecordTaskMetrics( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { if (ShouldDiscardTask(queue, task, task_timing)) return; @@ -270,7 +270,7 @@ per_queue_type_reporters_.overall.RecordTask(queue_type, duration); - TaskType task_type = static_cast<TaskType>(task.task_type()); + TaskType task_type = static_cast<TaskType>(task.task_type); per_task_type_duration_reporter_.RecordTask(task_type, duration); if (main_thread_scheduler_->main_thread_only().renderer_backgrounded) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h index f8e9062..c024e31 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h
@@ -47,7 +47,7 @@ void RecordTaskMetrics( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); void OnRendererForegrounded(base::TimeTicks now);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index 538c64d..ca52368 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -2483,7 +2483,7 @@ void MainThreadSchedulerImpl::OnTaskStarted( MainThreadTaskQueue* queue, - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { main_thread_only().running_queues.push(queue); queueing_time_estimator_.OnExecutionStarted(task_timing.start_time(), queue); @@ -2492,7 +2492,7 @@ main_thread_only().current_task_start_time = task_timing.start_time(); main_thread_only().task_description_for_tracing = TaskDescriptionForTracing{ - static_cast<TaskType>(task.task_type()), + static_cast<TaskType>(task.task_type), queue ? base::Optional<MainThreadTaskQueue::QueueType>(queue->queue_type()) : base::nullopt}; @@ -2505,7 +2505,7 @@ void MainThreadSchedulerImpl::OnTaskCompleted( MainThreadTaskQueue* queue, - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { DCHECK_LE(task_timing.start_time(), task_timing.end_time()); DCHECK(!main_thread_only().running_queues.empty()); @@ -2534,7 +2534,7 @@ void MainThreadSchedulerImpl::RecordTaskUkm( MainThreadTaskQueue* queue, - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { if (!ShouldRecordTaskUkm(task_timing.has_thread_time())) return; @@ -2560,7 +2560,7 @@ UkmRecordingStatus MainThreadSchedulerImpl::RecordTaskUkmImpl( MainThreadTaskQueue* queue, - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing, FrameSchedulerImpl* frame_scheduler, bool precise_attribution) { @@ -2586,7 +2586,7 @@ builder.SetRendererAudible(main_thread_only().is_audio_playing); builder.SetUseCase( static_cast<int>(main_thread_only().current_use_case.get())); - builder.SetTaskType(task.task_type()); + builder.SetTaskType(task.task_type); builder.SetQueueType(static_cast<int>( queue ? queue->queue_type() : MainThreadTaskQueue::QueueType::kDetached)); builder.SetFrameStatus(static_cast<int>(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 3a2902b..555936f 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -364,12 +364,12 @@ void OnTaskStarted( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); void OnTaskCompleted( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); bool IsAudioPlaying() const; @@ -726,12 +726,12 @@ // a particular Page, otherwise it's attributed to all Pages in the process. void RecordTaskUkm( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); UkmRecordingStatus RecordTaskUkmImpl( MainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing, FrameSchedulerImpl* frame_scheduler, bool precise_attribution);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc index 07d6cc5..fd16f3b 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc
@@ -125,14 +125,14 @@ MainThreadTaskQueue::~MainThreadTaskQueue() = default; void MainThreadTaskQueue::OnTaskStarted( - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { if (main_thread_scheduler_) main_thread_scheduler_->OnTaskStarted(this, task, task_timing); } void MainThreadTaskQueue::OnTaskCompleted( - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { if (main_thread_scheduler_) { main_thread_scheduler_->OnTaskCompleted(this, task, task_timing);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h index 2d60b0cc..2e2a2d6 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h
@@ -243,11 +243,11 @@ QueueTraits GetQueueTraits() const { return queue_traits_; } void OnTaskStarted( - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); void OnTaskCompleted( - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); void DetachFromMainThreadScheduler();
diff --git a/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.cc index 3cd0891..77436ed 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.cc
@@ -16,7 +16,7 @@ void CompositorMetricsHelper::RecordTaskMetrics( NonMainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { if (ShouldDiscardTask(queue, task, task_timing)) return;
diff --git a/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.h b/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.h index 1bc4163..bcd4f37 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/worker/compositor_metrics_helper.h
@@ -18,7 +18,7 @@ void RecordTaskMetrics( NonMainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); private:
diff --git a/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.cc index 12da463..f6c91b8e 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.cc
@@ -67,7 +67,7 @@ void CompositorThreadScheduler::OnTaskCompleted( NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { compositor_metrics_helper_.RecordTaskMetrics(worker_task_queue, task, task_timing);
diff --git a/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.h index 739f8c01..afa4ca22d 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.h
@@ -31,7 +31,7 @@ // NonMainThreadSchedulerImpl: scoped_refptr<NonMainThreadTaskQueue> DefaultTaskQueue() override; void OnTaskCompleted(NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) override;
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h index 019dae1..d16e6d69 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
@@ -42,7 +42,7 @@ virtual void OnTaskCompleted( NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) = 0; // ThreadSchedulerImpl:
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc index b3fce8d..fdf08d5 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc
@@ -27,7 +27,7 @@ NonMainThreadTaskQueue::~NonMainThreadTaskQueue() = default; void NonMainThreadTaskQueue::OnTaskCompleted( - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { // |non_main_thread_scheduler_| can be nullptr in tests. if (non_main_thread_scheduler_) {
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h index 7667c54..e801ecd6f 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h
@@ -25,7 +25,7 @@ ~NonMainThreadTaskQueue() override; void OnTaskCompleted( - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); scoped_refptr<base::SingleThreadTaskRunner> CreateTaskRunner(
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.cc index daa7522..71bd7ae3 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.cc
@@ -30,7 +30,7 @@ void WorkerMetricsHelper::RecordTaskMetrics( NonMainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { if (ShouldDiscardTask(queue, task, task_timing)) return; @@ -40,7 +40,7 @@ bool backgrounded = internal::ProcessState::Get()->is_process_backgrounded; if (thread_type_ == WebThreadType::kDedicatedWorkerThread) { - TaskType task_type = static_cast<TaskType>(task.task_type()); + TaskType task_type = static_cast<TaskType>(task.task_type); dedicated_worker_per_task_type_duration_reporter_.RecordTask( task_type, task_timing.wall_duration()); if (task_timing.has_thread_time()) {
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h b/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h index 9b1fb018..d4a1535 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h
@@ -22,7 +22,7 @@ void RecordTaskMetrics( NonMainThreadTaskQueue* queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); void SetParentFrameType(FrameOriginType frame_type);
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc index 891c5c7..ac3329a 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
@@ -221,7 +221,7 @@ void WorkerThreadScheduler::OnTaskCompleted( NonMainThreadTaskQueue* task_queue, - const TaskQueue::Task& task, + const base::sequence_manager::Task& task, const TaskQueue::TaskTiming& task_timing) { worker_metrics_helper_.RecordTaskMetrics(task_queue, task, task_timing); @@ -300,7 +300,7 @@ void WorkerThreadScheduler::RecordTaskUkm( NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) { if (!ShouldRecordTaskUkm(task_timing.has_thread_time())) return; @@ -311,7 +311,7 @@ builder.SetRendererBackgrounded( internal::ProcessState::Get()->is_process_backgrounded); - builder.SetTaskType(task.task_type()); + builder.SetTaskType(task.task_type); builder.SetFrameStatus(static_cast<int>(initial_frame_status_)); builder.SetTaskDuration(task_timing.wall_duration().InMicroseconds());
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h index 9dc600ce..7603c10 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h
@@ -68,7 +68,7 @@ // NonMainThreadSchedulerImpl implementation: scoped_refptr<NonMainThreadTaskQueue> DefaultTaskQueue() override; void OnTaskCompleted(NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing) override; @@ -132,7 +132,7 @@ void RecordTaskUkm( NonMainThreadTaskQueue* worker_task_queue, - const base::sequence_manager::TaskQueue::Task& task, + const base::sequence_manager::Task& task, const base::sequence_manager::TaskQueue::TaskTiming& task_timing); const WebThreadType thread_type_;
diff --git a/third_party/blink/tools/audit_non_blink_usage.py b/third_party/blink/tools/audit_non_blink_usage.py index b190a16..59c7a0dd 100755 --- a/third_party/blink/tools/audit_non_blink_usage.py +++ b/third_party/blink/tools/audit_non_blink_usage.py
@@ -442,7 +442,6 @@ # AtomicString or HeapVector) are used cross thread. These Blink types # are converted to the STL/WebRTC counterparts in the parent directory. 'allowed': [ - 'absl::.+', 'base::OnTaskRunnerDeleter', 'sigslot::.+', ],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 330d2ab..42e402d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2216,6 +2216,16 @@ <int value="4" label="Document destroyed"/> </enum> +<enum name="AudioOutputStreamDisconnectReason2"> + <int value="0" label="Default"/> + <int value="1" label="Platform error"/> + <int value="2" label="Terminated by client"/> + <int value="3" label="Terminated by client during stream creation"/> + <int value="4" label="Stream creation failed"/> + <int value="5" label="Document destroyed"/> + <int value="6" label="Document destroyed during stream creation"/> +</enum> + <enum name="AudioRenderDeviceError"> <int value="0" label="No error"/> <int value="1" label="Error during stream creation"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index d696a6d..669eff1 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -1822,7 +1822,7 @@ </histogram> <histogram name="Android.Intent.LaunchExternalAppFormSubmitHasUserGesture" - enum="Boolean" expires_after="M71"> + enum="Boolean" expires_after="M73"> <owner>tedchoc@chromium.org</owner> <owner>thildebr@chromium.org</owner> <summary> @@ -41872,6 +41872,10 @@ <histogram name="Media.Audio.Render.StreamBrokerDisconnectReason" enum="AudioOutputStreamDisconnectReason" expires_after="2019-02-01"> + <obsolete> + Deprecated 09/2018, and replaced by + Media.Audio.Render.StreamBrokerDisconnectReason2. + </obsolete> <owner>jonasolsson@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -41881,6 +41885,40 @@ </summary> </histogram> +<histogram name="Media.Audio.Render.StreamBrokerDisconnectReason2" + enum="AudioOutputStreamDisconnectReason2" expires_after="2019-02-01"> + <owner>jonasolsson@chromium.org</owner> + <owner>maxmorin@chromium.org</owner> + <owner>olka@chromium.org</owner> + <summary> + Describes why and in which state an audio output stream ended. + </summary> +</histogram> + +<histogram + name="Media.Audio.Render.StreamBrokerDocumentDestroyedAwaitingCreatedTime" + units="ms" expires_after="2019-02-01"> + <owner>olka@chromium.org</owner> + <owner>marinaciocea@chromium.org</owner> + <owner>maxmorin@chromium.org</owner> + <summary> + If the document was destroyed after the broker requested the output stream + from the audio service, but before it received the reply: how long ago the + stream was requested. + </summary> +</histogram> + +<histogram name="Media.Audio.Render.StreamBrokerStreamCreationTime" units="ms" + expires_after="2019-02-01"> + <owner>olka@chromium.org</owner> + <owner>marinaciocea@chromium.org</owner> + <owner>maxmorin@chromium.org</owner> + <summary> + Time interval between the moment the broker requested the output stream from + the audio service, and the moment it received the reply. + </summary> +</histogram> + <histogram name="Media.Audio.Render.StreamCallbackError" enum="BooleanError"> <obsolete> Replaced by Media.Audio.Render.StreamCallbackError2 @@ -97642,6 +97680,16 @@ </summary> </histogram> +<histogram name="SignedExchange.Time.SignatureVerify" units="ms" + expires_after="2019-10-01"> + <owner>kinuko@chromium.org</owner> + <owner>kouhei@chromium.org</owner> + <summary> + The amount of time that elapsed during + SignedExchangeSignatureVerifier::Verify. + </summary> +</histogram> + <histogram name="SignedExchange.TimeUntilExpiration" units="seconds"> <owner>kinuko@chromium.org</owner> <owner>kouhei@chromium.org</owner>
diff --git a/tools/perf/core/results_dashboard.py b/tools/perf/core/results_dashboard.py index ea371d7..0189908 100755 --- a/tools/perf/core/results_dashboard.py +++ b/tools/perf/core/results_dashboard.py
@@ -141,6 +141,7 @@ def MakeHistogramSetWithDiagnostics(histograms_file, test_name, bot, buildername, buildnumber, + project, buildbucket, revisions_dict, is_reference_build, perf_dashboard_machine_group): add_diagnostics_args = [] @@ -152,10 +153,16 @@ '--is_reference_build', 'true' if is_reference_build else '', ]) - url = _MakeStdioUrl(test_name, buildername, buildnumber) - if url: + stdio_url = _MakeStdioUrl(test_name, buildername, buildnumber) + if stdio_url: add_diagnostics_args.extend(['--log_urls_k', 'Buildbot stdio']) - add_diagnostics_args.extend(['--log_urls_v', url]) + add_diagnostics_args.extend(['--log_urls_v', stdio_url]) + + build_status_url = _MakeBuildStatusUrl( + project, buildbucket, buildername, buildnumber) + if build_status_url: + add_diagnostics_args.extend(['--build_urls_k', 'Build Status']) + add_diagnostics_args.extend(['--build_urls_v', build_status_url]) for k, v in revisions_dict.iteritems(): add_diagnostics_args.extend((k, v)) @@ -319,6 +326,18 @@ urllib.quote(test_name)) +def _MakeBuildStatusUrl(project, buildbucket, buildername, buildnumber): + # Note: this construction only works for LUCI but it's ok because we are + # converting all perf bots to LUCI (crbug.com/803137). + if not (project and buildbucket and buildnumber and buildnumber): + return None + return 'https://ci.chromium.org/p/%s/builders/%s/%s/%s' % ( + urllib.quote(project), + urllib.quote(buildbucket), + urllib.quote(buildername), + urllib.quote(str(buildnumber))) + + def _GetStdioUriColumn(test_name, buildername, buildnumber): """Gets a supplemental column containing buildbot stdio link.""" url = _MakeStdioUrl(test_name, buildername, buildnumber)
diff --git a/tools/perf/core/upload_results_to_perf_dashboard.py b/tools/perf/core/upload_results_to_perf_dashboard.py index 5b21de94..3afb2b3a 100755 --- a/tools/perf/core/upload_results_to_perf_dashboard.py +++ b/tools/perf/core/upload_results_to_perf_dashboard.py
@@ -75,9 +75,11 @@ begin_time = time.time() hs = results_dashboard.MakeHistogramSetWithDiagnostics( - options.results_file, stripped_test_name, - options.configuration_name, options.buildername, options.buildnumber, - revisions, is_reference_build, + histograms_file=options.results_file, test_name=stripped_test_name, + bot=options.configuration_name, buildername=options.buildername, + buildnumber=options.buildnumber, + project=options.project, buildbucket=options.buildbucket, + revisions_dict=revisions, is_reference_build=is_reference_build, perf_dashboard_machine_group=options.perf_dashboard_machine_group) end_time = time.time() print 'Duration of adding diagnostics for %s: %d seconds' % ( @@ -94,6 +96,8 @@ parser.add_option('--configuration-name') parser.add_option('--results-url') parser.add_option('--perf-dashboard-machine-group') + parser.add_option('--project') + parser.add_option('--buildbucket') parser.add_option('--buildername') parser.add_option('--buildnumber') parser.add_option('--got-webrtc-revision')
diff --git a/tools/perf/page_sets/data/system_health_desktop.json b/tools/perf/page_sets/data/system_health_desktop.json index 4f20030..eb09618 100644 --- a/tools/perf/page_sets/data/system_health_desktop.json +++ b/tools/perf/page_sets/data/system_health_desktop.json
@@ -33,6 +33,9 @@ "browse:news:nytimes": { "DEFAULT": "system_health_desktop_015.wprgo" }, + "browse:news:nytimes:2018": { + "DEFAULT": "system_health_desktop_e2dd18933f.wprgo" + }, "browse:news:reddit": { "DEFAULT": "system_health_desktop_016.wprgo" }, @@ -60,6 +63,9 @@ "browse:social:twitter_infinite_scroll": { "DEFAULT": "system_health_desktop_054.wprgo" }, + "browse:social:twitter_infinite_scroll:2018": { + "DEFAULT": "system_health_desktop_f6af33019a.wprgo" + }, "browse:tech:discourse_infinite_scroll": { "DEFAULT": "system_health_desktop_058.wprgo" },
diff --git a/tools/perf/page_sets/data/system_health_desktop_e2dd18933f.wprgo.sha1 b/tools/perf/page_sets/data/system_health_desktop_e2dd18933f.wprgo.sha1 new file mode 100644 index 0000000..0921b471 --- /dev/null +++ b/tools/perf/page_sets/data/system_health_desktop_e2dd18933f.wprgo.sha1
@@ -0,0 +1 @@ +e2dd18933f9299be5ab9c827b1dc1bd33669ca0a \ No newline at end of file
diff --git a/tools/perf/page_sets/data/system_health_desktop_f6af33019a.wprgo.sha1 b/tools/perf/page_sets/data/system_health_desktop_f6af33019a.wprgo.sha1 new file mode 100644 index 0000000..fc52d64 --- /dev/null +++ b/tools/perf/page_sets/data/system_health_desktop_f6af33019a.wprgo.sha1
@@ -0,0 +1 @@ +f6af33019ac05e1226cd1ed8ddfcb4ed31e083bd \ No newline at end of file
diff --git a/tools/perf/page_sets/login_helpers/login_utils.py b/tools/perf/page_sets/login_helpers/login_utils.py index fa7c76aa..941dc7d 100644 --- a/tools/perf/page_sets/login_helpers/login_utils.py +++ b/tools/perf/page_sets/login_helpers/login_utils.py
@@ -54,9 +54,11 @@ possible exceptions. """ action_runner.WaitForElement(selector=input_selector) + # Focus the requested element first and then enter text using single + # Keyboard events to bypass certain restrictions on websites. action_runner.ExecuteJavaScript( - 'document.querySelector({{ selector }}).value = {{ value }};', - selector=input_selector, value=input_text) + 'document.querySelector({{selector}}).focus()', selector=input_selector) + action_runner.EnterText(input_text) def InputForm(action_runner, input_text, input_id, form_id=None): """Sets the text value of an input field in a form on the page.
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py index 990dafc..5be8ea2a 100644 --- a/tools/perf/page_sets/system_health/browsing_stories.py +++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -196,6 +196,20 @@ TAGS = [story_tags.YEAR_2016] +class NytimesDesktopStory2018(_ArticleBrowsingStory): + """ + The third top website in http://www.alexa.com/topsites/category/News + Known Replay Errors: + - window.EventTracker is not loaded + - all network errors are related to ads + """ + NAME = 'browse:news:nytimes:2018' + URL = 'http://www.nytimes.com' + ITEM_SELECTOR = "a[href*='/2018/']" + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY + TAGS = [story_tags.YEAR_2018] + + # Desktop qq.com opens a news item in a separate tab, for which the back button # does not work. class QqMobileStory(_ArticleBrowsingStory): @@ -1063,3 +1077,10 @@ URL = 'https://twitter.com/taylorswift13' SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY TAGS = [story_tags.INFINITE_SCROLL, story_tags.YEAR_2016] + + +class TwitterScrollDesktopStory2018(_InfiniteScrollStory): + NAME = 'browse:social:twitter_infinite_scroll:2018' + URL = 'https://twitter.com/NASA' + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY + TAGS = [story_tags.INFINITE_SCROLL, story_tags.YEAR_2018]
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index baf19d9f..672a245 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -86,6 +86,12 @@ buildbucket['build'].get('bucket') == 'luci.chrome.ci'): is_luci = True + if 'build' in buildbucket: + args += [ + '--project', buildbucket['build'].get('project'), + '--buildbucket', buildbucket['build'].get('bucket'), + ] + if service_account_file and not is_luci: args += ['--service-account-file', service_account_file]
diff --git a/tools/perf/process_perf_results_unittest.py b/tools/perf/process_perf_results_unittest.py index 9788cfa..ba25f0ff 100755 --- a/tools/perf/process_perf_results_unittest.py +++ b/tools/perf/process_perf_results_unittest.py
@@ -82,6 +82,7 @@ "created_by": "user:foo", "created_ts": "1535490272757820", "id": "8936915467712010816", + "project": "chrome", "lease_key": "461228535", "tags": ["builder:obbs_fyi", "buildset:patch/1194825/3", "cq_experimental:False",
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 7244b68..1236bab 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -122,6 +122,8 @@ "cocoa/menu_controller.mm", "cocoa/nib_loading.h", "cocoa/nib_loading.mm", + "cocoa/ns_view_ids.h", + "cocoa/ns_view_ids.mm", "cocoa/nsgraphics_context_additions.h", "cocoa/nsgraphics_context_additions.mm", "cocoa/nsview_additions.h",
diff --git a/ui/base/cocoa/menu_controller.h b/ui/base/cocoa/menu_controller.h index 95cf7fc..56cdd4a 100644 --- a/ui/base/cocoa/menu_controller.h +++ b/ui/base/cocoa/menu_controller.h
@@ -15,9 +15,6 @@ class MenuModel; } -UI_BASE_EXPORT extern NSString* const kMenuControllerMenuWillOpenNotification; -UI_BASE_EXPORT extern NSString* const kMenuControllerMenuDidCloseNotification; - // A controller for the cross-platform menu model. The menu that's created // has the tag and represented object set for each menu item. The object is a // NSValue holding a pointer to the model for that level of the menu (to @@ -25,12 +22,10 @@ // that particular item. It is important that the model outlives this object // as it only maintains weak references. UI_BASE_EXPORT -@interface MenuControllerCocoa : NSObject<NSMenuDelegate> { - @protected - ui::MenuModel* model_; // Weak. - base::scoped_nsobject<NSMenu> menu_; -} +@interface MenuControllerCocoa + : NSObject<NSMenuDelegate, NSUserInterfaceValidations> +// The Model passed in to -initWithModel:. @property(nonatomic, assign) ui::MenuModel* model; // Whether to activate selected menu items via a posted task. This may allow the @@ -41,7 +36,7 @@ // Note that changing this will have no effect if you use // |-initWithModel:useWithPopUpButtonCell:| or after the first call to |-menu|. -@property(nonatomic) BOOL useWithPopUpButtonCell; +@property(nonatomic, assign) BOOL useWithPopUpButtonCell; + (base::string16)elideMenuTitle:(const base::string16&)title toWidth:(int)width; @@ -69,35 +64,6 @@ // Whether the menu is currently open. - (BOOL)isMenuOpen; -// NSMenuDelegate methods this class implements. Subclasses should call super -// if extending the behavior. -- (void)menuWillOpen:(NSMenu*)menu; -- (void)menuDidClose:(NSMenu*)menu; - -@end - -// Protected methods that subclassers can override and/or invoke. -@interface MenuControllerCocoa (Protected) - -// Called before the menu is to be displayed to update the state (enabled, -// radio, etc) of each item in the menu. Also will update the title if the item -// is marked as "dynamic". -- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item; - -// Adds the item at |index| in |model| as an NSMenuItem at |index| of |menu|. -// Associates a submenu if the MenuModel::ItemType is TYPE_SUBMENU. -- (void)addItemToMenu:(NSMenu*)menu - atIndex:(NSInteger)index - fromModel:(ui::MenuModel*)model; - -// Creates a NSMenu from the given model. If the model has submenus, this can -// be invoked recursively. -- (NSMenu*)menuFromModel:(ui::MenuModel*)model; - -// Returns the maximum width for the menu item. Returns -1 to indicate that -// there's no maximum width. -- (int)maxWidthForMenuModel:(ui::MenuModel*)model - modelIndex:(int)modelIndex; @end #endif // UI_BASE_COCOA_MENU_CONTROLLER_H_
diff --git a/ui/base/cocoa/menu_controller.mm b/ui/base/cocoa/menu_controller.mm index 089448f..7462cfc9 100644 --- a/ui/base/cocoa/menu_controller.mm +++ b/ui/base/cocoa/menu_controller.mm
@@ -45,13 +45,23 @@ } // namespace -NSString* const kMenuControllerMenuWillOpenNotification = - @"MenuControllerMenuWillOpen"; -NSString* const kMenuControllerMenuDidCloseNotification = - @"MenuControllerMenuDidClose"; - // Internal methods. @interface MenuControllerCocoa () +// Called before the menu is to be displayed to update the state (enabled, +// radio, etc) of each item in the menu. Also will update the title if the item +// is marked as "dynamic". +- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item; + +// Adds the item at |index| in |model| as an NSMenuItem at |index| of |menu|. +// Associates a submenu if the MenuModel::ItemType is TYPE_SUBMENU. +- (void)addItemToMenu:(NSMenu*)menu + atIndex:(NSInteger)index + fromModel:(ui::MenuModel*)model; + +// Creates a NSMenu from the given model. If the model has submenus, this can +// be invoked recursively. +- (NSMenu*)menuFromModel:(ui::MenuModel*)model; + // Adds a separator item at the given index. As the separator doesn't need // anything from the model, this method doesn't need the model index as the // other method below does. @@ -74,6 +84,8 @@ @end @implementation MenuControllerCocoa { + ui::MenuModel* model_; // Weak. + base::scoped_nsobject<NSMenu> menu_; BOOL useWithPopUpButtonCell_; // If YES, 0th item is blank BOOL isMenuOpen_; BOOL postItemSelectedAsTask_; @@ -139,11 +151,6 @@ return menu; } -- (int)maxWidthForMenuModel:(ui::MenuModel*)model - modelIndex:(int)modelIndex { - return -1; -} - - (void)addSeparatorToMenu:(NSMenu*)menu atIndex:(int)index { NSMenuItem* separator = [NSMenuItem separatorItem]; @@ -153,12 +160,7 @@ - (void)addItemToMenu:(NSMenu*)menu atIndex:(NSInteger)index fromModel:(ui::MenuModel*)model { - base::string16 label16 = model->GetLabelAt(index); - int maxWidth = [self maxWidthForMenuModel:model modelIndex:index]; - if (maxWidth != -1) - label16 = [MenuControllerCocoa elideMenuTitle:label16 toWidth:maxWidth]; - - NSString* label = l10n_util::FixUpWindowsStyleLabel(label16); + NSString* label = l10n_util::FixUpWindowsStyleLabel(model->GetLabelAt(index)); base::scoped_nsobject<NSMenuItem> item([[ResponsiveNSMenuItem alloc] initWithTitle:label action:@selector(itemSelected:) @@ -335,16 +337,10 @@ - (void)menuWillOpen:(NSMenu*)menu { isMenuOpen_ = YES; - [[NSNotificationCenter defaultCenter] - postNotificationName:kMenuControllerMenuWillOpenNotification - object:self]; model_->MenuWillShow(); // Note: |model_| may trigger -[self dealloc]. } - (void)menuDidClose:(NSMenu*)menu { - [[NSNotificationCenter defaultCenter] - postNotificationName:kMenuControllerMenuDidCloseNotification - object:self]; if (isMenuOpen_) { isMenuOpen_ = NO; model_->MenuWillClose(); // Note: |model_| may trigger -[self dealloc].
diff --git a/ui/base/cocoa/ns_view_ids.h b/ui/base/cocoa/ns_view_ids.h new file mode 100644 index 0000000..749fdd1 --- /dev/null +++ b/ui/base/cocoa/ns_view_ids.h
@@ -0,0 +1,49 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_BASE_COCOA_NS_VIEW_IDS_H_ +#define UI_BASE_COCOA_NS_VIEW_IDS_H_ + +#include <stdint.h> + +#include "base/macros.h" +#include "ui/base/ui_base_export.h" + +@class NSView; + +namespace ui { + +// A class used to manage NSViews across processes. +// - NSViews that may be instantiated in another process are assigned an id in +// the browser process. +// - Instantiating a ScopedNSViewIdMapping in the process where the NSView is +// created will make NSViewIds::GetNSView return the specified NSView. +// - This mechanism is used by mojo methods to refer to NSViews across +// interfaces (in particular, to specify parent NSViews). +class UI_BASE_EXPORT NSViewIds { + public: + // Get a new id to use with a new NSView. This is to only be called in the + // browser process. + static uint64_t GetNewId(); + + // Return an NSView given its id. This is to be called in an app shim process. + static NSView* GetNSView(uint64_t ns_view_id); +}; + +// A scoped mapping from |ns_view_id| to |view|. While this object exists, +// NSViewIds::GetNSView will return |view| when queried with |ns_view_id|. This +// is to be instantiated in the app shim process. +class UI_BASE_EXPORT ScopedNSViewIdMapping { + public: + ScopedNSViewIdMapping(uint64_t ns_view_id, NSView* view); + ~ScopedNSViewIdMapping(); + + private: + const uint64_t ns_view_id_; + DISALLOW_COPY_AND_ASSIGN(ScopedNSViewIdMapping); +}; + +} // namespace ui + +#endif // UI_BASE_COCOA_NS_VIEW_IDS_H_
diff --git a/ui/base/cocoa/ns_view_ids.mm b/ui/base/cocoa/ns_view_ids.mm new file mode 100644 index 0000000..3af9ba81 --- /dev/null +++ b/ui/base/cocoa/ns_view_ids.mm
@@ -0,0 +1,49 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/base/cocoa/ns_view_ids.h" + +#import <Cocoa/Cocoa.h> +#include <map> +#include <utility> + +#include "base/logging.h" +#include "base/no_destructor.h" + +namespace ui { + +std::map<uint64_t, NSView*>& GetNSViewIdMap() { + static base::NoDestructor<std::map<uint64_t, NSView*>> instance; + return *instance; +} + +// static +uint64_t NSViewIds::GetNewId() { + static uint64_t next_id = 1; + return next_id++; +} + +// static +NSView* NSViewIds::GetNSView(uint64_t ns_view_id) { + auto& view_map = GetNSViewIdMap(); + auto found = view_map.find(ns_view_id); + if (found == view_map.end()) + return nil; + return found->second; +} + +ScopedNSViewIdMapping::ScopedNSViewIdMapping(uint64_t ns_view_id, NSView* view) + : ns_view_id_(ns_view_id) { + auto result = GetNSViewIdMap().insert(std::make_pair(ns_view_id, view)); + DCHECK(result.second); +} + +ScopedNSViewIdMapping::~ScopedNSViewIdMapping() { + auto& view_map = GetNSViewIdMap(); + auto found = view_map.find(ns_view_id_); + DCHECK(found != view_map.end()); + view_map.erase(found); +} + +} // namespace ui
diff --git a/ui/base/cocoa/views_hostable.h b/ui/base/cocoa/views_hostable.h index c548b97..68c5cc56 100644 --- a/ui/base/cocoa/views_hostable.h +++ b/ui/base/cocoa/views_hostable.h
@@ -25,6 +25,15 @@ // Query the ui::Layer of the host. virtual ui::Layer* GetUiLayer() const = 0; + // Return the id for the process in which the host NSView exists. Used to + // migrate the content::WebContentsView and content::RenderWidgetHostview + // to that process. + virtual uint64_t GetViewsFactoryHostId() const = 0; + + // The id for the views::View's NSView. Used to add the + // content::WebContentsView's NSView as a child view. + virtual uint64_t GetNSViewId() const = 0; + // Query the parent accessibility element of the host. virtual id GetAccessibilityElement() const = 0; @@ -40,10 +49,20 @@ // the WebContentsView. // - Stitching together any app-shim-side NSViews. virtual void OnViewsHostableAttached(Host* host) = 0; + // Called when the WebContentsView's NSView has been removed from the // views::View's NSView. This is responsible for un-doing all of the actions // taken when attaching. virtual void OnViewsHostableDetached() = 0; + + // Called when the WebContentsView's NSView is to be shown or resized. + virtual void OnViewsHostableShow(const gfx::Rect& bounds_in_window) = 0; + + // Called when the WebContentsView's NSView is to be hidden. + virtual void OnViewsHostableHide() = 0; + + // Called when the WebContentsView's NSView is to be made a first responder. + virtual void OnViewsHostableMakeFirstResponder() = 0; }; } // namespace ui
diff --git a/ui/base/dragdrop/file_info.cc b/ui/base/dragdrop/file_info.cc index e5b894a..e0f63dc 100644 --- a/ui/base/dragdrop/file_info.cc +++ b/ui/base/dragdrop/file_info.cc
@@ -14,4 +14,8 @@ FileInfo::~FileInfo() {} +bool FileInfo::operator==(const FileInfo& other) const { + return path == other.path && display_name == other.display_name; +} + } // namespace ui
diff --git a/ui/base/dragdrop/file_info.h b/ui/base/dragdrop/file_info.h index 6e4f456..4c8bd3c 100644 --- a/ui/base/dragdrop/file_info.h +++ b/ui/base/dragdrop/file_info.h
@@ -15,6 +15,7 @@ FileInfo(); FileInfo(const base::FilePath& path, const base::FilePath& display_name); ~FileInfo(); + bool operator==(const FileInfo& other) const; base::FilePath path; base::FilePath display_name; // Optional.
diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.cc b/ui/base/dragdrop/os_exchange_data_provider_win.cc index 2aa2920a..4020ea6 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_win.cc +++ b/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -57,8 +57,9 @@ static void CreateValidFileNameFromTitle(const GURL& url, const base::string16& title, base::string16* validated); -// Creates a new STGMEDIUM object to hold a file. -static STGMEDIUM* GetStorageForFileName(const base::FilePath& path); +// Creates a new STGMEDIUM object to hold files. +static STGMEDIUM* GetStorageForFileNames( + const std::vector<FileInfo>& filenames); static STGMEDIUM* GetIDListStorageForFileName(const base::FilePath& path); // Creates a File Descriptor for the creation of a file to the given URL and // returns a handle to it. @@ -346,7 +347,7 @@ Clipboard::GetUrlFormatType().ToFormatEtc(), storage)); // TODO(beng): add CF_HTML. - // http://code.google.com/p/chromium/issues/detail?id=6767 + // http://code.google.com/p/chromium/issues/detail?id=6767GetIDListStorageForFileName // Also add text representations (these should be last since they're the // least preferable). @@ -354,11 +355,9 @@ } void OSExchangeDataProviderWin::SetFilename(const base::FilePath& path) { - STGMEDIUM* storage = GetStorageForFileName(path); - data_->contents_.push_back(std::make_unique<DataObjectImpl::StoredDataInfo>( - Clipboard::GetCFHDropFormatType().ToFormatEtc(), storage)); + SetFilenames({FileInfo(path, base::FilePath())}); - storage = GetIDListStorageForFileName(path); + STGMEDIUM* storage = GetIDListStorageForFileName(path); if (!storage) return; data_->contents_.push_back(std::make_unique<DataObjectImpl::StoredDataInfo>( @@ -367,11 +366,12 @@ void OSExchangeDataProviderWin::SetFilenames( const std::vector<FileInfo>& filenames) { - for (size_t i = 0; i < filenames.size(); ++i) { - STGMEDIUM* storage = GetStorageForFileName(filenames[i].path); - data_->contents_.push_back(std::make_unique<DataObjectImpl::StoredDataInfo>( - Clipboard::GetCFHDropFormatType().ToFormatEtc(), storage)); - } + STGMEDIUM* storage = GetStorageForFileNames(filenames); + if (!storage) + return; + + data_->contents_.push_back(std::make_unique<DataObjectImpl::StoredDataInfo>( + Clipboard::GetCFHDropFormatType().ToFormatEtc(), storage)); } void OSExchangeDataProviderWin::SetPickledData( @@ -537,7 +537,7 @@ // think we always synthesize one in WebContentsDragWin. STGMEDIUM* storage = NULL; if (!download.filename.empty()) - storage = GetStorageForFileName(download.filename); + GetStorageForFileNames({FileInfo(download.filename, base::FilePath())}); // Add CF_HDROP. auto info = std::make_unique<DataObjectImpl::StoredDataInfo>( @@ -752,8 +752,12 @@ } // Update the storage. - (*iter)->owns_medium = true; - (*iter)->medium = GetStorageForFileName(file_path); + STGMEDIUM* storage = + GetStorageForFileNames({FileInfo(file_path, base::FilePath())}); + if (storage) { + (*iter)->owns_medium = true; + (*iter)->medium = storage; + } break; } @@ -1003,26 +1007,52 @@ *validated += extension; } -static STGMEDIUM* GetStorageForFileName(const base::FilePath& path) { - const size_t kDropSize = sizeof(DROPFILES); - const size_t kTotalBytes = - kDropSize + (path.value().length() + 2) * sizeof(wchar_t); - HANDLE hdata = GlobalAlloc(GMEM_MOVEABLE, kTotalBytes); +static STGMEDIUM* GetStorageForFileNames( + const std::vector<FileInfo>& filenames) { + // CF_HDROP clipboard format consists of DROPFILES structure, a series of file + // names including the terminating null character and the additional null + // character at the tail to terminate the array. + // For example, + //| DROPFILES | FILENAME 1 | NULL | ... | FILENAME n | NULL | NULL | + // For more details, please refer to + // https://docs.microsoft.com/ko-kr/windows/desktop/shell/clipboard#cf_hdrop + + if (filenames.empty()) + return nullptr; + + const size_t kDropFilesHeaderSizeInBytes = sizeof(DROPFILES); + size_t total_bytes = kDropFilesHeaderSizeInBytes; + for (const auto& filename : filenames) { + // Allocate memory of the filename's length including the null + // character. + total_bytes += (filename.path.value().length() + 1) * sizeof(wchar_t); + } + // |data| needs to be terminated by an additional null character. + total_bytes += sizeof(wchar_t); + + // GHND combines GMEM_MOVEABLE and GMEM_ZEROINIT, and GMEM_ZEROINIT + // initializes memory contents to zero. + HANDLE hdata = GlobalAlloc(GHND, total_bytes); base::win::ScopedHGlobal<DROPFILES*> locked_mem(hdata); DROPFILES* drop_files = locked_mem.get(); drop_files->pFiles = sizeof(DROPFILES); drop_files->fWide = TRUE; + wchar_t* data = reinterpret_cast<wchar_t*>( - reinterpret_cast<BYTE*>(drop_files) + kDropSize); - const size_t copy_size = (path.value().length() + 1) * sizeof(wchar_t); - memcpy(data, path.value().c_str(), copy_size); - data[path.value().length() + 1] = L'\0'; // Double NULL + reinterpret_cast<BYTE*>(drop_files) + kDropFilesHeaderSizeInBytes); + + size_t next_filename_offset = 0; + for (const auto& filename : filenames) { + wcscpy(data + next_filename_offset, filename.path.value().c_str()); + // Skip the terminating null character of the filename. + next_filename_offset += filename.path.value().length() + 1; + } STGMEDIUM* storage = new STGMEDIUM; storage->tymed = TYMED_HGLOBAL; storage->hGlobal = hdata; - storage->pUnkForRelease = NULL; + storage->pUnkForRelease = nullptr; return storage; }
diff --git a/ui/base/dragdrop/os_exchange_data_win_unittest.cc b/ui/base/dragdrop/os_exchange_data_win_unittest.cc index 536c4d3..3d6a92fd 100644 --- a/ui/base/dragdrop/os_exchange_data_win_unittest.cc +++ b/ui/base/dragdrop/os_exchange_data_win_unittest.cc
@@ -11,6 +11,7 @@ #include "base/win/scoped_hglobal.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/clipboard/clipboard.h" +#include "ui/base/dragdrop/file_info.h" #include "ui/base/dragdrop/os_exchange_data_provider_win.h" #include "url/gurl.h" @@ -303,6 +304,23 @@ EXPECT_EQ(file_contents, read_contents); } +TEST(OSExchangeDataWinTest, Filenames) { + OSExchangeData data; + const std::vector<FileInfo> kTestFilenames = { + {base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\test_file1")), + base::FilePath()}, + {base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\test_file2")), + base::FilePath()}, + }; + data.SetFilenames(kTestFilenames); + + OSExchangeData copy(data.provider().Clone()); + std::vector<FileInfo> dropped_filenames; + + EXPECT_TRUE(copy.GetFilenames(&dropped_filenames)); + EXPECT_EQ(kTestFilenames, dropped_filenames); +} + TEST(OSExchangeDataWinTest, CFHtml) { OSExchangeData data; GURL url("http://www.google.com/");
diff --git a/ui/file_manager/file_manager/foreground/elements/files_safe_media.js b/ui/file_manager/file_manager/foreground/elements/files_safe_media.js index 4df8aedb..4c7f199 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_safe_media.js +++ b/ui/file_manager/file_manager/foreground/elements/files_safe_media.js
@@ -90,6 +90,12 @@ this.fire('files-safe-media-tap-inside'); } else if (event.data === 'tap-outside') { this.fire('files-safe-media-tap-outside'); + } else if (event.data === 'webview-loaded') { + if (this.webview_) + this.webview_.setAttribute('loaded', ''); + } else if (event.data === 'webview-cleared') { + if (this.webview_) + this.webview_.removeAttribute('loaded'); } }.bind(this)); }
diff --git a/ui/file_manager/file_manager/foreground/elements/files_safe_media_webview_content.js b/ui/file_manager/file_manager/foreground/elements/files_safe_media_webview_content.js index d35dc125..7730b80a 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_safe_media_webview_content.js +++ b/ui/file_manager/file_manager/foreground/elements/files_safe_media_webview_content.js
@@ -6,27 +6,29 @@ var FILES_APP_ORIGIN = 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj'; var messageSource; - var content = document.getElementById('content'); + var content = document.querySelector('#content'); window.addEventListener('message', function(event) { if (event.origin !== FILES_APP_ORIGIN) { console.error('Unknown origin: ' + event.origin); return; } + messageSource = event.source; switch (event.data.type) { case 'html': content.textContent = ''; - fetch(event.data.src) - .then(function(response) { - return response.text(); - }) - .then(function(text) { - content.textContent = text; - }); + contentChanged(null); + fetch(event.data.src).then((response) => { + return response.text(); + }).then((text) => { + content.textContent = text; + contentChanged(text); + }); break; default: content.src = event.data.src; + contentChanged(content.src); break; } }); @@ -37,17 +39,19 @@ }); document.addEventListener('click', function(e) { - var data; - if (e.target === content) { - data = 'tap-inside'; - } else { - data = 'tap-outside'; - } - - if (messageSource) - messageSource.postMessage(data, FILES_APP_ORIGIN); + sendMessage((e.target === content) ? 'tap-inside' : 'tap-outside'); }); + function contentChanged(src) { + sendMessage(src ? 'webview-loaded' : 'webview-cleared'); + } + + function sendMessage(message) { + if (messageSource) { + messageSource.postMessage(message, FILES_APP_ORIGIN); + } + } + // TODO(oka): This is a workaround to fix FOUC problem, where sometimes // immature view with smaller window size than outer window is rendered for a // moment. Remove this after the root cause is fixed. http://crbug.com/640525 @@ -63,5 +67,4 @@ setTimeout(function() { content.removeAttribute('hidden'); }, 500); - };
diff --git a/ui/file_manager/integration_tests/file_manager/background.js b/ui/file_manager/integration_tests/file_manager/background.js index 2780096..b8964f45 100644 --- a/ui/file_manager/integration_tests/file_manager/background.js +++ b/ui/file_manager/integration_tests/file_manager/background.js
@@ -437,15 +437,13 @@ var steps = [ // Request the guest mode state. function() { - chrome.test.sendMessage( - JSON.stringify({name: 'isInGuestMode'}), steps.shift()); + sendBrowserTestCommand({name: 'isInGuestMode'}, steps.shift()); }, // Request the root entry paths. function(mode) { if (JSON.parse(mode) != chrome.extension.inIncognitoContext) return; - chrome.test.sendMessage( - JSON.stringify({name: 'getRootPaths'}), steps.shift()); + sendBrowserTestCommand({name: 'getRootPaths'}, steps.shift()); }, // Request the test case name. function(paths) { @@ -453,15 +451,14 @@ RootPath.DOWNLOADS = roots.downloads; RootPath.DRIVE = roots.drive; RootPath.ANDROID_FILES = roots.android_files; - chrome.test.sendMessage( - JSON.stringify({name: 'getTestName'}), steps.shift()); + sendBrowserTestCommand({name: 'getTestName'}, steps.shift()); }, // Run the test case. function(testCaseName) { // Get the test function from testcase namespace testCaseName. var test = testcase[testCaseName]; // Verify test is an unnamed (aka 'anonymous') Function. - if (!test instanceof Function || test.name) { + if (!(test instanceof Function) || test.name) { chrome.test.fail('[' + testCaseName + '] not found.'); return; }
diff --git a/ui/file_manager/integration_tests/file_manager/quick_view.js b/ui/file_manager/integration_tests/file_manager/quick_view.js index db4d419..47097a9 100644 --- a/ui/file_manager/integration_tests/file_manager/quick_view.js +++ b/ui/file_manager/integration_tests/file_manager/quick_view.js
@@ -37,7 +37,7 @@ function(result) { chrome.test.assertTrue(!!result, 'fakeKeyDown failed'); repeatUntil(function() { - const elements = ['#quick-view', '#dialog']; + const elements = ['#quick-view', '#dialog[open]']; return remoteCall .callRemoteTestUtil( 'deepQueryAllElements', appId, [elements, ['display']]) @@ -75,7 +75,7 @@ function(result) { chrome.test.assertTrue(!!result, 'fakeMouseClick failed'); repeatUntil(function() { - const elements = ['#quick-view', '#dialog']; + const elements = ['#quick-view', '#dialog:not([open])']; return remoteCall .callRemoteTestUtil( 'deepQueryAllElements', appId, [elements, ['display']]) @@ -263,13 +263,27 @@ const caller = getCaller(); let appId; - function checkQuickViewTextScrollY(scrollY) { - if (Number(scrollY.toString()) < 100) - return pending(caller, 'Waiting for Quick View to scroll.'); - return; + /** + * The text <webview> resides in the #quick-view shadow DOM, as a child of + * the #dialog element. + */ + const webView = ['#quick-view', '#dialog[open] webview.text-content']; + + function scrollQuickViewTextBy(y) { + const doScrollBy = `window.scrollBy(0,${y})`; + return remoteCall + .callRemoteTestUtil( + 'deepExecuteScriptInWebView', appId, [webView, doScrollBy]); } - const textView = ['#quick-view', 'webview']; + function checkQuickViewTextScrollY(scrollY) { + if (!scrollY || Number(scrollY.toString()) <= 200) { + console.log('checkQuickViewTextScrollY: scrollY '.concat(scrollY)); + return scrollQuickViewTextBy(100).then(() => { + return pending(caller, 'Waiting for Quick View to scroll.'); + }); + } + } StepsRunner.run([ // Open Files app on Downloads containing ENTRIES.tallText. @@ -283,38 +297,135 @@ const openSteps = openQuickViewSteps(appId, ENTRIES.tallText.nameText); StepsRunner.run(openSteps).then(this.next); }, + // Wait for the Quick View <webview> to load and display its content. + function() { + function checkWebViewTextLoaded(elements) { + let haveElements = Array.isArray(elements) && elements.length === 1; + if (haveElements) + haveElements = elements[0].styles.display.includes('block'); + if (!haveElements || !elements[0].attributes.src) + return pending(caller, 'Waiting for <webview> to load.'); + return; + } + repeatUntil(function() { + return remoteCall + .callRemoteTestUtil( + 'deepQueryAllElements', appId, [webView, ['display']]) + .then(checkWebViewTextLoaded); + }).then(this.next); + }, // Get the Quick View <webview> scrollY. function() { const getScrollY = 'window.scrollY'; remoteCall .callRemoteTestUtil( - 'deepExecuteScriptInWebView', appId, [textView, getScrollY]) + 'deepExecuteScriptInWebView', appId, [webView, getScrollY]) .then(this.next); }, // Check: the initial <webview> scrollY should be 0. - function(result) { - chrome.test.assertEq('0', result.toString()); + function(scrollY) { + chrome.test.assertEq('0', scrollY.toString()); this.next(); }, - // Scroll the Quick View <webview> in the Y direction (down). - function() { - const doScrollTo = 'window.scrollTo(0,1000)'; - remoteCall - .callRemoteTestUtil( - 'deepExecuteScriptInWebView', appId, [textView, doScrollTo]) - .then(this.next); - }, - // Check: the <webview> should be scrolled in the Y direction. + // Scroll the <webview> and verify that it scrolled. function() { repeatUntil(function() { const getScrollY = 'window.scrollY'; return remoteCall .callRemoteTestUtil( - 'deepExecuteScriptInWebView', appId, [textView, getScrollY]) + 'deepExecuteScriptInWebView', appId, [webView, getScrollY]) .then(checkQuickViewTextScrollY); }).then(this.next); }, + function() { + checkIfNoErrorsOccured(this.next); + }, + ]); +}; + +/** + * Tests opening Quick View and scrolling its <webview> which contains a tall + * html document. + */ +testcase.openQuickViewScrollHtml = function() { + const caller = getCaller(); + let appId; + + /** + * The <webview> resides in the <files-safe-media type="html"> shadow DOM, + * which is a child of the #quick-view shadow DOM. + */ + const webView = ['#quick-view', 'files-safe-media[type="html"]', 'webview']; + + function scrollQuickViewHtmlBy(y) { + const doScrollBy = `window.scrollBy(0,${y})`; + return remoteCall + .callRemoteTestUtil( + 'deepExecuteScriptInWebView', appId, [webView, doScrollBy]); + } + + function checkQuickViewHtmlScrollY(scrollY) { + if (!scrollY || Number(scrollY.toString()) <= 200) { + console.log('checkQuickViewHtmlScrollY: scrollY '.concat(scrollY)); + return scrollQuickViewHtmlBy(100).then(() => { + return pending(caller, 'Waiting for Quick View to scroll.'); + }); + } + } + + StepsRunner.run([ + // Open Files app on Downloads containing ENTRIES.tallHtml. + function() { + setupAndWaitUntilReady( + null, RootPath.DOWNLOADS, this.next, [ENTRIES.tallHtml], []); + }, + // Open the file in Quick View. function(results) { + appId = results.windowId; + const openSteps = openQuickViewSteps(appId, ENTRIES.tallHtml.nameText); + StepsRunner.run(openSteps).then(this.next); + }, + // Wait for the Quick View <webview> to load and display its content. + function() { + function checkWebViewHtmlLoaded(elements) { + let haveElements = Array.isArray(elements) && elements.length === 1; + if (haveElements) + haveElements = elements[0].styles.display.includes('block'); + if (!haveElements || elements[0].attributes.loaded !== '') + return pending(caller, 'Waiting for <webview> to load.'); + return; + } + repeatUntil(function() { + return remoteCall + .callRemoteTestUtil( + 'deepQueryAllElements', appId, [webView, ['display']]) + .then(checkWebViewHtmlLoaded); + }).then(this.next); + }, + // Get the Quick View <webview> scrollY. + function() { + const getScrollY = 'window.scrollY'; + remoteCall + .callRemoteTestUtil( + 'deepExecuteScriptInWebView', appId, [webView, getScrollY]) + .then(this.next); + }, + // Check: the initial <webview> scrollY should be 0. + function(scrollY) { + chrome.test.assertEq('0', scrollY.toString()); + this.next(); + }, + // Scroll the <webview> and verify that it scrolled. + function() { + repeatUntil(function() { + const getScrollY = 'window.scrollY'; + return remoteCall + .callRemoteTestUtil( + 'deepExecuteScriptInWebView', appId, [webView, getScrollY]) + .then(checkQuickViewHtmlScrollY); + }).then(this.next); + }, + function() { checkIfNoErrorsOccured(this.next); }, ]);
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js index 82235ef..596f8eb 100644 --- a/ui/file_manager/integration_tests/test_util.js +++ b/ui/file_manager/integration_tests/test_util.js
@@ -5,8 +5,8 @@ 'use strict'; /** - * Sends a message to the controlling test harness, namely and usually, the - * chrome FileManagerBrowserTest harness: it expects the message to contain + * Sends a command to the controlling test harness, namely and usually, the + * chrome FileManagerBrowserTest harness: it expects the command to contain * the 'name' of the command, and any required or optional arguments of the * command, e.g., * @@ -16,18 +16,18 @@ * entries: entries * }).then(...); * - * @param {Object} message Message object to be sent. The object is converted - * to a JSON string prior to sending. + * @param {Object} command Test command to send. The object is converted to + * a JSON string prior to sending. * @return {Promise} Promise to be fulfilled with the value returned by the * chrome.test.sendMessage callback. */ -function sendTestMessage(message) { - if (typeof message.name === 'string') { +function sendTestMessage(command) { + if (typeof command.name === 'string') { return new Promise(function(fulfill) { - chrome.test.sendMessage(JSON.stringify(message), fulfill); + chrome.test.sendMessage(JSON.stringify(command), fulfill); }); } else { - let error = 'sendTestMessage requires a message.name <string>'; + const error = 'sendTestMessage requires a command.name <string>'; throw new Error(error); } } @@ -166,6 +166,33 @@ } /** + * Sends the test |command| to the browser test harness and awaits a 'string' + * result. Calls |callback| with that result. + * @param {Object} command Test command to send. Refer to sendTestMessage() + * above for the expected format of a test |command| object. + * @param {function(string)} callback Completion callback. + * @param {Object=} opt_debug If truthy, log the result. + */ +function sendBrowserTestCommand(command, callback, opt_debug) { + const caller = getCaller(); + if (typeof command.name !== 'string') + chrome.test.fail('Invalid test command: ' + JSON.stringify(command)); + repeatUntil(function sendTestCommand() { + const tryAgain = pending(caller, 'Sent BrowserTest ' + command.name); + return sendTestMessage(command).then((result) => { + if (typeof result !== 'string') + return tryAgain; + if (opt_debug) + console.log('BrowserTest ' + command.name + ': ' + result); + callback(result); + }).catch((error) => { + console.log(error.stack || error); + return tryAgain; + }); + }); +} + +/** * Adds the givin entries to the target volume(s). * @param {Array<string>} volumeNames Names of target volumes. * @param {Array<TestEntryInfo>} entries List of entries to be added. @@ -495,6 +522,17 @@ typeText: 'Plain text', }), + tallHtml: new TestEntryInfo({ + type: EntryType.FILE, + sourceFileName: 'tall.html', + targetPath: 'tall.html', + mimeType: 'text/html', + lastModifiedTime: 'Sep 4, 1998, 12:34 PM', + nameText: 'tall.html', + sizeText: '51 bytes', + typeText: 'HTML document', + }), + pinned: new TestEntryInfo({ type: EntryType.FILE, sourceFileName: 'text.txt', @@ -668,7 +706,6 @@ }, }), - // Read-only and write-restricted entries. // TODO(sashab): Generate all combinations of capabilities inside the test, to // ensure maximum coverage. @@ -764,6 +801,7 @@ canShare: true }, }), + directoryMovies: new TestEntryInfo({ type: EntryType.DIRECTORY, targetPath: 'Movies', @@ -779,6 +817,7 @@ canShare: true }, }), + directoryMusic: new TestEntryInfo({ type: EntryType.DIRECTORY, targetPath: 'Music', @@ -794,6 +833,7 @@ canShare: true }, }), + directoryPictures: new TestEntryInfo({ type: EntryType.DIRECTORY, targetPath: 'Pictures',
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager.cc b/ui/ozone/platform/wayland/wayland_buffer_manager.cc index cffceef..59f2b12 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager.cc +++ b/ui/ozone/platform/wayland/wayland_buffer_manager.cc
@@ -44,8 +44,9 @@ WaylandBufferManager::Buffer::Buffer() = default; WaylandBufferManager::Buffer::Buffer(uint32_t id, - zwp_linux_buffer_params_v1* zwp_params) - : buffer_id(id), params(zwp_params) {} + zwp_linux_buffer_params_v1* zwp_params, + const gfx::Size& buffer_size) + : buffer_id(id), size(buffer_size), params(zwp_params) {} WaylandBufferManager::Buffer::~Buffer() = default; WaylandBufferManager::WaylandBufferManager( @@ -97,7 +98,8 @@ struct zwp_linux_buffer_params_v1* params = zwp_linux_dmabuf_v1_create_params(zwp_linux_dmabuf_.get()); - std::unique_ptr<Buffer> buffer = std::make_unique<Buffer>(buffer_id, params); + std::unique_ptr<Buffer> buffer = + std::make_unique<Buffer>(buffer_id, params, gfx::Size(width, height)); buffers_.insert(std::pair<uint32_t, std::unique_ptr<Buffer>>( buffer_id, std::move(buffer))); @@ -188,9 +190,16 @@ return false; } - wl_surface_damage(window->surface(), buffer->damage_region.x(), - buffer->damage_region.y(), buffer->damage_region.width(), - buffer->damage_region.height()); + gfx::Rect damage_region = buffer->damage_region; + // If the size of the damage region is empty, wl_surface_damage must be + // supplied with the actual size of the buffer, which is going to be + // committed. + if (damage_region.size().IsEmpty()) + damage_region.set_size(buffer->size); + + wl_surface_damage_buffer(window->surface(), damage_region.x(), + damage_region.y(), damage_region.width(), + damage_region.height()); wl_surface_attach(window->surface(), buffer->wl_buffer.get(), 0, 0); static const wl_callback_listener frame_listener = {
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager.h b/ui/ozone/platform/wayland/wayland_buffer_manager.h index 763e0d2..f2917fd 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager.h +++ b/ui/ozone/platform/wayland/wayland_buffer_manager.h
@@ -82,12 +82,17 @@ // to this Buffer object on run-time. struct Buffer { Buffer(); - Buffer(uint32_t id, zwp_linux_buffer_params_v1* zwp_params); + Buffer(uint32_t id, + zwp_linux_buffer_params_v1* zwp_params, + const gfx::Size& buffer_size); ~Buffer(); // GPU GbmPixmapWayland corresponding buffer id. uint32_t buffer_id = 0; + // Actual buffer size. + const gfx::Size size; + // Widget to attached/being attach WaylandWindow. gfx::AcceleratedWidget widget = gfx::kNullAcceleratedWidget;
diff --git a/ui/ozone/platform/wayland/wayland_keyboard.cc b/ui/ozone/platform/wayland/wayland_keyboard.cc index 396c640..b656859 100644 --- a/ui/ozone/platform/wayland/wayland_keyboard.cc +++ b/ui/ozone/platform/wayland/wayland_keyboard.cc
@@ -8,6 +8,7 @@ #include "base/files/scoped_file.h" #include "ui/base/ui_features.h" +#include "ui/events/base_event_utils.h" #include "ui/events/event.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/keycode_converter.h" @@ -120,9 +121,8 @@ key, down, false /*suppress_auto_repeat*/, device_id); // TODO(tonikitoo,msisov): Handler 'repeat' parameter below. - keyboard->DispatchKey( - key, down, false /*repeat*/, - base::TimeTicks() + base::TimeDelta::FromMilliseconds(time), device_id); + keyboard->DispatchKey(key, down, false /*repeat*/, EventTimeForNow(), + device_id); } void WaylandKeyboard::Modifiers(void* data,
diff --git a/ui/ozone/platform/wayland/wayland_pointer.cc b/ui/ozone/platform/wayland/wayland_pointer.cc index 8079524..5aceb2f2 100644 --- a/ui/ozone/platform/wayland/wayland_pointer.cc +++ b/ui/ozone/platform/wayland/wayland_pointer.cc
@@ -94,8 +94,8 @@ pointer->location_.SetPoint(wl_fixed_to_double(surface_x), wl_fixed_to_double(surface_y)); MouseEvent event(ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), - base::TimeTicks() + base::TimeDelta::FromMilliseconds(time), - pointer->GetFlagsWithKeyboardModifiers(), 0); + EventTimeForNow(), pointer->GetFlagsWithKeyboardModifiers(), + 0); event.set_location_f(pointer->location_); event.set_root_location_f(pointer->location_); pointer->callback_.Run(&event); @@ -146,10 +146,8 @@ // MouseEvent's flags should contain the button that was released too. const int flags = pointer->GetFlagsWithKeyboardModifiers() | changed_button; - MouseEvent event(type, gfx::Point(), gfx::Point(), - base::TimeTicks() + base::TimeDelta::FromMilliseconds(time), - flags, changed_button); - + MouseEvent event(type, gfx::Point(), gfx::Point(), EventTimeForNow(), flags, + changed_button); event.set_location_f(pointer->location_); event.set_root_location_f(pointer->location_); @@ -187,10 +185,8 @@ MouseWheelEvent::kWheelDelta); else return; - MouseWheelEvent event( - offset, gfx::Point(), gfx::Point(), - base::TimeTicks() + base::TimeDelta::FromMilliseconds(time), - pointer->GetFlagsWithKeyboardModifiers(), 0); + MouseWheelEvent event(offset, gfx::Point(), gfx::Point(), EventTimeForNow(), + pointer->GetFlagsWithKeyboardModifiers(), 0); event.set_location_f(pointer->location_); event.set_root_location_f(pointer->location_); pointer->callback_.Run(&event);
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h index ad5ae771..4a6e120 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.h +++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -60,7 +60,7 @@ // potentially in another. static BridgedNativeWidgetHostImpl* GetFromId( uint64_t bridged_native_widget_id); - uint64_t bridged_native_widget_id() const { return id_; } + uint64_t bridged_native_widget_id() const { return widget_id_; } // Creates one side of the bridge. |parent| must not be NULL. explicit BridgedNativeWidgetHostImpl(NativeWidgetMac* parent); @@ -127,6 +127,9 @@ // Set the root view (set during initialization and un-set during teardown). void SetRootView(views::View* root_view); + // Return the id through which the NSView for |root_view_| may be looked up. + uint64_t GetRootViewNSViewId() const { return root_view_id_; } + // Initialize the ui::Compositor and ui::Layer. void CreateCompositor(const Widget::InitParams& params); @@ -293,7 +296,8 @@ // ui::AcceleratedWidgetMacNSView: void AcceleratedWidgetCALayerParamsUpdated() override; - const uint64_t id_; + // The id that this bridge may be looked up from. + const uint64_t widget_id_; views::NativeWidgetMac* const native_widget_mac_; // Weak. Owns |this_|. // The factory that was used to create |bridge_ptr_|. @@ -301,6 +305,8 @@ Widget::InitParams::Type widget_type_ = Widget::InitParams::TYPE_WINDOW; + // The id that may be used to look up the NSView for |root_view_|. + const uint64_t root_view_id_; views::View* root_view_ = nullptr; // Weak. Owned by |native_widget_mac_|. std::unique_ptr<DragDropClientMac> drag_drop_client_;
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm index eb7c6016..0f669a0 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.mm +++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -77,25 +77,25 @@ BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl( NativeWidgetMac* parent) - : id_(++g_last_bridged_native_widget_id), + : widget_id_(++g_last_bridged_native_widget_id), native_widget_mac_(parent), + root_view_id_(ui::NSViewIds::GetNewId()), host_mojo_binding_(this) { - DCHECK(GetIdToWidgetHostImplMap().find(id_) == + DCHECK(GetIdToWidgetHostImplMap().find(widget_id_) == GetIdToWidgetHostImplMap().end()); - GetIdToWidgetHostImplMap().insert(std::make_pair(id_, this)); - GetIdToWidgetHostImplMap().insert(std::make_pair(id_, this)); + GetIdToWidgetHostImplMap().insert(std::make_pair(widget_id_, this)); DCHECK(parent); } BridgedNativeWidgetHostImpl::~BridgedNativeWidgetHostImpl() { if (bridge_factory_host_) { - bridge_factory_host_->GetFactory()->DestroyBridge(id_); + bridge_factory_host_->GetFactory()->DestroyBridge(widget_id_); bridge_factory_host_->RemoveObserver(this); bridge_factory_host_ = nullptr; } // Ensure that |this| cannot be reached by its id while it is being destroyed. - auto found = GetIdToWidgetHostImplMap().find(id_); + auto found = GetIdToWidgetHostImplMap().find(widget_id_); DCHECK(found != GetIdToWidgetHostImplMap().end()); DCHECK_EQ(found->second, this); GetIdToWidgetHostImplMap().erase(found); @@ -126,7 +126,8 @@ base::scoped_nsobject<NativeWidgetMacNSWindow> window, NSView* parent) { local_window_ = window; - bridge_impl_ = std::make_unique<BridgedNativeWidgetImpl>(id_, this, this); + bridge_impl_ = + std::make_unique<BridgedNativeWidgetImpl>(widget_id_, this, this); bridge_impl_->SetWindow(window); if (parent) bridge_impl_->SetParent(parent); @@ -143,14 +144,14 @@ // other process. local_window_ = BridgedNativeWidgetImpl::CreateNSWindow(window_create_params.get()); - [local_window_ setBridgedNativeWidgetId:id_]; + [local_window_ setBridgedNativeWidgetId:widget_id_]; // Initialize |bridge_ptr_| to point to a bridge created by |factory|. views_bridge_mac::mojom::BridgedNativeWidgetHostPtr host_ptr; host_mojo_binding_.Bind(mojo::MakeRequest(&host_ptr), ui::WindowResizeHelperMac::Get()->task_runner()); bridge_factory_host_->GetFactory()->CreateBridge( - id_, mojo::MakeRequest(&bridge_ptr_), std::move(host_ptr)); + widget_id_, mojo::MakeRequest(&bridge_ptr_), std::move(host_ptr)); // Create the window in its process, and attach it to its parent window. bridge()->CreateWindow(std::move(window_create_params), parent_bridge_id);
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index 3d3c149..bd8304c9 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -618,7 +618,8 @@ // The delegate should exist before setting the root view. EXPECT_TRUE([window delegate]); bridge_host()->SetRootView(view_.get()); - bridge()->CreateContentView(view_->bounds()); + bridge()->CreateContentView(bridge_host()->GetRootViewNSViewId(), + view_->bounds()); ns_view_ = bridge()->ns_view(); // Pretend it has been shown via NativeWidgetMac::Show().
diff --git a/ui/views/controls/native/native_view_host_mac.h b/ui/views/controls/native/native_view_host_mac.h index 06f3e9c..f46e575e 100644 --- a/ui/views/controls/native/native_view_host_mac.h +++ b/ui/views/controls/native/native_view_host_mac.h
@@ -18,6 +18,7 @@ namespace views { +class BridgedNativeWidgetHostImpl; class NativeViewHost; // Mac implementation of NativeViewHostWrapper. @@ -29,6 +30,8 @@ // ViewsHostableView::Host: ui::Layer* GetUiLayer() const override; + uint64_t GetViewsFactoryHostId() const override; + uint64_t GetNSViewId() const override; id GetAccessibilityElement() const override; void OnHostableViewDestroying() override; @@ -50,6 +53,9 @@ gfx::NativeCursor GetCursor(int x, int y) override; private: + // Return the BridgedNativeWidgetHostImpl for this hosted view. + BridgedNativeWidgetHostImpl* GetBridgedNativeWidgetHost() const; + // Our associated NativeViewHost. Owns this. NativeViewHost* host_;
diff --git a/ui/views/controls/native/native_view_host_mac.mm b/ui/views/controls/native/native_view_host_mac.mm index 47b68fd..f246206 100644 --- a/ui/views/controls/native/native_view_host_mac.mm +++ b/ui/views/controls/native/native_view_host_mac.mm
@@ -51,6 +51,12 @@ NativeViewHostMac::~NativeViewHostMac() { } +BridgedNativeWidgetHostImpl* NativeViewHostMac::GetBridgedNativeWidgetHost() + const { + return BridgedNativeWidgetHostImpl::GetFromNativeWindow( + host_->GetWidget()->GetNativeWindow()); +} + //////////////////////////////////////////////////////////////////////////////// // NativeViewHostMac, ViewsHostableView::Host implementation: @@ -58,6 +64,20 @@ return host_->layer(); } +uint64_t NativeViewHostMac::GetViewsFactoryHostId() const { + auto* bridge_host = GetBridgedNativeWidgetHost(); + if (bridge_host && bridge_host->bridge_factory_host()) + return bridge_host->bridge_factory_host()->GetHostId(); + return 0; +} + +uint64_t NativeViewHostMac::GetNSViewId() const { + auto* bridge_host = GetBridgedNativeWidgetHost(); + if (bridge_host) + return bridge_host->GetRootViewNSViewId(); + return 0; +} + id NativeViewHostMac::GetAccessibilityElement() const { // Find the closest ancestor view that participates in the views toolkit // accessibility hierarchy and set its element as the native view's parent. @@ -93,9 +113,8 @@ DCHECK(!native_view_); native_view_.reset([host_->native_view() retain]); EnsureNativeViewHasNoChildWidgets(native_view_); - BridgedNativeWidgetHostImpl* bridge_host = - BridgedNativeWidgetHostImpl::GetFromNativeWindow( - host_->GetWidget()->GetNativeWindow()); + + auto* bridge_host = GetBridgedNativeWidgetHost(); DCHECK(bridge_host); bridge_host->SetAssociationForView(host_, native_view_); @@ -129,9 +148,7 @@ } EnsureNativeViewHasNoChildWidgets(host_->native_view()); - BridgedNativeWidgetHostImpl* bridge_host = - BridgedNativeWidgetHostImpl::GetFromNativeWindow( - host_->GetWidget()->GetNativeWindow()); + auto* bridge_host = GetBridgedNativeWidgetHost(); // BridgedNativeWidgetImpl can be null when Widget is closing. if (bridge_host) bridge_host->ClearAssociationForView(host_); @@ -195,15 +212,24 @@ [[host_->native_view() superview] convertRect:window_rect fromView:nil]; [host_->native_view() setFrame:container_rect]; [host_->native_view() setHidden:NO]; + + if (native_view_hostable_) + native_view_hostable_->OnViewsHostableShow(gfx::Rect(x, y, w, h)); } void NativeViewHostMac::HideWidget() { [host_->native_view() setHidden:YES]; + + if (native_view_hostable_) + native_view_hostable_->OnViewsHostableHide(); } void NativeViewHostMac::SetFocus() { if ([host_->native_view() acceptsFirstResponder]) [[host_->native_view() window] makeFirstResponder:host_->native_view()]; + + if (native_view_hostable_) + native_view_hostable_->OnViewsHostableMakeFirstResponder(); } gfx::NativeView NativeViewHostMac::GetNativeViewContainer() const {
diff --git a/ui/views/controls/native/native_view_host_mac_unittest.mm b/ui/views/controls/native/native_view_host_mac_unittest.mm index 5213360..85373e5 100644 --- a/ui/views/controls/native/native_view_host_mac_unittest.mm +++ b/ui/views/controls/native/native_view_host_mac_unittest.mm
@@ -32,6 +32,9 @@ void OnViewsHostableDetached() override { parent_accessibility_element_ = nil; } + void OnViewsHostableShow(const gfx::Rect& bounds_in_window) override {} + void OnViewsHostableHide() override {} + void OnViewsHostableMakeFirstResponder() override {} id parent_accessibility_element_ = nil; };
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 680434d5..09fe477 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -144,7 +144,8 @@ DCHECK(GetWidget()->GetRootView()); bridge_host_->SetRootView(GetWidget()->GetRootView()); - bridge()->CreateContentView(GetWidget()->GetRootView()->bounds()); + bridge()->CreateContentView(bridge_host_->GetRootViewNSViewId(), + GetWidget()->GetRootView()->bounds()); if (auto* focus_manager = GetWidget()->GetFocusManager()) { bridge()->MakeFirstResponder(); bridge_host_->SetFocusManager(focus_manager);
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index 6f9b147b..ba40ca3 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -42,6 +42,7 @@ #import "ui/views_bridge_mac/bridged_content_view.h" #import "ui/views_bridge_mac/bridged_native_widget_impl.h" #import "ui/views_bridge_mac/native_widget_mac_nswindow.h" +#include "ui/views_bridge_mac/widget_owner_nswindow_adapter.h" // Donates an implementation of -[NSAnimation stopAnimation] which calls the // original implementation, then quits a nested run loop. @@ -159,6 +160,7 @@ // Make a native NSWindow with the given |style_mask| to use as a parent. TestNativeParentWindow* MakeNativeParentWithStyle(int style_mask) { + WidgetOwnerNSWindowAdapter::AllowForTesting(); native_parent_.reset([[TestNativeParentWindow alloc] initWithContentRect:ParentRect() styleMask:style_mask
diff --git a/ui/views_bridge_mac/bridged_native_widget_impl.h b/ui/views_bridge_mac/bridged_native_widget_impl.h index 450b3ef..218b242 100644 --- a/ui/views_bridge_mac/bridged_native_widget_impl.h +++ b/ui/views_bridge_mac/bridged_native_widget_impl.h
@@ -16,6 +16,7 @@ #include "mojo/public/cpp/bindings/binding.h" #include "ui/accelerated_widget_mac/ca_transaction_observer.h" #include "ui/accelerated_widget_mac/display_ca_layer_tree.h" +#include "ui/base/cocoa/ns_view_ids.h" #include "ui/base/ime/text_input_client.h" #include "ui/display/display_observer.h" #include "ui/views/views_export.h" @@ -205,7 +206,7 @@ void InitWindow(views_bridge_mac::mojom::BridgedNativeWidgetInitParamsPtr params) override; void InitCompositorView() override; - void CreateContentView(const gfx::Rect& bounds) override; + void CreateContentView(uint64_t ns_view_id, const gfx::Rect& bounds) override; void DestroyContentView() override; void CloseWindow() override; void CloseWindowNow() override; @@ -284,6 +285,7 @@ base::scoped_nsobject<NativeWidgetMacNSWindow> window_; base::scoped_nsobject<ViewsNSWindowDelegate> window_delegate_; base::scoped_nsobject<BridgedContentView> bridged_view_; + std::unique_ptr<ui::ScopedNSViewIdMapping> bridged_view_id_mapping_; base::scoped_nsobject<ModalShowAnimationWithLayer> show_animation_; std::unique_ptr<CocoaMouseCapture> mouse_capture_; std::unique_ptr<CocoaWindowMoveLoop> window_move_loop_;
diff --git a/ui/views_bridge_mac/bridged_native_widget_impl.mm b/ui/views_bridge_mac/bridged_native_widget_impl.mm index 8766a0f..6bc4c62 100644 --- a/ui/views_bridge_mac/bridged_native_widget_impl.mm +++ b/ui/views_bridge_mac/bridged_native_widget_impl.mm
@@ -444,15 +444,19 @@ if (!bridged_view_) return; [bridged_view_ clearView]; + bridged_view_id_mapping_.reset(); bridged_view_.reset(); [window_ setContentView:nil]; } -void BridgedNativeWidgetImpl::CreateContentView(const gfx::Rect& bounds) { +void BridgedNativeWidgetImpl::CreateContentView(uint64_t ns_view_id, + const gfx::Rect& bounds) { DCHECK(!bridged_view_); bridged_view_.reset( [[BridgedContentView alloc] initWithBridge:this bounds:bounds]); + bridged_view_id_mapping_ = std::make_unique<ui::ScopedNSViewIdMapping>( + ns_view_id, bridged_view_.get()); // Objective C initializers can return nil. However, if |view| is non-NULL // this should be treated as an error and caught early.
diff --git a/ui/views_bridge_mac/mojo/bridged_native_widget.mojom b/ui/views_bridge_mac/mojo/bridged_native_widget.mojom index e576f99f..0030496 100644 --- a/ui/views_bridge_mac/mojo/bridged_native_widget.mojom +++ b/ui/views_bridge_mac/mojo/bridged_native_widget.mojom
@@ -65,8 +65,9 @@ // BridgedNativeWidgetHost. InitCompositorView(); - // Create the NSView to be the content view for the window. - CreateContentView(gfx.mojom.Rect bounds); + // Create the NSView to be the content view for the window. Use |ns_view_id| + // to look up this NSView in other functions (e.g, to specify a parent view). + CreateContentView(uint64 ns_view_id, gfx.mojom.Rect bounds); // Destroy the content NSView for this window. Note that the window will // become blank once this has been called.
diff --git a/ui/views_bridge_mac/widget_owner_nswindow_adapter.h b/ui/views_bridge_mac/widget_owner_nswindow_adapter.h index 715306d6..b5211fb 100644 --- a/ui/views_bridge_mac/widget_owner_nswindow_adapter.h +++ b/ui/views_bridge_mac/widget_owner_nswindow_adapter.h
@@ -7,6 +7,7 @@ #import "base/mac/scoped_nsobject.h" #include "base/macros.h" +#import "ui/views/views_export.h" #import "ui/views_bridge_mac/bridged_native_widget_owner.h" @class NSView; @@ -19,6 +20,12 @@ // backed by another BridgedNativeWidgetImpl. class WidgetOwnerNSWindowAdapter : public BridgedNativeWidgetOwner { public: + // This class appears to be unused outside of NativeWidgetMacTest. This class + // will crash on instantiation unless AllowForTesting is called. If no crashes + // are reported in the wild, then this class may be removed. + // https://832676 + static VIEWS_EXPORT void AllowForTesting(); + // Create an adapter that will own |child|, tying its lifetime with the // NSWindow containing |anchor_view|. The object is self-deleting, via a call // to RemoveChildWindow() made in child->OnWindowWillClose().
diff --git a/ui/views_bridge_mac/widget_owner_nswindow_adapter.mm b/ui/views_bridge_mac/widget_owner_nswindow_adapter.mm index 47ae95c3..46c389f 100644 --- a/ui/views_bridge_mac/widget_owner_nswindow_adapter.mm +++ b/ui/views_bridge_mac/widget_owner_nswindow_adapter.mm
@@ -44,6 +44,15 @@ namespace views { +namespace { +bool g_allow_widget_owner_ns_window_adapter = false; +} + +// static +void WidgetOwnerNSWindowAdapter::AllowForTesting() { + g_allow_widget_owner_ns_window_adapter = true; +} + WidgetOwnerNSWindowAdapter::WidgetOwnerNSWindowAdapter( BridgedNativeWidgetImpl* child, NSView* anchor_view) @@ -51,6 +60,7 @@ anchor_view_([anchor_view retain]), observer_bridge_( [[WidgetOwnerNSWindowAdapterBridge alloc] initWithAdapter:this]) { + CHECK(g_allow_widget_owner_ns_window_adapter); // Although the |anchor_view| must be in an NSWindow when the child dialog is // created, it's permitted for the |anchor_view| to be removed from its view // hierarchy before the child dialog window is fully removed from screen. When