SIGN IN SIGN UP
cefsharp / CefSharp UNCLAIMED

.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework

0 0 0 C#
Refactor CefSharp.Core into CefSharp.Core.Runtime (#3311) * Net Core - Rename CefSharp.Core.dll to CefSharp.Core.Runtime.dll Partial rename, only Net Core, folder not renamed * Net Core - Rename CefSharp.Core.RefAssembly to CefSharp.Core.netcore Remove GenApi * Core - Rename CefDragDataWrapper to DragData Move into CefSharp.Core namespace * WinForms/WPF/OffScreen - Migrate from GitLink command line to Nuget package * Net Core - Refactor to have CefSharp.Core.dll contain only public Api * Net Core - Remove CefSharp.Core.RefAssembly * Net Core - Change CefSharp.Core.netcore output folder * Net Core - Restructure nuget packages * Net Core - Add Cefsharp.Core.Runtime.RefAssembly * Net Core - Hide CLI/C++ classes from intellisense Make sure users don't attempt to load them directly * Rename CefSharp.Core to CefSharp.Core.Runtime * Core - Restructure Net 4.5.2 packages to use CefSharp.Core.dll anycpu variant Attempt to load CefSharp.Core.Runtime at runtime rather than having to use msbuild to copy the correct version * Rename CefSharp.Core.netcore to CefSharp.Core * WPF/WinForms/OffScreen - Change from x86/64 to AnyCPU As they are all managed assemblies they can target AnyCPU. Includes CefSharp.dll * Convert RequestContextBuilder from C++ to C# Now part of the CefSharp.Core PublicApi * Update version number to 87.1.11 * Migrate more of the public Api to C# * Net Core - Basic restructure complete * Net Core - ModuleInitializer (Doesn't work yet) * Remove direct references to BrowserSettings * Net Core - ModuleInitializer load CefShar.Core.Runtime.dl * Net Core - Load libcef.dll via CLR Module initializer If no RID is specified then we can load libcef.dll using the module initializer * Add version to CefSharp.Core * Remove dependency on CefSharp.Core.Runtime Rewrite common targets * AnyCPU app.config transform Improve AnyCPU support * Improve Net Core 3 support Only delete CefSharp.Core.Runtime.dll when AnyCPU * Nuget - Add CefSharp.Core.Runtime reference when TargetFramework = NetCore * Fix Typos Based on #3306 * Net Core - Rename CefSharp.Core.Runtime RefAssembly source file * Net Full - Generate CefSharp.Core.Runtime Ref Assembly For now the powershell build script generates the .cs file based on a x86 release build.ps1 It's not possible to directly install GenApi as it requires a Sdk style project * Net Core - Old packages copy files to required folders * Test - Install newer .Net Compiler and set Lang Version to 7.3 * Net Core - Exclude Net 452 Runtime generated reference source * Core - Add Refactoring TODO * Ref Assembly - Generate source as part of build - Move ref assembly source generate into GenerateRefAssemblySource.ps1 - Call before project build Runs locally, see if Appveyor has a problem with the powershell script execution * Core - Add more factory methods to create instances of managed wrappers * Net Core - Make Initialzier properties internal Not quite sure what the public API should look like as yet, so making internal for now.
2020-12-16 10:47:34 +10:00
// Copyright © 2015 The CefSharp Authors. All rights reserved.
2015-06-27 16:06:47 +02:00
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "Stdafx.h"
#include "V8Serialization.h"
#include "JavascriptCallbackRegistry.h"
Refactor CefSharp.Core into CefSharp.Core.Runtime (#3311) * Net Core - Rename CefSharp.Core.dll to CefSharp.Core.Runtime.dll Partial rename, only Net Core, folder not renamed * Net Core - Rename CefSharp.Core.RefAssembly to CefSharp.Core.netcore Remove GenApi * Core - Rename CefDragDataWrapper to DragData Move into CefSharp.Core namespace * WinForms/WPF/OffScreen - Migrate from GitLink command line to Nuget package * Net Core - Refactor to have CefSharp.Core.dll contain only public Api * Net Core - Remove CefSharp.Core.RefAssembly * Net Core - Change CefSharp.Core.netcore output folder * Net Core - Restructure nuget packages * Net Core - Add Cefsharp.Core.Runtime.RefAssembly * Net Core - Hide CLI/C++ classes from intellisense Make sure users don't attempt to load them directly * Rename CefSharp.Core to CefSharp.Core.Runtime * Core - Restructure Net 4.5.2 packages to use CefSharp.Core.dll anycpu variant Attempt to load CefSharp.Core.Runtime at runtime rather than having to use msbuild to copy the correct version * Rename CefSharp.Core.netcore to CefSharp.Core * WPF/WinForms/OffScreen - Change from x86/64 to AnyCPU As they are all managed assemblies they can target AnyCPU. Includes CefSharp.dll * Convert RequestContextBuilder from C++ to C# Now part of the CefSharp.Core PublicApi * Update version number to 87.1.11 * Migrate more of the public Api to C# * Net Core - Basic restructure complete * Net Core - ModuleInitializer (Doesn't work yet) * Remove direct references to BrowserSettings * Net Core - ModuleInitializer load CefShar.Core.Runtime.dl * Net Core - Load libcef.dll via CLR Module initializer If no RID is specified then we can load libcef.dll using the module initializer * Add version to CefSharp.Core * Remove dependency on CefSharp.Core.Runtime Rewrite common targets * AnyCPU app.config transform Improve AnyCPU support * Improve Net Core 3 support Only delete CefSharp.Core.Runtime.dll when AnyCPU * Nuget - Add CefSharp.Core.Runtime reference when TargetFramework = NetCore * Fix Typos Based on #3306 * Net Core - Rename CefSharp.Core.Runtime RefAssembly source file * Net Full - Generate CefSharp.Core.Runtime Ref Assembly For now the powershell build script generates the .cs file based on a x86 release build.ps1 It's not possible to directly install GenApi as it requires a Sdk style project * Net Core - Old packages copy files to required folders * Test - Install newer .Net Compiler and set Lang Version to 7.3 * Net Core - Exclude Net 452 Runtime generated reference source * Core - Add Refactoring TODO * Ref Assembly - Generate source as part of build - Move ref assembly source generate into GenerateRefAssemblySource.ps1 - Call before project build Runs locally, see if Appveyor has a problem with the powershell script execution * Core - Add more factory methods to create instances of managed wrappers * Net Core - Make Initialzier properties internal Not quite sure what the public API should look like as yet, so making internal for now.
2020-12-16 10:47:34 +10:00
#include "../CefSharp.Core.Runtime/Internals/Serialization/Primitives.h"
2015-06-27 16:06:47 +02:00
#include <deque>
using namespace std;
using namespace CefSharp::Internals::Serialization;
2015-06-27 16:06:47 +02:00
namespace CefSharp
{
namespace BrowserSubprocess
2015-06-27 16:06:47 +02:00
{
namespace Serialization
{
typedef deque<CefRefPtr<CefV8Value>> value_deque;
2015-06-27 16:06:47 +02:00
template<typename TList, typename TIndex>
2015-08-07 13:42:46 +10:00
void SerializeV8Object(const CefRefPtr<CefV8Value> &obj, const CefRefPtr<TList>& list, const TIndex& index, JavascriptCallbackRegistry^ callbackRegistry, value_deque &seen)
2015-06-27 16:06:47 +02:00
{
for (value_deque::const_iterator it = seen.begin(); it != seen.end(); ++it)
{
if (obj->IsSame(*it))
{
throw exception("Cycle found");
}
}
seen.push_back(obj);
2015-06-27 16:06:47 +02:00
if (obj->IsNull() || obj->IsUndefined())
{
list->SetNull(index);
}
else if (obj->IsBool())
2015-08-07 12:56:16 +10:00
{
2015-06-27 16:06:47 +02:00
list->SetBool(index, obj->GetBoolValue());
2015-08-07 12:56:16 +10:00
}
2015-06-27 16:06:47 +02:00
else if (obj->IsInt())
2015-08-07 12:56:16 +10:00
{
// CEF doesn't differentiate between UINT and INT
// so we have to do some additional bounds checking
// To make sure the correct value is returned
// CEF IPC doesn't support UINT so we can only
// support int and double.
// https://github.com/cefsharp/CefSharp/issues/3858
auto dValue = obj->GetDoubleValue();
if (dValue < INT_MIN || dValue > INT_MAX)
{
list->SetDouble(index, dValue);
}
else
{
list->SetInt(index, obj->GetIntValue());
}
2015-08-07 12:56:16 +10:00
}
2015-06-27 16:06:47 +02:00
else if (obj->IsDouble())
2015-08-07 12:56:16 +10:00
{
2015-06-27 16:06:47 +02:00
list->SetDouble(index, obj->GetDoubleValue());
2015-08-07 12:56:16 +10:00
}
2015-06-27 16:06:47 +02:00
else if (obj->IsString())
2015-08-07 12:56:16 +10:00
{
2015-06-27 16:06:47 +02:00
list->SetString(index, obj->GetStringValue());
2015-08-07 12:56:16 +10:00
}
2015-06-27 16:06:47 +02:00
else if (obj->IsDate())
2015-08-07 12:56:16 +10:00
{
SetCefTime(list, index, obj->GetDateValue().val);
2015-08-07 12:56:16 +10:00
}
else if (obj->IsArrayBuffer())
{
SetArrayBuffer(list, index, obj->GetArrayBufferByteLength(), obj->GetArrayBufferData());
}
2015-06-27 16:06:47 +02:00
else if (obj->IsArray())
{
int arrLength = obj->GetArrayLength();
auto array = CefListValue::Create();
if (arrLength > 0)
2015-06-27 16:06:47 +02:00
{
for (int i = 0; i < arrLength; i++)
{
SerializeV8Object(obj->GetValue(i), array, i, callbackRegistry, seen);
2015-06-27 16:06:47 +02:00
}
}
list->SetList(index, array);
2015-06-27 16:06:47 +02:00
}
else if (obj->IsFunction())
{
auto context = CefV8Context::GetCurrentContext();
auto jsCallback = callbackRegistry->Register(context, obj);
SetJsCallback(list, index, jsCallback);
2015-06-27 16:06:47 +02:00
}
else if (obj->IsObject())
{
std::vector<CefString> keys;
if (obj->GetKeys(keys) && keys.size() > 0)
{
auto result = CefDictionaryValue::Create();
for (size_t i = 0; i < keys.size(); i++)
2015-06-27 16:06:47 +02:00
{
auto p_keyStr = StringUtils::ToClr(keys[i].ToString());
if ((obj->HasValue(keys[i])) && (!p_keyStr->StartsWith("__")))
{
SerializeV8Object(obj->GetValue(keys[i]), result, keys[i], callbackRegistry, seen);
2015-06-27 16:06:47 +02:00
}
}
list->SetDictionary(index, result);
}
}
else
{
list->SetNull(index);
}
seen.pop_back();
}
template<typename TList, typename TIndex>
2015-08-07 13:42:46 +10:00
void SerializeV8Object(const CefRefPtr<CefV8Value> &obj, const CefRefPtr<TList>& list, const TIndex& index, JavascriptCallbackRegistry^ callbackRegistry)
{
try
{
value_deque seen;
SerializeV8Object(obj, list, index, callbackRegistry, seen);
}
catch (const exception&)
{
list->SetNull(index);
}
2015-06-27 16:06:47 +02:00
}
template<typename TList, typename TIndex>
2015-08-07 13:42:46 +10:00
CefRefPtr<CefV8Value> DeserializeV8Object(const CefRefPtr<TList>& list, const TIndex& index)
{
auto type = list->GetType(index);
if (type == VTYPE_BOOL)
2015-08-07 12:56:16 +10:00
{
return CefV8Value::CreateBool(list->GetBool(index));
2015-08-07 12:56:16 +10:00
}
if (type == VTYPE_INT)
2015-08-07 12:56:16 +10:00
{
return CefV8Value::CreateInt(list->GetInt(index));
2015-08-07 12:56:16 +10:00
}
if (type == VTYPE_DOUBLE)
2015-08-07 12:56:16 +10:00
{
return CefV8Value::CreateDouble(list->GetDouble(index));
2015-08-07 12:56:16 +10:00
}
if (type == VTYPE_STRING)
2015-08-07 12:56:16 +10:00
{
return CefV8Value::CreateString(list->GetString(index));
2015-08-07 12:56:16 +10:00
}
if (IsCefTime(list, index))
2015-08-07 12:56:16 +10:00
{
auto time = GetCefTime(list, index);
return CefV8Value::CreateDate(time);
2015-08-07 12:56:16 +10:00
}
if (type == VTYPE_LIST)
{
auto subList = list->GetList(index);
auto size = static_cast<int>(subList->GetSize());
auto result = CefV8Value::CreateArray(size);
for (int i = 0; i < size; i++)
{
result->SetValue(i, DeserializeV8Object(subList, i));
}
return result;
}
if (type == VTYPE_DICTIONARY)
{
auto subDict = list->GetDictionary(index);
auto size = subDict->GetSize();
std::vector<CefString> keys;
subDict->GetKeys(keys);
2016-12-01 22:48:01 +10:00
auto result = CefV8Value::CreateObject(nullptr, nullptr);
for (size_t i = 0; i < size; i++)
{
result->SetValue(keys[i], DeserializeV8Object(subDict, keys[i]), V8_PROPERTY_ATTRIBUTE_NONE);
}
return result;
}
return CefV8Value::CreateNull();
}
2015-08-07 13:42:46 +10:00
template void SerializeV8Object(const CefRefPtr<CefV8Value> &value, const CefRefPtr<CefListValue>& list, const int& index, JavascriptCallbackRegistry^ callbackRegistry);
template void SerializeV8Object(const CefRefPtr<CefV8Value> &value, const CefRefPtr<CefListValue>& list, const size_t& index, JavascriptCallbackRegistry^ callbackRegistry);
2015-08-07 13:42:46 +10:00
template void SerializeV8Object(const CefRefPtr<CefV8Value> &value, const CefRefPtr<CefDictionaryValue>& list, const CefString& index, JavascriptCallbackRegistry^ callbackRegistry);
template void SerializeV8Object(const CefRefPtr<CefV8Value> &value, const CefRefPtr<CefListValue>& list, const size_t& index, JavascriptCallbackRegistry^ callbackRegistry, value_deque &visited);
2015-08-07 13:42:46 +10:00
template void SerializeV8Object(const CefRefPtr<CefV8Value> &value, const CefRefPtr<CefDictionaryValue>& list, const CefString& index, JavascriptCallbackRegistry^ callbackRegistry, value_deque &visited);
template CefRefPtr<CefV8Value> DeserializeV8Object(const CefRefPtr<CefListValue>& list, const int& index);
template CefRefPtr<CefV8Value> DeserializeV8Object(const CefRefPtr<CefDictionaryValue>& list, const CefString& index);
2015-06-27 16:06:47 +02:00
}
}
Refactor CefSharp.Core into CefSharp.Core.Runtime (#3311) * Net Core - Rename CefSharp.Core.dll to CefSharp.Core.Runtime.dll Partial rename, only Net Core, folder not renamed * Net Core - Rename CefSharp.Core.RefAssembly to CefSharp.Core.netcore Remove GenApi * Core - Rename CefDragDataWrapper to DragData Move into CefSharp.Core namespace * WinForms/WPF/OffScreen - Migrate from GitLink command line to Nuget package * Net Core - Refactor to have CefSharp.Core.dll contain only public Api * Net Core - Remove CefSharp.Core.RefAssembly * Net Core - Change CefSharp.Core.netcore output folder * Net Core - Restructure nuget packages * Net Core - Add Cefsharp.Core.Runtime.RefAssembly * Net Core - Hide CLI/C++ classes from intellisense Make sure users don't attempt to load them directly * Rename CefSharp.Core to CefSharp.Core.Runtime * Core - Restructure Net 4.5.2 packages to use CefSharp.Core.dll anycpu variant Attempt to load CefSharp.Core.Runtime at runtime rather than having to use msbuild to copy the correct version * Rename CefSharp.Core.netcore to CefSharp.Core * WPF/WinForms/OffScreen - Change from x86/64 to AnyCPU As they are all managed assemblies they can target AnyCPU. Includes CefSharp.dll * Convert RequestContextBuilder from C++ to C# Now part of the CefSharp.Core PublicApi * Update version number to 87.1.11 * Migrate more of the public Api to C# * Net Core - Basic restructure complete * Net Core - ModuleInitializer (Doesn't work yet) * Remove direct references to BrowserSettings * Net Core - ModuleInitializer load CefShar.Core.Runtime.dl * Net Core - Load libcef.dll via CLR Module initializer If no RID is specified then we can load libcef.dll using the module initializer * Add version to CefSharp.Core * Remove dependency on CefSharp.Core.Runtime Rewrite common targets * AnyCPU app.config transform Improve AnyCPU support * Improve Net Core 3 support Only delete CefSharp.Core.Runtime.dll when AnyCPU * Nuget - Add CefSharp.Core.Runtime reference when TargetFramework = NetCore * Fix Typos Based on #3306 * Net Core - Rename CefSharp.Core.Runtime RefAssembly source file * Net Full - Generate CefSharp.Core.Runtime Ref Assembly For now the powershell build script generates the .cs file based on a x86 release build.ps1 It's not possible to directly install GenApi as it requires a Sdk style project * Net Core - Old packages copy files to required folders * Test - Install newer .Net Compiler and set Lang Version to 7.3 * Net Core - Exclude Net 452 Runtime generated reference source * Core - Add Refactoring TODO * Ref Assembly - Generate source as part of build - Move ref assembly source generate into GenerateRefAssemblySource.ps1 - Call before project build Runs locally, see if Appveyor has a problem with the powershell script execution * Core - Add more factory methods to create instances of managed wrappers * Net Core - Make Initialzier properties internal Not quite sure what the public API should look like as yet, so making internal for now.
2020-12-16 10:47:34 +10:00
}