// Copyright © 2015 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. using System; using System.Threading.Tasks; using CefSharp.Internals; namespace CefSharp { /// /// Provides a callback implementation of . /// public class TaskSetCookieCallback : ISetCookieCallback { private readonly TaskCompletionSource taskCompletionSource; private volatile bool isDisposed; private bool onComplete; //Only ever accessed on the same CEF thread, so no need for thread safety /// /// Default constructor /// public TaskSetCookieCallback() { taskCompletionSource = new TaskCompletionSource(); } void ISetCookieCallback.OnComplete(bool success) { onComplete = true; taskCompletionSource.TrySetResultAsync(success); } /// /// Task used to await this callback /// public Task Task { get { return taskCompletionSource.Task; } } bool ISetCookieCallback.IsDisposed { get { return isDisposed; } } void IDisposable.Dispose() { var task = taskCompletionSource.Task; //If onComplete is false then ISetCookieCallback.OnComplete was never called, //so we'll set the result to false. Calling TrySetResultAsync multiple times //can result in the issue outlined in https://github.com/cefsharp/CefSharp/pull/2349 if (onComplete == false && task.IsCompleted == false) { taskCompletionSource.TrySetResultAsync(false); } isDisposed = true; } } }