mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-02 20:26:59 +01:00
d9efaee9b9
When navigating cross-origin a speculative RenderFrameHost (RFH) and CefFrameHostImpl is created in the browser process for the new frame object created in a new renderer process. The FrameAttached message then arrives for the speculative RFH, and as a consequence interfaces are bound between the new CefFrameHostImpl and the speculative RFH. If the pending navigation commits then the existing RFH will be replaced with the previously speculative RFH. Since interfaces are already bound we must keep the new CefFrameHostImpl. This means that frame objects (including for the main frame) will now always change after cross-origin navigation, and the old frame object will be invalidated.
52 lines
2.0 KiB
C++
52 lines
2.0 KiB
C++
// Copyright 2021 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_FRAME_H_
|
|
#define CEF_LIBCEF_BROWSER_BROWSER_FRAME_H_
|
|
#pragma once
|
|
|
|
#include "libcef/browser/frame_host_impl.h"
|
|
|
|
#include "cef/libcef/common/mojom/cef.mojom.h"
|
|
#include "content/public/browser/frame_service_base.h"
|
|
#include "mojo/public/cpp/bindings/binder_map.h"
|
|
|
|
// Implementation of the BrowserFrame mojo interface.
|
|
// This is implemented separately from CefFrameHostImpl to better manage the
|
|
// association with the RenderFrameHost (which may be speculative, etc.), and so
|
|
// that messages are always routed to the most appropriate CefFrameHostImpl
|
|
// instance. Lifespan is tied to the RFH via FrameServiceBase.
|
|
class CefBrowserFrame
|
|
: public content::FrameServiceBase<cef::mojom::BrowserFrame> {
|
|
public:
|
|
CefBrowserFrame(content::RenderFrameHost* render_frame_host,
|
|
mojo::PendingReceiver<cef::mojom::BrowserFrame> receiver);
|
|
~CefBrowserFrame() override;
|
|
|
|
// Called from the ContentBrowserClient method of the same name.
|
|
static void RegisterBrowserInterfaceBindersForFrame(
|
|
content::RenderFrameHost* render_frame_host,
|
|
mojo::BinderMapWithContext<content::RenderFrameHost*>* map);
|
|
|
|
private:
|
|
// cef::mojom::BrowserFrame methods:
|
|
void SendMessage(const std::string& name, base::Value arguments) override;
|
|
void FrameAttached() override;
|
|
void DidFinishFrameLoad(const GURL& validated_url,
|
|
int32_t http_status_code) override;
|
|
void UpdateDraggableRegions(
|
|
base::Optional<std::vector<cef::mojom::DraggableRegionEntryPtr>> regions)
|
|
override;
|
|
|
|
// FrameServiceBase methods:
|
|
bool ShouldCloseOnFinishNavigation() const override { return false; }
|
|
|
|
CefRefPtr<CefFrameHostImpl> GetFrameHost(
|
|
bool prefer_speculative = false) const;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(CefBrowserFrame);
|
|
};
|
|
|
|
#endif // CEF_LIBCEF_BROWSER_BROWSER_FRAME_H_
|