private static OnReadyStateChangeSignalSender CreateOnReadyStateChangeSignalSender(OnReadyStateChangeSignalHandler handler) { OnReadyStateChangeSignalSender signalSender; lock (_onReadyStateChangeSignalHandlers) { int signalId = ++_customSignalIdCounter; _onReadyStateChangeSignalHandlers[signalId] = handler; signalSender = new OnReadyStateChangeSignalSender { SignalId = signalId }; } return signalSender; }
private static XmlHttpRequest _doSimpleXmlHttpRequest(string url, RequestMethod method, string postData, string username, string password, int timeoutMs) { XmlHttpRequest xhr = GetXmlHttpRequest(); Lock l = new Lock(); l.Acquire(); Condition condition = new Condition(l); if (_driverProcess == null) { throw new SystemException("XmlHttpRequestManager.Driver was not started."); } OnReadyStateChangeSignalHandler handler = new OnReadyStateChangeSignalHandler { XmlHttpRequest = xhr, Condition = condition }; // TODO: Use resource manager to ensure these signal senders and handlers get cleaned up OnReadyStateChangeSignalSender signalSender = CreateOnReadyStateChangeSignalSender(handler); try { xhr.OnReadyStateChange = (NativeFunction)new NativeVoidDelegate(signalSender.SendSignal); string methodString; if (method == RequestMethod.Get) { methodString = "GET"; } else { methodString = "POST"; } xhr.Open(methodString, url, true, username, password); xhr.Send(postData); if (timeoutMs > 0) { if (!condition.Await(timeoutMs)) { xhr.OnReadyStateChange = null; throw new XmlHttpRequestTimeoutException("Timed out waiting for " + url, xhr); } } else { condition.Await(); } // TODO: finally blocks are not executed if there is a return statement in the try block. fix that } finally { DestroyOnReadyStateChangeSignalSender(signalSender); } return xhr; }