public DevToolsCallCompletionSource(ConvertUtf8BufferToObjectDelegate convertDelegate)
#if !NET45
            : base(TaskCreationOptions.RunContinuationsAsynchronously)
#endif
        {
            _convertDelegate = convertDelegate;
        }
Example #2
0
        private DevToolsCallCompletionSource RemoveOrAddTaskSource(int messageId, ConvertUtf8BufferToObjectDelegate convert)
        {
            DevToolsCallCompletionSource m;

            lock (SyncRoot)
            {
                if (!_waitTasks.Remove(messageId, out m))
                {
                    m = new DevToolsCallCompletionSource(convert);
                    _waitTasks.Add(messageId, m);
                }
            }
            return(m);
        }
Example #3
0
		private static async Task<object> ExecuteDevToolsMethodInternalAsync(IChromiumWebView webview, string method, CefDictionaryValue parameters, ConvertUtf8BufferToObjectDelegate convert, CancellationToken cancellationToken)
		{
			CefBrowser browser = webview.BrowserObject;
			if (browser is null)
				throw new InvalidOperationException();

			cancellationToken.ThrowIfCancellationRequested();

			CefBrowserHost browserHost = browser.Host;
			DevToolsProtocolClient protocolClient = GetProtocolClient(browserHost);

			await CefNetSynchronizationContextAwaiter.GetForThread(CefThreadId.UI);
			cancellationToken.ThrowIfCancellationRequested();

			int messageId = browserHost.ExecuteDevToolsMethod(protocolClient.IncrementMessageId(), method, parameters);
			protocolClient.UpdateLastMessageId(messageId);
			DevToolsMethodResult r;
			if (cancellationToken.CanBeCanceled)
			{
				Task<DevToolsMethodResult> waitTask = protocolClient.WaitForMessageAsync(messageId, convert);
				await Task.WhenAny(waitTask, Task.Delay(Timeout.Infinite, cancellationToken)).ConfigureAwait(false);
				cancellationToken.ThrowIfCancellationRequested();
				r = waitTask.Result;
			}
			else
			{
				r = await protocolClient.WaitForMessageAsync(messageId, convert).ConfigureAwait(false);
			}
			if (r.Success)
				return r.Result;

			CefValue errorValue;
			if (r.Result is byte[] buffer)
				errorValue = CefApi.CefParseJSONBuffer(buffer, CefJsonParserOptions.AllowTrailingCommas);
			else
				errorValue = CefApi.CefParseJSON(r.Result as string, CefJsonParserOptions.AllowTrailingCommas);
			if (errorValue is null)
				throw new DevToolsProtocolException($"An unknown error occurred while trying to execute the '{method}' method.");
			throw new DevToolsProtocolException(errorValue.GetDictionary().GetString("message"));
		}
Example #4
0
 /// <summary>
 /// Returns Task.
 /// </summary>
 /// <param name="messageId">Message ID.</param>
 /// <param name="convert">By default, the result is copied to a byte array.</param>
 /// <returns></returns>
 public Task <DevToolsMethodResult> WaitForMessageAsync(int messageId, ConvertUtf8BufferToObjectDelegate convert)
 {
     return(RemoveOrAddTaskSource(messageId, convert).Task);
 }