### 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
content::RenderFrameHost* render_frame_host) {
  
  
  
  
  
  
  
  if (!granted_devices_.empty()) {
    granted_devices_.erase(render_frame_host->GetFrameTreeNodeId());
  }
  
  
  
  
  
  auto* web_frame = WebFrameMain::FromRenderFrameHost(render_frame_host);
  if (web_frame && web_frame->render_frame_host() == render_frame_host)
    web_frame->MarkRenderFrameDisposed();
}
void WebContents::RenderFrameHostChanged(content::RenderFrameHost* old_host,