fix: only focus a webContents if the window was not initially hidden (#25292)
This commit is contained in:
		
					parent
					
						
							
								d305fe7d30
							
						
					
				
			
			
				commit
				
					
						a6b9f9d8e5
					
				
			
		
					 4 changed files with 17 additions and 6 deletions
				
			
		| 
						 | 
					@ -28,9 +28,11 @@ Object.setPrototypeOf(BrowserWindow.prototype, BaseWindow.prototype);
 | 
				
			||||||
  // Though this hack is only needed on macOS when the app is launched from
 | 
					  // Though this hack is only needed on macOS when the app is launched from
 | 
				
			||||||
  // Finder, we still do it on all platforms in case of other bugs we don't
 | 
					  // Finder, we still do it on all platforms in case of other bugs we don't
 | 
				
			||||||
  // know.
 | 
					  // know.
 | 
				
			||||||
 | 
					  if (this.webContents._initiallyShown) {
 | 
				
			||||||
    this.webContents.once('load-url' as any, function (this: WebContents) {
 | 
					    this.webContents.once('load-url' as any, function (this: WebContents) {
 | 
				
			||||||
      this.focus();
 | 
					      this.focus();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Redirect focus/blur event to app instance too.
 | 
					  // Redirect focus/blur event to app instance too.
 | 
				
			||||||
  this.on('blur', (event: Event) => {
 | 
					  this.on('blur', (event: Event) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -474,8 +474,8 @@ WebContents::WebContents(v8::Isolate* isolate,
 | 
				
			||||||
  // BrowserViews are not attached to a window initially so they should start
 | 
					  // BrowserViews are not attached to a window initially so they should start
 | 
				
			||||||
  // off as hidden. This is also important for compositor recycling. See:
 | 
					  // off as hidden. This is also important for compositor recycling. See:
 | 
				
			||||||
  // https://github.com/electron/electron/pull/21372
 | 
					  // https://github.com/electron/electron/pull/21372
 | 
				
			||||||
  bool initially_shown = type_ != Type::BROWSER_VIEW;
 | 
					  initially_shown_ = type_ != Type::BROWSER_VIEW;
 | 
				
			||||||
  options.Get(options::kShow, &initially_shown);
 | 
					  options.Get(options::kShow, &initially_shown_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Obtain the session.
 | 
					  // Obtain the session.
 | 
				
			||||||
  std::string partition;
 | 
					  std::string partition;
 | 
				
			||||||
| 
						 | 
					@ -531,7 +531,7 @@ WebContents::WebContents(v8::Isolate* isolate,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    content::WebContents::CreateParams params(session->browser_context());
 | 
					    content::WebContents::CreateParams params(session->browser_context());
 | 
				
			||||||
    params.initially_hidden = !initially_shown;
 | 
					    params.initially_hidden = !initially_shown_;
 | 
				
			||||||
    web_contents = content::WebContents::Create(params);
 | 
					    web_contents = content::WebContents::Create(params);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2732,6 +2732,10 @@ v8::Local<v8::Value> WebContents::Debugger(v8::Isolate* isolate) {
 | 
				
			||||||
  return v8::Local<v8::Value>::New(isolate, debugger_);
 | 
					  return v8::Local<v8::Value>::New(isolate, debugger_);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool WebContents::WasInitiallyShown() {
 | 
				
			||||||
 | 
					  return initially_shown_;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WebContents::GrantOriginAccess(const GURL& url) {
 | 
					void WebContents::GrantOriginAccess(const GURL& url) {
 | 
				
			||||||
  content::ChildProcessSecurityPolicy::GetInstance()->GrantCommitOrigin(
 | 
					  content::ChildProcessSecurityPolicy::GetInstance()->GrantCommitOrigin(
 | 
				
			||||||
      web_contents()->GetMainFrame()->GetProcess()->GetID(),
 | 
					      web_contents()->GetMainFrame()->GetProcess()->GetID(),
 | 
				
			||||||
| 
						 | 
					@ -2925,6 +2929,7 @@ v8::Local<v8::ObjectTemplate> WebContents::FillObjectTemplate(
 | 
				
			||||||
      .SetProperty("hostWebContents", &WebContents::HostWebContents)
 | 
					      .SetProperty("hostWebContents", &WebContents::HostWebContents)
 | 
				
			||||||
      .SetProperty("devToolsWebContents", &WebContents::DevToolsWebContents)
 | 
					      .SetProperty("devToolsWebContents", &WebContents::DevToolsWebContents)
 | 
				
			||||||
      .SetProperty("debugger", &WebContents::Debugger)
 | 
					      .SetProperty("debugger", &WebContents::Debugger)
 | 
				
			||||||
 | 
					      .SetProperty("_initiallyShown", &WebContents::WasInitiallyShown)
 | 
				
			||||||
      .Build();
 | 
					      .Build();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -393,6 +393,7 @@ class WebContents : public gin::Wrappable<WebContents>,
 | 
				
			||||||
  content::WebContents* HostWebContents() const;
 | 
					  content::WebContents* HostWebContents() const;
 | 
				
			||||||
  v8::Local<v8::Value> DevToolsWebContents(v8::Isolate* isolate);
 | 
					  v8::Local<v8::Value> DevToolsWebContents(v8::Isolate* isolate);
 | 
				
			||||||
  v8::Local<v8::Value> Debugger(v8::Isolate* isolate);
 | 
					  v8::Local<v8::Value> Debugger(v8::Isolate* isolate);
 | 
				
			||||||
 | 
					  bool WasInitiallyShown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WebContentsZoomController* GetZoomController() { return zoom_controller_; }
 | 
					  WebContentsZoomController* GetZoomController() { return zoom_controller_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -683,6 +684,8 @@ class WebContents : public gin::Wrappable<WebContents>,
 | 
				
			||||||
  // Observers of this WebContents.
 | 
					  // Observers of this WebContents.
 | 
				
			||||||
  base::ObserverList<ExtendedWebContentsObserver> observers_;
 | 
					  base::ObserverList<ExtendedWebContentsObserver> observers_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool initially_shown_ = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // The ID of the process of the currently committed RenderViewHost.
 | 
					  // The ID of the process of the currently committed RenderViewHost.
 | 
				
			||||||
  // -1 means no speculative RVH has been committed yet.
 | 
					  // -1 means no speculative RVH has been committed yet.
 | 
				
			||||||
  int currently_committed_process_id_ = -1;
 | 
					  int currently_committed_process_id_ = -1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								typings/internal-electron.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								typings/internal-electron.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -56,6 +56,7 @@ declare namespace Electron {
 | 
				
			||||||
    getLastWebPreferences(): Electron.WebPreferences;
 | 
					    getLastWebPreferences(): Electron.WebPreferences;
 | 
				
			||||||
    _getPreloadPaths(): string[];
 | 
					    _getPreloadPaths(): string[];
 | 
				
			||||||
    equal(other: WebContents): boolean;
 | 
					    equal(other: WebContents): boolean;
 | 
				
			||||||
 | 
					    _initiallyShown: boolean;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  interface WebPreferences {
 | 
					  interface WebPreferences {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue