using System; using System.Threading.Tasks; using ElectronNET.API.Entities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; namespace ElectronNET.API { /// /// Query and modify a session's cookies. /// public class Cookies { /// /// Gets the identifier. /// /// /// The identifier. /// public int Id { get; private set; } internal Cookies(int id) { Id = id; } /// /// Emitted when a cookie is changed because it was added, edited, removed, or expired. /// public event Action OnChanged { add { if (_changed == null) { BridgeConnector.Socket.On("webContents-session-cookies-changed" + Id, (args) => { Cookie cookie = ((JArray)args)[0].ToObject(); CookieChangedCause cause = ((JArray)args)[1].ToObject(); bool removed = ((JArray)args)[2].ToObject(); _changed(cookie, cause, removed); }); BridgeConnector.Socket.Emit("register-webContents-session-cookies-changed", Id); } _changed += value; } remove { _changed -= value; if (_changed == null) BridgeConnector.Socket.Off("webContents-session-cookies-changed" + Id); } } private event Action _changed; /// /// Sends a request to get all cookies matching filter, and resolves a callack with the response. /// /// /// /// A task which resolves an array of cookie objects. public Task GetAsync(CookieFilter filter) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-cookies-get-completed" + guid, (cookies) => { Cookie[] result = ((JArray)cookies).ToObject(); BridgeConnector.Socket.Off("webContents-session-cookies-get-completed" + guid); taskCompletionSource.SetResult(result); }); BridgeConnector.Socket.Emit("webContents-session-cookies-get", Id, JObject.FromObject(filter, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// /// /// /// public Task SetAsync(CookieDetails details) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-cookies-set-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-cookies-set-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-cookies-set", Id, JObject.FromObject(details, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// Removes the cookies matching url and name /// /// The URL associated with the cookie. /// The name of cookie to remove. /// A task which resolves when the cookie has been removed public Task RemoveAsync(string url, string name) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-cookies-remove-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-cookies-remove-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-cookies-remove", Id, url, name, guid); return taskCompletionSource.Task; } /// /// Writes any unwritten cookies data to disk. /// /// A task which resolves when the cookie store has been flushed public Task FlushStoreAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-cookies-flushStore-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-cookies-flushStore-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-cookies-flushStore", Id, guid); return taskCompletionSource.Task; } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }