2015-01-27 01:03:25 +01:00
|
|
|
// Copyright (c) 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.
|
|
|
|
|
2015-01-31 01:55:56 +01:00
|
|
|
#ifndef CEF_TESTS_CEFCLIENT_BROWSER_ROOT_WINDOW_MANAGER_H_
|
|
|
|
#define CEF_TESTS_CEFCLIENT_BROWSER_ROOT_WINDOW_MANAGER_H_
|
|
|
|
#pragma once
|
2015-01-27 01:03:25 +01:00
|
|
|
|
2021-06-17 22:08:01 +02:00
|
|
|
#include <memory>
|
2015-01-27 01:03:25 +01:00
|
|
|
#include <set>
|
|
|
|
|
|
|
|
#include "include/cef_command_line.h"
|
2019-04-24 04:50:25 +02:00
|
|
|
#include "include/cef_request_context_handler.h"
|
2017-08-04 00:55:19 +02:00
|
|
|
#include "tests/cefclient/browser/image_cache.h"
|
2016-11-18 00:52:42 +01:00
|
|
|
#include "tests/cefclient/browser/root_window.h"
|
|
|
|
#include "tests/cefclient/browser/temp_window.h"
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
namespace client {
|
|
|
|
|
|
|
|
// Used to create/manage RootWindow instances. The methods of this class can be
|
|
|
|
// called from any browser process thread unless otherwise indicated.
|
|
|
|
class RootWindowManager : public RootWindow::Delegate {
|
|
|
|
public:
|
|
|
|
// If |terminate_when_all_windows_closed| is true quit the main message loop
|
|
|
|
// after all windows have closed.
|
|
|
|
explicit RootWindowManager(bool terminate_when_all_windows_closed);
|
|
|
|
|
2017-08-04 00:55:19 +02:00
|
|
|
// Create a new top-level native window. This method can be called from
|
|
|
|
// anywhere.
|
2021-06-19 21:54:45 +02:00
|
|
|
scoped_refptr<RootWindow> CreateRootWindow(
|
|
|
|
std::unique_ptr<RootWindowConfig> config);
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
// Create a new native popup window.
|
|
|
|
// If |with_controls| is true the window will show controls.
|
|
|
|
// If |with_osr| is true the window will use off-screen rendering.
|
2015-01-30 19:55:55 +01:00
|
|
|
// This method is called from ClientHandler::CreatePopupWindow() to
|
2017-05-31 17:33:30 +02:00
|
|
|
// create a new popup or DevTools window. Must be called on the UI thread.
|
2015-01-27 01:03:25 +01:00
|
|
|
scoped_refptr<RootWindow> CreateRootWindowAsPopup(
|
|
|
|
bool with_controls,
|
|
|
|
bool with_osr,
|
|
|
|
const CefPopupFeatures& popupFeatures,
|
|
|
|
CefWindowInfo& windowInfo,
|
|
|
|
CefRefPtr<CefClient>& client,
|
|
|
|
CefBrowserSettings& settings);
|
|
|
|
|
2017-08-04 00:55:19 +02:00
|
|
|
// Create a new top-level native window to host |extension|.
|
|
|
|
// If |with_controls| is true the window will show controls.
|
|
|
|
// If |with_osr| is true the window will use off-screen rendering.
|
|
|
|
// This method can be called from anywhere.
|
|
|
|
scoped_refptr<RootWindow> CreateRootWindowAsExtension(
|
|
|
|
CefRefPtr<CefExtension> extension,
|
|
|
|
const CefRect& source_bounds,
|
|
|
|
CefRefPtr<CefWindow> parent_window,
|
2021-06-19 21:54:45 +02:00
|
|
|
base::OnceClosure close_callback,
|
2017-08-04 00:55:19 +02:00
|
|
|
bool with_controls,
|
|
|
|
bool with_osr);
|
|
|
|
|
|
|
|
// Returns true if a window hosting |extension| currently exists. Must be
|
|
|
|
// called on the main thread.
|
|
|
|
bool HasRootWindowAsExtension(CefRefPtr<CefExtension> extension);
|
|
|
|
|
2015-01-27 01:03:25 +01:00
|
|
|
// Returns the RootWindow associated with the specified browser ID. Must be
|
|
|
|
// called on the main thread.
|
2017-08-04 00:55:19 +02:00
|
|
|
scoped_refptr<RootWindow> GetWindowForBrowser(int browser_id) const;
|
|
|
|
|
2021-06-17 22:08:01 +02:00
|
|
|
// Returns the currently active/foreground RootWindow. May return nullptr.
|
|
|
|
// Must be called on the main thread.
|
2017-08-04 00:55:19 +02:00
|
|
|
scoped_refptr<RootWindow> GetActiveRootWindow() const;
|
|
|
|
|
2021-06-17 22:08:01 +02:00
|
|
|
// Returns the currently active/foreground browser. May return nullptr. Safe
|
|
|
|
// to call from any thread.
|
2017-08-04 00:55:19 +02:00
|
|
|
CefRefPtr<CefBrowser> GetActiveBrowser() const;
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
// Close all existing windows. If |force| is true onunload handlers will not
|
|
|
|
// be executed.
|
|
|
|
void CloseAllWindows(bool force);
|
|
|
|
|
2017-08-04 00:55:19 +02:00
|
|
|
// Manage the set of loaded extensions. RootWindows will be notified via the
|
|
|
|
// OnExtensionsChanged method.
|
|
|
|
void AddExtension(CefRefPtr<CefExtension> extension);
|
|
|
|
|
|
|
|
bool request_context_per_browser() const {
|
|
|
|
return request_context_per_browser_;
|
|
|
|
}
|
|
|
|
|
2015-01-27 01:03:25 +01:00
|
|
|
private:
|
2021-06-17 22:08:01 +02:00
|
|
|
// Allow deletion via std::unique_ptr only.
|
|
|
|
friend std::default_delete<RootWindowManager>;
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
~RootWindowManager();
|
|
|
|
|
|
|
|
void OnRootWindowCreated(scoped_refptr<RootWindow> root_window);
|
2017-08-04 00:55:19 +02:00
|
|
|
void NotifyExtensionsChanged();
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
// RootWindow::Delegate methods.
|
2015-02-14 00:17:08 +01:00
|
|
|
CefRefPtr<CefRequestContext> GetRequestContext(
|
2021-06-17 21:43:06 +02:00
|
|
|
RootWindow* root_window) override;
|
|
|
|
scoped_refptr<ImageCache> GetImageCache() override;
|
|
|
|
void OnTest(RootWindow* root_window, int test_id) override;
|
|
|
|
void OnExit(RootWindow* root_window) override;
|
|
|
|
void OnRootWindowDestroyed(RootWindow* root_window) override;
|
|
|
|
void OnRootWindowActivated(RootWindow* root_window) override;
|
2017-08-04 00:55:19 +02:00
|
|
|
void OnBrowserCreated(RootWindow* root_window,
|
2021-06-17 21:43:06 +02:00
|
|
|
CefRefPtr<CefBrowser> browser) override;
|
2017-08-04 00:55:19 +02:00
|
|
|
void CreateExtensionWindow(CefRefPtr<CefExtension> extension,
|
|
|
|
const CefRect& source_bounds,
|
|
|
|
CefRefPtr<CefWindow> parent_window,
|
2021-06-19 21:54:45 +02:00
|
|
|
base::OnceClosure close_callback,
|
2021-06-17 21:43:06 +02:00
|
|
|
bool with_osr) override;
|
2015-01-27 01:03:25 +01:00
|
|
|
|
2018-09-20 15:00:14 +02:00
|
|
|
void CleanupOnUIThread();
|
|
|
|
|
2015-01-27 01:03:25 +01:00
|
|
|
const bool terminate_when_all_windows_closed_;
|
2015-02-14 00:17:08 +01:00
|
|
|
bool request_context_per_browser_;
|
2016-01-12 01:19:51 +01:00
|
|
|
bool request_context_shared_cache_;
|
2015-01-27 01:03:25 +01:00
|
|
|
|
|
|
|
// Existing root windows. Only accessed on the main thread.
|
2017-05-17 11:29:28 +02:00
|
|
|
typedef std::set<scoped_refptr<RootWindow>> RootWindowSet;
|
2015-01-27 01:03:25 +01:00
|
|
|
RootWindowSet root_windows_;
|
|
|
|
|
2017-08-04 00:55:19 +02:00
|
|
|
// The currently active/foreground RootWindow. Only accessed on the main
|
|
|
|
// thread.
|
|
|
|
scoped_refptr<RootWindow> active_root_window_;
|
|
|
|
|
|
|
|
// The currently active/foreground browser. Access is protected by
|
|
|
|
// |active_browser_lock_;
|
|
|
|
mutable base::Lock active_browser_lock_;
|
|
|
|
CefRefPtr<CefBrowser> active_browser_;
|
|
|
|
|
2015-01-27 01:03:25 +01:00
|
|
|
// Singleton window used as the temporary parent for popup browsers.
|
2021-06-17 22:08:01 +02:00
|
|
|
std::unique_ptr<TempWindow> temp_window_;
|
2015-01-27 01:03:25 +01:00
|
|
|
|
2015-09-09 16:05:39 +02:00
|
|
|
CefRefPtr<CefRequestContext> shared_request_context_;
|
2017-08-04 00:55:19 +02:00
|
|
|
|
|
|
|
// Loaded extensions. Only accessed on the main thread.
|
|
|
|
ExtensionSet extensions_;
|
|
|
|
|
|
|
|
scoped_refptr<ImageCache> image_cache_;
|
2015-09-09 16:05:39 +02:00
|
|
|
|
2015-01-27 01:03:25 +01:00
|
|
|
DISALLOW_COPY_AND_ASSIGN(RootWindowManager);
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace client
|
|
|
|
|
2015-01-31 01:55:56 +01:00
|
|
|
#endif // CEF_TESTS_CEFCLIENT_BROWSER_ROOT_WINDOW_MANAGER_H_
|