// 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;
}
}
}