Skip to content

Commit f92687b

Browse files
AgapovAlexseyamaitland
authored andcommitted
1 parent 5cab3c2 commit f92687b

19 files changed

+559
-1
lines changed

CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,8 @@
362362
<ClInclude Include="BrowserSettings.h" />
363363
<ClInclude Include="Cef.h" />
364364
<ClInclude Include="Internals\CefDevToolsMessageObserverAdapter.h" />
365+
<ClInclude Include="Internals\CefMediaAccessCallbackWrapper.h" />
366+
<ClInclude Include="Internals\CefPermissionPromptCallbackWrapper.h" />
365367
<ClInclude Include="Internals\CefRefCountManaged.h" />
366368
<ClInclude Include="Internals\CefRegistrationWrapper.h" />
367369
<ClInclude Include="Internals\CefResourceReadCallbackWrapper.h" />

CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@
123123
</ClInclude>
124124
<ClInclude Include="Internals\CefTaskScheduler.h">
125125
<Filter>Header Files</Filter>
126+
</ClInclude>
127+
<ClInclude Include="Internals\CefPermissionPromptCallbackWrapper.h">
128+
<Filter>Header Files</Filter>
129+
</ClInclude>
130+
<ClInclude Include="Internals\CefMediaAccessCallbackWrapper.h">
131+
<Filter>Header Files</Filter>
126132
</ClInclude>
127133
<ClInclude Include="NativeMethodWrapper.h">
128134
<Filter>Header Files</Filter>

CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@
267267
<ClInclude Include="Cef.h" />
268268
<ClInclude Include="DragData.h" />
269269
<ClInclude Include="Internals\CefDevToolsMessageObserverAdapter.h" />
270+
<ClInclude Include="Internals\CefMediaAccessCallbackWrapper.h" />
271+
<ClInclude Include="Internals\CefPermissionPromptCallbackWrapper.h" />
270272
<ClInclude Include="Internals\CefRefCountManaged.h" />
271273
<ClInclude Include="Internals\CefRegistrationWrapper.h" />
272274
<ClInclude Include="Internals\CefResourceReadCallbackWrapper.h" />

CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,12 @@
331331
<ClInclude Include="Internals\CefTaskDelegate.h">
332332
<Filter>Header Files</Filter>
333333
</ClInclude>
334+
<ClInclude Include="Internals\CefPermissionPromptCallbackWrapper.h">
335+
<Filter>Header Files</Filter>
336+
</ClInclude>
337+
<ClInclude Include="Internals\CefMediaAccessCallbackWrapper.h">
338+
<Filter>Header Files</Filter>
339+
</ClInclude>
334340
</ItemGroup>
335341
<ItemGroup>
336342
<ClInclude Include="Internals\CefFrameWrapper.h">
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright © 2022 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+
#pragma once
6+
7+
#include "Stdafx.h"
8+
9+
#include "include\cef_permission_handler.h"
10+
#include "CefWrapper.h"
11+
12+
namespace CefSharp
13+
{
14+
namespace Internals
15+
{
16+
private ref class CefMediaAccessCallbackWrapper : public IMediaAccessCallback, public CefWrapper
17+
{
18+
private:
19+
MCefRefPtr<CefMediaAccessCallback> _callback;
20+
public:
21+
CefMediaAccessCallbackWrapper(CefRefPtr<CefMediaAccessCallback>& callback) :
22+
_callback(callback)
23+
{
24+
25+
}
26+
27+
!CefMediaAccessCallbackWrapper()
28+
{
29+
_callback = nullptr;
30+
}
31+
32+
~CefMediaAccessCallbackWrapper()
33+
{
34+
this->!CefMediaAccessCallbackWrapper();
35+
36+
_disposed = true;
37+
}
38+
39+
virtual void Cancel()
40+
{
41+
ThrowIfDisposed();
42+
43+
_callback->Cancel();
44+
45+
delete this;
46+
}
47+
48+
virtual void Continue(CefMediaAccessPermissionType allowedPermissions)
49+
{
50+
ThrowIfDisposed();
51+
52+
_callback->Continue(static_cast<cef_media_access_permission_types_t>(allowedPermissions));
53+
54+
delete this;
55+
}
56+
};
57+
}
58+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright © 2022 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+
#pragma once
6+
7+
#include "Stdafx.h"
8+
9+
#include "include\cef_permission_handler.h"
10+
#include "CefWrapper.h"
11+
12+
namespace CefSharp
13+
{
14+
namespace Internals
15+
{
16+
private ref class CefPermissionPromptCallbackWrapper : public IPermissionPromptCallback, public CefWrapper
17+
{
18+
private:
19+
MCefRefPtr<CefPermissionPromptCallback> _callback;
20+
public:
21+
CefPermissionPromptCallbackWrapper(CefRefPtr<CefPermissionPromptCallback> &callback):
22+
_callback(callback)
23+
{
24+
25+
}
26+
27+
!CefPermissionPromptCallbackWrapper()
28+
{
29+
_callback = nullptr;
30+
}
31+
32+
~CefPermissionPromptCallbackWrapper()
33+
{
34+
this->!CefPermissionPromptCallbackWrapper();
35+
36+
_disposed = true;
37+
}
38+
39+
virtual void Continue(CefPermissionResult result)
40+
{
41+
ThrowIfDisposed();
42+
43+
_callback->Continue(static_cast<cef_permission_request_result_t>(result));
44+
45+
delete this;
46+
}
47+
};
48+
}
49+
}

CefSharp.Core.Runtime/Internals/ClientAdapter.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
#include "CefResourceRequestHandlerAdapter.h"
2323
#include "CefRequestCallbackWrapper.h"
2424
#include "CefRunContextMenuCallbackWrapper.h"
25+
#include "CefPermissionPromptCallbackWrapper.h"
2526
#include "CefSslInfoWrapper.h"
2627
#include "CefBrowserWrapper.h"
28+
#include "CefMediaAccessCallbackWrapper.h"
2729
#include "ManagedCefBrowserAdapter.h"
2830
#include "Messaging\Messages.h"
2931
#include "PopupFeatures.h"
@@ -1182,6 +1184,50 @@ namespace CefSharp
11821184
}
11831185
}
11841186

1187+
bool ClientAdapter::OnShowPermissionPrompt(CefRefPtr<CefBrowser> browser, uint64 prompt_id,
1188+
const CefString& requesting_origin, uint32 requested_permissions,
1189+
CefRefPtr<CefPermissionPromptCallback> callback)
1190+
{
1191+
auto handler = _browserControl->PermissionHandler;
1192+
if (handler != nullptr)
1193+
{
1194+
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
1195+
auto callbackWrapper = gcnew CefPermissionPromptCallbackWrapper(callback);
1196+
1197+
return handler->OnShowPermissionPrompt(_browserControl, browserWrapper, prompt_id, StringUtils::ToClr(requesting_origin), (CefPermissionType)requested_permissions, callbackWrapper);
1198+
}
1199+
1200+
return false;
1201+
}
1202+
1203+
void ClientAdapter::OnDismissPermissionPrompt(CefRefPtr<CefBrowser> browser, uint64 prompt_id,
1204+
cef_permission_request_result_t result)
1205+
{
1206+
auto handler = _browserControl->PermissionHandler;
1207+
if (handler != nullptr)
1208+
{
1209+
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
1210+
1211+
handler->OnDismissPermissionPrompt(_browserControl, browserWrapper, prompt_id, (CefPermissionResult)result);
1212+
}
1213+
}
1214+
1215+
bool ClientAdapter::OnRequestMediaAccessPermission(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
1216+
const CefString& requesting_origin, uint32 requested_permissions,
1217+
CefRefPtr<CefMediaAccessCallback> callback)
1218+
{
1219+
auto handler = _browserControl->PermissionHandler;
1220+
if (handler != nullptr)
1221+
{
1222+
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
1223+
CefFrameWrapper frameWrapper(frame);
1224+
auto callbackWrapper = gcnew CefMediaAccessCallbackWrapper(callback);
1225+
1226+
return handler->OnRequestMediaAccessPermission(_browserControl, browserWrapper, %frameWrapper, StringUtils::ToClr(requesting_origin), (CefMediaAccessPermissionType)requested_permissions, callbackWrapper);
1227+
}
1228+
return false;
1229+
}
1230+
11851231
bool ClientAdapter::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
11861232
{
11871233
if (_disposed)

CefSharp.Core.Runtime/Internals/ClientAdapter.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ namespace CefSharp
3434
public CefDownloadHandler,
3535
public CefFindHandler,
3636
public CefAudioHandler,
37-
public CefFrameHandler
37+
public CefFrameHandler,
38+
public CefPermissionHandler
3839
{
3940
private:
4041
gcroot<IWebBrowserInternal^> _browserControl;
@@ -102,6 +103,7 @@ namespace CefSharp
102103
virtual DECL CefRefPtr<CefFindHandler> GetFindHandler() override { return this; }
103104
virtual DECL CefRefPtr<CefAudioHandler> GetAudioHandler() override { return this; }
104105
virtual DECL CefRefPtr<CefFrameHandler> GetFrameHandler() override { return this; }
106+
virtual DECL CefRefPtr<CefPermissionHandler> GetPermissionHandler() override { return this; }
105107
virtual DECL bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) override;
106108

107109

@@ -209,6 +211,26 @@ namespace CefSharp
209211
virtual DECL void OnFrameDetached(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame) override;
210212
virtual DECL void OnMainFrameChanged(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> old_frame, CefRefPtr<CefFrame> new_frame) override;
211213

214+
//CefPermissionHandler
215+
virtual DECL bool OnShowPermissionPrompt(
216+
CefRefPtr<CefBrowser> browser,
217+
uint64 prompt_id,
218+
const CefString& requesting_origin,
219+
uint32 requested_permissions,
220+
CefRefPtr<CefPermissionPromptCallback> callback) override;
221+
222+
virtual DECL void OnDismissPermissionPrompt(
223+
CefRefPtr<CefBrowser> browser,
224+
uint64 prompt_id,
225+
cef_permission_request_result_t result) override;
226+
227+
virtual DECL bool OnRequestMediaAccessPermission(
228+
CefRefPtr<CefBrowser> browser,
229+
CefRefPtr<CefFrame> frame,
230+
const CefString& requesting_origin,
231+
uint32 requested_permissions,
232+
CefRefPtr<CefMediaAccessCallback> callback) override;
233+
212234
IMPLEMENT_REFCOUNTINGM(ClientAdapter);
213235
};
214236
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright © 2022 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 CefSharp.Handler;
6+
7+
namespace CefSharp.Example.Handlers
8+
{
9+
public class PermissionHandlerExample : PermissionHandler
10+
{
11+
protected override bool OnShowPermissionPrompt(IWebBrowser chromiumWebBrowser, IBrowser browser, ulong promptId, string requestingOrigin, CefPermissionType requestedPermissions, IPermissionPromptCallback callback)
12+
{
13+
using (callback)
14+
{
15+
System.Diagnostics.Debug.WriteLine($"{promptId}|{requestedPermissions} {requestingOrigin}");
16+
callback.Continue(CefPermissionResult.Accept);
17+
return true;
18+
}
19+
}
20+
21+
protected override void OnDismissPermissionPrompt(IWebBrowser chromiumWebBrowser, IBrowser browser, ulong promptId, CefPermissionResult result)
22+
{
23+
base.OnDismissPermissionPrompt(chromiumWebBrowser, browser, promptId, result);
24+
}
25+
26+
protected override bool OnRequestMediaAccessPermission(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string requestingOrigin, CefMediaAccessPermissionType requestedPermissions, IMediaAccessCallback callback)
27+
{
28+
using (callback)
29+
{
30+
callback.Continue(CefMediaAccessPermissionType.AudioCapture |
31+
CefMediaAccessPermissionType.VideoCapture |
32+
CefMediaAccessPermissionType.DesktopVideoCapture |
33+
CefMediaAccessPermissionType.DesktopAudioCapture);
34+
return true;
35+
}
36+
}
37+
}
38+
}

CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public BrowserTabView()
4444

4545
browser.RequestHandler = new ExampleRequestHandler();
4646

47+
//Test Handler allow All Permission
48+
browser.PermissionHandler = new PermissionHandlerExample();
49+
4750
var bindingOptions = new BindingOptions()
4851
{
4952
Binder = BindingOptions.DefaultBinder.Binder,

0 commit comments

Comments
 (0)