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;
        }