// Copyright (c) 2012 The Chromium Embedded Framework Authors. // Portions copyright (c) 2011 The Chromium 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_RENDERER_BROWSER_IMPL_H_ #define CEF_LIBCEF_RENDERER_BROWSER_IMPL_H_ #pragma once #include #include #include #include #include #include "include/cef_browser.h" #include "include/cef_client.h" #include "libcef/common/tracker.h" #include "libcef/renderer/frame_impl.h" #include "third_party/blink/public/web/web_view_observer.h" namespace blink { class WebFrame; class WebNode; class WebView; } // namespace blink // Renderer plumbing for CEF features. There is a one-to-one relationship // between RenderView on the renderer side and RenderViewHost on the browser // side. // // RenderViewObserver: Interface for observing RenderView notifications. class CefBrowserImpl : public CefBrowser, public blink::WebViewObserver { public: // Returns the browser associated with the specified RenderView. static CefRefPtr GetBrowserForView(blink::WebView* view); // Returns the browser associated with the specified main WebFrame. static CefRefPtr GetBrowserForMainFrame( blink::WebFrame* frame); // CefBrowser methods. bool IsValid() override; CefRefPtr GetHost() override; bool CanGoBack() override; void GoBack() override; bool CanGoForward() override; void GoForward() override; bool IsLoading() override; void Reload() override; void ReloadIgnoreCache() override; void StopLoad() override; int GetIdentifier() override; bool IsSame(CefRefPtr that) override; bool IsPopup() override; bool HasDocument() override; CefRefPtr GetMainFrame() override; CefRefPtr GetFocusedFrame() override; CefRefPtr GetFrame(int64_t identifier) override; CefRefPtr GetFrame(const CefString& name) override; size_t GetFrameCount() override; void GetFrameIdentifiers(std::vector& identifiers) override; void GetFrameNames(std::vector& names) override; CefBrowserImpl(blink::WebView* web_view, int browser_id, bool is_popup, bool is_windowless); CefBrowserImpl(const CefBrowserImpl&) = delete; CefBrowserImpl& operator=(const CefBrowserImpl&) = delete; ~CefBrowserImpl() override; // Returns the matching CefFrameImpl reference or creates a new one. CefRefPtr GetWebFrameImpl(blink::WebLocalFrame* frame); CefRefPtr GetWebFrameImpl(int64_t frame_id); // Frame objects will be deleted immediately before the frame is closed. void AddFrameObject(int64_t frame_id, CefTrackNode* tracked_object); int browser_id() const { return browser_id_; } bool is_popup() const { return is_popup_; } bool is_windowless() const { return is_windowless_; } // blink::WebViewObserver methods. void OnDestruct() override; void FrameDetached(int64_t frame_id); void OnLoadingStateChange(bool isLoading); void OnEnterBFCache(); private: // ID of the browser that this RenderView is associated with. During loading // of cross-origin requests multiple RenderViews may be associated with the // same browser ID. int browser_id_; bool is_popup_; bool is_windowless_; // Map of unique frame ids to CefFrameImpl references. using FrameMap = std::map>; FrameMap frames_; // True if the browser was in the BFCache. bool was_in_bfcache_ = false; // Map of unique frame ids to CefTrackManager objects that need to be cleaned // up when the frame is deleted. using FrameObjectMap = std::map>; FrameObjectMap frame_objects_; struct LoadingState { LoadingState(bool is_loading, bool can_go_back, bool can_go_forward) : is_loading_(is_loading), can_go_back_(can_go_back), can_go_forward_(can_go_forward) {} bool IsMatch(bool is_loading, bool can_go_back, bool can_go_forward) const { return is_loading_ == is_loading && can_go_back_ == can_go_back && can_go_forward_ == can_go_forward; } bool is_loading_; bool can_go_back_; bool can_go_forward_; }; std::unique_ptr last_loading_state_; IMPLEMENT_REFCOUNTING(CefBrowserImpl); }; #endif // CEF_LIBCEF_RENDERER_BROWSER_IMPL_H_