Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 28 additions & 10 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ namespace CefSharp
_onBrowserCreated->Invoke(wrapper);

//Multiple CefBrowserWrappers created when opening popups
_browserWrappers->TryAdd(browser->GetIdentifier(), wrapper);
auto browserId = browser->GetIdentifier();
_browserWrappers->TryAdd(browserId, wrapper);

auto javascriptBindingSettings = gcnew JavascriptBindingSettings();
_browserJavascriptBindingSettings->TryAdd(browserId, javascriptBindingSettings);

if (!extraInfo.get())
{
Expand Down Expand Up @@ -103,19 +107,19 @@ namespace CefSharp

if (extraInfo->HasKey("JavascriptBindingApiEnabled"))
{
wrapper->JavascriptBindingApiEnabled = extraInfo->GetBool("JavascriptBindingApiEnabled");
javascriptBindingSettings->JavascriptBindingApiEnabled = extraInfo->GetBool("JavascriptBindingApiEnabled");
}

if (extraInfo->HasKey("JavascriptBindingApiHasAllowOrigins"))
{
wrapper->JavascriptBindingApiHasAllowOrigins = extraInfo->GetBool("JavascriptBindingApiHasAllowOrigins");
javascriptBindingSettings->JavascriptBindingApiHasAllowOrigins = extraInfo->GetBool("JavascriptBindingApiHasAllowOrigins");

if (wrapper->JavascriptBindingApiHasAllowOrigins)
if (javascriptBindingSettings->JavascriptBindingApiHasAllowOrigins)
{
auto allowOrigins = extraInfo->GetList("JavascriptBindingApiAllowOrigins");
if (allowOrigins.get() && allowOrigins->IsValid())
{
wrapper->JavascriptBindingApiAllowOrigins = allowOrigins->Copy();
javascriptBindingSettings->JavascriptBindingApiAllowOrigins = allowOrigins->Copy();
}
}
}
Expand All @@ -136,6 +140,9 @@ namespace CefSharp
_onBrowserDestroyed->Invoke(wrapper);
delete wrapper;
}

// Don't remove javascript settings because cef is unreliable in calling OnBrowserCreated/OnBrowserDestroyed consistently:
// https://github.com/cefsharp/CefSharp/issues/5228
};

void CefAppUnmanagedWrapper::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
Expand Down Expand Up @@ -165,9 +172,10 @@ namespace CefSharp
}
}

auto browserWrapper = FindBrowserWrapper(browser->GetIdentifier());
JavascriptBindingSettings^ javascriptBindingSettings = nullptr;
_browserJavascriptBindingSettings->TryGetValue(browser->GetIdentifier(), javascriptBindingSettings);

if (browserWrapper != nullptr && browserWrapper->JavascriptBindingApiEnabled && IsJavascriptBindingApiAllowed(browserWrapper, frame))
if (IsJavascriptBindingApiAllowed(javascriptBindingSettings, frame))
{
//TODO: Look at adding some sort of javascript mapping layer to reduce the code duplication
auto global = context->GetGlobal();
Expand Down Expand Up @@ -347,14 +355,24 @@ namespace CefSharp
return rootObject;
}

bool CefAppUnmanagedWrapper::IsJavascriptBindingApiAllowed(CefBrowserWrapper^ browserWrapper, CefRefPtr<CefFrame> frame)
bool CefAppUnmanagedWrapper::IsJavascriptBindingApiAllowed(JavascriptBindingSettings^ javascriptBindingSettings, CefRefPtr<CefFrame> frame)
{
if (browserWrapper == nullptr || !browserWrapper->JavascriptBindingApiHasAllowOrigins)
if (javascriptBindingSettings == nullptr)
{
return false;
}

if (!javascriptBindingSettings->JavascriptBindingApiEnabled)
{
return false;
}

if (!javascriptBindingSettings->JavascriptBindingApiHasAllowOrigins)
{
return true;
}

auto allowOrigins = browserWrapper->JavascriptBindingApiAllowOrigins;
auto allowOrigins = javascriptBindingSettings->JavascriptBindingApiAllowOrigins;
if (!allowOrigins.get())
{
return false;
Expand Down
15 changes: 14 additions & 1 deletion CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "SubProcessApp.h"
#include "CefBrowserWrapper.h"
#include "JavascriptBindingSettings.h"
#include "RegisterBoundObjectRegistry.h"

using namespace System::Collections::Generic;
Expand All @@ -26,6 +27,7 @@ namespace CefSharp
gcroot<Action<CefBrowserWrapper^>^> _onBrowserCreated;
gcroot<Action<CefBrowserWrapper^>^> _onBrowserDestroyed;
gcroot<ConcurrentDictionary<int, CefBrowserWrapper^>^> _browserWrappers;
gcroot<ConcurrentDictionary<int, JavascriptBindingSettings^>^> _browserJavascriptBindingSettings;
gcroot<ConcurrentDictionary<String^, JavascriptRootObjectWrapper^>^> _jsRootObjectWrappersByFrameId;
bool _focusedNodeChangedEnabled;
bool _legacyBindingEnabled;
Expand All @@ -38,7 +40,7 @@ namespace CefSharp
gcroot<Dictionary<String^, JavascriptObject^>^> _javascriptObjects;

gcroot<RegisterBoundObjectRegistry^> _registerBoundObjectRegistry;
bool IsJavascriptBindingApiAllowed(CefBrowserWrapper^ browserWrapper, CefRefPtr<CefFrame> frame);
bool IsJavascriptBindingApiAllowed(JavascriptBindingSettings^ javascriptBindingSettings, CefRefPtr<CefFrame> frame);

public:
static const CefString kPromiseCreatorScript;
Expand All @@ -49,6 +51,7 @@ namespace CefSharp
_onBrowserCreated = onBrowserCreated;
_onBrowserDestroyed = onBrowserDestroyed;
_browserWrappers = gcnew ConcurrentDictionary<int, CefBrowserWrapper^>();
_browserJavascriptBindingSettings = gcnew ConcurrentDictionary<int, JavascriptBindingSettings^>();
_jsRootObjectWrappersByFrameId = gcnew ConcurrentDictionary<String^, JavascriptRootObjectWrapper^>();
_focusedNodeChangedEnabled = enableFocusedNodeChanged;
_javascriptObjects = gcnew Dictionary<String^, JavascriptObject^>();
Expand All @@ -70,6 +73,16 @@ namespace CefSharp
_browserWrappers = nullptr;
}

if (!Object::ReferenceEquals(_browserJavascriptBindingSettings, nullptr))
{
for each (JavascriptBindingSettings ^ javascriptBindingSettings in Enumerable::OfType<JavascriptBindingSettings^>(_browserJavascriptBindingSettings))
{
delete javascriptBindingSettings;
}

_browserJavascriptBindingSettings = nullptr;
}

if (!Object::ReferenceEquals(_jsRootObjectWrappersByFrameId, nullptr))
{
for each (JavascriptRootObjectWrapper^ rootObject in Enumerable::OfType<JavascriptRootObjectWrapper^>(_jsRootObjectWrappersByFrameId))
Expand Down
14 changes: 0 additions & 14 deletions CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,18 @@ namespace CefSharp
{
private:
MCefRefPtr<CefBrowser> _cefBrowser;
MCefRefPtr<CefListValue> _javascriptBindingApiAllowOrigins;

public:
CefBrowserWrapper(const CefRefPtr<CefBrowser> &cefBrowser)
{
_cefBrowser = cefBrowser.get();
BrowserId = cefBrowser->GetIdentifier();
IsPopup = cefBrowser->IsPopup();

JavascriptBindingApiEnabled = true;
JavascriptBindingApiHasAllowOrigins = false;
JavascriptBindingApiAllowOrigins = nullptr;
}

!CefBrowserWrapper()
{
_cefBrowser = nullptr;

_javascriptBindingApiAllowOrigins = nullptr;
}

~CefBrowserWrapper()
Expand All @@ -56,13 +49,6 @@ namespace CefSharp

property int BrowserId;
property bool IsPopup;
property bool JavascriptBindingApiEnabled;
property bool JavascriptBindingApiHasAllowOrigins;
property CefRefPtr<CefListValue> JavascriptBindingApiAllowOrigins
{
CefRefPtr<CefListValue> get() { return _javascriptBindingApiAllowOrigins.get(); }
void set(CefRefPtr<CefListValue> value) { _javascriptBindingApiAllowOrigins = value.get(); }
}

#ifndef NETCOREAPP
// This allows us to create the WCF proxies back to our parent process.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@
<ClCompile Include="..\CefSharp.Core.Runtime\Internals\CefRefCountManaged.cpp" />
<ClCompile Include="BrowserSubprocessExecutable.h" />
<ClInclude Include="Cef.h" />
<ClInclude Include="JavascriptBindingSettings.h" />
<ClInclude Include="JavascriptRootObjectWrapper.h" />
<ClInclude Include="SubProcessApp.h" />
<ClInclude Include="Async\JavascriptAsyncMethodCallback.h" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@
<ClCompile Include="..\CefSharp.Core.Runtime\Internals\CefRefCountManaged.cpp" />
<ClCompile Include="BrowserSubprocessExecutable.h" />
<ClInclude Include="Cef.h" />
<ClInclude Include="JavascriptBindingSettings.h" />
<ClInclude Include="JavascriptPromiseHandler.h" />
<ClInclude Include="JavascriptPromiseResolverCatch.h" />
<ClInclude Include="JavascriptPromiseResolverThen.h" />
Expand Down
47 changes: 47 additions & 0 deletions CefSharp.BrowserSubprocess.Core/JavascriptBindingSettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright © 2013 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.

#pragma once

#include "include/cef_v8.h"

#include "Stdafx.h"

namespace CefSharp
{
namespace BrowserSubprocess
{
private ref class JavascriptBindingSettings
{
private:
MCefRefPtr<CefListValue> _javascriptBindingApiAllowOrigins;

public:
JavascriptBindingSettings()
{
JavascriptBindingApiEnabled = true;
JavascriptBindingApiHasAllowOrigins = false;
JavascriptBindingApiAllowOrigins = nullptr;
}

!JavascriptBindingSettings()
{
_javascriptBindingApiAllowOrigins = nullptr;
}

~JavascriptBindingSettings()
{
this->!JavascriptBindingSettings();
}

property bool JavascriptBindingApiEnabled;
property bool JavascriptBindingApiHasAllowOrigins;
property CefRefPtr<CefListValue> JavascriptBindingApiAllowOrigins
{
CefRefPtr<CefListValue> get() { return _javascriptBindingApiAllowOrigins.get(); }
void set(CefRefPtr<CefListValue> value) { _javascriptBindingApiAllowOrigins = value.get(); }
}
};
}
}