diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-29 10:46:47 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-11-02 12:02:10 +0000 |
commit | 99677208ff3b216fdfec551fbe548da5520cd6fb (patch) | |
tree | 476a4865c10320249360e859d8fdd3e01833b03a /chromium/content/browser/android | |
parent | c30a6232df03e1efbd9f3b226777b07e087a1122 (diff) | |
download | qtwebengine-chromium-99677208ff3b216fdfec551fbe548da5520cd6fb.tar.gz |
BASELINE: Update Chromium to 86.0.4240.124
Change-Id: Ide0ff151e94cd665ae6521a446995d34a9d1d644
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/content/browser/android')
16 files changed, 255 insertions, 99 deletions
diff --git a/chromium/content/browser/android/DEPS b/chromium/content/browser/android/DEPS index 81b3fee6fc1..b7c51e57b19 100644 --- a/chromium/content/browser/android/DEPS +++ b/chromium/content/browser/android/DEPS @@ -1,3 +1,9 @@ include_rules = [ "+v8", # To support unit tests. ] + +specific_include_rules = { + "tracing_controller_android.*": [ + "+third_party/perfetto", # For tracing using Perfetto. + ] +} diff --git a/chromium/content/browser/android/OWNERS b/chromium/content/browser/android/OWNERS index 13cc5f86a23..c1cdd236b2b 100644 --- a/chromium/content/browser/android/OWNERS +++ b/chromium/content/browser/android/OWNERS @@ -4,3 +4,4 @@ tedchoc@chromium.org yfriedman@chromium.org # COMPONENT: Content>WebApps +# OS: Android diff --git a/chromium/content/browser/android/content_feature_list.cc b/chromium/content/browser/android/content_feature_list.cc index a297f8db048..54f672c92b0 100644 --- a/chromium/content/browser/android/content_feature_list.cc +++ b/chromium/content/browser/android/content_feature_list.cc @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/android/content_feature_list.h" - #include "base/android/jni_string.h" #include "base/feature_list.h" #include "base/notreached.h" @@ -26,7 +24,6 @@ const base::Feature* kFeaturesExposedToJava[] = { &features::kBackgroundMediaRendererHasModerateBinding, &features::kWebBluetoothNewPermissionsBackend, &features::kWebNfc, - &kServiceGroupImportance, }; const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) { @@ -41,10 +38,6 @@ const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) { } // namespace -// Alphabetical: -const base::Feature kServiceGroupImportance{"ServiceGroupImportance", - base::FEATURE_DISABLED_BY_DEFAULT}; - static jboolean JNI_ContentFeatureListImpl_IsEnabled( JNIEnv* env, const JavaParamRef<jstring>& jfeature_name) { diff --git a/chromium/content/browser/android/content_feature_list.h b/chromium/content/browser/android/content_feature_list.h deleted file mode 100644 index 6c2ccd27b93..00000000000 --- a/chromium/content/browser/android/content_feature_list.h +++ /dev/null @@ -1,19 +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. - -#ifndef CONTENT_BROWSER_ANDROID_CONTENT_FEATURE_LIST_H_ -#define CONTENT_BROWSER_ANDROID_CONTENT_FEATURE_LIST_H_ - -#include "base/feature_list.h" - -namespace content { -namespace android { - -// Alphabetical: -extern const base::Feature kServiceGroupImportance; - -} // namespace android -} // namespace content - -#endif // CONTENT_BROWSER_ANDROID_CONTENT_FEATURE_LIST_H_ diff --git a/chromium/content/browser/android/nfc_host.cc b/chromium/content/browser/android/nfc_host.cc index 30517f69b3d..cf0ab7b5d48 100644 --- a/chromium/content/browser/android/nfc_host.cc +++ b/chromium/content/browser/android/nfc_host.cc @@ -50,12 +50,14 @@ void NFCHost::GetNFC(RenderFrameHost* render_frame_host, return; } - // base::Unretained() is safe here because the subscription is canceled when - // this object is destroyed. - subscription_id_ = permission_controller_->SubscribePermissionStatusChange( - PermissionType::NFC, render_frame_host, origin_url, - base::BindRepeating(&NFCHost::OnPermissionStatusChange, - base::Unretained(this))); + if (subscription_id_ == PermissionController::kNoPendingOperation) { + // base::Unretained() is safe here because the subscription is canceled when + // this object is destroyed. + subscription_id_ = permission_controller_->SubscribePermissionStatusChange( + PermissionType::NFC, render_frame_host, origin_url, + base::BindRepeating(&NFCHost::OnPermissionStatusChange, + base::Unretained(this))); + } if (!nfc_provider_) { content::GetDeviceService().BindNFCProvider( @@ -99,8 +101,10 @@ void NFCHost::OnPermissionStatusChange(blink::mojom::PermissionStatus status) { void NFCHost::Close() { nfc_provider_.reset(); - if (subscription_id_ != 0) + if (subscription_id_ != PermissionController::kNoPendingOperation) { permission_controller_->UnsubscribePermissionStatusChange(subscription_id_); + subscription_id_ = PermissionController::kNoPendingOperation; + } } } // namespace content diff --git a/chromium/content/browser/android/nfc_host.h b/chromium/content/browser/android/nfc_host.h index 8df7cbec810..1d203274b6f 100644 --- a/chromium/content/browser/android/nfc_host.h +++ b/chromium/content/browser/android/nfc_host.h @@ -6,6 +6,7 @@ #define CONTENT_BROWSER_ANDROID_NFC_HOST_H_ #include "base/android/jni_android.h" +#include "content/public/browser/permission_controller.h" #include "content/public/browser/web_contents_observer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -44,7 +45,7 @@ class NFCHost : public WebContentsObserver { mojo::Remote<device::mojom::NFCProvider> nfc_provider_; // Permission change subscription ID provided by |permission_controller_|. - int subscription_id_ = 0; + int subscription_id_ = PermissionController::kNoPendingOperation; DISALLOW_COPY_AND_ASSIGN(NFCHost); }; diff --git a/chromium/content/browser/android/nfc_host_unittest.cc b/chromium/content/browser/android/nfc_host_unittest.cc new file mode 100644 index 00000000000..cac46256649 --- /dev/null +++ b/chromium/content/browser/android/nfc_host_unittest.cc @@ -0,0 +1,79 @@ +// Copyright 2020 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/android/nfc_host.h" + +#include "content/browser/web_contents/web_contents_impl.h" +#include "content/public/test/mock_permission_manager.h" +#include "content/public/test/test_browser_context.h" +#include "content/test/test_render_view_host.h" +#include "content/test/test_web_contents.h" +#include "services/device/public/mojom/nfc.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::Return; + +namespace content { + +namespace { + +constexpr char kTestUrl[] = "https://www.google.com"; + +} + +class NFCHostTest : public RenderViewHostImplTestHarness { + protected: + NFCHostTest() = default; + ~NFCHostTest() override = default; + + NFCHostTest(const NFCHostTest& other) = delete; + NFCHostTest& operator=(const NFCHostTest& other) = delete; + + void SetUp() override { + RenderViewHostImplTestHarness::SetUp(); + auto mock_permission_manager = std::make_unique<MockPermissionManager>(); + mock_permission_manager_ = mock_permission_manager.get(); + static_cast<TestBrowserContext*>(browser_context()) + ->SetPermissionControllerDelegate(std::move(mock_permission_manager)); + } + + MockPermissionManager& mock_permission_manager() { + return *mock_permission_manager_; + } + + private: + MockPermissionManager* mock_permission_manager_; +}; + +TEST_F(NFCHostTest, GetNFCTwice) { + constexpr int kSubscriptionId = 42; + + NavigateAndCommit(GURL(kTestUrl)); + + EXPECT_CALL(mock_permission_manager(), + GetPermissionStatusForFrame(PermissionType::NFC, main_rfh(), _)) + .WillOnce(Return(blink::mojom::PermissionStatus::GRANTED)) + .WillOnce(Return(blink::mojom::PermissionStatus::GRANTED)); + EXPECT_CALL(mock_permission_manager(), + SubscribePermissionStatusChange(PermissionType::NFC, main_rfh(), + GURL(kTestUrl), _)) + .WillOnce(Return(kSubscriptionId)); + + mojo::Remote<device::mojom::NFC> nfc1, nfc2; + contents()->GetNFC(main_rfh(), nfc1.BindNewPipeAndPassReceiver()); + contents()->GetNFC(main_rfh(), nfc2.BindNewPipeAndPassReceiver()); + + nfc1.FlushForTesting(); + nfc2.FlushForTesting(); + EXPECT_TRUE(nfc1.is_bound()); + EXPECT_TRUE(nfc2.is_bound()); + + EXPECT_CALL(mock_permission_manager(), + UnsubscribePermissionStatusChange(kSubscriptionId)); + + DeleteContents(); +} + +} // namespace content diff --git a/chromium/content/browser/android/overscroll_controller_android.cc b/chromium/content/browser/android/overscroll_controller_android.cc index af013af38de..db6066cb3a2 100644 --- a/chromium/content/browser/android/overscroll_controller_android.cc +++ b/chromium/content/browser/android/overscroll_controller_android.cc @@ -4,17 +4,17 @@ #include "content/browser/android/overscroll_controller_android.h" -#include "base/android/build_info.h" #include "base/command_line.h" +#include "base/metrics/field_trial_params.h" #include "cc/layers/layer.h" #include "components/viz/common/quads/compositor_frame_metadata.h" #include "content/public/browser/navigation_controller.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/use_zoom_for_dsf_policy.h" #include "third_party/blink/public/common/input/web_gesture_event.h" #include "third_party/blink/public/common/input/web_input_event.h" #include "ui/android/edge_effect.h" -#include "ui/android/edge_effect_l.h" #include "ui/android/resources/resource_manager.h" #include "ui/android/window_android.h" #include "ui/android/window_android_compositor.h" @@ -23,8 +23,6 @@ using ui::DidOverscrollParams; using ui::EdgeEffect; -using ui::EdgeEffectBase; -using ui::EdgeEffectL; using ui::OverscrollGlow; using ui::OverscrollGlowClient; using ui::OverscrollRefresh; @@ -36,40 +34,13 @@ namespace { // be suppressed. This value was experimentally determined to provide a // reasonable balance between avoiding accidental refresh activation and // minimizing the wait required to refresh after the glow has been triggered. -const float kMinGlowAlphaToDisableRefreshOnL = 0.085f; - -// Used for conditional creation of EdgeEffect types for the overscroll glow. -bool IsAndroidLOrNewer() { - static bool android_l_or_newer = - base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_LOLLIPOP; - return android_l_or_newer; -} - -// Suppressing refresh detection when the glow is still animating prevents -// visual confusion and accidental activation after repeated scrolls. -float MinGlowAlphaToDisableRefresh() { - // Only the L effect is guaranteed to be both sufficiently brief and prominent - // to provide a meaningful "wait" signal. The refresh effect on previous - // Android releases can be quite faint, depending on the OEM-supplied - // overscroll resources, and lasts nearly twice as long. - if (IsAndroidLOrNewer()) - return kMinGlowAlphaToDisableRefreshOnL; - - // Any value greater than 1 effectively prevents the glow effect from ever - // suppressing the refresh effect. - return 1.01f; -} +const float kMinGlowAlphaToDisableRefresh = 0.085f; -std::unique_ptr<EdgeEffectBase> CreateGlowEdgeEffect( +std::unique_ptr<EdgeEffect> CreateGlowEdgeEffect( ui::ResourceManager* resource_manager, float dpi_scale) { DCHECK(resource_manager); - if (IsAndroidLOrNewer()) - return std::unique_ptr<EdgeEffectBase>(new EdgeEffectL(resource_manager)); - - return std::unique_ptr<EdgeEffectBase>( - new EdgeEffect(resource_manager, dpi_scale)); + return std::make_unique<EdgeEffect>(resource_manager); } std::unique_ptr<OverscrollGlow> CreateGlowEffect(OverscrollGlowClient* client) { @@ -89,8 +60,13 @@ std::unique_ptr<OverscrollRefresh> CreateRefreshEffect( return nullptr; } + float edge_width = base::GetFieldTrialParamByFeatureAsInt( + features::kOverscrollHistoryNavigation, + "gesture_navigation_triggering_area_width", + OverscrollRefresh::kDefaultNavigationEdgeWidth) * + dpi_scale; return std::make_unique<OverscrollRefresh>(overscroll_refresh_handler, - dpi_scale); + edge_width); } } // namespace @@ -145,7 +121,7 @@ bool OverscrollControllerAndroid::WillHandleGestureEvent( // Suppress refresh detection if the glow effect is still prominent. if (glow_effect_ && glow_effect_->IsActive()) { - if (glow_effect_->GetVisibleAlpha() > MinGlowAlphaToDisableRefresh()) + if (glow_effect_->GetVisibleAlpha() > kMinGlowAlphaToDisableRefresh) return false; } @@ -331,8 +307,7 @@ void OverscrollControllerAndroid::Disable() { } } -std::unique_ptr<EdgeEffectBase> -OverscrollControllerAndroid::CreateEdgeEffect() { +std::unique_ptr<EdgeEffect> OverscrollControllerAndroid::CreateEdgeEffect() { return CreateGlowEdgeEffect(&compositor_->GetResourceManager(), dpi_scale_); } diff --git a/chromium/content/browser/android/overscroll_controller_android.h b/chromium/content/browser/android/overscroll_controller_android.h index 2ff14f62902..316fc8836fc 100644 --- a/chromium/content/browser/android/overscroll_controller_android.h +++ b/chromium/content/browser/android/overscroll_controller_android.h @@ -87,7 +87,7 @@ class CONTENT_EXPORT OverscrollControllerAndroid std::unique_ptr<ui::OverscrollRefresh> refresh_effect); // OverscrollGlowClient implementation. - std::unique_ptr<ui::EdgeEffectBase> CreateEdgeEffect() override; + std::unique_ptr<ui::EdgeEffect> CreateEdgeEffect() override; void SetNeedsAnimate(); diff --git a/chromium/content/browser/android/overscroll_controller_android_unittest.cc b/chromium/content/browser/android/overscroll_controller_android_unittest.cc index ab6cd0d1d56..7b3b77a1b71 100644 --- a/chromium/content/browser/android/overscroll_controller_android_unittest.cc +++ b/chromium/content/browser/android/overscroll_controller_android_unittest.cc @@ -19,14 +19,14 @@ #include "ui/events/base_event_utils.h" #include "ui/events/blink/did_overscroll_params.h" -using ui::EdgeEffectBase; -using ui::ResourceManager; +using ::testing::_; +using ::testing::Return; +using ui::EdgeEffect; using ui::OverscrollGlow; using ui::OverscrollGlowClient; using ui::OverscrollRefresh; +using ui::ResourceManager; using ui::WindowAndroidCompositor; -using ::testing::_; -using ::testing::Return; namespace content { @@ -52,7 +52,7 @@ class MockCompositor : public WindowAndroidCompositor { class MockGlowClient : public OverscrollGlowClient { public: - MOCK_METHOD0(CreateEdgeEffect, std::unique_ptr<EdgeEffectBase>()); + MOCK_METHOD0(CreateEdgeEffect, std::unique_ptr<EdgeEffect>()); }; class MockGlow : public OverscrollGlow { diff --git a/chromium/content/browser/android/synchronous_compositor_host.cc b/chromium/content/browser/android/synchronous_compositor_host.cc index 7afaf4ea786..76914190d5d 100644 --- a/chromium/content/browser/android/synchronous_compositor_host.cc +++ b/chromium/content/browser/android/synchronous_compositor_host.cc @@ -464,9 +464,6 @@ void SynchronousCompositorHost::DidPresentCompositorFrames( void SynchronousCompositorHost::UpdatePresentedFrameToken( uint32_t frame_token) { - if (!viz::FrameTokenGT(frame_token, last_frame_token_)) - return; - last_frame_token_ = frame_token; rwhva_->FrameTokenChangedForSynchronousCompositor(frame_token, root_scroll_offset_); } diff --git a/chromium/content/browser/android/synchronous_compositor_host.h b/chromium/content/browser/android/synchronous_compositor_host.h index e3b50b3d673..aeb7236ee7b 100644 --- a/chromium/content/browser/android/synchronous_compositor_host.h +++ b/chromium/content/browser/android/synchronous_compositor_host.h @@ -180,9 +180,6 @@ class CONTENT_EXPORT SynchronousCompositorHost float min_page_scale_factor_ = 0.f; float max_page_scale_factor_ = 0.f; - // From viz display. - uint32_t last_frame_token_ = 0u; - scoped_refptr<SynchronousCompositorSyncCallBridge> bridge_; // Indicates whether and for what reason a request for begin frames has been diff --git a/chromium/content/browser/android/tracing_controller_android.cc b/chromium/content/browser/android/tracing_controller_android.cc index 9c6c152f726..b1dcbc8dae6 100644 --- a/chromium/content/browser/android/tracing_controller_android.cc +++ b/chromium/content/browser/android/tracing_controller_android.cc @@ -16,12 +16,56 @@ #include "content/browser/tracing/tracing_controller_impl.h" #include "content/public/android/content_jni_headers/TracingControllerAndroidImpl_jni.h" #include "content/public/browser/tracing_controller.h" +#include "services/tracing/public/cpp/perfetto/perfetto_config.h" +#include "services/tracing/public/cpp/perfetto/perfetto_session.h" +#include "services/tracing/public/cpp/perfetto/trace_packet_tokenizer.h" +#include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_packet.h" +#include "third_party/perfetto/include/perfetto/tracing/tracing.h" +#include "third_party/perfetto/protos/perfetto/common/trace_stats.gen.h" using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaGlobalRef; namespace content { +namespace { + +// Currently active tracing session. +perfetto::TracingSession* g_tracing_session = nullptr; + +void ReadProtobufTraceData( + scoped_refptr<TracingController::TraceDataEndpoint> endpoint, + perfetto::TracingSession::ReadTraceCallbackArgs args) { + if (args.size) { + auto data_string = std::make_unique<std::string>(args.data, args.size); + endpoint->ReceiveTraceChunk(std::move(data_string)); + } + if (!args.has_more) + endpoint->ReceivedTraceFinalContents(); +} + +void ReadJsonTraceData( + scoped_refptr<TracingController::TraceDataEndpoint> endpoint, + tracing::TracePacketTokenizer& tokenizer, + perfetto::TracingSession::ReadTraceCallbackArgs args) { + if (args.size) { + auto packets = + tokenizer.Parse(reinterpret_cast<const uint8_t*>(args.data), args.size); + for (const auto& packet : packets) { + for (const auto& slice : packet.slices()) { + auto data_string = std::make_unique<std::string>( + reinterpret_cast<const char*>(slice.start), slice.size); + endpoint->ReceiveTraceChunk(std::move(data_string)); + } + } + } + if (!args.has_more) { + DCHECK(!tokenizer.has_more()); + endpoint->ReceivedTraceFinalContents(); + } +} + +} // namespace static jlong JNI_TracingControllerAndroidImpl_Init( JNIEnv* env, @@ -44,7 +88,8 @@ bool TracingControllerAndroid::StartTracing( JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jstring>& jcategories, - const JavaParamRef<jstring>& jtraceoptions) { + const JavaParamRef<jstring>& jtraceoptions, + bool use_protobuf) { std::string categories = base::android::ConvertJavaStringToUTF8(env, jcategories); std::string options = @@ -53,16 +98,23 @@ bool TracingControllerAndroid::StartTracing( // This log is required by adb_profile_chrome.py. LOG(WARNING) << "Logging performance trace to file"; - return TracingController::GetInstance()->StartTracing( - base::trace_event::TraceConfig(categories, options), - TracingController::StartTracingDoneCallback()); + base::trace_event::TraceConfig trace_config(categories, options); + perfetto::TraceConfig perfetto_config = tracing::GetDefaultPerfettoConfig( + base::trace_event::TraceConfig(), /*privacy_filtering_enabled=*/false, + /*convert_to_legacy_json=*/!use_protobuf); + delete g_tracing_session; + g_tracing_session = perfetto::Tracing::NewTrace().release(); + g_tracing_session->Setup(perfetto_config); + g_tracing_session->Start(); + return true; } void TracingControllerAndroid::StopTracing( JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jstring>& jfilepath, - bool compressfile, + bool compress_file, + bool use_protobuf, const base::android::JavaParamRef<jobject>& callback) { base::FilePath file_path( base::android::ConvertJavaStringToUTF8(env, jfilepath)); @@ -70,14 +122,43 @@ void TracingControllerAndroid::StopTracing( auto endpoint = TracingController::CreateFileEndpoint( file_path, base::BindOnce(&TracingControllerAndroid::OnTracingStopped, weak_factory_.GetWeakPtr(), global_callback)); - if (compressfile) { - endpoint = - TracingControllerImpl::CreateCompressedStringEndpoint(endpoint, true); - } - if (!TracingController::GetInstance()->StopTracing(endpoint)) { - LOG(ERROR) << "EndTracingAsync failed, forcing an immediate stop"; + + if (!g_tracing_session) { + LOG(ERROR) << "Tried to stop a non-existent tracing session"; OnTracingStopped(global_callback); + return; + } + + if (compress_file) { + endpoint = TracingControllerImpl::CreateCompressedStringEndpoint( + endpoint, /*compress_with_background_priority=*/true); + } + + auto session = base::MakeRefCounted< + base::RefCountedData<std::unique_ptr<perfetto::TracingSession>>>( + base::WrapUnique(g_tracing_session)); + g_tracing_session = nullptr; + if (use_protobuf) { + session->data->SetOnStopCallback([session, endpoint] { + session->data->ReadTrace( + [session, + endpoint](perfetto::TracingSession::ReadTraceCallbackArgs args) { + ReadProtobufTraceData(endpoint, args); + }); + }); + } else { + auto tokenizer = base::MakeRefCounted< + base::RefCountedData<std::unique_ptr<tracing::TracePacketTokenizer>>>( + std::make_unique<tracing::TracePacketTokenizer>()); + session->data->SetOnStopCallback([session, tokenizer, endpoint] { + session->data->ReadTrace( + [session, tokenizer, + endpoint](perfetto::TracingSession::ReadTraceCallbackArgs args) { + ReadJsonTraceData(endpoint, *tokenizer->data, args); + }); + }); } + session->data->Stop(); } void TracingControllerAndroid::GenerateTracingFilePath( @@ -102,6 +183,7 @@ bool TracingControllerAndroid::GetKnownCategoriesAsync( const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& callback) { ScopedJavaGlobalRef<jobject> global_callback(env, callback); + // TODO(skyostil): Get the categories from Perfetto instead. return TracingController::GetInstance()->GetCategories( base::BindOnce(&TracingControllerAndroid::OnKnownCategoriesReceived, weak_factory_.GetWeakPtr(), global_callback)); @@ -146,9 +228,37 @@ bool TracingControllerAndroid::GetTraceBufferUsageAsync( const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& callback) { ScopedJavaGlobalRef<jobject> global_callback(env, callback); - return TracingController::GetInstance()->GetTraceBufferUsage( + auto weak_callback = base::BindOnce(&TracingControllerAndroid::OnTraceBufferUsageReceived, - weak_factory_.GetWeakPtr(), global_callback)); + weak_factory_.GetWeakPtr(), global_callback); + + if (!g_tracing_session) { + std::move(weak_callback) + .Run(/*percent_full=*/0.f, /*approximate_event_count=*/0); + return true; + } + + // |weak_callback| is move-only, so in order to pass it through a copied + // lambda we need to temporarily move it on the heap. + auto shared_callback = base::MakeRefCounted< + base::RefCountedData<base::OnceCallback<void(float, size_t)>>>( + std::move(weak_callback)); + g_tracing_session->GetTraceStats( + [shared_callback]( + perfetto::TracingSession::GetTraceStatsCallbackArgs args) { + float percent_full = 0; + perfetto::protos::gen::TraceStats trace_stats; + if (args.success && + trace_stats.ParseFromArray(args.trace_stats_data.data(), + args.trace_stats_data.size())) { + percent_full = tracing::GetTraceBufferUsage(trace_stats); + } + // TODO(skyostil): Remove approximate_event_count since no-one is using + // it. + std::move(shared_callback->data) + .Run(percent_full, /*approximate_event_count=*/0); + }); + return true; } void TracingControllerAndroid::OnTraceBufferUsageReceived( diff --git a/chromium/content/browser/android/tracing_controller_android.h b/chromium/content/browser/android/tracing_controller_android.h index a88fab3afd6..4b24221908f 100644 --- a/chromium/content/browser/android/tracing_controller_android.h +++ b/chromium/content/browser/android/tracing_controller_android.h @@ -23,11 +23,13 @@ class TracingControllerAndroid { bool StartTracing(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jstring>& categories, - const base::android::JavaParamRef<jstring>& trace_options); + const base::android::JavaParamRef<jstring>& trace_options, + bool use_protobuf); void StopTracing(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jstring>& jfilepath, - bool compressfile, + bool compress_file, + bool use_protobuf, const base::android::JavaParamRef<jobject>& callback); bool GetKnownCategoriesAsync( JNIEnv* env, diff --git a/chromium/content/browser/android/web_contents_observer_proxy.cc b/chromium/content/browser/android/web_contents_observer_proxy.cc index a25075d291d..bc7a45617ab 100644 --- a/chromium/content/browser/android/web_contents_observer_proxy.cc +++ b/chromium/content/browser/android/web_contents_observer_proxy.cc @@ -68,6 +68,14 @@ void WebContentsObserverProxy::WebContentsDestroyed() { Java_WebContentsObserverProxy_destroy(env, java_observer_); } +void WebContentsObserverProxy::RenderFrameCreated( + RenderFrameHost* render_frame_host) { + JNIEnv* env = AttachCurrentThread(); + Java_WebContentsObserverProxy_renderFrameCreated( + env, java_observer_, render_frame_host->GetProcess()->GetID(), + render_frame_host->GetRoutingID()); +} + void WebContentsObserverProxy::RenderViewReady() { JNIEnv* env = AttachCurrentThread(); Java_WebContentsObserverProxy_renderViewReady(env, java_observer_); diff --git a/chromium/content/browser/android/web_contents_observer_proxy.h b/chromium/content/browser/android/web_contents_observer_proxy.h index 1b5271cb10a..a33a64e3276 100644 --- a/chromium/content/browser/android/web_contents_observer_proxy.h +++ b/chromium/content/browser/android/web_contents_observer_proxy.h @@ -20,6 +20,7 @@ namespace content { class WebContents; +class RenderFrameHost; // Extends WebContentsObserver for providing a public Java API for some of the // the calls it receives. @@ -31,6 +32,7 @@ class WebContentsObserverProxy : public WebContentsObserver { void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); private: + void RenderFrameCreated(RenderFrameHost* render_frame_host) override; void RenderViewReady() override; void RenderProcessGone(base::TerminationStatus termination_status) override; void DidStartLoading() override; |