// Copyright © 2017 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 TaskDeleteCookiesCallback : IDeleteCookiesCallback { /// /// Invalid Number of Cookies /// public const int InvalidNoOfCookiesDeleted = -1; 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 TaskDeleteCookiesCallback() { taskCompletionSource = new TaskCompletionSource(); } void IDeleteCookiesCallback.OnComplete(int numDeleted) { onComplete = true; taskCompletionSource.TrySetResultAsync(numDeleted); } /// /// Task used to await this callback /// public Task Task { get { return taskCompletionSource.Task; } } bool IDeleteCookiesCallback.IsDisposed { get { return isDisposed; } } void IDisposable.Dispose() { var task = taskCompletionSource.Task; //If onComplete is false then IDeleteCookiesCallback.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(InvalidNoOfCookiesDeleted); } isDisposed = true; } } }