mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	This change moves the SendProcessMessage method from CefBrowser to CefFrame and adds CefBrowser parameters to OnProcessMessageReceived and OnDraggableRegionsChanged. The internal implementation has changed as follows: - Frame IDs are now a 64-bit combination of the 32-bit render_process_id and render_routing_id values that uniquely identify a RenderFrameHost (RFH). - CefFrameHostImpl objects are now managed by CefBrowserInfo with life span tied to RFH expectations. Specifically, a CefFrameHostImpl object representing a sub-frame will be created when a RenderFrame is created in the renderer process and detached when the associated RenderFrame is deleted or the renderer process in which it runs has died. - The CefFrameHostImpl object representing the main frame will always be valid but the underlying RFH (and associated frame ID) may change over time as a result of cross-origin navigations. Despite these changes calling LoadURL on the main frame object in the browser process will always navigate as expected. - Speculative RFHs, which may be created as a result of a cross-origin navigation and discarded if that navigation is not committed, are now handled correctly (e.g. ignored in most cases until they're committed). - It is less likely, but still possible, to receive a CefFrame object with an invalid frame ID (ID < 0). This can happen in cases where a RFH has not yet been created for a sub-frame. For example, when OnBeforeBrowse is called before initiating navigation in a previously nonexisting sub-frame. To test: All tests pass with NetworkService enabled and disabled.
		
			
				
	
	
		
			180 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2012 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_BROWSER_BROWSER_INFO_H_
 | |
| #define CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
 | |
| #pragma once
 | |
| 
 | |
| #include <set>
 | |
| #include <unordered_map>
 | |
| 
 | |
| #include "include/internal/cef_ptr.h"
 | |
| #include "libcef/common/values_impl.h"
 | |
| 
 | |
| #include "base/containers/unique_ptr_adapters.h"
 | |
| #include "base/memory/ref_counted.h"
 | |
| #include "base/synchronization/lock.h"
 | |
| #include "base/values.h"
 | |
| 
 | |
| namespace content {
 | |
| class RenderFrameHost;
 | |
| }
 | |
| 
 | |
| class CefBrowserHostImpl;
 | |
| class CefFrameHostImpl;
 | |
| 
 | |
| // CefBrowserInfo is used to associate a browser ID and render view/process
 | |
| // IDs with a particular CefBrowserHostImpl. Render view/process IDs may change
 | |
| // during the lifetime of a single CefBrowserHostImpl.
 | |
| //
 | |
| // CefBrowserInfo objects are managed by CefBrowserInfoManager and should not be
 | |
| // created directly.
 | |
| class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
 | |
|  public:
 | |
|   CefBrowserInfo(int browser_id,
 | |
|                  bool is_popup,
 | |
|                  bool is_windowless,
 | |
|                  CefRefPtr<CefDictionaryValue> extra_info);
 | |
| 
 | |
|   int browser_id() const { return browser_id_; }
 | |
|   bool is_popup() const { return is_popup_; }
 | |
|   bool is_windowless() const { return is_windowless_; }
 | |
|   CefRefPtr<CefDictionaryValue> extra_info() const { return extra_info_; }
 | |
| 
 | |
|   // May return NULL if the browser has not yet been created or if the browser
 | |
|   // has been destroyed.
 | |
|   CefRefPtr<CefBrowserHostImpl> browser() const;
 | |
| 
 | |
|   // Set or clear the browser. Called from the CefBrowserHostImpl constructor
 | |
|   // (to set) and DestroyBrowser (to clear).
 | |
|   void SetBrowser(CefRefPtr<CefBrowserHostImpl> browser);
 | |
| 
 | |
|   // Ensure that a frame record exists for |host|. Called for the main frame
 | |
|   // when the RenderView is created, or for a sub-frame when the associated
 | |
|   // RenderFrame is created in the renderer process.
 | |
|   // Called from CefBrowserHostImpl::RenderFrameCreated (is_guest_view = false)
 | |
|   // or CefMimeHandlerViewGuestDelegate::OnGuestAttached (is_guest_view = true).
 | |
|   void MaybeCreateFrame(content::RenderFrameHost* host, bool is_guest_view);
 | |
| 
 | |
|   // Remove the frame record for |host|. Called for the main frame when the
 | |
|   // RenderView is destroyed, or for a sub-frame when the associated RenderFrame
 | |
|   // is destroyed in the renderer process.
 | |
|   // Called from CefBrowserHostImpl::FrameDeleted or
 | |
|   // CefMimeHandlerViewGuestDelegate::OnGuestDetached.
 | |
|   void RemoveFrame(content::RenderFrameHost* host);
 | |
| 
 | |
|   // Returns the main frame object. This object will remain valid until the
 | |
|   // browser is destroyed even though the indentifier may change with cross-
 | |
|   // origin navigations. Furthermore, calling LoadURL on this object will always
 | |
|   // behave as expected because the call is routed through the browser's
 | |
|   // NavigationController.
 | |
|   CefRefPtr<CefFrameHostImpl> GetMainFrame();
 | |
| 
 | |
|   // Creates a temporary sub-frame object for situations during navigation or
 | |
|   // resource loading where a RFH does not yet exist. If |parent_frame_id|
 | |
|   // is invalid the current main frame will be specified as the parent.
 | |
|   // Temporary frame objects are not tracked but will be implicitly detached
 | |
|   // on browser destruction.
 | |
|   CefRefPtr<CefFrameHostImpl> CreateTempSubFrame(int64_t parent_frame_id);
 | |
| 
 | |
|   // Returns the frame object matching the specified host or nullptr if no match
 | |
|   // is found. Nullptr will also be returned if a guest view match is found
 | |
|   // because we don't create frame objects for guest views. If |is_guest_view|
 | |
|   // is non-nullptr it will be set to true in this case. Must be called on the
 | |
|   // UI thread.
 | |
|   CefRefPtr<CefFrameHostImpl> GetFrameForHost(
 | |
|       const content::RenderFrameHost* host,
 | |
|       bool* is_guest_view = nullptr) const;
 | |
| 
 | |
|   // Returns the frame object matching the specified IDs or nullptr if no match
 | |
|   // is found. Nullptr will also be returned if a guest view match is found
 | |
|   // because we don't create frame objects for guest views. If |is_guest_view|
 | |
|   // is non-nullptr it will be set to true in this case. Safe to call from any
 | |
|   // thread.
 | |
|   CefRefPtr<CefFrameHostImpl> GetFrameForRoute(
 | |
|       int32_t render_process_id,
 | |
|       int32_t render_routing_id,
 | |
|       bool* is_guest_view = nullptr) const;
 | |
| 
 | |
|   // Returns the frame object matching the specified ID or nullptr if no match
 | |
|   // is found. Nullptr will also be returned if a guest view match is found
 | |
|   // because we don't create frame objects for guest views. If |is_guest_view|
 | |
|   // is non-nullptr it will be set to true in this case. Safe to call from any
 | |
|   // thread.
 | |
|   CefRefPtr<CefFrameHostImpl> GetFrameForId(
 | |
|       int64_t frame_id,
 | |
|       bool* is_guest_view = nullptr) const;
 | |
| 
 | |
|   // Returns the frame object matching the specified ID or nullptr if no match
 | |
|   // is found. Nullptr will also be returned if a guest view match is found
 | |
|   // because we don't create frame objects for guest views. If |is_guest_view|
 | |
|   // is non-nullptr it will be set to true in this case. Safe to call from any
 | |
|   // thread.
 | |
|   CefRefPtr<CefFrameHostImpl> GetFrameForFrameTreeNode(
 | |
|       int frame_tree_node_id,
 | |
|       bool* is_guest_view = nullptr) const;
 | |
| 
 | |
|   // Returns all non-speculative frame objects that currently exist. Guest views
 | |
|   // will be excluded because they don't have a frame object. Safe to call from
 | |
|   // any thread.
 | |
|   typedef std::set<CefRefPtr<CefFrameHostImpl>> FrameHostList;
 | |
|   FrameHostList GetAllFrames() const;
 | |
| 
 | |
|  private:
 | |
|   friend class base::RefCountedThreadSafe<CefBrowserInfo>;
 | |
| 
 | |
|   virtual ~CefBrowserInfo();
 | |
| 
 | |
|   struct FrameInfo {
 | |
|     ~FrameInfo();
 | |
| 
 | |
|     content::RenderFrameHost* host_;
 | |
|     int64_t frame_id_;  // Combination of render_process_id + render_routing_id.
 | |
|     int frame_tree_node_id_;
 | |
|     bool is_guest_view_;
 | |
|     bool is_main_frame_;
 | |
|     bool is_speculative_;
 | |
|     CefRefPtr<CefFrameHostImpl> frame_;
 | |
|   };
 | |
| 
 | |
|   void MaybeUpdateFrameTreeNodeIdMap(FrameInfo* info);
 | |
| 
 | |
|   CefRefPtr<CefFrameHostImpl> GetFrameForFrameTreeNodeInternal(
 | |
|       int frame_tree_node_id,
 | |
|       bool* is_guest_view = nullptr) const;
 | |
| 
 | |
|   void RemoveAllFrames();
 | |
| 
 | |
|   int browser_id_;
 | |
|   bool is_popup_;
 | |
|   bool is_windowless_;
 | |
|   CefRefPtr<CefDictionaryValue> extra_info_;
 | |
| 
 | |
|   mutable base::Lock lock_;
 | |
| 
 | |
|   // The below members must be protected by |lock_|.
 | |
| 
 | |
|   CefRefPtr<CefBrowserHostImpl> browser_;
 | |
| 
 | |
|   // Owner of FrameInfo structs.
 | |
|   typedef std::set<std::unique_ptr<FrameInfo>, base::UniquePtrComparator>
 | |
|       FrameInfoSet;
 | |
|   FrameInfoSet frame_info_set_;
 | |
| 
 | |
|   // Map a frame ID (e.g. MakeFrameId(process_id, routing_id)) to one frame.
 | |
|   typedef std::unordered_map<int64_t, FrameInfo*> FrameIDMap;
 | |
|   FrameIDMap frame_id_map_;
 | |
| 
 | |
|   // Map a frame_tree_node_id to one frame.
 | |
|   typedef std::unordered_map<int, FrameInfo*> FrameTreeNodeIDMap;
 | |
|   FrameTreeNodeIDMap frame_tree_node_id_map_;
 | |
| 
 | |
|   // The current main frame.
 | |
|   CefRefPtr<CefFrameHostImpl> main_frame_;
 | |
| 
 | |
|   DISALLOW_COPY_AND_ASSIGN(CefBrowserInfo);
 | |
| };
 | |
| 
 | |
| #endif  // CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
 |