2018-09-10 02:41:13 +02:00
// Copyright © 2016 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.
2018-09-10 02:41:13 +02:00
2016-05-16 18:52:35 +10:00
# 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 ;
2019-07-27 21:49:49 +10:00
//Add null check for issue https://github.com/cefsharp/CefSharp/issues/2839
if ( channelFactory = = nullptr )
2018-01-22 11:15:44 +10:00
{
2019-07-27 21:49:49 +10:00
LOG ( ERROR ) < < " WcfEnabledSubProcess::OnBrowserDestroyed - browser->ChannelFactory was unexpectedly null, see https://github.com/cefsharp/CefSharp/issues/2839 for some debugging tips. " ;
2018-01-22 11:15:44 +10:00
}
2019-07-27 21:49:49 +10:00
else
2016-05-31 08:27:58 +10:00
{
2019-07-27 21:49:49 +10:00
try
{
if ( channelFactory - > State = = CommunicationState : : Opened )
{
channelFactory - > Close ( ) ;
}
}
catch ( Exception ^ )
{
channelFactory - > Abort ( ) ;
}
2016-05-31 08:27:58 +10:00
}
2019-07-27 21:49:49 +10:00
//Add null check for issue https://github.com/cefsharp/CefSharp/issues/2839
if ( browser - > BrowserProcess ! = nullptr )
2018-01-22 11:15:44 +10:00
{
2019-07-27 21:49:49 +10:00
auto clientChannel = ( ( IClientChannel ^ ) browser - > BrowserProcess ) ;
try
2018-01-22 11:15:44 +10:00
{
2019-07-27 21:49:49 +10:00
if ( clientChannel - > State = = CommunicationState : : Opened )
{
clientChannel - > Close ( ) ;
}
}
catch ( Exception ^ )
{
clientChannel - > Abort ( ) ;
2018-01-22 11:15:44 +10:00
}
2016-05-31 08:27:58 +10:00
}
browser - > ChannelFactory = nullptr ;
browser - > BrowserProcess = nullptr ;
}
}
2019-07-27 21:49:49 +10:00
}