summaryrefslogtreecommitdiff
path: root/chromium/content/browser/android
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-29 10:46:47 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-11-02 12:02:10 +0000
commit99677208ff3b216fdfec551fbe548da5520cd6fb (patch)
tree476a4865c10320249360e859d8fdd3e01833b03a /chromium/content/browser/android
parentc30a6232df03e1efbd9f3b226777b07e087a1122 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/content/browser/android/DEPS6
-rw-r--r--chromium/content/browser/android/OWNERS1
-rw-r--r--chromium/content/browser/android/content_feature_list.cc7
-rw-r--r--chromium/content/browser/android/content_feature_list.h19
-rw-r--r--chromium/content/browser/android/nfc_host.cc18
-rw-r--r--chromium/content/browser/android/nfc_host.h3
-rw-r--r--chromium/content/browser/android/nfc_host_unittest.cc79
-rw-r--r--chromium/content/browser/android/overscroll_controller_android.cc51
-rw-r--r--chromium/content/browser/android/overscroll_controller_android.h2
-rw-r--r--chromium/content/browser/android/overscroll_controller_android_unittest.cc10
-rw-r--r--chromium/content/browser/android/synchronous_compositor_host.cc3
-rw-r--r--chromium/content/browser/android/synchronous_compositor_host.h3
-rw-r--r--chromium/content/browser/android/tracing_controller_android.cc136
-rw-r--r--chromium/content/browser/android/tracing_controller_android.h6
-rw-r--r--chromium/content/browser/android/web_contents_observer_proxy.cc8
-rw-r--r--chromium/content/browser/android/web_contents_observer_proxy.h2
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;