Skip to content

Commit eab35e7

Browse files
committed
Merge branch 'feature/focus-handler-ext' of https://github.com/numbersint/CefSharp
2 parents ad4cc17 + 9c8fab9 commit eab35e7

File tree

13 files changed

+166
-17
lines changed

13 files changed

+166
-17
lines changed

CefSharp.Core/Internals/ClientAdapter.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,41 @@ namespace CefSharp
390390
}
391391
}
392392

393+
void ClientAdapter::OnGotFocus(CefRefPtr<CefBrowser> browser)
394+
{
395+
IFocusHandler^ handler = _browserControl->FocusHandler;
396+
397+
if (handler == nullptr)
398+
{
399+
return;
400+
}
401+
402+
handler->OnGotFocus();
403+
}
404+
405+
bool ClientAdapter::OnSetFocus(CefRefPtr<CefBrowser> browser, FocusSource source)
406+
{
407+
IFocusHandler^ handler = _browserControl->FocusHandler;
408+
409+
if (handler == nullptr)
410+
{
411+
// Allow the focus to be set by default.
412+
return false;
413+
}
414+
415+
return handler->OnSetFocus((CefFocusSource)source);
416+
}
417+
393418
void ClientAdapter::OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next)
394419
{
395-
_browserControl->OnTakeFocus(next);
420+
IFocusHandler^ handler = _browserControl->FocusHandler;
421+
422+
if (handler == nullptr)
423+
{
424+
return;
425+
}
426+
427+
handler->OnTakeFocus(next);
396428
}
397429

398430
bool ClientAdapter::OnJSDialog(CefRefPtr<CefBrowser> browser, const CefString& origin_url, const CefString& accept_lang,

CefSharp.Core/Internals/ClientAdapter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ namespace CefSharp
106106
CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) OVERRIDE;
107107

108108
// CefFocusHandler
109+
virtual DECL void OnGotFocus(CefRefPtr<CefBrowser> browser) OVERRIDE;
110+
virtual DECL bool OnSetFocus(CefRefPtr<CefBrowser> browser, FocusSource source) OVERRIDE;
109111
virtual DECL void OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next) OVERRIDE;
110112

111113
// CefKeyboardHandler

CefSharp.OffScreen/ChromiumWebBrowser.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ public Task<Bitmap> ScreenshotAsync()
176176
public IKeyboardHandler KeyboardHandler { get; set; }
177177
public ILifeSpanHandler LifeSpanHandler { get; set; }
178178
public IMenuHandler MenuHandler { get; set; }
179+
public IFocusHandler FocusHandler { get; set; }
179180
public IRequestHandler RequestHandler { get; set; }
180181

181182
public event EventHandler<LoadErrorEventArgs> LoadError;
@@ -452,11 +453,6 @@ void IWebBrowserInternal.OnLoadError(string url, CefErrorCode errorCode, string
452453
}
453454
}
454455

455-
void IWebBrowserInternal.OnTakeFocus(bool next)
456-
{
457-
throw new NotImplementedException();
458-
}
459-
460456
void IWebBrowserInternal.OnStatusMessage(string value)
461457
{
462458
var handler = StatusMessage;

CefSharp.WinForms.Example/BrowserTabUserControl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public BrowserTabUserControl(string url)
2525

2626
browser.MenuHandler = new MenuHandler();
2727
browser.RequestHandler = new RequestHandler();
28+
//browser.FocusHandler = new FocusHandler(browser, urlTextBox);
2829
browser.NavStateChanged += OnBrowserNavStateChanged;
2930
browser.ConsoleMessage += OnBrowserConsoleMessage;
3031
browser.TitleChanged += OnBrowserTitleChanged;

CefSharp.WinForms.Example/CefSharp.WinForms.Example.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
<Compile Include="BrowserTabUserControl.Designer.cs">
7171
<DependentUpon>BrowserTabUserControl.cs</DependentUpon>
7272
</Compile>
73+
<Compile Include="FocusHandler.cs" />
7374
<Compile Include="MenuHandler.cs" />
7475
<Compile Include="Minimal\SimpleBrowserForm.cs">
7576
<SubType>Form</SubType>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright © 2010-2014 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
using System.Windows.Forms;
6+
namespace CefSharp.WinForms.Example
7+
{
8+
internal class FocusHandler : IFocusHandler
9+
{
10+
private ChromiumWebBrowser browser;
11+
private ToolStripTextBox urlTextBox;
12+
13+
public FocusHandler(ChromiumWebBrowser browser, ToolStripTextBox urlTextBox)
14+
{
15+
this.browser = browser;
16+
this.urlTextBox = urlTextBox;
17+
}
18+
19+
public void OnGotFocus()
20+
{
21+
// Fired when Chromium finally receives focus.
22+
}
23+
24+
public bool OnSetFocus(CefFocusSource source)
25+
{
26+
// Returning false means that we allow Chromium to take the focus away from our WinForms control.
27+
// You could also return true to keep focus in the address bar.
28+
return false;
29+
}
30+
31+
public void OnTakeFocus(bool next)
32+
{
33+
// Fired when Chromium is giving up focus because the user
34+
// pressed Tab on the last link/field in the HTML document (in which case 'next' is true)
35+
// or because they pressed Shift+Tab on the first link/field (in which case 'next' is false).
36+
37+
// Here we always focus on the address bar.
38+
urlTextBox.Control.BeginInvoke(new MethodInvoker(() => urlTextBox.Focus()));
39+
}
40+
}
41+
}

CefSharp.WinForms/ChromiumWebBrowser.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ChromiumWebBrowser : Control, IWebBrowserInternal, IWinFormsWebBrow
2626
public IDownloadHandler DownloadHandler { get; set; }
2727
public ILifeSpanHandler LifeSpanHandler { get; set; }
2828
public IMenuHandler MenuHandler { get; set; }
29+
public IFocusHandler FocusHandler { get; set; }
2930

3031
public bool CanGoForward { get; private set; }
3132
public bool CanGoBack { get; private set; }
@@ -54,6 +55,8 @@ public ChromiumWebBrowser(string address)
5455
Address = address;
5556

5657
Dock = DockStyle.Fill;
58+
59+
FocusHandler = new DefaultFocusHandler(this);
5760
}
5861

5962
protected override void Dispose(bool disposing)
@@ -208,11 +211,6 @@ void IWebBrowserInternal.OnFrameLoadEnd(string url, bool isMainFrame, int httpSt
208211
}
209212
}
210213

211-
void IWebBrowserInternal.OnTakeFocus(bool next)
212-
{
213-
SelectNextControl(this, next, true, true, true);
214-
}
215-
216214
void IWebBrowserInternal.OnConsoleMessage(string message, string source, int line)
217215
{
218216
var handler = ConsoleMessage;
@@ -358,5 +356,31 @@ private void ResizeBrowser()
358356
managedCefBrowserAdapter.Resize(Width, Height);
359357
}
360358
}
359+
360+
#region DefaultFocusHandler
361+
private class DefaultFocusHandler : IFocusHandler
362+
{
363+
private ChromiumWebBrowser browser;
364+
365+
public DefaultFocusHandler(ChromiumWebBrowser browser)
366+
{
367+
this.browser = browser;
368+
}
369+
370+
public void OnGotFocus()
371+
{
372+
}
373+
374+
public bool OnSetFocus(CefFocusSource source)
375+
{
376+
return false;
377+
}
378+
379+
public void OnTakeFocus(bool next)
380+
{
381+
browser.BeginInvoke(new MethodInvoker(() => browser.SelectNextControl(browser, next, true, true, true)));
382+
}
383+
}
384+
#endregion
361385
}
362386
}

CefSharp.Wpf/ChromiumWebBrowser.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public class ChromiumWebBrowser : ContentControl, IRenderWebBrowser, IWpfWebBrow
5151
public IDownloadHandler DownloadHandler { get; set; }
5252
public ILifeSpanHandler LifeSpanHandler { get; set; }
5353
public IMenuHandler MenuHandler { get; set; }
54+
public IFocusHandler FocusHandler { get; set; }
5455

5556
public event EventHandler<ConsoleMessageEventArgs> ConsoleMessage;
5657
public event EventHandler<StatusMessageEventArgs> StatusMessage;
@@ -1132,11 +1133,6 @@ void IWebBrowserInternal.OnFrameLoadEnd(string url, bool isMainFrame, int httpSt
11321133
}
11331134
}
11341135

1135-
void IWebBrowserInternal.OnTakeFocus(bool next)
1136-
{
1137-
throw new NotImplementedException();
1138-
}
1139-
11401136
void IWebBrowserInternal.OnConsoleMessage(string message, string source, int line)
11411137
{
11421138
var handler = ConsoleMessage;

CefSharp/CefFocusSource.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright © 2010-2014 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
namespace CefSharp
6+
{
7+
/// <summary>
8+
/// Focus Source
9+
/// </summary>
10+
public enum CefFocusSource
11+
{
12+
/// <summary>
13+
/// The source is explicit navigation via the API (LoadURL(), etc).
14+
/// </summary>
15+
FocusSourceNavigation = 0,
16+
/// <summary>
17+
/// The source is a system-generated focus event.
18+
/// </summary>
19+
FocusSourceSystem
20+
}
21+
}

CefSharp/CefSharp.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
</ItemGroup>
9090
<ItemGroup>
9191
<Compile Include="CefFileDialogMode.cs" />
92+
<Compile Include="IFocusHandler.cs" />
9293
<Compile Include="IsBrowserInitializedChangedEventArgs.cs" />
9394
<Compile Include="CefTerminationStatus.cs" />
9495
<Compile Include="IDialogHandler.cs" />
@@ -114,6 +115,7 @@
114115
<Compile Include="TransitionType.cs" />
115116
<Compile Include="NavStateChangedEventArgs.cs" />
116117
<Compile Include="ICompletionHandler.cs" />
118+
<Compile Include="CefFocusSource.cs" />
117119
<Compile Include="Internals\BitmapInfo.cs" />
118120
<Compile Include="Internals\IBrowserProcess.cs" />
119121
<Compile Include="Internals\JavascriptMethod.cs" />

0 commit comments

Comments
 (0)