From 271a6c3487a14599023a9106329505597638d793 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 30 Aug 2019 10:22:43 +0200 Subject: BASELINE: Update Chromium to 77.0.3865.59 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1e89a5f3b009a9519a6705102ad65c92fe736f21 Reviewed-by: Michael BrĂ¼ning --- chromium/services/audio/group_coordinator-impl.h | 4 +- .../services/audio/group_coordinator_unittest.cc | 16 ++--- .../services/audio/input_controller_unittest.cc | 2 +- chromium/services/audio/loopback_stream.cc | 72 ++++++++++++---------- .../services/audio/loopback_stream_unittest.cc | 2 +- chromium/services/audio/output_controller.cc | 2 +- .../services/audio/output_controller_unittest.cc | 7 ++- chromium/services/audio/service.cc | 9 +++ chromium/services/audio/service.h | 5 ++ chromium/services/audio/service_factory.cc | 7 +++ chromium/services/audio/sync_reader.cc | 6 +- 11 files changed, 81 insertions(+), 51 deletions(-) (limited to 'chromium/services/audio') diff --git a/chromium/services/audio/group_coordinator-impl.h b/chromium/services/audio/group_coordinator-impl.h index 6e10c3bbc3f..5c3b5407599 100644 --- a/chromium/services/audio/group_coordinator-impl.h +++ b/chromium/services/audio/group_coordinator-impl.h @@ -42,7 +42,7 @@ void GroupCoordinator::RegisterMember( const auto it = FindGroup(group_id); std::vector& members = it->second.members; - DCHECK(!base::ContainsValue(members, member)); + DCHECK(!base::Contains(members, member)); members.push_back(member); DCHECK_INCREMENT_MUTATION_COUNT(); DCHECK_REMEMBER_CURRENT_MUTATION_COUNT(); @@ -84,7 +84,7 @@ void GroupCoordinator::AddObserver( DCHECK(observer); std::vector& observers = FindGroup(group_id)->second.observers; - DCHECK(!base::ContainsValue(observers, observer)); + DCHECK(!base::Contains(observers, observer)); observers.push_back(observer); DCHECK_INCREMENT_MUTATION_COUNT(); } diff --git a/chromium/services/audio/group_coordinator_unittest.cc b/chromium/services/audio/group_coordinator_unittest.cc index 91b81c5598c..8dbdfb944f7 100644 --- a/chromium/services/audio/group_coordinator_unittest.cc +++ b/chromium/services/audio/group_coordinator_unittest.cc @@ -72,8 +72,8 @@ TEST(GroupCoordinatorTest, RegistersMembersInSameGroup) { const std::vector& members = coordinator.GetCurrentMembers(group_id); EXPECT_EQ(2u, members.size()); - EXPECT_TRUE(base::ContainsValue(members, &member1)); - EXPECT_TRUE(base::ContainsValue(members, &member2)); + EXPECT_TRUE(base::Contains(members, &member1)); + EXPECT_TRUE(base::Contains(members, &member2)); EXPECT_TRUE( coordinator.GetCurrentMembers(UnguessableToken::Create()).empty()); @@ -120,8 +120,8 @@ TEST(GroupCoordinatorTest, RegistersMembersInDifferentGroups) { const std::vector& members_a = coordinator.GetCurrentMembers(group_id_a); EXPECT_EQ(2u, members_a.size()); - EXPECT_TRUE(base::ContainsValue(members_a, &member_a_1)); - EXPECT_TRUE(base::ContainsValue(members_a, &member_a_2)); + EXPECT_TRUE(base::Contains(members_a, &member_a_1)); + EXPECT_TRUE(base::Contains(members_a, &member_a_2)); EXPECT_EQ(std::vector({&member_b_1}), coordinator.GetCurrentMembers(group_id_b)); EXPECT_TRUE( @@ -155,8 +155,8 @@ TEST(GroupCoordinatorTest, TracksMembersWithoutAnObserverPresent) { const std::vector& members = coordinator.GetCurrentMembers(group_id); EXPECT_EQ(2u, members.size()); - EXPECT_TRUE(base::ContainsValue(members, &member1)); - EXPECT_TRUE(base::ContainsValue(members, &member2)); + EXPECT_TRUE(base::Contains(members, &member1)); + EXPECT_TRUE(base::Contains(members, &member2)); EXPECT_TRUE( coordinator.GetCurrentMembers(UnguessableToken::Create()).empty()); @@ -191,8 +191,8 @@ TEST(GroupCoordinatorTest, NotifiesOnlyWhileObserving) { const std::vector& members = coordinator.GetCurrentMembers(group_id); EXPECT_EQ(2u, members.size()); - EXPECT_TRUE(base::ContainsValue(members, &member1)); - EXPECT_TRUE(base::ContainsValue(members, &member2)); + EXPECT_TRUE(base::Contains(members, &member1)); + EXPECT_TRUE(base::Contains(members, &member2)); coordinator.UnregisterMember(group_id, &member1); EXPECT_EQ(std::vector({&member2}), diff --git a/chromium/services/audio/input_controller_unittest.cc b/chromium/services/audio/input_controller_unittest.cc index de779c8fe7f..02a7e1c7fd2 100644 --- a/chromium/services/audio/input_controller_unittest.cc +++ b/chromium/services/audio/input_controller_unittest.cc @@ -109,7 +109,7 @@ class InputControllerTest : public ::testing::TestWithParam { public: InputControllerTest() : task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME), + base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME), audio_manager_(std::make_unique( std::make_unique(false), &log_factory_)), diff --git a/chromium/services/audio/loopback_stream.cc b/chromium/services/audio/loopback_stream.cc index fed7bb1d524..c30ec22e718 100644 --- a/chromium/services/audio/loopback_stream.cc +++ b/chromium/services/audio/loopback_stream.cc @@ -68,43 +68,32 @@ LoopbackStream::LoopbackStream( observer_.set_disconnect_handler( base::BindOnce(&LoopbackStream::OnError, base::Unretained(this))); - // As of this writing, only machines older than about 10 years won't be able - // to produce high-resolution timestamps. In order to avoid adding extra - // complexity to the implementation, simply refuse to operate without that - // basic level of hardware support. - // // Construct the components of the AudioDataPipe, for delivering the data to // the consumer. If successful, create the FlowNetwork too. - if (base::TimeTicks::IsHighResolution()) { - base::CancelableSyncSocket foreign_socket; - std::unique_ptr writer = InputSyncWriter::Create( - base::BindRepeating( - [](const std::string& message) { VLOG(1) << message; }), - shared_memory_count, params, &foreign_socket); - if (writer) { - base::ReadOnlySharedMemoryRegion shared_memory_region = - writer->TakeSharedMemoryRegion(); - mojo::ScopedHandle socket_handle; - if (shared_memory_region.IsValid()) { - socket_handle = mojo::WrapPlatformFile(foreign_socket.Release()); - if (socket_handle.is_valid()) { - std::move(created_callback) - .Run({base::in_place, std::move(shared_memory_region), - std::move(socket_handle)}); - network_.reset(new FlowNetwork(std::move(flow_task_runner), params, - std::move(writer))); - return; // Success! - } + base::CancelableSyncSocket foreign_socket; + std::unique_ptr writer = InputSyncWriter::Create( + base::BindRepeating( + [](const std::string& message) { VLOG(1) << message; }), + shared_memory_count, params, &foreign_socket); + if (writer) { + base::ReadOnlySharedMemoryRegion shared_memory_region = + writer->TakeSharedMemoryRegion(); + mojo::ScopedHandle socket_handle; + if (shared_memory_region.IsValid()) { + socket_handle = mojo::WrapPlatformFile(foreign_socket.Release()); + if (socket_handle.is_valid()) { + std::move(created_callback) + .Run({base::in_place, std::move(shared_memory_region), + std::move(socket_handle)}); + network_.reset(new FlowNetwork(std::move(flow_task_runner), params, + std::move(writer))); + return; // Success! } } - } else /* if (!base::TimeTicks::IsHighResolution()) */ { - LOG(ERROR) << "Refusing to start loop-back because this machine cannot " - "provide high-resolution timestamps."; } - // If this point is reached, either the TimeTicks clock is not high resolution - // or one or more AudioDataPipe components failed to initialize. Report the - // error. + // If this point is reached, one or more AudioDataPipe components failed to + // initialize. Report the error. std::move(created_callback).Run(nullptr); OnError(); } @@ -174,6 +163,17 @@ void LoopbackStream::OnMemberJoinedGroup(LoopbackGroupMember* member) { return; } + if (!base::TimeTicks::IsHighResolution()) { + // As of this writing, only machines manufactured before 2008 won't be able + // to produce high-resolution timestamps. Since the buffer management logic + // (to mitigate overruns/underruns) depends on them to function correctly, + // simply return early (i.e., never start snooping on the |member|). + TRACE_EVENT_INSTANT0("audio", + "LoopbackStream::OnMemberJoinedGroup Rejected", + TRACE_EVENT_SCOPE_THREAD); + return; + } + TRACE_EVENT1("audio", "LoopbackStream::OnMemberJoinedGroup", "member", member); @@ -194,10 +194,14 @@ void LoopbackStream::OnMemberLeftGroup(LoopbackGroupMember* member) { return; } + const auto snoop_it = snoopers_.find(member); + if (snoop_it == snoopers_.end()) { + // See comments about "high-resolution timestamps" in OnMemberJoinedGroup(). + return; + } + TRACE_EVENT1("audio", "LoopbackStream::OnMemberLeftGroup", "member", member); - const auto snoop_it = snoopers_.find(member); - DCHECK(snoop_it != snoopers_.end()); SnooperNode* const snooper = &(snoop_it->second); member->StopSnooping(snooper); network_->RemoveInput(snooper); @@ -262,7 +266,7 @@ void LoopbackStream::FlowNetwork::AddInput(SnooperNode* node) { if (inputs_.empty()) { HelpDiagnoseCauseOfLoopbackCrash("adding first input"); } - DCHECK(!base::ContainsValue(inputs_, node)); + DCHECK(!base::Contains(inputs_, node)); inputs_.push_back(node); } diff --git a/chromium/services/audio/loopback_stream_unittest.cc b/chromium/services/audio/loopback_stream_unittest.cc index 924bb6b7b82..860eab3793b 100644 --- a/chromium/services/audio/loopback_stream_unittest.cc +++ b/chromium/services/audio/loopback_stream_unittest.cc @@ -252,7 +252,7 @@ class LoopbackStreamTest : public testing::Test { private: base::test::ScopedTaskEnvironment scoped_task_environment_{ - base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME}; + base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME}; LoopbackCoordinator coordinator_; const base::UnguessableToken group_id_; std::vector> sources_; diff --git a/chromium/services/audio/output_controller.cc b/chromium/services/audio/output_controller.cc index cf047970e48..faf7e5570e4 100644 --- a/chromium/services/audio/output_controller.cc +++ b/chromium/services/audio/output_controller.cc @@ -498,7 +498,7 @@ void OutputController::StartSnooping(Snooper* snooper) { // The list will only update on this thread, and only be read on the realtime // audio thread. - DCHECK(!base::ContainsValue(snoopers_, snooper)); + DCHECK(!base::Contains(snoopers_, snooper)); base::AutoLock lock(snooper_lock_); snoopers_.push_back(snooper); } diff --git a/chromium/services/audio/output_controller_unittest.cc b/chromium/services/audio/output_controller_unittest.cc index f3da4563bf6..d837b60a020 100644 --- a/chromium/services/audio/output_controller_unittest.cc +++ b/chromium/services/audio/output_controller_unittest.cc @@ -22,6 +22,7 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_piece.h" +#include "base/test/gmock_callback_support.h" #include "base/test/test_message_loop.h" #include "base/threading/thread.h" #include "base/time/time.h" @@ -32,7 +33,6 @@ #include "media/audio/test_audio_thread.h" #include "media/base/audio_bus.h" #include "media/base/audio_parameters.h" -#include "media/base/gmock_callback_support.h" #include "services/audio/loopback_group_member.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -49,8 +49,9 @@ using media::AudioBus; using media::AudioManager; using media::AudioOutputStream; using media::AudioParameters; -using media::RunClosure; -using media::RunOnceClosure; + +using base::test::RunClosure; +using base::test::RunOnceClosure; namespace audio { namespace { diff --git a/chromium/services/audio/service.cc b/chromium/services/audio/service.cc index 37ebf55513a..aa1551c5941 100644 --- a/chromium/services/audio/service.cc +++ b/chromium/services/audio/service.cc @@ -7,8 +7,10 @@ #include #include "base/bind.h" +#include "base/deferred_sequenced_task_runner.h" #include "base/logging.h" #include "base/macros.h" +#include "base/no_destructor.h" #include "base/single_thread_task_runner.h" #include "base/system/system_monitor.h" #include "base/time/default_tick_clock.h" @@ -83,6 +85,13 @@ Service::~Service() { magic_bytes_ = 0xDEADBEEFu; } +// static +base::DeferredSequencedTaskRunner* Service::GetInProcessTaskRunner() { + static base::NoDestructor> + instance(base::MakeRefCounted()); + return instance->get(); +} + void Service::OnStart() { CHECK_EQ(magic_bytes_, 0x600DC0DEu); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); diff --git a/chromium/services/audio/service.h b/chromium/services/audio/service.h index 66ec0d703c5..b37b5393755 100644 --- a/chromium/services/audio/service.h +++ b/chromium/services/audio/service.h @@ -27,6 +27,7 @@ #include "services/service_manager/public/mojom/service.mojom.h" namespace base { +class DeferredSequencedTaskRunner; class SystemMonitor; } @@ -77,6 +78,10 @@ class Service : public service_manager::Service { mojo::PendingReceiver receiver); ~Service() final; + // Returns a DeferredSequencedTaskRunner to be used to run the audio service + // when launched in the browser process. + static base::DeferredSequencedTaskRunner* GetInProcessTaskRunner(); + // service_manager::Service implementation. void OnStart() final; void OnBindInterface(const service_manager::BindSourceInfo& source_info, diff --git a/chromium/services/audio/service_factory.cc b/chromium/services/audio/service_factory.cc index 965e5313d95..f6c45a2347c 100644 --- a/chromium/services/audio/service_factory.cc +++ b/chromium/services/audio/service_factory.cc @@ -13,6 +13,7 @@ #include "base/optional.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" +#include "build/build_config.h" #include "media/audio/audio_manager.h" #include "media/base/media_switches.h" #include "services/audio/in_process_audio_manager_accessor.h" @@ -51,7 +52,13 @@ base::Optional GetQuitTimeout() { if (auto timeout = GetExperimentalQuitTimeout()) return *timeout >= base::TimeDelta() ? timeout : base::nullopt; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + // On platforms where the audio service have launched, use default timeout + // instead of no lifetime management. + return base::TimeDelta::FromMinutes(15); +#else return base::nullopt; +#endif } } // namespace diff --git a/chromium/services/audio/sync_reader.cc b/chromium/services/audio/sync_reader.cc index ed3b6a92bc0..17889fb4b83 100644 --- a/chromium/services/audio/sync_reader.cc +++ b/chromium/services/audio/sync_reader.cc @@ -218,8 +218,12 @@ void SyncReader::Read(media::AudioBus* dest) { } output_bus_->SetBitstreamDataSize(data_size); output_bus_->SetBitstreamFrames(bitstream_frames); + output_bus_->CopyTo(dest); + return; } - output_bus_->CopyTo(dest); + + // Copy and clip data coming across the shared memory since it's untrusted. + output_bus_->CopyAndClipTo(dest); } void SyncReader::Close() { -- cgit v1.2.1