mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-01-30 02:54:47 +01:00
e411b513be
See the new cef_frame_handler.h for complete usage documentation. This change includes the following related enhancements: - The newly added CefBrowser::IsValid method will return false (in the browser process) after CefLifeSpanHandler::OnBeforeClose is called. - CefBrowser::GetMainFrame will return a valid object (in the browser process) until after CefLifeSpanHandler::OnBeforeClose is called. - The main frame object will change during cross-origin navigation or re-navigation after renderer process termination. During that time, GetMainFrame will return the new/pending frame (in the browser process) and any messages that arrive for the new/pending frame will be correctly attributed in OnProcessMessageReceived. - Commands to be executed in the renderer process that may fail during early frame initialization (ExecuteJavaScript, LoadRequest, etc.) will now be queued until after the JavaScript context for the frame has been created. - Logging has been added for any commands that are dropped because they arrived after frame detachment.
131 lines
4.3 KiB
C++
131 lines
4.3 KiB
C++
// 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 <stdint.h>
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#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;
|
|
} // namespace blink
|
|
|
|
namespace content {
|
|
class RenderView;
|
|
}
|
|
|
|
// 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<CefBrowserImpl> GetBrowserForView(content::RenderView* view);
|
|
// Returns the browser associated with the specified main WebFrame.
|
|
static CefRefPtr<CefBrowserImpl> GetBrowserForMainFrame(
|
|
blink::WebFrame* frame);
|
|
|
|
// CefBrowser methods.
|
|
bool IsValid() override;
|
|
CefRefPtr<CefBrowserHost> 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<CefBrowser> that) override;
|
|
bool IsPopup() override;
|
|
bool HasDocument() override;
|
|
CefRefPtr<CefFrame> GetMainFrame() override;
|
|
CefRefPtr<CefFrame> GetFocusedFrame() override;
|
|
CefRefPtr<CefFrame> GetFrame(int64 identifier) override;
|
|
CefRefPtr<CefFrame> GetFrame(const CefString& name) override;
|
|
size_t GetFrameCount() override;
|
|
void GetFrameIdentifiers(std::vector<int64>& identifiers) override;
|
|
void GetFrameNames(std::vector<CefString>& names) override;
|
|
|
|
CefBrowserImpl(content::RenderView* render_view,
|
|
int browser_id,
|
|
bool is_popup,
|
|
bool is_windowless);
|
|
~CefBrowserImpl() override;
|
|
|
|
// Returns the matching CefFrameImpl reference or creates a new one.
|
|
CefRefPtr<CefFrameImpl> GetWebFrameImpl(blink::WebLocalFrame* frame);
|
|
CefRefPtr<CefFrameImpl> 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);
|
|
|
|
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.
|
|
typedef std::map<int64, CefRefPtr<CefFrameImpl>> FrameMap;
|
|
FrameMap frames_;
|
|
|
|
// Map of unique frame ids to CefTrackManager objects that need to be cleaned
|
|
// up when the frame is deleted.
|
|
typedef std::map<int64, CefRefPtr<CefTrackManager>> FrameObjectMap;
|
|
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<LoadingState> last_loading_state_;
|
|
|
|
IMPLEMENT_REFCOUNTING(CefBrowserImpl);
|
|
DISALLOW_COPY_AND_ASSIGN(CefBrowserImpl);
|
|
};
|
|
|
|
#endif // CEF_LIBCEF_RENDERER_BROWSER_IMPL_H_
|