using ElectronNET.API.Entities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Manage browser sessions, cookies, cache, proxy settings, etc. /// public class Session { /// /// Gets the identifier. /// /// /// The identifier. /// public int Id { get; private set; } internal Session(int id) { Id = id; } /// /// Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate authentication. /// /// A comma-separated list of servers for which integrated authentication is enabled. public void AllowNTLMCredentialsForDomains(string domains) { BridgeConnector.Socket.Emit("webContents-session-allowNTLMCredentialsForDomains", Id, domains); } /// /// Clears the session’s HTTP authentication cache. /// /// /// public Task ClearAuthCacheAsync(RemovePassword options) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearAuthCache-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearAuthCache-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearAuthCache", Id, JObject.FromObject(options, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// Clears the session’s HTTP authentication cache. /// /// public Task ClearAuthCacheAsync(RemoveClientCertificate options) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearAuthCache-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearAuthCache-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearAuthCache", Id, JObject.FromObject(options, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// Clears the session’s HTTP cache. /// /// public Task ClearCacheAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearCache-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearCache-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearCache", Id, guid); return taskCompletionSource.Task; } /// /// Clears the host resolver cache. /// /// public Task ClearHostResolverCacheAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearHostResolverCache-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearHostResolverCache-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearHostResolverCache", Id, guid); return taskCompletionSource.Task; } /// /// Clears the data of web storages. /// /// public Task ClearStorageDataAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearStorageData-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearStorageData-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearStorageData", Id, guid); return taskCompletionSource.Task; } /// /// Clears the data of web storages. /// /// /// public Task ClearStorageDataAsync(ClearStorageDataOptions options) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-clearStorageData-options-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-clearStorageData-options-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-clearStorageData-options", Id, JObject.FromObject(options, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// Allows resuming cancelled or interrupted downloads from previous Session. The /// API will generate a DownloadItem that can be accessed with the will-download /// event. The DownloadItem will not have any WebContents associated with it and the /// initial state will be interrupted. The download will start only when the resume /// API is called on the DownloadItem. /// /// public void CreateInterruptedDownload(CreateInterruptedDownloadOptions options) { BridgeConnector.Socket.Emit("webContents-session-createInterruptedDownload", Id, JObject.FromObject(options, _jsonSerializer)); } /// /// Disables any network emulation already active for the session. Resets to the /// original network configuration. /// public void DisableNetworkEmulation() { BridgeConnector.Socket.Emit("webContents-session-disableNetworkEmulation", Id); } /// /// Emulates network with the given configuration for the session. /// /// public void EnableNetworkEmulation(EnableNetworkEmulationOptions options) { BridgeConnector.Socket.Emit("webContents-session-enableNetworkEmulation", Id, JObject.FromObject(options, _jsonSerializer)); } /// /// Writes any unwritten DOMStorage data to disk. /// public void FlushStorageData() { BridgeConnector.Socket.Emit("webContents-session-flushStorageData", Id); } /// /// /// /// /// public Task GetBlobDataAsync(string identifier) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-getBlobData-completed" + guid, (buffer) => { var result = ((JArray)buffer).ToObject(); BridgeConnector.Socket.Off("webContents-session-getBlobData-completed" + guid); taskCompletionSource.SetResult(result); }); BridgeConnector.Socket.Emit("webContents-session-getBlobData", Id, identifier, guid); return taskCompletionSource.Task; } /// /// Get session's current cache size. /// /// Callback is invoked with the session's current cache size. public Task GetCacheSizeAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-getCacheSize-completed" + guid, (size) => { BridgeConnector.Socket.Off("webContents-session-getCacheSize-completed" + guid); taskCompletionSource.SetResult((int)size); }); BridgeConnector.Socket.Emit("webContents-session-getCacheSize", Id, guid); return taskCompletionSource.Task; } /// /// /// /// public Task GetPreloadsAsync() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-getPreloads-completed" + guid, (preloads) => { var result = ((JArray)preloads).ToObject(); BridgeConnector.Socket.Off("webContents-session-getPreloads-completed" + guid); taskCompletionSource.SetResult(result); }); BridgeConnector.Socket.Emit("webContents-session-getPreloads", Id, guid); return taskCompletionSource.Task; } /// /// /// /// public Task GetUserAgent() { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-getUserAgent-completed" + guid, (userAgent) => { BridgeConnector.Socket.Off("webContents-session-getUserAgent-completed" + guid); taskCompletionSource.SetResult(userAgent.ToString()); }); BridgeConnector.Socket.Emit("webContents-session-getUserAgent", Id, guid); return taskCompletionSource.Task; } /// /// Resolves the proxy information for url. The callback will be called with /// callback(proxy) when the request is performed. /// /// /// public Task ResolveProxyAsync(string url) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-resolveProxy-completed" + guid, (proxy) => { BridgeConnector.Socket.Off("webContents-session-resolveProxy-completed" + guid); taskCompletionSource.SetResult(proxy.ToString()); }); BridgeConnector.Socket.Emit("webContents-session-resolveProxy", Id, url, guid); return taskCompletionSource.Task; } /// /// Sets download saving directory. By default, the download directory will be the /// Downloads under the respective app folder. /// /// public void SetDownloadPath(string path) { BridgeConnector.Socket.Emit("webContents-session-setDownloadPath", Id, path); } /// /// Adds scripts that will be executed on ALL web contents that are associated with /// this session just before normal preload scripts run. /// /// public void SetPreloads(string[] preloads) { BridgeConnector.Socket.Emit("webContents-session-setPreloads", Id, preloads); } /// /// Sets the proxy settings. When pacScript and proxyRules are provided together, /// the proxyRules option is ignored and pacScript configuration is applied. /// /// /// public Task SetProxyAsync(ProxyConfig config) { var taskCompletionSource = new TaskCompletionSource(); string guid = Guid.NewGuid().ToString(); BridgeConnector.Socket.On("webContents-session-setProxy-completed" + guid, () => { BridgeConnector.Socket.Off("webContents-session-setProxy-completed" + guid); taskCompletionSource.SetResult(null); }); BridgeConnector.Socket.Emit("webContents-session-setProxy", Id, JObject.FromObject(config, _jsonSerializer), guid); return taskCompletionSource.Task; } /// /// Overrides the userAgent for this session. This doesn't affect existing WebContents, and /// each WebContents can use webContents.setUserAgent to override the session-wide /// user agent. /// /// public void SetUserAgent(string userAgent) { BridgeConnector.Socket.Emit("webContents-session-setUserAgent", Id, userAgent); } /// /// Overrides the userAgent and acceptLanguages for this session. The /// acceptLanguages must a comma separated ordered list of language codes, for /// example "en-US,fr,de,ko,zh-CN,ja". This doesn't affect existing WebContents, and /// each WebContents can use webContents.setUserAgent to override the session-wide /// user agent. /// /// /// The /// acceptLanguages must a comma separated ordered list of language codes, for /// example "en-US,fr,de,ko,zh-CN,ja". public void SetUserAgent(string userAgent, string acceptLanguages) { BridgeConnector.Socket.Emit("webContents-session-setUserAgent", Id, userAgent, acceptLanguages); } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }