-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
466 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
85 changes: 85 additions & 0 deletions
85
CefSharp.BrowserSubprocess.Core/Serialization/V8Serialization.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
// Copyright © 2010-2015 The CefSharp Project. All rights reserved. | ||
// | ||
// 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" | ||
#include "../CefSharp.Core/Internals/Serialization/Primitives.h" | ||
|
||
namespace CefSharp | ||
{ | ||
namespace Internals | ||
{ | ||
namespace Serialization | ||
{ | ||
template<typename TList, typename TIndex> | ||
void SerializeV8Object(CefRefPtr<CefV8Value> obj, CefRefPtr<TList> list, TIndex index, JavascriptCallbackRegistry^ callbackRegistry) | ||
{ | ||
if (obj->IsNull() || obj->IsUndefined()) | ||
{ | ||
list->SetNull(index); | ||
} | ||
else if (obj->IsBool()) | ||
list->SetBool(index, obj->GetBoolValue()); | ||
else if (obj->IsInt()) | ||
list->SetInt(index, obj->GetIntValue()); | ||
else if (obj->IsDouble()) | ||
list->SetDouble(index, obj->GetDoubleValue()); | ||
else if (obj->IsString()) | ||
list->SetString(index, obj->GetStringValue()); | ||
else if (obj->IsDate()) | ||
SetCefTime(obj->GetDateValue(), list, index); | ||
else if (obj->IsArray()) | ||
{ | ||
int arrLength = obj->GetArrayLength(); | ||
std::vector<CefString> keys; | ||
if (arrLength > 0 && obj->GetKeys(keys)) | ||
{ | ||
auto array = CefListValue::Create(); | ||
for (int i = 0; i < arrLength; i++) | ||
{ | ||
SerializeV8Object(obj->GetValue(keys[i]), array, i, callbackRegistry); | ||
} | ||
|
||
list->SetList(index, array); | ||
} | ||
else | ||
{ | ||
list->SetNull(index); | ||
} | ||
} | ||
else if (obj->IsFunction()) | ||
{ | ||
auto context = CefV8Context::GetCurrentContext(); | ||
auto jsCallback = callbackRegistry->Register(context, obj); | ||
SetJsCallback(jsCallback, list, index); | ||
} | ||
else if (obj->IsObject()) | ||
{ | ||
std::vector<CefString> keys; | ||
if (obj->GetKeys(keys) && keys.size() > 0) | ||
{ | ||
auto result = CefDictionaryValue::Create(); | ||
for (int i = 0; i < keys.size(); i++) | ||
{ | ||
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); | ||
} | ||
} | ||
list->SetDictionary(index, result); | ||
} | ||
} | ||
else | ||
{ | ||
list->SetNull(index); | ||
} | ||
} | ||
|
||
template void SerializeV8Object(CefRefPtr<CefV8Value> value, CefRefPtr<CefListValue> list, int index, JavascriptCallbackRegistry^ callbackRegistry); | ||
template void SerializeV8Object(CefRefPtr<CefV8Value> value, CefRefPtr<CefDictionaryValue> list, CefString index, JavascriptCallbackRegistry^ callbackRegistry); | ||
} | ||
} | ||
} |
25 changes: 25 additions & 0 deletions
25
CefSharp.BrowserSubprocess.Core/Serialization/V8Serialization.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Copyright © 2010-2015 The CefSharp Project. All rights reserved. | ||
// | ||
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | ||
|
||
#pragma once | ||
|
||
#include "include/cef_v8.h" | ||
|
||
namespace CefSharp | ||
{ | ||
namespace Internals | ||
{ | ||
ref class JavascriptCallbackRegistry; | ||
|
||
namespace Serialization | ||
{ | ||
//Functions to sserialize data to be sent to the browser process. | ||
|
||
//Serializes a V8 structure into a given index of a CefListValue or CefDictionaryValue | ||
//JavascriptCallbackRegistry should be passed to save V8Values with function types | ||
template<typename TList, typename TIndex> | ||
void SerializeV8Object(CefRefPtr<CefV8Value> value, CefRefPtr<TList> list, TIndex index, JavascriptCallbackRegistry^ callbackRegistry); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
// Copyright © 2010-2015 The CefSharp Authors. All rights reserved. | ||
// | ||
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | ||
|
||
#include "Stdafx.h" | ||
#include "Primitives.h" | ||
|
||
#include "include/cef_app.h" | ||
|
||
using namespace std; | ||
|
||
namespace CefSharp | ||
{ | ||
namespace Internals | ||
{ | ||
namespace Serialization | ||
{ | ||
enum class PrimitiveType : unsigned char | ||
{ | ||
INT64, | ||
CEFTIME, | ||
JSCALLBACK | ||
}; | ||
|
||
template<typename TList, typename TIndex> | ||
bool IsType(PrimitiveType type, CefRefPtr<TList> list, TIndex index) | ||
{ | ||
auto result = list->GetType(index) == VTYPE_BINARY; | ||
if (result) | ||
{ | ||
underlying_type<PrimitiveType>::type typeRead; | ||
auto binaryValue = list->GetBinary(index); | ||
binaryValue->GetData(&typeRead, sizeof(underlying_type<PrimitiveType>::type), 0); | ||
result = typeRead == static_cast<underlying_type<PrimitiveType>::type>(type); | ||
} | ||
return result; | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
void SetInt64(const int64 &value, CefRefPtr<TList> list, TIndex index) | ||
{ | ||
unsigned char mem[1 + sizeof(int64)]; | ||
mem[0] = static_cast<unsigned char>(PrimitiveType::INT64); | ||
memcpy(reinterpret_cast<void*>(mem + 1), &value, sizeof(int64)); | ||
|
||
auto binaryValue = CefBinaryValue::Create(mem, sizeof(mem)); | ||
list->SetBinary(index, binaryValue); | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
int64 GetInt64(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
int64 result; | ||
|
||
auto binaryValue = list->GetBinary(index); | ||
binaryValue->GetData(&result, sizeof(int64), 1); | ||
|
||
return result; | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
bool IsInt64(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
return IsType(PrimitiveType::INT64, list, index); | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
void SetCefTime(const CefTime &value, CefRefPtr<TList> list, TIndex index) | ||
{ | ||
auto doubleT = value.GetDoubleT(); | ||
unsigned char mem[1 + sizeof(double)]; | ||
mem[0] = static_cast<unsigned char>(PrimitiveType::CEFTIME); | ||
memcpy(reinterpret_cast<void*>(mem + 1), &doubleT, sizeof(double)); | ||
|
||
auto binaryValue = CefBinaryValue::Create(mem, sizeof(mem)); | ||
list->SetBinary(index, binaryValue); | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
CefTime GetCefTime(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
double doubleT; | ||
|
||
auto binaryValue = list->GetBinary(index); | ||
binaryValue->GetData(&doubleT, sizeof(double), 1); | ||
|
||
return CefTime(doubleT); | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
bool IsCefTime(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
return IsType(PrimitiveType::CEFTIME, list, index); | ||
} | ||
template<typename TList, typename TIndex> | ||
void SetJsCallback(JavascriptCallback^ value, CefRefPtr<TList> list, TIndex index) | ||
{ | ||
auto id = value->Id; | ||
auto browserId = value->BrowserId; | ||
|
||
unsigned char mem[1 + sizeof(int) + sizeof(int64)]; | ||
mem[0] = static_cast<unsigned char>(PrimitiveType::JSCALLBACK); | ||
memcpy(reinterpret_cast<void*>(mem + 1), &browserId, sizeof(int)); | ||
memcpy(reinterpret_cast<void*>(mem + 1 + sizeof(int)), &id, sizeof(int64)); | ||
|
||
auto binaryValue = CefBinaryValue::Create(mem, sizeof(mem)); | ||
list->SetBinary(index, binaryValue); | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
JavascriptCallback^ GetJsCallback(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
auto result = gcnew JavascriptCallback(); | ||
int64 id; | ||
int browserId; | ||
|
||
auto binaryValue = list->GetBinary(index); | ||
binaryValue->GetData(&browserId, sizeof(int), 1); | ||
binaryValue->GetData(&id, sizeof(int64), 1 + sizeof(int)); | ||
|
||
result->Id = id; | ||
result->BrowserId = browserId; | ||
|
||
return result; | ||
} | ||
|
||
template<typename TList, typename TIndex> | ||
bool IsJsCallback(CefRefPtr<TList> list, TIndex index) | ||
{ | ||
return IsType(PrimitiveType::JSCALLBACK, list, index); | ||
} | ||
|
||
template void SetInt64(const int64 &value, CefRefPtr<CefListValue> list, int index); | ||
template void SetInt64(const int64 &value, CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template int64 GetInt64(CefRefPtr<CefListValue> list, int index); | ||
template int64 GetInt64(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template bool IsInt64(CefRefPtr<CefListValue> list, int index); | ||
template bool IsInt64(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
|
||
template void SetCefTime(const CefTime &value, CefRefPtr<CefListValue> list, int index); | ||
template void SetCefTime(const CefTime &value, CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template CefTime GetCefTime(CefRefPtr<CefListValue> list, int index); | ||
template CefTime GetCefTime(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template bool IsCefTime(CefRefPtr<CefListValue> list, int index); | ||
template bool IsCefTime(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
|
||
template void SetJsCallback(JavascriptCallback^ value, CefRefPtr<CefListValue> list, int index); | ||
template void SetJsCallback(JavascriptCallback^ value, CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template JavascriptCallback^ GetJsCallback(CefRefPtr<CefListValue> list, int index); | ||
template JavascriptCallback^ GetJsCallback(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
template bool IsJsCallback(CefRefPtr<CefListValue> list, int index); | ||
template bool IsJsCallback(CefRefPtr<CefDictionaryValue> list, CefString index); | ||
} | ||
} | ||
} |
Oops, something went wrong.