2015-11-17 19:20:13 +01:00
|
|
|
// Copyright 2015 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_MANAGER_H_
|
|
|
|
#define CEF_LIBCEF_BROWSER_BROWSER_INFO_MANAGER_H_
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "include/cef_client.h"
|
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
#include <map>
|
2017-07-27 01:19:27 +02:00
|
|
|
#include <memory>
|
|
|
|
#include <vector>
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
#include "libcef/browser/browser_info.h"
|
|
|
|
|
|
|
|
#include "base/synchronization/lock.h"
|
|
|
|
#include "content/public/browser/render_process_host_observer.h"
|
2019-04-16 16:38:48 +02:00
|
|
|
#include "third_party/blink/public/mojom/window_features/window_features.mojom.h"
|
2015-11-17 19:20:13 +01:00
|
|
|
#include "ui/base/window_open_disposition.h"
|
|
|
|
#include "url/gurl.h"
|
|
|
|
|
|
|
|
namespace blink {
|
|
|
|
struct WebWindowFeatures;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace content {
|
2020-07-23 20:41:56 +02:00
|
|
|
struct OpenURLParams;
|
2015-11-17 19:20:13 +01:00
|
|
|
struct Referrer;
|
2017-05-31 17:33:30 +02:00
|
|
|
class RenderFrameHost;
|
2015-11-17 19:20:13 +01:00
|
|
|
class RenderViewHostDelegateView;
|
|
|
|
class WebContents;
|
|
|
|
class WebContentsView;
|
2017-07-27 01:19:27 +02:00
|
|
|
} // namespace content
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
namespace IPC {
|
|
|
|
class Message;
|
|
|
|
}
|
|
|
|
|
2020-09-18 00:24:08 +02:00
|
|
|
class CefBrowserHostBase;
|
2020-09-22 21:54:02 +02:00
|
|
|
class AlloyBrowserHostImpl;
|
2015-11-17 19:20:13 +01:00
|
|
|
class CefBrowserPlatformDelegate;
|
|
|
|
|
|
|
|
// Singleton object for managing BrowserInfo instances.
|
|
|
|
class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
|
|
|
public:
|
|
|
|
CefBrowserInfoManager();
|
|
|
|
~CefBrowserInfoManager() override;
|
|
|
|
|
|
|
|
// Returns this singleton instance of this class.
|
|
|
|
static CefBrowserInfoManager* GetInstance();
|
|
|
|
|
2020-09-22 21:54:02 +02:00
|
|
|
// Called from AlloyBrowserHostImpl::Create or
|
2020-09-18 00:24:08 +02:00
|
|
|
// ChromeBrowserDelegate::SetAsDelegate when a new browser is being created
|
2015-11-17 19:20:13 +01:00
|
|
|
// directly. In this case |is_popup| will be true only for DevTools browsers.
|
2019-03-19 10:42:54 +01:00
|
|
|
scoped_refptr<CefBrowserInfo> CreateBrowserInfo(
|
|
|
|
bool is_popup,
|
|
|
|
bool is_windowless,
|
|
|
|
CefRefPtr<CefDictionaryValue> extra_info);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-09-22 21:54:02 +02:00
|
|
|
// Called from AlloyBrowserHostImpl::WebContentsCreated when a new browser is
|
2015-11-17 19:20:13 +01:00
|
|
|
// being created for a traditional popup (e.g. window.open() or targeted
|
|
|
|
// link). If any OnGetNewBrowserInfo requests are pending for the popup the
|
|
|
|
// response will be sent when this method is called.
|
|
|
|
scoped_refptr<CefBrowserInfo> CreatePopupBrowserInfo(
|
|
|
|
content::WebContents* new_contents,
|
2019-03-19 10:42:54 +01:00
|
|
|
bool is_windowless,
|
|
|
|
CefRefPtr<CefDictionaryValue> extra_info);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-06-28 20:29:44 +02:00
|
|
|
// Called from AlloyContentBrowserClient::CanCreateWindow. See comments on
|
2015-11-17 19:20:13 +01:00
|
|
|
// PendingPopup for more information.
|
2017-05-31 17:33:30 +02:00
|
|
|
bool CanCreateWindow(content::RenderFrameHost* opener,
|
|
|
|
const GURL& target_url,
|
2017-05-17 11:29:28 +02:00
|
|
|
const content::Referrer& referrer,
|
|
|
|
const std::string& frame_name,
|
|
|
|
WindowOpenDisposition disposition,
|
|
|
|
const blink::mojom::WindowFeatures& features,
|
|
|
|
bool user_gesture,
|
|
|
|
bool opener_suppressed,
|
|
|
|
bool* no_javascript_access);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-09-22 21:54:02 +02:00
|
|
|
// Called from AlloyBrowserHostImpl::GetCustomWebContentsView. See comments on
|
2015-11-17 19:20:13 +01:00
|
|
|
// PendingPopup for more information.
|
2017-02-10 23:44:11 +01:00
|
|
|
void GetCustomWebContentsView(
|
2017-05-17 11:29:28 +02:00
|
|
|
const GURL& target_url,
|
|
|
|
int opener_render_process_id,
|
2019-05-24 22:23:43 +02:00
|
|
|
int opener_render_routing_id,
|
2017-05-17 11:29:28 +02:00
|
|
|
content::WebContentsView** view,
|
|
|
|
content::RenderViewHostDelegateView** delegate_view);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-09-22 21:54:02 +02:00
|
|
|
// Called from AlloyBrowserHostImpl::WebContentsCreated. See comments on
|
2015-11-17 19:20:13 +01:00
|
|
|
// PendingPopup for more information.
|
|
|
|
void WebContentsCreated(
|
|
|
|
const GURL& target_url,
|
2017-03-15 23:04:16 +01:00
|
|
|
int opener_render_process_id,
|
2019-05-24 22:23:43 +02:00
|
|
|
int opener_render_routing_id,
|
2015-11-17 19:20:13 +01:00
|
|
|
CefBrowserSettings& settings,
|
|
|
|
CefRefPtr<CefClient>& client,
|
2019-03-19 10:42:54 +01:00
|
|
|
std::unique_ptr<CefBrowserPlatformDelegate>& platform_delegate,
|
|
|
|
CefRefPtr<CefDictionaryValue>& extra_info);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
// Called from CefBrowserMessageFilter::OnGetNewBrowserInfo for delivering
|
|
|
|
// browser info to the renderer process. If the browser info already exists
|
|
|
|
// the response will be sent immediately. Otherwise, the response will be sent
|
|
|
|
// when CreatePopupBrowserInfo creates the browser info. The info will already
|
|
|
|
// exist for explicitly created browsers and guest views. It may sometimes
|
|
|
|
// already exist for traditional popup browsers depending on timing. See
|
|
|
|
// comments on PendingPopup for more information.
|
2017-05-17 11:29:28 +02:00
|
|
|
void OnGetNewBrowserInfo(int render_process_id,
|
2019-05-24 22:23:43 +02:00
|
|
|
int render_routing_id,
|
2017-05-17 11:29:28 +02:00
|
|
|
IPC::Message* reply_msg);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-09-18 00:24:08 +02:00
|
|
|
// Called from CefBrowserHostBase::DestroyBrowser() when a browser is
|
2015-11-17 19:20:13 +01:00
|
|
|
// destroyed.
|
|
|
|
void RemoveBrowserInfo(scoped_refptr<CefBrowserInfo> browser_info);
|
|
|
|
|
|
|
|
// Called from CefContext::FinishShutdownOnUIThread() to destroy all browsers.
|
|
|
|
void DestroyAllBrowsers();
|
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
// Returns the CefBrowserInfo matching the specified IDs or nullptr if no
|
|
|
|
// match is found. It is allowed to add new callers of this method but
|
2020-09-18 00:24:08 +02:00
|
|
|
// consider using CefBrowserHostBase::GetBrowserForFrameRoute() or
|
2019-05-24 22:23:43 +02:00
|
|
|
// extensions::GetOwnerBrowserForFrameRoute() instead. If |is_guest_view| is
|
|
|
|
// non-nullptr it will be set to true if the IDs match a guest view associated
|
|
|
|
// with the returned browser info instead of the browser itself.
|
|
|
|
scoped_refptr<CefBrowserInfo> GetBrowserInfoForFrameRoute(
|
|
|
|
int render_process_id,
|
|
|
|
int render_routing_id,
|
|
|
|
bool* is_guest_view = nullptr);
|
|
|
|
|
|
|
|
// Returns the CefBrowserInfo matching the specified ID or nullptr if no match
|
|
|
|
// is found. It is allowed to add new callers of this method but consider
|
2020-09-18 00:24:08 +02:00
|
|
|
// using CefBrowserHostBase::GetBrowserForFrameTreeNode() instead. If
|
2019-05-24 22:23:43 +02:00
|
|
|
// |is_guest_view| is non-nullptr it will be set to true if the IDs match a
|
|
|
|
// guest view associated with the returned browser info instead of the browser
|
|
|
|
// itself.
|
2017-10-26 20:17:00 +02:00
|
|
|
scoped_refptr<CefBrowserInfo> GetBrowserInfoForFrameTreeNode(
|
2019-05-24 22:23:43 +02:00
|
|
|
int frame_tree_node_id,
|
|
|
|
bool* is_guest_view = nullptr);
|
2017-10-26 20:17:00 +02:00
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
// Returns all existing CefBrowserInfo objects.
|
2017-05-17 11:29:28 +02:00
|
|
|
typedef std::list<scoped_refptr<CefBrowserInfo>> BrowserInfoList;
|
2019-05-24 22:23:43 +02:00
|
|
|
BrowserInfoList GetBrowserInfoList();
|
2016-07-20 20:03:38 +02:00
|
|
|
|
2020-07-23 20:41:56 +02:00
|
|
|
// Returns true if the navigation should be allowed to proceed, or false if
|
|
|
|
// the navigation will instead be sent via OpenURLFromTab. If allowed,
|
2020-07-23 21:46:57 +02:00
|
|
|
// |browser| will be set to the target browser if any.
|
2020-07-23 20:41:56 +02:00
|
|
|
bool MaybeAllowNavigation(content::RenderFrameHost* opener,
|
|
|
|
const content::OpenURLParams& params,
|
2020-09-22 21:54:02 +02:00
|
|
|
CefRefPtr<AlloyBrowserHostImpl>& browser) const;
|
2020-07-23 20:41:56 +02:00
|
|
|
|
2015-11-17 19:20:13 +01:00
|
|
|
private:
|
|
|
|
// RenderProcessHostObserver methods:
|
|
|
|
void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
|
|
|
|
|
|
|
|
// Store state information about pending popups. Call order is:
|
2020-06-28 20:29:44 +02:00
|
|
|
// - AlloyContentBrowserClient::CanCreateWindow (UIT)
|
2015-11-17 19:20:13 +01:00
|
|
|
// Provides an opportunity to cancel the popup (calls OnBeforePopup) and
|
|
|
|
// creates the new platform delegate for the popup. If the popup owner is
|
|
|
|
// an extension guest view then the popup is canceled and
|
2020-09-22 21:54:02 +02:00
|
|
|
// AlloyBrowserHostImpl::OpenURLFromTab is called.
|
2015-11-17 19:20:13 +01:00
|
|
|
// And then the following calls may occur at the same time:
|
2020-09-22 21:54:02 +02:00
|
|
|
// - AlloyBrowserHostImpl::GetCustomWebContentsView (UIT)
|
2015-11-17 19:20:13 +01:00
|
|
|
// Creates the OSR views for windowless popups.
|
2020-09-22 21:54:02 +02:00
|
|
|
// - AlloyBrowserHostImpl::WebContentsCreated (UIT)
|
|
|
|
// Creates the AlloyBrowserHostImpl representation for the popup.
|
2015-11-17 19:20:13 +01:00
|
|
|
// - CefBrowserMessageFilter::OnGetNewBrowserInfo (IOT)
|
|
|
|
// Passes information about the popup to the renderer process.
|
|
|
|
struct PendingPopup {
|
|
|
|
// Track the last method that modified this PendingPopup instance. There may
|
|
|
|
// be multiple pending popups with the same identifiers and this allows us
|
|
|
|
// to differentiate between them at different processing steps.
|
|
|
|
enum Step {
|
|
|
|
CAN_CREATE_WINDOW,
|
2017-02-10 23:44:11 +01:00
|
|
|
GET_CUSTOM_WEB_CONTENTS_VIEW,
|
2015-11-17 19:20:13 +01:00
|
|
|
} step;
|
|
|
|
|
|
|
|
// Initial state from ViewHostMsg_CreateWindow.
|
2015-12-03 19:41:40 +01:00
|
|
|
// |target_url| will be empty if a popup is created via window.open() and
|
|
|
|
// never navigated. For example: javascript:window.open();
|
2019-05-24 22:23:43 +02:00
|
|
|
int opener_render_process_id;
|
|
|
|
int opener_render_routing_id;
|
2015-11-17 19:20:13 +01:00
|
|
|
GURL target_url;
|
|
|
|
std::string target_frame_name;
|
|
|
|
|
|
|
|
// Values specified by OnBeforePopup.
|
|
|
|
CefBrowserSettings settings;
|
|
|
|
CefRefPtr<CefClient> client;
|
2019-03-19 10:42:54 +01:00
|
|
|
CefRefPtr<CefDictionaryValue> extra_info;
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
// Platform delegate specific to the new popup.
|
2016-04-27 22:38:52 +02:00
|
|
|
std::unique_ptr<CefBrowserPlatformDelegate> platform_delegate;
|
2015-11-17 19:20:13 +01:00
|
|
|
};
|
|
|
|
|
2017-05-31 17:33:30 +02:00
|
|
|
// Manage pending popups. Only called on the UI thread.
|
2016-04-27 22:38:52 +02:00
|
|
|
void PushPendingPopup(std::unique_ptr<PendingPopup> popup);
|
2017-05-17 11:29:28 +02:00
|
|
|
std::unique_ptr<PendingPopup> PopPendingPopup(PendingPopup::Step step,
|
|
|
|
int opener_process_id,
|
2019-05-24 22:23:43 +02:00
|
|
|
int opener_routing_id,
|
2017-05-17 11:29:28 +02:00
|
|
|
const GURL& target_url);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
// Retrieves the BrowserInfo matching the specified IDs. If both sets are
|
|
|
|
// valid then this method makes sure both sets have been registered.
|
2019-05-24 22:23:43 +02:00
|
|
|
scoped_refptr<CefBrowserInfo> GetBrowserInfo(int render_process_id,
|
|
|
|
int render_routing_id,
|
2017-05-17 11:29:28 +02:00
|
|
|
bool* is_guest_view);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
|
|
|
// Send the response for a pending OnGetNewBrowserInfo request.
|
2017-07-27 01:19:27 +02:00
|
|
|
static void SendNewBrowserInfoResponse(
|
|
|
|
int render_process_id,
|
|
|
|
scoped_refptr<CefBrowserInfo> browser_info,
|
|
|
|
bool is_guest_view,
|
|
|
|
IPC::Message* reply_msg);
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2020-01-23 22:58:01 +01:00
|
|
|
// Time out a response if it's still pending.
|
|
|
|
static void TimeoutNewBrowserInfoResponse(int64_t frame_id, int timeout_id);
|
|
|
|
|
2015-11-17 19:20:13 +01:00
|
|
|
// Pending request for OnGetNewBrowserInfo.
|
|
|
|
struct PendingNewBrowserInfo {
|
2016-05-11 18:18:43 +02:00
|
|
|
int render_process_id;
|
2019-05-24 22:23:43 +02:00
|
|
|
int render_routing_id;
|
2020-01-23 22:58:01 +01:00
|
|
|
int timeout_id;
|
2015-11-17 19:20:13 +01:00
|
|
|
IPC::Message* reply_msg;
|
|
|
|
};
|
|
|
|
|
|
|
|
mutable base::Lock browser_info_lock_;
|
|
|
|
|
|
|
|
// Access to the below members must be protected by |browser_info_lock_|.
|
|
|
|
|
|
|
|
BrowserInfoList browser_info_list_;
|
2020-01-23 22:58:01 +01:00
|
|
|
int next_browser_id_ = 0;
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2019-05-24 22:23:43 +02:00
|
|
|
// Map of frame ID to info.
|
|
|
|
using PendingNewBrowserInfoMap =
|
|
|
|
std::map<int64_t, std::unique_ptr<PendingNewBrowserInfo>>;
|
|
|
|
PendingNewBrowserInfoMap pending_new_browser_info_map_;
|
2015-11-17 19:20:13 +01:00
|
|
|
|
2017-05-31 17:33:30 +02:00
|
|
|
// Only accessed on the UI thread.
|
2017-07-27 01:19:27 +02:00
|
|
|
using PendingPopupList = std::vector<std::unique_ptr<PendingPopup>>;
|
2015-11-17 19:20:13 +01:00
|
|
|
PendingPopupList pending_popup_list_;
|
|
|
|
|
2020-01-23 22:58:01 +01:00
|
|
|
int next_timeout_id_ = 0;
|
|
|
|
|
2015-11-17 19:20:13 +01:00
|
|
|
DISALLOW_COPY_AND_ASSIGN(CefBrowserInfoManager);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
|