2016-05-16 18:52:35 +10:00
|
|
|
// Copyright © 2010-2016 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 "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)
|
|
|
|
|
{
|
|
|
|
|
if (!parentBrowserId.HasValue)
|
|
|
|
|
{
|
|
|
|
|
parentBrowserId = browser->BrowserId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!parentProcessId.HasValue || !parentBrowserId.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto browserId = browser->IsPopup ? parentBrowserId.Value : browser->BrowserId;
|
|
|
|
|
|
|
|
|
|
auto serviceName = RenderprocessClientFactory::GetServiceName(parentProcessId.Value, browserId);
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
if (channelFactory->State == CommunicationState::Opened)
|
|
|
|
|
{
|
|
|
|
|
channelFactory->Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto clientChannel = ((IClientChannel^)browser->BrowserProcess);
|
|
|
|
|
|
|
|
|
|
if (clientChannel->State == CommunicationState::Opened)
|
|
|
|
|
{
|
|
|
|
|
clientChannel->Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
browser->ChannelFactory = nullptr;
|
|
|
|
|
browser->BrowserProcess = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-05-16 18:52:35 +10:00
|
|
|
}
|