Skip to content

Commit b81da7b

Browse files
committed
Merge pull request #573 from cefsharp/cef/2062-jsb-wip
Upgrade to Cef 2062 with JSB
2 parents a0d1aa5 + ad40abb commit b81da7b

File tree

117 files changed

+3008
-794
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

117 files changed

+3008
-794
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ bin/
2323
obj/
2424
packages/
2525
Debug/
26+
Release/
2627
CefSharp/app.aps
2728
debug.log
2829
CefSharp.BrowserSubprocess/Release

.nuget/packages.config

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "Stdafx.h"
2+
3+
using namespace System;
4+
using namespace System::Reflection;
5+
using namespace System::Runtime::CompilerServices;
6+
using namespace System::Runtime::InteropServices;
7+
using namespace System::Security::Permissions;
8+
using namespace CefSharp;
9+
10+
//[assembly:AssemblyTitle("CefSharpBrowserSubprocess.Core")];
11+
//[assembly:AssemblyCompany(AssemblyInfo::AssemblyCompany)];
12+
//[assembly:AssemblyProduct(AssemblyInfo::AssemblyProduct)];
13+
//[assembly:AssemblyCopyright(AssemblyInfo::AssemblyCopyright)];
14+
15+
[assembly:AssemblyVersion(AssemblyInfo::AssemblyVersion)];
16+
[assembly:ComVisible(AssemblyInfo::ComVisible)];
17+
[assembly:CLSCompliant(AssemblyInfo::ClsCompliant)];
18+
19+
[assembly:AssemblyDescription("")];
20+
[assembly:AssemblyConfiguration("")];
21+
[assembly:AssemblyTrademark("")];
22+
[assembly:AssemblyCulture("")];
23+
24+
[assembly:InternalsVisibleTo(AssemblyInfo::CefSharpBrowserSubprocessProject)];
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright © 2010-2014 The CefSharp Project. 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+
#pragma once
5+
6+
#include "Stdafx.h"
7+
8+
#include "CefAppWrapper.h"
9+
#include "CefBrowserWrapper.h"
10+
#include "CefAppUnmanagedWrapper.h"
11+
12+
using namespace System;
13+
using namespace System::Diagnostics;
14+
using namespace System::Collections::Generic;
15+
16+
namespace CefSharp
17+
{
18+
CefRefPtr<CefRenderProcessHandler> CefAppUnmanagedWrapper::GetRenderProcessHandler()
19+
{
20+
return this;
21+
};
22+
23+
// CefRenderProcessHandler
24+
void CefAppUnmanagedWrapper::OnBrowserCreated(CefRefPtr<CefBrowser> browser)
25+
{
26+
auto wrapper = gcnew CefBrowserWrapper(browser);
27+
_onBrowserCreated->Invoke(wrapper);
28+
29+
//Multiple CefBrowserWrappers created when opening popups
30+
_browserWrappers->Add(browser->GetIdentifier(), wrapper);
31+
}
32+
33+
void CefAppUnmanagedWrapper::OnBrowserDestroyed(CefRefPtr<CefBrowser> browser)
34+
{
35+
auto wrapper = FindBrowserWrapper(browser, false);
36+
37+
if (wrapper != nullptr)
38+
{
39+
_browserWrappers->Remove(wrapper->BrowserId);
40+
_onBrowserDestroyed->Invoke(wrapper);
41+
delete wrapper;
42+
}
43+
};
44+
45+
void CefAppUnmanagedWrapper::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
46+
{
47+
auto wrapper = FindBrowserWrapper(browser, true);
48+
49+
if (wrapper->JavascriptRootObject != nullptr)
50+
{
51+
auto window = context->GetGlobal();
52+
53+
auto jsRootWrapper = gcnew JavascriptRootObjectWrapper(wrapper->JavascriptRootObject, wrapper->CreateBrowserProxyDelegate);
54+
55+
jsRootWrapper->V8Value = window;
56+
jsRootWrapper->Bind();
57+
}
58+
};
59+
60+
void CefAppUnmanagedWrapper::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
61+
{
62+
};
63+
64+
CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(CefRefPtr<CefBrowser> browser, bool mustExist)
65+
{
66+
auto browserId = browser->GetIdentifier();
67+
CefBrowserWrapper^ wrapper = nullptr;
68+
69+
_browserWrappers->TryGetValue(browserId, wrapper);
70+
71+
if (mustExist && wrapper == nullptr)
72+
{
73+
throw gcnew InvalidOperationException(String::Format("Failed to identify BrowserWrapper in OnContextCreated. : {0}", browserId));
74+
}
75+
76+
return wrapper;
77+
};
78+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright © 2010-2013 The CefSharp Project. 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+
8+
#include "Stdafx.h"
9+
#include "include/cef_app.h"
10+
#include "include/cef_base.h"
11+
12+
#include "CefBrowserWrapper.h"
13+
#include "CefAppWrapper.h"
14+
15+
using namespace System::Collections::Generic;
16+
17+
namespace CefSharp
18+
{
19+
private class CefAppUnmanagedWrapper : CefApp, CefRenderProcessHandler
20+
{
21+
private:
22+
gcroot<Action<CefBrowserWrapper^>^> _onBrowserCreated;
23+
gcroot<Action<CefBrowserWrapper^>^> _onBrowserDestroyed;
24+
gcroot<Dictionary<int, CefBrowserWrapper^>^> _browserWrappers;
25+
CefBrowserWrapper^ FindBrowserWrapper(CefRefPtr<CefBrowser> browser, bool mustExist);
26+
public:
27+
28+
CefAppUnmanagedWrapper(Action<CefBrowserWrapper^>^ onBrowserCreated, Action<CefBrowserWrapper^>^ onBrowserDestoryed)
29+
{
30+
_onBrowserCreated = onBrowserCreated;
31+
_onBrowserDestroyed = onBrowserDestoryed;
32+
_browserWrappers = gcnew Dictionary<int, CefBrowserWrapper^>();
33+
}
34+
35+
~CefAppUnmanagedWrapper()
36+
{
37+
delete _browserWrappers;
38+
delete _onBrowserCreated;
39+
delete _onBrowserDestroyed;
40+
}
41+
42+
virtual DECL CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() OVERRIDE;
43+
virtual DECL void OnBrowserCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
44+
virtual DECL void OnBrowserDestroyed(CefRefPtr<CefBrowser> browser) OVERRIDE;
45+
virtual DECL void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
46+
virtual DECL void OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
47+
48+
IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper);
49+
};
50+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright © 2010-2014 The CefSharp Project. 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+
#pragma once
5+
6+
#include "Stdafx.h"
7+
8+
#include "CefAppWrapper.h"
9+
#include "CefBrowserWrapper.h"
10+
#include "CefTaskScheduler.h"
11+
12+
using namespace System;
13+
using namespace System::Diagnostics;
14+
using namespace System::Collections::Generic;
15+
16+
namespace CefSharp
17+
{
18+
CefAppWrapper::CefAppWrapper()
19+
{
20+
auto onBrowserCreated = gcnew Action<CefBrowserWrapper^>(this, &CefAppWrapper::OnBrowserCreated);
21+
auto onBrowserDestroyed = gcnew Action<CefBrowserWrapper^>(this, &CefAppWrapper::OnBrowserDestroyed);
22+
_cefApp = new CefAppUnmanagedWrapper(onBrowserCreated, onBrowserDestroyed);
23+
24+
RenderThreadTaskFactory = gcnew TaskFactory(gcnew CefTaskScheduler(TID_RENDERER));
25+
};
26+
27+
CefAppWrapper::~CefAppWrapper()
28+
{
29+
RenderThreadTaskFactory = nullptr;
30+
_cefApp = nullptr;
31+
}
32+
33+
int CefAppWrapper::Run()
34+
{
35+
auto hInstance = Process::GetCurrentProcess()->Handle;
36+
37+
CefMainArgs cefMainArgs((HINSTANCE)hInstance.ToPointer());
38+
39+
return CefExecuteProcess(cefMainArgs, (CefApp*)_cefApp.get(), NULL);
40+
}
41+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright © 2010-2013 The CefSharp Project. 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+
#include "include/cef_app.h"
9+
#include "include/cef_base.h"
10+
11+
#include "JavascriptRootObjectWrapper.h"
12+
#include "CefBrowserWrapper.h"
13+
#include "CefAppUnmanagedWrapper.h"
14+
15+
using namespace System::Collections::Generic;
16+
17+
namespace CefSharp
18+
{
19+
public ref class CefAppWrapper abstract : public DisposableResource
20+
{
21+
private:
22+
MCefRefPtr<CefAppUnmanagedWrapper> _cefApp;
23+
24+
public:
25+
CefAppWrapper();
26+
~CefAppWrapper();
27+
28+
int Run();
29+
30+
property TaskFactory^ RenderThreadTaskFactory;
31+
32+
virtual void OnBrowserCreated(CefBrowserWrapper^ cefBrowserWrapper) abstract;
33+
virtual void OnBrowserDestroyed(CefBrowserWrapper^ cefBrowserWrapper) abstract;
34+
};
35+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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+
#pragma once
6+
7+
#include "include/cef_browser.h"
8+
#include "include/cef_runnable.h"
9+
#include "include/cef_v8.h"
10+
11+
#include "TypeUtils.h"
12+
#include "Stdafx.h"
13+
14+
using namespace CefSharp::Internals;
15+
using namespace System;
16+
using namespace System::ServiceModel;
17+
using namespace System::Threading;
18+
using namespace System::Threading::Tasks;
19+
20+
namespace CefSharp
21+
{
22+
// "Master class" for wrapping everything that the CefSubprocess needs.
23+
public ref class CefBrowserWrapper : DisposableResource
24+
{
25+
26+
private:
27+
MCefRefPtr<CefBrowser> _cefBrowser;
28+
29+
public:
30+
CefBrowserWrapper(CefRefPtr<CefBrowser> cefBrowser)
31+
{
32+
_cefBrowser = cefBrowser;
33+
BrowserId = cefBrowser->GetIdentifier();
34+
IsPopup = cefBrowser->IsPopup();
35+
}
36+
37+
~CefBrowserWrapper()
38+
{
39+
_cefBrowser = nullptr;
40+
}
41+
42+
property int BrowserId;
43+
property bool IsPopup;
44+
property DuplexChannelFactory<IBrowserProcess^>^ ChannelFactory;
45+
property JavascriptRootObject^ JavascriptRootObject;
46+
property Func<IBrowserProcess^>^ CreateBrowserProxyDelegate;
47+
48+
JavascriptResponse^ EvaluateScriptInContext(CefRefPtr<CefV8Context> context, CefString script)
49+
{
50+
CefRefPtr<CefV8Value> result;
51+
CefRefPtr<CefV8Exception> exception;
52+
JavascriptResponse^ response = gcnew JavascriptResponse();
53+
54+
response->Success = context->Eval(script, result, exception);
55+
if (response->Success)
56+
{
57+
response->Result = TypeUtils::ConvertFromCef(result);
58+
}
59+
else if (exception.get())
60+
{
61+
response->Message = StringUtils::ToClr(exception->GetMessage());
62+
}
63+
64+
return response;
65+
}
66+
67+
virtual void DoDispose( bool disposing ) override
68+
{
69+
_cefBrowser = nullptr;
70+
DisposableResource::DoDispose( disposing );
71+
}
72+
73+
virtual JavascriptResponse^ DoEvaluateScript(System::Int64 frameId, String^ script)
74+
{
75+
auto frame = _cefBrowser->GetFrame(frameId);
76+
CefRefPtr<CefV8Context> context = frame->GetV8Context();
77+
78+
if (context.get() && context->Enter())
79+
{
80+
try
81+
{
82+
return EvaluateScriptInContext(context, StringUtils::ToNative(script));
83+
}
84+
finally
85+
{
86+
context->Exit();
87+
}
88+
}
89+
90+
return nullptr;
91+
}
92+
};
93+
}

0 commit comments

Comments
 (0)