SIGN IN SIGN UP
cefsharp / CefSharp UNCLAIMED

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

0 0 0 C#
// Copyright © 2016 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 "Stdafx.h"
#include "WcfEnabledSubProcess.h"
using namespace System::ServiceModel;
namespace CefSharp
{
2016-05-31 08:27:58 +10:00
namespace BrowserSubprocess
{
void WcfEnabledSubProcess::OnBrowserCreated(CefBrowserWrapper^ browser)
{
if (!_parentBrowserId.HasValue)
2016-05-31 08:27:58 +10:00
{
_parentBrowserId = browser->BrowserId;
2016-05-31 08:27:58 +10:00
}
if (!_parentBrowserId.HasValue)
2016-05-31 08:27:58 +10:00
{
return;
}
//TODO: This can likely be simplified as both values are likely equal
auto browserId = browser->IsPopup ? _parentBrowserId.Value : browser->BrowserId;
2016-05-31 08:27:58 +10:00
auto serviceName = RenderprocessClientFactory::GetServiceName(_parentProcessId, browserId);
2016-05-31 08:27:58 +10:00
auto binding = BrowserProcessServiceHost::CreateBinding();
auto channelFactory = gcnew ChannelFactory<IBrowserProcess^>(
binding,
gcnew EndpointAddress(serviceName)
);
channelFactory->Open();
auto browserProcess = channelFactory->CreateChannel();
auto clientChannel = ((IClientChannel^)browserProcess);
try
{
clientChannel->Open();
browser->ChannelFactory = channelFactory;
browser->BrowserProcess = browserProcess;
}
catch (Exception^)
{
}
}
void WcfEnabledSubProcess::OnBrowserDestroyed(CefBrowserWrapper^ browser)
{
auto channelFactory = browser->ChannelFactory;
//Add null check for issue https://github.com/cefsharp/CefSharp/issues/2839
if (channelFactory == nullptr)
{
LOG(ERROR) << "WcfEnabledSubProcess::OnBrowserDestroyed - browser->ChannelFactory was unexpectedly null, see https://github.com/cefsharp/CefSharp/issues/2839 for some debugging tips.";
}
else
2016-05-31 08:27:58 +10:00
{
try
{
if (channelFactory->State == CommunicationState::Opened)
{
channelFactory->Close();
}
}
catch (Exception^)
{
channelFactory->Abort();
}
2016-05-31 08:27:58 +10:00
}
//Add null check for issue https://github.com/cefsharp/CefSharp/issues/2839
if (browser->BrowserProcess != nullptr)
{
auto clientChannel = ((IClientChannel^)browser->BrowserProcess);
try
{
if (clientChannel->State == CommunicationState::Opened)
{
clientChannel->Close();
}
}
catch (Exception^)
{
clientChannel->Abort();
}
2016-05-31 08:27:58 +10:00
}
browser->ChannelFactory = nullptr;
browser->BrowserProcess = nullptr;
}
}
}