blob: f856b110c99998888ecb9d306ba7a36abb6c0d01 [file] [log] [blame]
// Copyright 2016 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/frame_host/frame_tree_node_blame_context.h"
#include "base/process/process_handle.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/traced_value.h"
#include "content/browser/frame_host/frame_tree.h"
#include "url/gurl.h"
namespace content {
namespace {
const char kFrameTreeNodeBlameContextCategory[] = "navigation";
const char kFrameTreeNodeBlameContextName[] = "FrameTreeNodeBlameContext";
const char kFrameTreeNodeBlameContextType[] = "FrameTreeNode";
const char kFrameTreeNodeBlameContextScope[] = "FrameTreeNode";
const char kRenderFrameBlameContextScope[] = "RenderFrame";
} // namespace
FrameTreeNodeBlameContext::FrameTreeNodeBlameContext(int node_id,
FrameTreeNode* parent)
: base::trace_event::BlameContext(kFrameTreeNodeBlameContextCategory,
kFrameTreeNodeBlameContextName,
kFrameTreeNodeBlameContextType,
kFrameTreeNodeBlameContextScope,
node_id,
parent ? &parent->blame_context()
: nullptr) {}
FrameTreeNodeBlameContext::~FrameTreeNodeBlameContext() {}
void FrameTreeNodeBlameContext::AsValueInto(
base::trace_event::TracedValue* value) {
BlameContext::AsValueInto(value);
// id() is equal to the owner FrameTreeNode's id, as set in the constructor.
FrameTreeNode* owner = FrameTreeNode::GloballyFindByID(id());
DCHECK(owner);
RenderFrameHostImpl* current_frame_host = owner->current_frame_host();
if (!current_frame_host)
return;
int process_id = base::kNullProcessId;
if (current_frame_host->GetProcess()->GetProcess().IsValid())
process_id = current_frame_host->GetProcess()->GetProcess().Pid();
if (process_id >= 0) {
int routing_id = current_frame_host->GetRoutingID();
DCHECK_NE(routing_id, MSG_ROUTING_NONE);
value->BeginDictionary("renderFrame");
value->SetInteger("pid_ref", process_id);
value->SetString("id_ref", base::StringPrintf("0x%x", routing_id));
value->SetString("scope", kRenderFrameBlameContextScope);
value->EndDictionary();
}
GURL url = current_frame_host->GetLastCommittedURL();
if (url.is_valid())
value->SetString("url", url.spec());
}
} // namespace content