// 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 sealed 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 /// /// Initializes a new instance of the TaskSetCookieCallback class. /// public TaskSetCookieCallback() { taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); } void ISetCookieCallback.OnComplete(bool success) { onComplete = true; taskCompletionSource.TrySetResult(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. if (onComplete == false && task.IsCompleted == false) { taskCompletionSource.TrySetResult(false); } isDisposed = true; } } }