feat: add a 'title' parameter to openDevTools() (#39047)
		
	* [Feature Request]: Add a parameter to openDevTools() that sets the DevTools window title bar * all titles->title * add GetDevToolsTitle(),update docs * fix:lint error * fix:lint error * add setDevToolTitle * lint errror * lint errror * ling errror (.md) * build error * build error in mac * build error * build error * change docs * std::string->std::u16string * lint error * build error * build error
This commit is contained in:
		
					parent
					
						
							
								8e3dcc8b17
							
						
					
				
			
			
				commit
				
					
						127584dc37
					
				
			
		
					 13 changed files with 90 additions and 5 deletions
				
			
		|  | @ -1777,6 +1777,7 @@ app.whenReady().then(() => { | |||
|     In `undocked` mode it's possible to dock back. In `detach` mode it's not. | ||||
|   * `activate` boolean (optional) - Whether to bring the opened devtools window | ||||
|     to the foreground. The default is `true`. | ||||
|   * `title` string (optional) - A title for the DevTools window (only in `undocked` or `detach` mode). | ||||
| 
 | ||||
| Opens the devtools. | ||||
| 
 | ||||
|  | @ -1797,6 +1798,18 @@ Returns `boolean` - Whether the devtools is opened. | |||
| 
 | ||||
| Returns `boolean` - Whether the devtools view is focused . | ||||
| 
 | ||||
| #### `contents.getDevToolsTitle()` | ||||
| 
 | ||||
| Returns `string` - the current title of the DevTools window. This will only be visible | ||||
| if DevTools is opened in `undocked` or `detach` mode. | ||||
| 
 | ||||
| #### `contents.setDevToolsTitle(title)` | ||||
| 
 | ||||
| * `title` string | ||||
| 
 | ||||
| Changes the title of the DevTools window to `title`. This will only be visible if DevTools is | ||||
| opened in `undocked` or `detach` mode. | ||||
| 
 | ||||
| #### `contents.toggleDevTools()` | ||||
| 
 | ||||
| Toggles the developer tools. | ||||
|  |  | |||
|  | @ -2649,16 +2649,19 @@ void WebContents::OpenDevTools(gin::Arguments* args) { | |||
| #endif | ||||
| 
 | ||||
|   bool activate = true; | ||||
|   std::string title; | ||||
|   if (args && args->Length() == 1) { | ||||
|     gin_helper::Dictionary options; | ||||
|     if (args->GetNext(&options)) { | ||||
|       options.Get("mode", &state); | ||||
|       options.Get("activate", &activate); | ||||
|       options.Get("title", &title); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   DCHECK(inspectable_web_contents_); | ||||
|   inspectable_web_contents_->SetDockState(state); | ||||
|   inspectable_web_contents_->SetDevToolsTitle(base::UTF8ToUTF16(title)); | ||||
|   inspectable_web_contents_->ShowDevTools(activate); | ||||
| } | ||||
| 
 | ||||
|  | @ -2678,6 +2681,18 @@ bool WebContents::IsDevToolsOpened() { | |||
|   return inspectable_web_contents_->IsDevToolsViewShowing(); | ||||
| } | ||||
| 
 | ||||
| std::u16string WebContents::GetDevToolsTitle() { | ||||
|   if (type_ == Type::kRemote) | ||||
|     return std::u16string(); | ||||
| 
 | ||||
|   DCHECK(inspectable_web_contents_); | ||||
|   return inspectable_web_contents_->GetDevToolsTitle(); | ||||
| } | ||||
| 
 | ||||
| void WebContents::SetDevToolsTitle(const std::u16string& title) { | ||||
|   inspectable_web_contents_->SetDevToolsTitle(title); | ||||
| } | ||||
| 
 | ||||
| bool WebContents::IsDevToolsFocused() { | ||||
|   if (type_ == Type::kRemote) | ||||
|     return false; | ||||
|  | @ -4214,6 +4229,8 @@ void WebContents::FillObjectTemplate(v8::Isolate* isolate, | |||
|       .SetMethod("closeDevTools", &WebContents::CloseDevTools) | ||||
|       .SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened) | ||||
|       .SetMethod("isDevToolsFocused", &WebContents::IsDevToolsFocused) | ||||
|       .SetMethod("getDevToolsTitle", &WebContents::GetDevToolsTitle) | ||||
|       .SetMethod("setDevToolsTitle", &WebContents::SetDevToolsTitle) | ||||
|       .SetMethod("enableDeviceEmulation", &WebContents::EnableDeviceEmulation) | ||||
|       .SetMethod("disableDeviceEmulation", &WebContents::DisableDeviceEmulation) | ||||
|       .SetMethod("toggleDevTools", &WebContents::ToggleDevTools) | ||||
|  |  | |||
|  | @ -201,6 +201,8 @@ class WebContents : public ExclusiveAccessContext, | |||
|   void CloseDevTools(); | ||||
|   bool IsDevToolsOpened(); | ||||
|   bool IsDevToolsFocused(); | ||||
|   std::u16string GetDevToolsTitle(); | ||||
|   void SetDevToolsTitle(const std::u16string& title); | ||||
|   void ToggleDevTools(); | ||||
|   void EnableDeviceEmulation(const blink::DeviceEmulationParams& params); | ||||
|   void DisableDeviceEmulation(); | ||||
|  |  | |||
|  | @ -50,6 +50,7 @@ using electron::InspectableWebContentsViewMac; | |||
| - (void)setContentsResizingStrategy: | ||||
|     (const DevToolsContentsResizingStrategy&)strategy; | ||||
| - (void)setTitle:(NSString*)title; | ||||
| - (NSString*)getTitle; | ||||
| 
 | ||||
| - (void)redispatchContextMenuEvent:(base::apple::OwnedNSEvent)theEvent; | ||||
| 
 | ||||
|  |  | |||
|  | @ -244,6 +244,10 @@ | |||
|   [devtools_window_ setTitle:title]; | ||||
| } | ||||
| 
 | ||||
| - (NSString*)getTitle { | ||||
|   return [devtools_window_ title]; | ||||
| } | ||||
| 
 | ||||
| - (void)viewDidBecomeFirstResponder:(NSNotification*)notification { | ||||
|   auto* inspectable_web_contents = | ||||
|       inspectableWebContentsView_->inspectable_web_contents(); | ||||
|  |  | |||
|  | @ -426,6 +426,11 @@ void InspectableWebContents::SetDockState(const std::string& state) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| void InspectableWebContents::SetDevToolsTitle(const std::u16string& title) { | ||||
|   devtools_title_ = title; | ||||
|   view_->SetTitle(devtools_title_); | ||||
| } | ||||
| 
 | ||||
| void InspectableWebContents::SetDevToolsWebContents( | ||||
|     content::WebContents* devtools) { | ||||
|   if (!managed_devtools_web_contents_) | ||||
|  | @ -481,6 +486,10 @@ bool InspectableWebContents::IsDevToolsViewShowing() { | |||
|   return managed_devtools_web_contents_ && view_->IsDevToolsViewShowing(); | ||||
| } | ||||
| 
 | ||||
| std::u16string InspectableWebContents::GetDevToolsTitle() { | ||||
|   return view_->GetTitle(); | ||||
| } | ||||
| 
 | ||||
| void InspectableWebContents::AttachTo( | ||||
|     scoped_refptr<content::DevToolsAgentHost> host) { | ||||
|   Detach(); | ||||
|  | @ -565,6 +574,9 @@ void InspectableWebContents::LoadCompleted() { | |||
|   // If the devtools can dock, "SetIsDocked" will be called by devtools itself.
 | ||||
|   if (!can_dock_) { | ||||
|     SetIsDocked(DispatchCallback(), false); | ||||
|     if (!devtools_title_.empty()) { | ||||
|       view_->SetTitle(devtools_title_); | ||||
|     } | ||||
|   } else { | ||||
|     if (dock_state_.empty()) { | ||||
|       const base::Value::Dict& prefs = | ||||
|  | @ -635,9 +647,12 @@ void InspectableWebContents::SetInspectedPageBounds(const gfx::Rect& rect) { | |||
| void InspectableWebContents::InspectElementCompleted() {} | ||||
| 
 | ||||
| void InspectableWebContents::InspectedURLChanged(const std::string& url) { | ||||
|   if (managed_devtools_web_contents_) | ||||
|     view_->SetTitle( | ||||
|         base::UTF8ToUTF16(base::StringPrintf(kTitleFormat, url.c_str()))); | ||||
|   if (managed_devtools_web_contents_) { | ||||
|     if (devtools_title_.empty()) { | ||||
|       view_->SetTitle( | ||||
|           base::UTF8ToUTF16(base::StringPrintf(kTitleFormat, url.c_str()))); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void InspectableWebContents::LoadNetworkResource(DispatchCallback callback, | ||||
|  |  | |||
|  | @ -59,9 +59,11 @@ class InspectableWebContents | |||
|   void ReleaseWebContents(); | ||||
|   void SetDevToolsWebContents(content::WebContents* devtools); | ||||
|   void SetDockState(const std::string& state); | ||||
|   void SetDevToolsTitle(const std::u16string& title); | ||||
|   void ShowDevTools(bool activate); | ||||
|   void CloseDevTools(); | ||||
|   bool IsDevToolsViewShowing(); | ||||
|   std::u16string GetDevToolsTitle(); | ||||
|   void AttachTo(scoped_refptr<content::DevToolsAgentHost>); | ||||
|   void Detach(); | ||||
|   void CallClientFunction( | ||||
|  | @ -207,6 +209,7 @@ class InspectableWebContents | |||
|   gfx::Rect devtools_bounds_; | ||||
|   bool can_dock_ = true; | ||||
|   std::string dock_state_; | ||||
|   std::u16string devtools_title_; | ||||
|   bool activate_ = true; | ||||
| 
 | ||||
|   raw_ptr<InspectableWebContentsDelegate> delegate_ = | ||||
|  |  | |||
|  | @ -57,6 +57,7 @@ class InspectableWebContentsView { | |||
|   virtual void SetContentsResizingStrategy( | ||||
|       const DevToolsContentsResizingStrategy& strategy) = 0; | ||||
|   virtual void SetTitle(const std::u16string& title) = 0; | ||||
|   virtual const std::u16string GetTitle() = 0; | ||||
| 
 | ||||
|  protected: | ||||
|   // Owns us.
 | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ class InspectableWebContentsViewMac : public InspectableWebContentsView { | |||
|   void SetContentsResizingStrategy( | ||||
|       const DevToolsContentsResizingStrategy& strategy) override; | ||||
|   void SetTitle(const std::u16string& title) override; | ||||
|   const std::u16string GetTitle() override; | ||||
| 
 | ||||
|  private: | ||||
|   ElectronInspectableWebContentsView* __strong view_; | ||||
|  |  | |||
|  | @ -61,4 +61,8 @@ void InspectableWebContentsViewMac::SetTitle(const std::u16string& title) { | |||
|   [view_ setTitle:base::SysUTF16ToNSString(title)]; | ||||
| } | ||||
| 
 | ||||
| const std::u16string InspectableWebContentsViewMac::GetTitle() { | ||||
|   return base::SysNSStringToUTF16([view_ getTitle]); | ||||
| } | ||||
| 
 | ||||
| }  // namespace electron | ||||
|  |  | |||
|  | @ -209,6 +209,10 @@ void InspectableWebContentsViewViews::SetTitle(const std::u16string& title) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| const std::u16string InspectableWebContentsViewViews::GetTitle() { | ||||
|   return title_; | ||||
| } | ||||
| 
 | ||||
| void InspectableWebContentsViewViews::Layout() { | ||||
|   if (!devtools_web_view_->GetVisible()) { | ||||
|     contents_web_view_->SetBoundsRect(GetContentsBounds()); | ||||
|  |  | |||
|  | @ -39,12 +39,11 @@ class InspectableWebContentsViewViews : public InspectableWebContentsView, | |||
|   void SetContentsResizingStrategy( | ||||
|       const DevToolsContentsResizingStrategy& strategy) override; | ||||
|   void SetTitle(const std::u16string& title) override; | ||||
|   const std::u16string GetTitle() override; | ||||
| 
 | ||||
|   // views::View:
 | ||||
|   void Layout() override; | ||||
| 
 | ||||
|   const std::u16string& GetTitle() const { return title_; } | ||||
| 
 | ||||
|  private: | ||||
|   std::unique_ptr<views::Widget> devtools_window_; | ||||
|   raw_ptr<views::WebView> devtools_window_web_view_ = nullptr; | ||||
|  |  | |||
|  | @ -608,6 +608,27 @@ describe('webContents module', () => { | |||
|       await devtoolsOpened; | ||||
|       expect(w.webContents.isDevToolsOpened()).to.be.true(); | ||||
|     }); | ||||
| 
 | ||||
|     it('can show a DevTools window with custom title', async () => { | ||||
|       const w = new BrowserWindow({ show: false }); | ||||
|       const devtoolsOpened = once(w.webContents, 'devtools-opened'); | ||||
|       w.webContents.openDevTools({ mode: 'detach', activate: false, title: 'myTitle' }); | ||||
|       await devtoolsOpened; | ||||
|       expect(w.webContents.getDevToolsTitle()).to.equal('myTitle'); | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   describe('setDevToolsTitle() API', () => { | ||||
|     afterEach(closeAllWindows); | ||||
|     it('can set devtools title with function', async () => { | ||||
|       const w = new BrowserWindow({ show: false }); | ||||
|       const devtoolsOpened = once(w.webContents, 'devtools-opened'); | ||||
|       w.webContents.openDevTools({ mode: 'detach', activate: false }); | ||||
|       await devtoolsOpened; | ||||
|       expect(w.webContents.isDevToolsOpened()).to.be.true(); | ||||
|       w.webContents.setDevToolsTitle('newTitle'); | ||||
|       expect(w.webContents.getDevToolsTitle()).to.equal('newTitle'); | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   describe('before-input-event event', () => { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 wgsheng
				wgsheng