Commit 76f029c7 authored by Minoru Chikamune's avatar Minoru Chikamune Committed by Commit Bot

Migrate PerformanceResourceTiming to use GC mojo wrappers.

No behavior change. This CL reduces potential risks of use-after-free bugs.

Bug: 1049056
Change-Id: I3513d21c4af320700269118b3b573a794125a6c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2154356
Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771676}
parent 77bdb41a
...@@ -282,7 +282,8 @@ void RemoteFrame::AddResourceTimingFromChild( ...@@ -282,7 +282,8 @@ void RemoteFrame::AddResourceTimingFromChild(
// WorkerTimingContainer for navigation from the calling function. // WorkerTimingContainer for navigation from the calling function.
DOMWindowPerformance::performance(*owner_element->GetDocument().domWindow()) DOMWindowPerformance::performance(*owner_element->GetDocument().domWindow())
->AddResourceTiming(std::move(timing), owner_element->localName(), ->AddResourceTiming(std::move(timing), owner_element->localName(),
/*worker_timing_receiver=*/mojo::NullReceiver()); /*worker_timing_receiver=*/mojo::NullReceiver(),
owner_element->GetDocument().GetExecutionContext());
} }
void RemoteFrame::DidStartLoading() { void RemoteFrame::DidStartLoading() {
......
...@@ -70,7 +70,8 @@ void WorkerResourceTimingNotifierImpl::AddResourceTiming( ...@@ -70,7 +70,8 @@ void WorkerResourceTimingNotifierImpl::AddResourceTiming(
DCHECK(inside_execution_context_->IsContextThread()); DCHECK(inside_execution_context_->IsContextThread());
GetPerformance(*inside_execution_context_) GetPerformance(*inside_execution_context_)
->AddResourceTiming(std::move(info), initiator_type, ->AddResourceTiming(std::move(info), initiator_type,
std::move(worker_timing_receiver)); std::move(worker_timing_receiver),
inside_execution_context_);
} else { } else {
PostCrossThreadTask( PostCrossThreadTask(
*task_runner_, FROM_HERE, *task_runner_, FROM_HERE,
...@@ -93,7 +94,8 @@ void WorkerResourceTimingNotifierImpl::AddCrossThreadResourceTiming( ...@@ -93,7 +94,8 @@ void WorkerResourceTimingNotifierImpl::AddCrossThreadResourceTiming(
DCHECK(outside_execution_context_->IsContextThread()); DCHECK(outside_execution_context_->IsContextThread());
GetPerformance(*outside_execution_context_) GetPerformance(*outside_execution_context_)
->AddResourceTiming(std::move(info), AtomicString(initiator_type), ->AddResourceTiming(std::move(info), AtomicString(initiator_type),
std::move(worker_timing_receiver)); std::move(worker_timing_receiver),
outside_execution_context_);
} }
void WorkerResourceTimingNotifierImpl::Trace(Visitor* visitor) const { void WorkerResourceTimingNotifierImpl::Trace(Visitor* visitor) const {
......
...@@ -503,7 +503,7 @@ void Performance::GenerateAndAddResourceTiming( ...@@ -503,7 +503,7 @@ void Performance::GenerateAndAddResourceTiming(
AddResourceTiming( AddResourceTiming(
GenerateResourceTiming(*security_origin, info, *context), GenerateResourceTiming(*security_origin, info, *context),
!initiator_type.IsNull() ? initiator_type : info.InitiatorType(), !initiator_type.IsNull() ? initiator_type : info.InitiatorType(),
info.TakeWorkerTimingReceiver()); info.TakeWorkerTimingReceiver(), context);
} }
mojom::blink::ResourceTimingInfoPtr Performance::GenerateResourceTiming( mojom::blink::ResourceTimingInfoPtr Performance::GenerateResourceTiming(
...@@ -592,9 +592,11 @@ void Performance::AddResourceTiming( ...@@ -592,9 +592,11 @@ void Performance::AddResourceTiming(
mojom::blink::ResourceTimingInfoPtr info, mojom::blink::ResourceTimingInfoPtr info,
const AtomicString& initiator_type, const AtomicString& initiator_type,
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer> mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>
worker_timing_receiver) { worker_timing_receiver,
ExecutionContext* context) {
auto* entry = MakeGarbageCollected<PerformanceResourceTiming>( auto* entry = MakeGarbageCollected<PerformanceResourceTiming>(
*info, time_origin_, initiator_type, std::move(worker_timing_receiver)); *info, time_origin_, initiator_type, std::move(worker_timing_receiver),
context);
NotifyObserversOfEntry(*entry); NotifyObserversOfEntry(*entry);
// https://w3c.github.io/resource-timing/#dfn-add-a-performanceresourcetiming-entry // https://w3c.github.io/resource-timing/#dfn-add-a-performanceresourcetiming-entry
if (CanAddResourceTimingEntry() && if (CanAddResourceTimingEntry() &&
......
...@@ -180,7 +180,8 @@ class CORE_EXPORT Performance : public EventTargetWithInlineData { ...@@ -180,7 +180,8 @@ class CORE_EXPORT Performance : public EventTargetWithInlineData {
mojom::blink::ResourceTimingInfoPtr, mojom::blink::ResourceTimingInfoPtr,
const AtomicString& initiator_type, const AtomicString& initiator_type,
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer> mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>
worker_timing_receiver); worker_timing_receiver,
ExecutionContext* context);
void NotifyNavigationTimingToObservers(); void NotifyNavigationTimingToObservers();
......
...@@ -57,7 +57,8 @@ PerformanceNavigationTiming::PerformanceNavigationTiming( ...@@ -57,7 +57,8 @@ PerformanceNavigationTiming::PerformanceNavigationTiming(
: g_empty_atom, : g_empty_atom,
time_origin, time_origin,
SecurityOrigin::IsSecure(frame->GetDocument()->Url()), SecurityOrigin::IsSecure(frame->GetDocument()->Url()),
std::move(server_timing)), std::move(server_timing),
frame->DomWindow()),
ExecutionContextClient(frame), ExecutionContextClient(frame),
resource_timing_info_(info) { resource_timing_info_(info) {
DCHECK(frame); DCHECK(frame);
...@@ -317,4 +318,4 @@ void PerformanceNavigationTiming::BuildJSONValue( ...@@ -317,4 +318,4 @@ void PerformanceNavigationTiming::BuildJSONValue(
builder.AddString("type", type()); builder.AddString("type", type());
builder.AddNumber("redirectCount", redirectCount()); builder.AddNumber("redirectCount", redirectCount());
} }
} } // namespace blink
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_response.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
namespace blink { namespace blink {
...@@ -51,7 +52,8 @@ PerformanceResourceTiming::PerformanceResourceTiming( ...@@ -51,7 +52,8 @@ PerformanceResourceTiming::PerformanceResourceTiming(
base::TimeTicks time_origin, base::TimeTicks time_origin,
const AtomicString& initiator_type, const AtomicString& initiator_type,
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer> mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>
worker_timing_receiver) worker_timing_receiver,
ExecutionContext* context)
: PerformanceEntry(AtomicString(info.name), : PerformanceEntry(AtomicString(info.name),
Performance::MonotonicTimeToDOMHighResTimeStamp( Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin, time_origin,
...@@ -83,7 +85,12 @@ PerformanceResourceTiming::PerformanceResourceTiming( ...@@ -83,7 +85,12 @@ PerformanceResourceTiming::PerformanceResourceTiming(
is_secure_context_(info.is_secure_context), is_secure_context_(info.is_secure_context),
server_timing_( server_timing_(
PerformanceServerTiming::FromParsedServerTiming(info.server_timing)), PerformanceServerTiming::FromParsedServerTiming(info.server_timing)),
worker_timing_receiver_(this, std::move(worker_timing_receiver)) {} worker_timing_receiver_(this, context) {
DCHECK(context);
worker_timing_receiver_.Bind(
std::move(worker_timing_receiver),
context->GetTaskRunner(TaskType::kMiscPlatformAPI));
}
// This constructor is for PerformanceNavigationTiming. // This constructor is for PerformanceNavigationTiming.
// TODO(https://crbug.com/900700): Set a Mojo pending receiver for // TODO(https://crbug.com/900700): Set a Mojo pending receiver for
...@@ -93,14 +100,19 @@ PerformanceResourceTiming::PerformanceResourceTiming( ...@@ -93,14 +100,19 @@ PerformanceResourceTiming::PerformanceResourceTiming(
const AtomicString& name, const AtomicString& name,
base::TimeTicks time_origin, base::TimeTicks time_origin,
bool is_secure_context, bool is_secure_context,
HeapVector<Member<PerformanceServerTiming>> server_timing) HeapVector<Member<PerformanceServerTiming>> server_timing,
ExecutionContext* context)
: PerformanceEntry(name, 0.0, 0.0), : PerformanceEntry(name, 0.0, 0.0),
time_origin_(time_origin), time_origin_(time_origin),
context_type_(mojom::RequestContextType::HYPERLINK), context_type_(mojom::RequestContextType::HYPERLINK),
request_destination_(network::mojom::RequestDestination::kDocument), request_destination_(network::mojom::RequestDestination::kDocument),
is_secure_context_(is_secure_context), is_secure_context_(is_secure_context),
server_timing_(std::move(server_timing)), server_timing_(std::move(server_timing)),
worker_timing_receiver_(this, mojo::NullReceiver()) {} worker_timing_receiver_(this, context) {
DCHECK(context);
worker_timing_receiver_.Bind(
mojo::NullReceiver(), context->GetTaskRunner(TaskType::kMiscPlatformAPI));
}
PerformanceResourceTiming::~PerformanceResourceTiming() = default; PerformanceResourceTiming::~PerformanceResourceTiming() = default;
...@@ -442,6 +454,7 @@ void PerformanceResourceTiming::AddPerformanceEntry( ...@@ -442,6 +454,7 @@ void PerformanceResourceTiming::AddPerformanceEntry(
void PerformanceResourceTiming::Trace(Visitor* visitor) const { void PerformanceResourceTiming::Trace(Visitor* visitor) const {
visitor->Trace(server_timing_); visitor->Trace(server_timing_);
visitor->Trace(worker_timing_); visitor->Trace(worker_timing_);
visitor->Trace(worker_timing_receiver_);
PerformanceEntry::Trace(visitor); PerformanceEntry::Trace(visitor);
} }
......
...@@ -32,15 +32,17 @@ ...@@ -32,15 +32,17 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TIMING_PERFORMANCE_RESOURCE_TIMING_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TIMING_PERFORMANCE_RESOURCE_TIMING_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_TIMING_PERFORMANCE_RESOURCE_TIMING_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_TIMING_PERFORMANCE_RESOURCE_TIMING_H_
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
#include "third_party/blink/public/mojom/timing/performance_mark_or_measure.mojom-blink-forward.h" #include "third_party/blink/public/mojom/timing/performance_mark_or_measure.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/timing/resource_timing.mojom-blink.h" #include "third_party/blink/public/mojom/timing/resource_timing.mojom-blink.h"
#include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-blink.h" #include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-blink.h"
#include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h" #include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/timing/performance_entry.h" #include "third_party/blink/renderer/core/timing/performance_entry.h"
#include "third_party/blink/renderer/core/timing/performance_server_timing.h" #include "third_party/blink/renderer/core/timing/performance_server_timing.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
#include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
namespace blink { namespace blink {
...@@ -60,13 +62,15 @@ class CORE_EXPORT PerformanceResourceTiming ...@@ -60,13 +62,15 @@ class CORE_EXPORT PerformanceResourceTiming
const AtomicString& name, const AtomicString& name,
base::TimeTicks time_origin, base::TimeTicks time_origin,
bool is_secure_context, bool is_secure_context,
HeapVector<Member<PerformanceServerTiming>> server_timing); HeapVector<Member<PerformanceServerTiming>> server_timing,
ExecutionContext* context);
PerformanceResourceTiming( PerformanceResourceTiming(
const mojom::blink::ResourceTimingInfo&, const mojom::blink::ResourceTimingInfo&,
base::TimeTicks time_origin, base::TimeTicks time_origin,
const AtomicString& initiator_type, const AtomicString& initiator_type,
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer> mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>
worker_timing_receiver); worker_timing_receiver,
ExecutionContext* context);
~PerformanceResourceTiming() override; ~PerformanceResourceTiming() override;
AtomicString entryType() const override; AtomicString entryType() const override;
...@@ -146,7 +150,10 @@ class CORE_EXPORT PerformanceResourceTiming ...@@ -146,7 +150,10 @@ class CORE_EXPORT PerformanceResourceTiming
// Used for getting entries from a service worker to add to // Used for getting entries from a service worker to add to
// PerformanceResourceTiming#workerTiming. Null when no service worker handles // PerformanceResourceTiming#workerTiming. Null when no service worker handles
// a request for the resource. // a request for the resource.
mojo::Receiver<mojom::blink::WorkerTimingContainer> worker_timing_receiver_; HeapMojoReceiver<mojom::blink::WorkerTimingContainer,
PerformanceResourceTiming,
HeapMojoWrapperMode::kWithoutContextObserver>
worker_timing_receiver_;
}; };
} // namespace blink } // namespace blink
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "third_party/blink/renderer/core/timing/performance_resource_timing.h" #include "third_party/blink/renderer/core/timing/performance_resource_timing.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
namespace blink { namespace blink {
...@@ -14,10 +15,15 @@ class PerformanceResourceTimingTest : public testing::Test { ...@@ -14,10 +15,15 @@ class PerformanceResourceTimingTest : public testing::Test {
const AtomicString& connection_info) { const AtomicString& connection_info) {
mojom::blink::ResourceTimingInfo info; mojom::blink::ResourceTimingInfo info;
info.allow_timing_details = true; info.allow_timing_details = true;
PerformanceResourceTiming timing( std::unique_ptr<DummyPageHolder> dummy_page_holder =
std::make_unique<DummyPageHolder>();
PerformanceResourceTiming* timing =
MakeGarbageCollected<PerformanceResourceTiming>(
info, base::TimeTicks(), /*initiator_type=*/"", info, base::TimeTicks(), /*initiator_type=*/"",
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>()); mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>(),
return timing.GetNextHopProtocol(alpn_negotiated_protocol, connection_info); dummy_page_holder->GetDocument().GetExecutionContext());
return timing->GetNextHopProtocol(alpn_negotiated_protocol,
connection_info);
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment