### Preflight Checklist

- [X] I have read the [Contributing Guidelines](https://github.com/electron/electron/blob/main/CONTRIBUTING.md) for this project.
- [X] I agree to follow the [Code of Conduct](https://github.com/electron/electron/blob/main/CODE_OF_CONDUCT.md) that this project adheres to.
- [X] I have searched the [issue tracker](https://www.github.com/electron/electron/issues) for a feature request that matches the one I want to file, without success.

### Electron Version

16.0.0-alpha.6
15.1.1
14.1.0

### What operating system are you using?

Windows

### Operating System Version

Windows 11 (10.0.22000.194)

### What arch are you using?

x64

### Last Known Working Electron version

13.5.1

### Expected Behavior
We have a page, which contains a `<webview>` loaded in a `BrowserWindow`.
When we reload the window and call `mainWindow.webContents.setZoomLevel()` it should work.

### Actual Behavior
The main Electron process crashes with the following callstack:
```
Teams.exe!content::WebContentsImpl::GetRenderViewHost()	C++
Teams.exe!electron::WebContentsZoomController::SetTemporaryZoomLevel(double level) Line 97	C++
Teams.exe!electron::WebViewGuestDelegate::OnZoomLevelChanged(content::WebContents * web_contents, double level, bool is_temporary) Line 79	C++
Teams.exe!electron::WebContentsZoomController::SetTemporaryZoomLevel(double level) Line 101	C++
Teams.exe!electron::mojom::ElectronBrowserStubDispatch::Accept(electron::mojom::ElectronBrowser * impl, mojo::Message * message) Line 4568	C++
[Inline Frame] Teams.exe!mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message * message) Line 898	C++
Teams.exe!mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(mojo::Message * message) Line 329	C++
Teams.exe!mojo::MessageDispatcher::Accept(mojo::Message * message) Line 43	C++
Teams.exe!mojo::InterfaceEndpointClient::HandleIncomingMessage(mojo::Message * message) Line 655	C++
[Inline Frame] Teams.exe!mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper * message_wrapper, mojo::internal::MultiplexRouter::ClientCallBehavior client_call_behavior, base::SequencedTaskRunner * current_task_runner) Line 1098	C++
Teams.exe!mojo::internal::MultiplexRouter::Accept(mojo::Message * message) Line 717	C++
Teams.exe!mojo::MessageDispatcher::Accept(mojo::Message * message) Line 43	C++
[Inline Frame] Teams.exe!mojo::Connector::DispatchMessageW(mojo::Message message) Line 545	C++
[Inline Frame] Teams.exe!mojo::Connector::ReadAllAvailableMessages() Line 604	C++
[Inline Frame] Teams.exe!mojo::Connector::OnHandleReadyInternal(unsigned int result) Line 439	C++
[Inline Frame] Teams.exe!mojo::Connector::OnWatcherHandleReady(unsigned int result) Line 410	C++
[Inline Frame] Teams.exe!base::internal::FunctorTraits<void (mojo::Connector::*)(unsigned int),void>::Invoke(void(mojo::Connector::*)(unsigned int) method, mojo::Connector * && receiver_ptr, unsigned int && args) Line 509	C++
[Inline Frame] Teams.exe!base::internal::InvokeHelper<0,void>::MakeItSo(void(mojo::Connector::*)(unsigned int) & functor, mojo::Connector * && args, unsigned int && args) Line 648	C++
[Inline Frame] Teams.exe!base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int),base::internal::UnretainedWrapper<mojo::Connector>>,void (unsigned int)>::RunImpl(void(mojo::Connector::*)(unsigned int) & functor, const std::__1::tuple<base::internal::UnretainedWrapper<mojo::Connector>> & bound, std::__1::integer_sequence<unsigned long long,0>, unsigned int && unbound_args) Line 721	C++
Teams.exe!base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int),base::internal::UnretainedWrapper<mojo::Connector>>,void (unsigned int)>::Run(base::internal::BindStateBase * base, unsigned int unbound_args) Line 703	C++
[Inline Frame] Teams.exe!base::RepeatingCallback<void (unsigned int, const mojo::HandleSignalsState &)>::Run(unsigned int args, const mojo::HandleSignalsState & args) Line 166	C++
[Inline Frame] Teams.exe!mojo::SimpleWatcher::OnHandleReady(int watch_id, unsigned int result, const mojo::HandleSignalsState & state) Line 278	C++
[Inline Frame] Teams.exe!base::internal::FunctorTraits<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),void>::Invoke(void(mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &) method, base::WeakPtr<mojo::SimpleWatcher> && receiver_ptr, int && args, unsigned int && args, mojo::HandleSignalsState && args) Line 509	C++
[Inline Frame] Teams.exe!base::internal::InvokeHelper<1,void>::MakeItSo(void(mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &) && functor, base::WeakPtr<mojo::SimpleWatcher> && weak_ptr, int && args, unsigned int && args, mojo::HandleSignalsState && args) Line 668	C++
[Inline Frame] Teams.exe!base::internal::Invoker<base::internal::BindState<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,void ()>::RunImpl(void(mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &) && functor, std::__1::tuple<base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState> && bound, std::__1::integer_sequence<unsigned long long,0,1,2,3>) Line 721	C++
Teams.exe!base::internal::Invoker<base::internal::BindState<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,void ()>::RunOnce(base::internal::BindStateBase * base) Line 690	C++
[Inline Frame] Teams.exe!base::OnceCallback<void ()>::Run() Line 98	C++
Teams.exe!base::TaskAnnotator::RunTask(const char * trace_event_name, base::PendingTask * pending_task) Line 178	C++
[Inline Frame] Teams.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::sequence_manager::LazyNow * continuation_lazy_now) Line 360	C++
Teams.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() Line 260	C++
Teams.exe!base::MessagePumpForUI::DoRunLoop() Line 221	C++
Teams.exe!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate) Line 79	C++
Teams.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed, base::TimeDelta timeout) Line 470	C++
Teams.exe!base::RunLoop::Run(const base::Location & location) Line 136	C++
Teams.exe!content::BrowserMainLoop::RunMainMessageLoop() Line 989	C++
Teams.exe!content::BrowserMainRunnerImpl::Run() Line 153	C++
Teams.exe!content::BrowserMain(const content::MainFunctionParams & parameters) Line 49	C++
[Inline Frame] Teams.exe!content::RunBrowserProcessMain(const content::MainFunctionParams & main_function_params, content::ContentMainDelegate * delegate) Line 608	C++
Teams.exe!content::ContentMainRunnerImpl::RunBrowser(content::MainFunctionParams & main_params, bool start_minimal_browser) Line 1104	C++
Teams.exe!content::ContentMainRunnerImpl::Run(bool start_minimal_browser) Line 971	C++
Teams.exe!content::RunContentProcess(const content::ContentMainParams & params, content::ContentMainRunner * content_main_runner) Line 394	C++
Teams.exe!content::ContentMain(const content::ContentMainParams & params) Line 422	C++
Teams.exe!wWinMain(HINSTANCE__ * instance, HINSTANCE__ *, wchar_t * cmd, int) Line 298	C++
[External Code]	
```

### Testcase Gist URL

https://gist.github.com/6c59983d04c7b0d5755e48e4fc6c31b5

### Additional Information

The Fiddle repro app should crash after running for a few seconds.
Bisected to this range: https://github.com/electron/electron/compare/v14.0.0-nightly.20210305...v14.0.0-nightly.20210308
Looks like it regressed by https://github.com/electron/electron/pull/27920
shell/browser/api/electron_api_web_contents.cc
}
#if !defined(OS_MAC)
   If the view's renderer is suspended this may fail on Windows/Linux -
   bail if so. See CopyFromSurface in
   content/public/browser/render_widget_host_view.h.
  auto* rfh = ontents()->GetMainFrame();
  if (rfh &&
      rfh->GetVisibilityState() == blink::mojom::PageVisibilityState::kHidden) {
    promise.Resolve(gfx::Image());
    return handle;
  }
#endif   defined(OS_MAC)
   Capture full page if user doesn't specify a |rect|.
  const gfx::Size view_size =
      rect.IsEmpty() ? view->GetViewBounds().size() : rect.size();
   By default, the requested bitmap size is the view size in screen
   coordinates.  However, if there's more pixel detail available on the
   current system, increase the requested bitmap size to capture it all.
  gfx::Size bitmap_size = view_size;
  const gfx::NativeView native_view = view->GetNativeView();
  const float scale = display::Screen::GetScreen()
                          ->GetDisplayNearestView(native_view)
                          .device_scale_factor();
  if (scale > 1.0f)
    bitmap_size = gfx::ScaleToCeiledSize(view_size, scale);
  view->CopyFromSurface(gfx::Rect(rect.origin(), view_size), bitmap_size,
                        base::BindOnce(&OnCapturePageDone, std::move(promise)));
  return handle;
}
void WebContents::IncrementCapturerCount(gin::Arguments* args) {