2017-03-05 23:44:37 +01:00
|
|
|
// Copyright © 2010-2017 The CefSharp Authors. All rights reserved.
|
2016-05-16 18:52:35 +10:00
|
|
|
//
|
|
|
|
|
// 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"
|
2016-05-16 20:22:08 +10:00
|
|
|
#include "WcfEnabledSubProcess.h"
|
2016-05-16 18:52:35 +10:00
|
|
|
|
|
|
|
|
using namespace System::ServiceModel;
|
|
|
|
|
|
|
|
|
|
namespace CefSharp
|
|
|
|
|
{
|
2016-05-31 08:27:58 +10:00
|
|
|
namespace BrowserSubprocess
|
|
|
|
|
{
|
|
|
|
|
void WcfEnabledSubProcess::OnBrowserCreated(CefBrowserWrapper^ browser)
|
|
|
|
|
{
|
2018-04-30 12:45:15 +10:00
|
|
|
if (!_parentBrowserId.HasValue)
|
2016-05-31 08:27:58 +10:00
|
|
|
{
|
2018-04-30 12:45:15 +10:00
|
|
|
_parentBrowserId = browser->BrowserId;
|
2016-05-31 08:27:58 +10:00
|
|
|
}
|
|
|
|
|
|
2018-04-30 12:45:15 +10:00
|
|
|
if (!_parentBrowserId.HasValue)
|
2016-05-31 08:27:58 +10:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-30 12:45:15 +10:00
|
|
|
//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
|
|
|
|
2018-04-30 12:45:15 +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;
|
|
|
|
|
|
2018-01-22 11:15:44 +10:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (channelFactory->State == CommunicationState::Opened)
|
|
|
|
|
{
|
|
|
|
|
channelFactory->Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception^)
|
2016-05-31 08:27:58 +10:00
|
|
|
{
|
2018-01-22 11:15:44 +10:00
|
|
|
|
|
|
|
|
channelFactory->Abort();
|
2016-05-31 08:27:58 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto clientChannel = ((IClientChannel^)browser->BrowserProcess);
|
|
|
|
|
|
2018-01-22 11:15:44 +10:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (clientChannel->State == CommunicationState::Opened)
|
|
|
|
|
{
|
|
|
|
|
clientChannel->Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception^)
|
2016-05-31 08:27:58 +10:00
|
|
|
{
|
2018-01-22 11:15:44 +10:00
|
|
|
clientChannel->Abort();
|
2016-05-31 08:27:58 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
browser->ChannelFactory = nullptr;
|
|
|
|
|
browser->BrowserProcess = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-05-16 18:52:35 +10:00
|
|
|
}
|