// 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. #ifndef CEF_LIBCEF_COMMON_FRAME_UTIL_H_ #define CEF_LIBCEF_COMMON_FRAME_UTIL_H_ #include #include #include "base/logging.h" #include "content/public/browser/child_process_host.h" #include "content/public/browser/global_routing_id.h" namespace content { class NavigationHandle; } namespace frame_util { // Create a frame ID in the format exposed by the CEF API. inline int64_t MakeFrameId(int child_id, int frame_routing_id) { return (static_cast(child_id) << 32) | static_cast(frame_routing_id); } // Create a frame ID in the format exposed by the CEF API. inline int64_t MakeFrameId(const content::GlobalRenderFrameHostId& global_id) { return MakeFrameId(global_id.child_id, global_id.frame_routing_id); } // Returns true if |child_id| is valid. inline bool IsValidChildId(int child_id) { // See comments in ChildProcessHostImpl::GenerateChildProcessUniqueId(). return child_id != content::ChildProcessHost::kInvalidUniqueID && child_id != 0; } // Returns true if |frame_routing_id| is valid. inline bool IsValidRoutingId(int frame_routing_id) { return frame_routing_id != MSG_ROUTING_NONE; } // Returns true if |global_id| is valid. inline bool IsValidGlobalId(const content::GlobalRenderFrameHostId& global_id) { return IsValidChildId(global_id.child_id) && IsValidRoutingId(global_id.frame_routing_id); } // Create a global ID from components. inline content::GlobalRenderFrameHostId MakeGlobalId( int child_id, int frame_routing_id, bool allow_invalid_frame_id = false) { DCHECK(IsValidChildId(child_id)); DCHECK(allow_invalid_frame_id || IsValidRoutingId(frame_routing_id)); return content::GlobalRenderFrameHostId(child_id, frame_routing_id); } // Create a global ID from a frame ID. inline content::GlobalRenderFrameHostId MakeGlobalId(int64_t frame_id) { uint32_t child_id = frame_id >> 32; uint32_t frame_routing_id = std::numeric_limits::max() & frame_id; return MakeGlobalId(child_id, frame_routing_id); } // Returns an invalid global ID value. inline content::GlobalRenderFrameHostId InvalidGlobalId() { return content::GlobalRenderFrameHostId(); } // Returns the best match of global ID for |navigation_handle|. For pre-commit // navigations this will return the current RFH, if any, or an invalid ID. content::GlobalRenderFrameHostId GetGlobalId( content::NavigationHandle* navigation_handle); // Returns a human-readable version of the ID. std::string GetFrameDebugString(int64_t frame_id); std::string GetFrameDebugString( const content::GlobalRenderFrameHostId& global_id); } // namespace frame_util #endif // CEF_LIBCEF_COMMON_FRAME_UTIL_H_