blob: d7e43482073bb716b06f8e7a02b53c648199e307 [file] [log] [blame]
// Copyright 2014 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/console_message.h"
#include <memory>
#include <utility>
#include "third_party/blink/public/web/web_console_message.h"
#include "third_party/blink/renderer/core/dom/node.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
#include "third_party/blink/renderer/core/workers/worker_thread.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
ConsoleMessage::ConsoleMessage(mojom::ConsoleMessageSource source,
mojom::ConsoleMessageLevel level,
const String& message,
const String& url,
DocumentLoader* loader,
uint64_t request_identifier)
: ConsoleMessage(source,
level,
message,
SourceLocation::Capture(url, 0, 0)) {
request_identifier_ =
IdentifiersFactory::RequestId(loader, request_identifier);
}
ConsoleMessage::ConsoleMessage(mojom::ConsoleMessageLevel level,
const String& message,
std::unique_ptr<SourceLocation> location,
WorkerThread* worker_thread)
: ConsoleMessage(mojom::ConsoleMessageSource::kWorker,
level,
message,
std::move(location)) {
worker_id_ =
IdentifiersFactory::IdFromToken(worker_thread->GetDevToolsWorkerToken());
}
ConsoleMessage::ConsoleMessage(const WebConsoleMessage& message,
LocalFrame* local_frame)
: ConsoleMessage(message.nodes.empty()
? mojom::ConsoleMessageSource::kOther
: mojom::ConsoleMessageSource::kRecommendation,
message.level,
message.text,
std::make_unique<SourceLocation>(message.url,
message.line_number,
message.column_number,
nullptr)) {
if (local_frame) {
Vector<DOMNodeId> nodes;
for (const WebNode& web_node : message.nodes)
nodes.push_back(DOMNodeIds::IdForNode(&(*web_node)));
SetNodes(local_frame, std::move(nodes));
}
}
ConsoleMessage::ConsoleMessage(mojom::ConsoleMessageSource source,
mojom::ConsoleMessageLevel level,
const String& message,
std::unique_ptr<SourceLocation> location)
: source_(source),
level_(level),
message_(message),
location_(std::move(location)),
timestamp_(base::Time::Now().ToDoubleT() * 1000.0),
frame_(nullptr) {
DCHECK(location_);
}
ConsoleMessage::~ConsoleMessage() = default;
SourceLocation* ConsoleMessage::Location() const {
return location_.get();
}
const String& ConsoleMessage::RequestIdentifier() const {
return request_identifier_;
}
double ConsoleMessage::Timestamp() const {
return timestamp_;
}
mojom::ConsoleMessageSource ConsoleMessage::Source() const {
return source_;
}
mojom::ConsoleMessageLevel ConsoleMessage::Level() const {
return level_;
}
const String& ConsoleMessage::Message() const {
return message_;
}
const String& ConsoleMessage::WorkerId() const {
return worker_id_;
}
LocalFrame* ConsoleMessage::Frame() const {
// Do not reference detached frames.
if (frame_ && frame_->Client())
return frame_;
return nullptr;
}
Vector<DOMNodeId>& ConsoleMessage::Nodes() {
return nodes_;
}
void ConsoleMessage::SetNodes(LocalFrame* frame, Vector<DOMNodeId> nodes) {
frame_ = frame;
nodes_ = std::move(nodes);
}
void ConsoleMessage::Trace(Visitor* visitor) const {
visitor->Trace(frame_);
}
} // namespace blink