// 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.Collections.Generic; using System.Threading.Tasks; namespace CefSharp { /// /// Async extensions for different interfaces /// public static class AsyncExtensions { /// /// Deletes all cookies that matches all the provided parameters asynchronously. /// If both and are empty, all cookies will be deleted. /// /// cookie manager /// The cookie URL. If an empty string is provided, any URL will be matched. /// The name of the cookie. If an empty string is provided, any URL will be matched. /// Returns -1 if a non-empty invalid URL is specified, or if cookies cannot be accessed; /// otherwise, a task that represents the delete operation. The value of the TResult will be the number of cookies that were deleted or -1 if unknown. public static Task DeleteCookiesAsync(this ICookieManager cookieManager, string url = null, string name = null) { if (cookieManager == null) { throw new NullReferenceException("cookieManager"); } if (cookieManager.IsDisposed) { throw new ObjectDisposedException("cookieManager"); } var callback = new TaskDeleteCookiesCallback(); if (cookieManager.DeleteCookies(url, name, callback)) { return callback.Task; } //There was a problem deleting cookies return Task.FromResult(TaskDeleteCookiesCallback.InvalidNoOfCookiesDeleted); } /// /// Sets a cookie given a valid URL and explicit user-provided cookie attributes. /// This function expects each attribute to be well-formed. It will check for disallowed /// characters (e.g. the ';' character is disallowed within the cookie value attribute) and will return false without setting /// /// cookie manager /// The cookie URL. If an empty string is provided, any URL will be matched. /// the cookie to be set /// returns false if the cookie cannot be set (e.g. if illegal charecters such as ';' are used); /// otherwise task that represents the set operation. The value of the TResult parameter contains a bool to indicate success. public static Task SetCookieAsync(this ICookieManager cookieManager, string url, Cookie cookie) { if (cookieManager == null) { throw new NullReferenceException("cookieManager"); } if (cookieManager.IsDisposed) { throw new ObjectDisposedException("cookieManager"); } var callback = new TaskSetCookieCallback(); if (cookieManager.SetCookie(url, cookie, callback)) { return callback.Task; } //There was a problem setting cookies return Task.FromResult(false); } /// /// Visits all cookies. The returned cookies are sorted by longest path, then by earliest creation date. /// /// cookie manager /// A task that represents the VisitAllCookies operation. The value of the TResult parameter contains a List of cookies /// or null if cookies cannot be accessed. public static Task> VisitAllCookiesAsync(this ICookieManager cookieManager) { var cookieVisitor = new TaskCookieVisitor(); if (cookieManager.VisitAllCookies(cookieVisitor)) { return cookieVisitor.Task; } return Task.FromResult>(null); } /// /// Visits a subset of the cookies. The results are filtered by the given url scheme, host, domain and path. /// If is true, HTTP-only cookies will also be included in the results. The returned cookies /// are sorted by longest path, then by earliest creation date. /// /// cookie manager /// The URL to use for filtering a subset of the cookies available. /// A flag that determines whether HTTP-only cookies will be shown in results. /// A task that represents the VisitUrlCookies operation. The value of the TResult parameter contains a List of cookies. /// or null if cookies cannot be accessed. public static Task> VisitUrlCookiesAsync(this ICookieManager cookieManager, string url, bool includeHttpOnly) { var cookieVisitor = new TaskCookieVisitor(); if (cookieManager.VisitUrlCookies(url, includeHttpOnly, cookieVisitor)) { return cookieVisitor.Task; } return Task.FromResult>(null); } /// /// Flush the backing store (if any) to disk. /// /// cookieManager instance /// A task that represents the FlushStore operation. Result indicates if the flush completed successfully. /// Will return false if the cookikes cannot be accessed. public static Task FlushStoreAsync(this ICookieManager cookieManager) { var handler = new TaskCompletionCallback(); if (cookieManager.FlushStore(handler)) { return handler.Task; } //returns null if cookies cannot be accessed. return Task.FromResult(false); } /// /// Retrieve a snapshot of current navigation entries /// /// browserHost /// If true the List will only contain the current navigation entry. /// If false the List will include all navigation entries will be included. Default is false public static Task> GetNavigationEntriesAsync(this IBrowserHost browserHost, bool currentOnly = false) { var visitor = new TaskNavigationEntryVisitor(); browserHost.GetNavigationEntries(visitor, currentOnly); return visitor.Task; } } }