Fix CefBrowser::GetMainFrame assumptions in the renderer process (see issue #2421)

ClientAppRenderer::Delegate callbacks are executed for all tests. In this case
CorsTest.IframeAllowScriptsCustomNonStandardSchemeToServer was crashing on Linux
because CefBrowser::GetMainFrame() returns nullptr in the renderer process when
called from a cross-origin sub-frame.
This commit is contained in:
Marshall Greenblatt 2021-06-07 13:31:39 -07:00
parent 9353f9b28b
commit ba46b8c53e
3 changed files with 9 additions and 5 deletions

View File

@ -33,7 +33,7 @@
// by hand. See the translator.README.txt file in the tools directory for // by hand. See the translator.README.txt file in the tools directory for
// more information. // more information.
// //
// $hash=bb01bd8418e5fb715a7a6bd53e962e11a0d04993$ // $hash=6e192c6e8a59c37e98e458578a287dd36b8ed90f$
// //
#ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_
@ -147,8 +147,10 @@ typedef struct _cef_browser_t {
/// ///
// Returns the main (top-level) frame for the browser. In the browser process // Returns the main (top-level) frame for the browser. In the browser process
// this will return a valid object until after // this will return a valid object until after
// cef_life_span_handler_t::OnBeforeClose is called. The main frame object // cef_life_span_handler_t::OnBeforeClose is called. In the renderer process
// will change during cross-origin navigation or re-navigation after renderer // this will return NULL if the main frame is hosted in a different renderer
// process (e.g. for cross-origin sub-frames). The main frame object will
// change during cross-origin navigation or re-navigation after renderer
// process termination (due to crashes, etc). // process termination (due to crashes, etc).
/// ///
struct _cef_frame_t*(CEF_CALLBACK* get_main_frame)( struct _cef_frame_t*(CEF_CALLBACK* get_main_frame)(

View File

@ -151,7 +151,9 @@ class CefBrowser : public virtual CefBaseRefCounted {
/// ///
// Returns the main (top-level) frame for the browser. In the browser process // Returns the main (top-level) frame for the browser. In the browser process
// this will return a valid object until after // this will return a valid object until after
// CefLifeSpanHandler::OnBeforeClose is called. The main frame object will // CefLifeSpanHandler::OnBeforeClose is called. In the renderer process this
// will return NULL if the main frame is hosted in a different renderer
// process (e.g. for cross-origin sub-frames). The main frame object will
// change during cross-origin navigation or re-navigation after renderer // change during cross-origin navigation or re-navigation after renderer
// process termination (due to crashes, etc). // process termination (due to crashes, etc).
/// ///

View File

@ -163,7 +163,7 @@ class MRRenderDelegate : public ClientAppRenderer::Delegate {
CefRefPtr<CefFrame> frame, CefRefPtr<CefFrame> frame,
CefProcessId source_process, CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) override { CefRefPtr<CefProcessMessage> message) override {
const std::string& url = browser->GetMainFrame()->GetURL(); const std::string& url = frame->GetURL();
if (url.find(kTestDomainRoot) != 0) if (url.find(kTestDomainRoot) != 0)
return false; return false;