Skip to content

Commit 70de3a6

Browse files
authored
Add Initial IRenderProcessHandler.OnContextCreated/Released implementation (#2697)
* WinForms/WPF - Dispose of IFrame after calling LoadUrl * BrowserProcess - Add initial implementation of IRenderProcessHandler.OnContextCreated/OnContextReleased - IV8Context.Execute is the only method to be implemented so far (execute script without returning a result) - Wrappers for CefFrame and CefBrowser have yet to be imported yet, still need to determine if they should be included individually or reference to CefSharp.Core added * BrowserProcess - Add wrappers for Browser and Frame Ultimately we should probably remove the CefSharp.BrowserSubprocess.Core project and move all the code into a folder/namespace within CefSharp.Core This would allow us to share the a lot of existing code, major refactor required * CefSharp.Common.props - Add CefSharpBrowserProcessCore32/64 properties Make creating your own custom browser process easier * BrowserProcess - Remove example and add comments about creating your own custom version
1 parent 1c5d400 commit 70de3a6

18 files changed

+1224
-8
lines changed

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,19 @@
1010
#include "CefAppUnmanagedWrapper.h"
1111
#include "RegisterBoundObjectHandler.h"
1212
#include "JavascriptRootObjectWrapper.h"
13+
#include "Async\JavascriptAsyncMethodCallback.h"
1314
#include "Serialization\V8Serialization.h"
1415
#include "Serialization\JsObjectsSerialization.h"
15-
#include "Async\JavascriptAsyncMethodCallback.h"
16+
#include "Wrapper\V8Context.h"
17+
#include "Wrapper\Frame.h"
18+
#include "Wrapper\Browser.h"
1619
#include "..\CefSharp.Core\Internals\Messaging\Messages.h"
1720
#include "..\CefSharp.Core\Internals\Serialization\Primitives.h"
1821

1922
using namespace System;
2023
using namespace System::Diagnostics;
2124
using namespace System::Collections::Generic;
25+
using namespace CefSharp::BrowserSubprocess;
2226
using namespace CefSharp::Internals::Messaging;
2327
using namespace CefSharp::Internals::Serialization;
2428

@@ -62,6 +66,15 @@ namespace CefSharp
6266

6367
void CefAppUnmanagedWrapper::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
6468
{
69+
if (!Object::ReferenceEquals(_handler, nullptr))
70+
{
71+
Browser browserWrapper(browser);
72+
Frame frameWrapper(frame);
73+
V8Context contextWrapper(context);
74+
75+
_handler->OnContextCreated(%browserWrapper, %frameWrapper, %contextWrapper);
76+
}
77+
6578
if (_legacyBindingEnabled)
6679
{
6780
if (_javascriptObjects->Count > 0)
@@ -115,6 +128,15 @@ namespace CefSharp
115128

116129
void CefAppUnmanagedWrapper::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
117130
{
131+
if (!Object::ReferenceEquals(_handler, nullptr))
132+
{
133+
Browser browserWrapper(browser);
134+
Frame frameWrapper(frame);
135+
V8Context contextWrapper(context);
136+
137+
_handler->OnContextReleased(%browserWrapper, %frameWrapper, %contextWrapper);
138+
}
139+
118140
auto contextReleasedMessage = CefProcessMessage::Create(kOnContextReleasedRequest);
119141

120142
SetInt64(contextReleasedMessage->GetArgumentList(), 0, frame->GetIdentifier());

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
#include "RegisterBoundObjectRegistry.h"
1313

1414
using namespace System::Collections::Generic;
15+
using namespace CefSharp::RenderProcess;
1516

1617
namespace CefSharp
1718
{
1819
// This class is the native subprocess level CEF object wrapper.
1920
private class CefAppUnmanagedWrapper : CefApp, CefRenderProcessHandler
2021
{
2122
private:
23+
gcroot<IRenderProcessHandler^> _handler;
2224
gcroot<Action<CefBrowserWrapper^>^> _onBrowserCreated;
2325
gcroot<Action<CefBrowserWrapper^>^> _onBrowserDestroyed;
2426
gcroot<ConcurrentDictionary<int, CefBrowserWrapper^>^> _browserWrappers;
@@ -35,8 +37,9 @@ namespace CefSharp
3537
public:
3638
static const CefString kPromiseCreatorScript;
3739

38-
CefAppUnmanagedWrapper(List<CefCustomScheme^>^ schemes, bool enableFocusedNodeChanged, Action<CefBrowserWrapper^>^ onBrowserCreated, Action<CefBrowserWrapper^>^ onBrowserDestoryed)
40+
CefAppUnmanagedWrapper(IRenderProcessHandler^ handler, List<CefCustomScheme^>^ schemes, bool enableFocusedNodeChanged, Action<CefBrowserWrapper^>^ onBrowserCreated, Action<CefBrowserWrapper^>^ onBrowserDestoryed)
3941
{
42+
_handler = handler;
4043
_onBrowserCreated = onBrowserCreated;
4144
_onBrowserDestroyed = onBrowserDestoryed;
4245
_browserWrappers = gcnew ConcurrentDictionary<int, CefBrowserWrapper^>();

CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@
177177
<ClInclude Include="Async\JavascriptAsyncMethodWrapper.h" />
178178
<ClInclude Include="Async\JavascriptAsyncObjectWrapper.h" />
179179
<ClInclude Include="CefAppUnmanagedWrapper.h" />
180+
<ClInclude Include="Wrapper\Frame.h" />
181+
<ClInclude Include="Wrapper\Browser.h" />
182+
<ClInclude Include="Wrapper\V8Context.h" />
180183
<ClInclude Include="RegisterBoundObjectHandler.h" />
181184
<ClInclude Include="RegisterBoundObjectRegistry.h" />
182185
<ClInclude Include="resource.h" />
@@ -206,6 +209,8 @@
206209
<ClCompile Include="Async\JavascriptAsyncMethodWrapper.cpp" />
207210
<ClCompile Include="Async\JavascriptAsyncObjectWrapper.cpp" />
208211
<ClCompile Include="CefAppUnmanagedWrapper.cpp" />
212+
<ClCompile Include="Wrapper\Frame.cpp" />
213+
<ClCompile Include="Wrapper\Browser.cpp" />
209214
<ClCompile Include="WcfEnabledSubProcess.cpp" />
210215
<ClCompile Include="JavascriptCallbackRegistry.cpp" />
211216
<ClCompile Include="JavascriptMethodHandler.cpp" />

CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj.filters

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@
9898
<ClInclude Include="RegisterBoundObjectRegistry.h">
9999
<Filter>Header Files</Filter>
100100
</ClInclude>
101+
<ClInclude Include="Wrapper\Frame.h">
102+
<Filter>Header Files</Filter>
103+
</ClInclude>
104+
<ClInclude Include="Wrapper\Browser.h">
105+
<Filter>Header Files</Filter>
106+
</ClInclude>
107+
<ClInclude Include="Wrapper\V8Context.h">
108+
<Filter>Header Files</Filter>
109+
</ClInclude>
101110
</ItemGroup>
102111
<ItemGroup>
103112
<ClCompile Include="AssemblyInfo.cpp">
@@ -157,6 +166,12 @@
157166
<ClCompile Include="WcfEnabledSubProcess.cpp">
158167
<Filter>Source Files</Filter>
159168
</ClCompile>
169+
<ClCompile Include="Wrapper\Frame.cpp">
170+
<Filter>Source Files</Filter>
171+
</ClCompile>
172+
<ClCompile Include="Wrapper\Browser.cpp">
173+
<Filter>Source Files</Filter>
174+
</ClCompile>
160175
</ItemGroup>
161176
<ItemGroup>
162177
<ResourceCompile Include="Resource.rc" />

CefSharp.BrowserSubprocess.Core/SubProcess.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using namespace System::Collections::Generic;
1515
using namespace System::Linq;
1616
using namespace CefSharp::Internals;
17+
using namespace CefSharp::RenderProcess;
1718

1819
namespace CefSharp
1920
{
@@ -26,14 +27,14 @@ namespace CefSharp
2627
MCefRefPtr<CefAppUnmanagedWrapper> _cefApp;
2728

2829
public:
29-
SubProcess(IEnumerable<String^>^ args)
30+
SubProcess(IRenderProcessHandler^ handler, IEnumerable<String^>^ args)
3031
{
3132
auto onBrowserCreated = gcnew Action<CefBrowserWrapper^>(this, &SubProcess::OnBrowserCreated);
3233
auto onBrowserDestroyed = gcnew Action<CefBrowserWrapper^>(this, &SubProcess::OnBrowserDestroyed);
3334
auto schemes = CefCustomScheme::ParseCommandLineArguments(args);
3435
auto enableFocusedNodeChanged = CommandLineArgsParser::HasArgument(args, CefSharpArguments::FocusedNodeChangedEnabledArgument);
3536

36-
_cefApp = new CefAppUnmanagedWrapper(schemes, enableFocusedNodeChanged, onBrowserCreated, onBrowserDestroyed);
37+
_cefApp = new CefAppUnmanagedWrapper(handler, schemes, enableFocusedNodeChanged, onBrowserCreated, onBrowserDestroyed);
3738
}
3839

3940
!SubProcess()

CefSharp.BrowserSubprocess.Core/WcfEnabledSubProcess.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "CefBrowserWrapper.h"
1010

1111
using namespace System;
12+
using namespace CefSharp::RenderProcess;
1213

1314
namespace CefSharp
1415
{
@@ -25,7 +26,7 @@ namespace CefSharp
2526
int _parentProcessId;
2627

2728
public:
28-
WcfEnabledSubProcess(int parentProcessId, IEnumerable<String^>^ args) : SubProcess(args)
29+
WcfEnabledSubProcess(int parentProcessId, IRenderProcessHandler^ handler, IEnumerable<String^>^ args) : SubProcess(handler,args)
2930
{
3031
_parentProcessId = parentProcessId;
3132
}
@@ -34,4 +35,4 @@ namespace CefSharp
3435
void OnBrowserDestroyed(CefBrowserWrapper^ browser) override;
3536
};
3637
}
37-
}
38+
}
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
// Copyright © 2015 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+
#include "Stdafx.h"
6+
7+
#include "Frame.h"
8+
#include "Browser.h"
9+
10+
using namespace CefSharp::BrowserSubprocess;
11+
12+
///
13+
// Returns the browser host object. This method can only be called in the
14+
// browser process.
15+
///
16+
/*--cef()--*/
17+
IBrowserHost^ Browser::GetHost()
18+
{
19+
throw gcnew NotImplementedException("Browser process only");
20+
}
21+
22+
///
23+
// Returns true if the browser can navigate backwards.
24+
///
25+
/*--cef()--*/
26+
bool Browser::CanGoBack::get()
27+
{
28+
return _browser->CanGoBack();
29+
}
30+
31+
///
32+
// Navigate backwards.
33+
///
34+
/*--cef()--*/
35+
void Browser::GoBack()
36+
{
37+
_browser->GoBack();
38+
}
39+
40+
///
41+
// Returns true if the browser can navigate forwards.
42+
///
43+
/*--cef()--*/
44+
bool Browser::CanGoForward::get()
45+
{
46+
return _browser->CanGoForward();
47+
}
48+
49+
///
50+
// Navigate forwards.
51+
///
52+
/*--cef()--*/
53+
void Browser::GoForward()
54+
{
55+
_browser->GoForward();
56+
}
57+
58+
///
59+
// Returns true if the browser is currently loading.
60+
///
61+
/*--cef()--*/
62+
bool Browser::IsLoading::get()
63+
{
64+
return _browser->IsLoading();
65+
}
66+
67+
void Browser::CloseBrowser(bool forceClose)
68+
{
69+
throw gcnew NotImplementedException("Browser process only");
70+
}
71+
72+
///
73+
// Reload the current page.
74+
///
75+
/*--cef()--*/
76+
void Browser::Reload(bool ignoreCache)
77+
{
78+
if (ignoreCache)
79+
{
80+
_browser->ReloadIgnoreCache();
81+
}
82+
else
83+
{
84+
_browser->Reload();
85+
}
86+
}
87+
88+
///
89+
// Stop loading the page.
90+
///
91+
/*--cef()--*/
92+
void Browser::StopLoad()
93+
{
94+
_browser->StopLoad();
95+
}
96+
97+
///
98+
// Returns the globally unique identifier for this browser.
99+
///
100+
/*--cef()--*/
101+
int Browser::Identifier::get()
102+
{
103+
return _browser->GetIdentifier();
104+
}
105+
106+
///
107+
// Returns true if this object is pointing to the same handle as |that|
108+
// object.
109+
///
110+
/*--cef()--*/
111+
bool Browser::IsSame(IBrowser^ that)
112+
{
113+
return _browser->IsSame(dynamic_cast<Browser^>(that)->_browser.get());
114+
}
115+
116+
///
117+
// Returns true if the window is a popup window.
118+
///
119+
/*--cef()--*/
120+
bool Browser::IsPopup::get()
121+
{
122+
return _browser->IsPopup();
123+
}
124+
125+
///
126+
// Returns true if a document has been loaded in the browser.
127+
///
128+
/*--cef()--*/
129+
bool Browser::HasDocument::get()
130+
{
131+
return _browser->HasDocument();
132+
}
133+
134+
IFrame^ Browser::MainFrame::get()
135+
{
136+
auto frame = _browser->GetMainFrame();
137+
return gcnew Frame(frame);
138+
}
139+
140+
///
141+
// Returns the focused frame for the browser window.
142+
///
143+
/*--cef()--*/
144+
IFrame^ Browser::FocusedFrame::get()
145+
{
146+
return gcnew Frame(_browser->GetFocusedFrame());
147+
}
148+
149+
///
150+
// Returns the frame with the specified identifier, or NULL if not found.
151+
///
152+
/*--cef(capi_name=get_frame_byident)--*/
153+
IFrame^ Browser::GetFrame(Int64 identifier)
154+
{
155+
auto frame = _browser->GetFrame(identifier);
156+
157+
if (frame.get())
158+
{
159+
return gcnew Frame(frame);
160+
}
161+
162+
return nullptr;
163+
}
164+
165+
///
166+
// Returns the frame with the specified name, or NULL if not found.
167+
///
168+
/*--cef(optional_param=name)--*/
169+
IFrame^ Browser::GetFrame(String^ name)
170+
{
171+
auto frame = _browser->GetFrame(StringUtils::ToNative(name));
172+
173+
if (frame.get())
174+
{
175+
return gcnew Frame(frame);
176+
}
177+
178+
return nullptr;
179+
}
180+
181+
///
182+
// Returns the number of frames that currently exist.
183+
///
184+
/*--cef()--*/
185+
int Browser::GetFrameCount()
186+
{
187+
return _browser->GetFrameCount();
188+
}
189+
190+
///
191+
// Returns the identifiers of all existing frames.
192+
///
193+
/*--cef(count_func=identifiers:GetFrameCount)--*/
194+
List<Int64>^ Browser::GetFrameIdentifiers()
195+
{
196+
std::vector<Int64> identifiers;
197+
_browser->GetFrameIdentifiers(identifiers);
198+
List<Int64>^ results = gcnew List<Int64>(identifiers.size());
199+
for (UINT i = 0; i < identifiers.size(); i++)
200+
{
201+
results->Add(identifiers[i]);
202+
}
203+
return results;
204+
}
205+
206+
///
207+
// Returns the names of all existing frames.
208+
///
209+
/*--cef()--*/
210+
List<String^>^ Browser::GetFrameNames()
211+
{
212+
std::vector<CefString> names;
213+
214+
_browser->GetFrameNames(names);
215+
return StringUtils::ToClr(names);
216+
}
217+
218+
bool Browser::IsDisposed::get()
219+
{
220+
return _disposed;
221+
}

0 commit comments

Comments
 (0)