diff --git a/libcef/browser/chrome/browser_platform_delegate_chrome.h b/libcef/browser/chrome/browser_platform_delegate_chrome.h index c92f2a87a..aff822e57 100644 --- a/libcef/browser/chrome/browser_platform_delegate_chrome.h +++ b/libcef/browser/chrome/browser_platform_delegate_chrome.h @@ -52,8 +52,8 @@ class CefBrowserPlatformDelegateChrome void set_chrome_browser(Browser* browser); - CefBrowserPlatformDelegateNative* native_delegate() const { - return native_delegate_.get(); + base::WeakPtr native_delegate() const { + return native_delegate_->GetWeakPtr(); } protected: diff --git a/libcef/browser/chrome/views/chrome_child_window.cc b/libcef/browser/chrome/views/chrome_child_window.cc index dee8c9894..44b4717b8 100644 --- a/libcef/browser/chrome/views/chrome_child_window.cc +++ b/libcef/browser/chrome/views/chrome_child_window.cc @@ -65,7 +65,7 @@ class ChildWindowDelegate : public CefWindowDelegate { void OnWindowDestroyed(CefRefPtr window) override { browser_view_ = nullptr; window_ = nullptr; -#if BUILDFLAG(IS_WIN) +#if defined(USE_AURA) native_delegate_ = nullptr; #endif } @@ -96,8 +96,7 @@ class ChildWindowDelegate : public CefWindowDelegate { DCHECK(platform_delegate->IsViewsHosted()); auto chrome_delegate = static_cast(platform_delegate); - native_delegate_ = static_cast( - chrome_delegate->native_delegate()); + native_delegate_ = chrome_delegate->native_delegate(); #if BUILDFLAG(IS_WIN) auto widget = static_cast(window_.get())->widget(); @@ -106,9 +105,11 @@ class ChildWindowDelegate : public CefWindowDelegate { DCHECK(widget_hwnd); // The Windows delegate needs state to perform some actions. - auto* delegate_win = - static_cast(native_delegate_); - delegate_win->set_widget(widget, widget_hwnd); + if (native_delegate_){ + auto* delegate_win = + static_cast(native_delegate_); + delegate_win->set_widget(widget, widget_hwnd); + } if (window_info_.ex_style & WS_EX_NOACTIVATE) { const DWORD widget_ex_styles = GetWindowLongPtr(widget_hwnd, GWL_EXSTYLE); @@ -145,7 +146,7 @@ class ChildWindowDelegate : public CefWindowDelegate { CefRefPtr window_; #if defined(USE_AURA) - base::raw_ptr native_delegate_ = + base::WeakPtr native_delegate_ = nullptr; #endif diff --git a/libcef/browser/native/browser_platform_delegate_native.cc b/libcef/browser/native/browser_platform_delegate_native.cc index 0705366c4..6aa93f5a1 100644 --- a/libcef/browser/native/browser_platform_delegate_native.cc +++ b/libcef/browser/native/browser_platform_delegate_native.cc @@ -47,3 +47,7 @@ void CefBrowserPlatformDelegateNative::NotifyScreenInfoChanged() { render_widget_host->NotifyScreenInfoChanged(); } + +base::WeakPtr CefBrowserPlatformDelegateNative::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} \ No newline at end of file diff --git a/libcef/browser/native/browser_platform_delegate_native.h b/libcef/browser/native/browser_platform_delegate_native.h index 0c5a71399..b6d83c5c5 100644 --- a/libcef/browser/native/browser_platform_delegate_native.h +++ b/libcef/browser/native/browser_platform_delegate_native.h @@ -51,7 +51,7 @@ class CefBrowserPlatformDelegateNative int deltaY) const = 0; const CefWindowInfo& window_info() const { return window_info_; } - + base::WeakPtr GetWeakPtr(); protected: // Delegates that can wrap a native delegate. friend class CefBrowserPlatformDelegateBackground; @@ -73,6 +73,9 @@ class CefBrowserPlatformDelegateNative // Not owned by this object. raw_ptr windowless_handler_ = nullptr; + + base::WeakPtrFactory weak_ptr_factory_{ + this}; }; #endif // CEF_LIBCEF_BROWSER_NATIVE_BROWSER_PLATFORM_DELEGATE_NATIVE_H_