--- /usr/local/lib/ruby/gems/1.8/gems/watir-1.4.1/watir.rb	2006-07-28 02:01:22.000000000 +0200
+++ vendor/watir.rb	2006-07-29 23:37:27.000000000 +0200
@@ -1370,63 +1370,68 @@
         # Synchronization
         #
         
-        # This method is used internally to cause an execution to stop until the page has loaded in Internet Explorer.
-        def wait( noSleep  = false )
-            begin
-                @down_load_time=0
-                pageLoadStart = Time.now
-                @pageHasReloaded= false
-                
-                s= Spinner.new(@enable_spinner)
-                while @ie.busy
-                    @pageHasReloaded = true
-                    sleep 0.02
-                    s.spin
-                end
-                s.reverse
-                
-                log "wait: readystate=" + @ie.readyState.to_s 
-                until @ie.readyState == READYSTATE_COMPLETE
-                    @pageHasReloaded = true
-                    sleep 0.02
-                    s.spin
-                end
-                sleep 0.02
-                
-                until @ie.document.readyState == "complete"
-                    sleep 0.02
-                    s.spin
-                end
-                
-                
-                if @ie.document.frames.length > 1
-                    begin
-                        0.upto @ie.document.frames.length-1 do |i|
-                            until @ie.document.frames[i.to_s].document.readyState == "complete"
-                                sleep 0.02
-                                s.spin
-                            end
-                            @url_list << @ie.document.frames[i.to_s].document.url unless url_list.include?(@ie.document.frames[i.to_s].document.url)
-                        end
-                    rescue=>e
-                        @logger.warn 'frame error in wait'   + e.to_s + "\n" + e.backtrace.join("\n")
-                    end
-                else
-                    @url_list << @ie.document.url unless @url_list.include?(@ie.document.url)
+        # When we ask IE to load a page the call does not block until everything is ready to use.
+        # The browser passes through a sequence of states until it completes the load, and then
+        # we need yet to wait until it has processed the doument to build the DOM. If the document
+        # contains frames the same operation needs to be done, recursively. All that waiting is
+        # encapsulated in this method, which is called by Watir in order to hide this details from
+        # the user.
+        def wait( noSleep = false )
+          begin
+            @down_load_time = 0
+            pageLoadStart = Time.now
+            
+            spinner = Spinner.new(@enable_spinner)
+            
+            wait_for_ie(spinner)
+            documents_to_wait_for = [@ie.document]
+            while documents_to_wait_for.length > 0
+              doc = documents_to_wait_for.shift
+              wait_for_document(doc, spinner)
+              @url_list << doc.url unless @url_list.include?(doc.url)
+              if doc.frames.length > 0
+                0.upto(doc.frames.length-1) do |n|
+                  documents_to_wait_for << doc.frames[n.to_s].document
                 end
-                @down_load_time =  Time.now - pageLoadStart 
-
-                run_error_checks
-
-                print "\b" unless @enable_spinner == false
-                
-                s=nil
-            rescue WIN32OLERuntimeError => e
-                @logger.info "runtime error in wait: #{e}\n#{e.backtrace.join("\\\n")}"
+              end
             end
-            sleep 0.01
-            sleep @defaultSleepTime unless noSleep  == true
+            
+            @down_load_time =  Time.now - pageLoadStart 
+            run_error_checks
+            print "\b" if @enable_spinner
+          rescue WIN32OLERuntimeError => e
+            @logger.info "runtime error in wait: #{e}\n#{e.backtrace.join("\\\n")}"
+          end
+          sleep 0.01
+          sleep @defaultSleepTime unless noSleep
+        end
+
+        # Wait for IE to complete.
+        def wait_for_ie(spinner)
+          begin
+            while @ie.busy
+              sleep 0.02
+              spinner.spin
+            end
+            spinner.reverse
+            log "wait: readystate=" + @ie.readyState.to_s 
+            until @ie.readyState == READYSTATE_COMPLETE
+              sleep 0.02
+              spinner.spin
+            end
+            sleep 0.02
+          end while @ie.busy || @ie.readyState != READYSTATE_COMPLETE
+        end
+        private :wait_for_ie
+        
+        # Waits until the document has a complete readyState.
+        def wait_for_document(doc, spinner)
+          until doc.readyState == "complete"
+            sleep 0.02
+            spinner.spin
+          end
         end
+        private :wait_for_document
 
         # Error checkers
 
