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; } /// /// Query and modify a session's cookies. /// public Cookies Cookies { get; } internal Session(int id) { Id = id; Cookies = new Cookies(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).FireAndForget(); } /// /// Clears the session’s HTTP authentication cache. /// /// /// public Task ClearAuthCacheAsync(RemovePassword options) { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// Clears the session’s HTTP authentication cache. /// public Task ClearAuthCacheAsync() { var taskCompletionSource = new TaskCompletionSource(); var 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, guid).FireAndForget(); return taskCompletionSource.Task; } /// /// Clears the session’s HTTP cache. /// /// public Task ClearCacheAsync() { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// Clears the host resolver cache. /// /// public Task ClearHostResolverCacheAsync() { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// Clears the data of web storages. /// /// public Task ClearStorageDataAsync() { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// Clears the data of web storages. /// /// /// public Task ClearStorageDataAsync(ClearStorageDataOptions options) { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); 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)).FireAndForget(); } /// /// 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).FireAndForget(); } /// /// 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)).FireAndForget(); } /// /// Writes any unwritten DOMStorage data to disk. /// public void FlushStorageData() { BridgeConnector.Socket.Emit("webContents-session-flushStorageData", Id).FireAndForget(); } /// /// /// /// /// public Task GetBlobDataAsync(string identifier) { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); 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(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// /// /// public Task GetPreloadsAsync() { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); return taskCompletionSource.Task; } /// /// /// /// public Task GetUserAgent() { var taskCompletionSource = new TaskCompletionSource(); var 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).FireAndForget(); 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(); var 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).FireAndForget(); 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).FireAndForget(); } /// /// 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).FireAndForget(); } /// /// 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(); var 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).FireAndForget(); 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).FireAndForget(); } /// /// 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).FireAndForget(); } /// /// The keys are the extension names and each value is an object containing name and version properties. /// Note: This API cannot be called before the ready event of the app module is emitted. /// /// public Task GetAllExtensionsAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("webContents-session-getAllExtensions-completed", (extensionslist) => { BridgeConnector.Socket.Off("webContents-session-getAllExtensions-completed"); var chromeExtensionInfos = ((JArray)extensionslist).ToObject(); taskCompletionSource.SetResult(chromeExtensionInfos); }); BridgeConnector.Socket.Emit("webContents-session-getAllExtensions", Id).FireAndForget(); return taskCompletionSource.Task; } /// /// Remove Chrome extension with the specified name. /// Note: This API cannot be called before the ready event of the app module is emitted. /// /// Name of the Chrome extension to remove public void RemoveExtension(string name) { BridgeConnector.Socket.Emit("webContents-session-removeExtension", Id, name).FireAndForget(); } /// /// resolves when the extension is loaded. /// /// This method will raise an exception if the extension could not be loaded.If /// there are warnings when installing the extension (e.g. if the extension requests /// an API that Electron does not support) then they will be logged to the console. /// /// Note that Electron does not support the full range of Chrome extensions APIs. /// See Supported Extensions APIs for more details on what is supported. /// /// Note that in previous versions of Electron, extensions that were loaded would be /// remembered for future runs of the application.This is no longer the case: /// `loadExtension` must be called on every boot of your app if you want the /// extension to be loaded. /// /// This API does not support loading packed (.crx) extensions. /// ///** Note:** This API cannot be called before the `ready` event of the `app` module /// is emitted. /// ///** Note:** Loading extensions into in-memory(non-persistent) sessions is not supported and will throw an error. /// /// Path to the Chrome extension /// Whether to allow the extension to read local files over `file://` protocol and /// inject content scripts into `file://` pages. This is required e.g. for loading /// devtools extensions on `file://` URLs. Defaults to false. /// public Task LoadExtensionAsync(string path, bool allowFileAccess = false) { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("webContents-session-loadExtension-completed", (extension) => { BridgeConnector.Socket.Off("webContents-session-loadExtension-completed"); taskCompletionSource.SetResult(((JObject)extension).ToObject()); }); BridgeConnector.Socket.Emit("webContents-session-loadExtension", Id, path, allowFileAccess).FireAndForget(); return taskCompletionSource.Task; } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }