2019-05-24 22:23:43 +02:00
|
|
|
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
|
|
|
|
// reserved. Use of this source code is governed by a BSD-style license that can
|
|
|
|
// be found in the LICENSE file.
|
|
|
|
|
2024-04-30 17:45:07 +02:00
|
|
|
#include "cef/libcef/common/frame_util.h"
|
2021-08-19 23:07:44 +02:00
|
|
|
|
2024-01-26 03:12:43 +01:00
|
|
|
#include "base/strings/string_number_conversions.h"
|
|
|
|
#include "base/strings/stringprintf.h"
|
2024-04-30 17:45:07 +02:00
|
|
|
#include "cef/libcef/browser/thread_util.h"
|
2021-08-19 23:07:44 +02:00
|
|
|
#include "content/public/browser/navigation_handle.h"
|
|
|
|
#include "content/public/browser/render_frame_host.h"
|
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
namespace frame_util {
|
|
|
|
|
2021-08-19 23:07:44 +02:00
|
|
|
content::GlobalRenderFrameHostId GetGlobalId(
|
|
|
|
content::NavigationHandle* navigation_handle) {
|
|
|
|
CEF_REQUIRE_UIT();
|
|
|
|
return navigation_handle->HasCommitted()
|
|
|
|
? navigation_handle->GetRenderFrameHost()->GetGlobalId()
|
|
|
|
: navigation_handle->GetPreviousRenderFrameHostId();
|
2019-05-24 22:23:43 +02:00
|
|
|
}
|
|
|
|
|
2024-01-26 03:12:43 +01:00
|
|
|
std::optional<content::GlobalRenderFrameHostToken> ParseFrameIdentifier(
|
|
|
|
const std::string& identifier) {
|
|
|
|
if (identifier.size() < 3) {
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
|
|
|
|
const size_t pos = identifier.find('-');
|
|
|
|
if (pos == std::string::npos || pos == 0 || pos == identifier.size() - 1) {
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string_view process_id_str(identifier.c_str(), pos);
|
|
|
|
int process_id;
|
|
|
|
if (!base::HexStringToInt(process_id_str, &process_id) ||
|
|
|
|
!IsValidChildId(process_id)) {
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string_view frame_token_str(identifier.c_str() + pos + 1,
|
|
|
|
identifier.size() - pos - 1);
|
|
|
|
auto token = base::Token::FromString(frame_token_str);
|
|
|
|
if (token) {
|
|
|
|
auto unguessable_token =
|
|
|
|
base::UnguessableToken::Deserialize(token->high(), token->low());
|
|
|
|
if (unguessable_token) {
|
|
|
|
return content::GlobalRenderFrameHostToken(
|
|
|
|
process_id, blink::LocalFrameToken(unguessable_token.value()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string MakeFrameIdentifier(
|
|
|
|
const content::GlobalRenderFrameHostToken& global_token) {
|
|
|
|
if (!IsValidGlobalToken(global_token)) {
|
|
|
|
return std::string();
|
|
|
|
}
|
2021-05-21 03:42:58 +02:00
|
|
|
|
2024-01-26 03:12:43 +01:00
|
|
|
// All upper-case hex values.
|
|
|
|
return base::StringPrintf("%X-%s", global_token.child_id,
|
|
|
|
global_token.frame_token.ToString().c_str());
|
2021-05-21 03:42:58 +02:00
|
|
|
}
|
|
|
|
|
2021-08-19 23:07:44 +02:00
|
|
|
std::string GetFrameDebugString(
|
|
|
|
const content::GlobalRenderFrameHostId& global_id) {
|
2024-01-26 03:12:43 +01:00
|
|
|
return base::StringPrintf("[%d,%d]", global_id.child_id,
|
|
|
|
global_id.frame_routing_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string GetFrameDebugString(
|
|
|
|
const content::GlobalRenderFrameHostToken& global_token) {
|
|
|
|
return MakeFrameIdentifier(global_token);
|
2021-08-19 23:07:44 +02:00
|
|
|
}
|
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
} // namespace frame_util
|