blob: e9710ada06fd648de05ab41c3b2dc5f8d103a17d [file] [log] [blame]
// 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 "third_party/blink/renderer/core/inspector/inspector_issue_reporter.h"
#include "base/optional.h"
#include "base/unguessable_token.h"
#include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-blink.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
#include "third_party/blink/renderer/core/inspector/inspector_issue_storage.h"
#include "third_party/blink/renderer/platform/heap/visitor.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
namespace blink {
InspectorIssueReporter::InspectorIssueReporter(InspectorIssueStorage* storage)
: storage_(storage) {}
InspectorIssueReporter::~InspectorIssueReporter() = default;
void InspectorIssueReporter::Trace(Visitor* visitor) const {
visitor->Trace(storage_);
}
void InspectorIssueReporter::DidFailLoading(
CoreProbeSink* sink,
uint64_t identifier,
DocumentLoader* loader,
const ResourceError& error,
const base::UnguessableToken& token) {
if (!storage_)
return;
base::Optional<network::mojom::BlockedByResponseReason>
blocked_by_response_reason = error.GetBlockedByResponseReason();
if (!blocked_by_response_reason)
return;
auto blocked_by_response_details =
mojom::blink::BlockedByResponseIssueDetails::New();
blocked_by_response_details->reason = *blocked_by_response_reason;
auto affected_request = mojom::blink::AffectedRequest::New();
affected_request->request_id =
IdentifiersFactory::RequestId(loader, identifier);
affected_request->url = error.FailingURL();
blocked_by_response_details->request = std::move(affected_request);
auto affected_frame = mojom::blink::AffectedFrame::New();
affected_frame->frame_id = IdentifiersFactory::IdFromToken(token);
blocked_by_response_details->parentFrame = std::move(affected_frame);
auto details = mojom::blink::InspectorIssueDetails::New();
details->blocked_by_response_issue_details =
std::move(blocked_by_response_details);
storage_->AddInspectorIssue(
sink, mojom::blink::InspectorIssueInfo::New(
mojom::blink::InspectorIssueCode::kBlockedByResponseIssue,
std::move(details)));
}
} // namespace blink