| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include <ApplicationServices/ApplicationServices.h> |    5 #include <ApplicationServices/ApplicationServices.h> | 
|    6 #import <Cocoa/Cocoa.h> |    6 #import <Cocoa/Cocoa.h> | 
|    7 #import <objc/objc-runtime.h> |    7 #import <objc/objc-runtime.h> | 
|    8 #include <sys/stat.h> |    8 #include <sys/stat.h> | 
|    9  |    9  | 
|   10 #include "webkit/tools/test_shell/test_shell.h" |   10 #include "webkit/tools/test_shell/test_shell.h" | 
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  350  |  350  | 
|  351   if (IsSVGTestURL(starting_url)) { |  351   if (IsSVGTestURL(starting_url)) { | 
|  352     SizeTo(kSVGTestWindowWidth, kSVGTestWindowHeight); |  352     SizeTo(kSVGTestWindowWidth, kSVGTestWindowHeight); | 
|  353   } else { |  353   } else { | 
|  354     SizeToDefault(); |  354     SizeToDefault(); | 
|  355   } |  355   } | 
|  356  |  356  | 
|  357   return true; |  357   return true; | 
|  358 } |  358 } | 
|  359  |  359  | 
|  360 void TestShell::TestFinished() { |  | 
|  361   if (!test_is_pending_) |  | 
|  362     return;  // reached when running under test_shell_tests |  | 
|  363  |  | 
|  364   test_is_pending_ = false; |  | 
|  365   MessageLoop::current()->Quit(); |  | 
|  366 } |  | 
|  367  |  | 
|  368 // A class to be the target/selector of the "watchdog" thread that ensures |  | 
|  369 // pages timeout if they take too long and tells the test harness via stdout. |  | 
|  370 @interface WatchDogTarget : NSObject { |  | 
|  371  @private |  | 
|  372   NSTimeInterval timeout_; |  | 
|  373 } |  | 
|  374 // |timeout| is in seconds |  | 
|  375 - (id)initWithTimeout:(NSTimeInterval)timeout; |  | 
|  376 // serves as the "run" method of a NSThread. |  | 
|  377 - (void)run:(id)sender; |  | 
|  378 @end |  | 
|  379  |  | 
|  380 @implementation WatchDogTarget |  | 
|  381  |  | 
|  382 - (id)initWithTimeout:(NSTimeInterval)timeout { |  | 
|  383   if ((self = [super init])) { |  | 
|  384     timeout_ = timeout; |  | 
|  385   } |  | 
|  386   return self; |  | 
|  387 } |  | 
|  388  |  | 
|  389 - (void)run:(id)ignore { |  | 
|  390   base::mac::ScopedNSAutoreleasePool scoped_pool; |  | 
|  391  |  | 
|  392   // Check for debugger, just bail if so. We don't want the timeouts hitting |  | 
|  393   // when we're trying to track down an issue. |  | 
|  394   if (base::debug::BeingDebugged()) |  | 
|  395     return; |  | 
|  396  |  | 
|  397   NSThread* currentThread = [NSThread currentThread]; |  | 
|  398  |  | 
|  399   // Wait to be cancelled. If we are that means the test finished. If it hasn't, |  | 
|  400   // then we need to tell the layout script we timed out and start again. |  | 
|  401   NSDate* limitDate = [NSDate dateWithTimeIntervalSinceNow:timeout_]; |  | 
|  402   while ([(NSDate*)[NSDate date] compare:limitDate] == NSOrderedAscending && |  | 
|  403          ![currentThread isCancelled]) { |  | 
|  404     // sleep for a small increment then check again |  | 
|  405     NSDate* incrementDate = [NSDate dateWithTimeIntervalSinceNow:1.0]; |  | 
|  406     [NSThread sleepUntilDate:incrementDate]; |  | 
|  407   } |  | 
|  408   if (![currentThread isCancelled]) { |  | 
|  409     // Print a warning to be caught by the layout-test script. |  | 
|  410     // Note: the layout test driver may or may not recognize |  | 
|  411     // this as a timeout. |  | 
|  412     puts("#TEST_TIMED_OUT\n"); |  | 
|  413     puts("#EOF\n"); |  | 
|  414     fflush(stdout); |  | 
|  415     abort(); |  | 
|  416   } |  | 
|  417 } |  | 
|  418  |  | 
|  419 @end |  | 
|  420  |  | 
|  421 void TestShell::WaitTestFinished() { |  | 
|  422   DCHECK(!test_is_pending_) << "cannot be used recursively"; |  | 
|  423  |  | 
|  424   test_is_pending_ = true; |  | 
|  425  |  | 
|  426   // Create a watchdog thread which just sets a timer and |  | 
|  427   // kills the process if it times out.  This catches really |  | 
|  428   // bad hangs where the shell isn't coming back to the |  | 
|  429   // message loop.  If the watchdog is what catches a |  | 
|  430   // timeout, it can't do anything except terminate the test |  | 
|  431   // shell, which is unfortunate. |  | 
|  432   // Windows multiplies by 2.5, but that causes us to run for far, far too |  | 
|  433   // long. We use the passed value and let the scripts flag override |  | 
|  434   // the value as needed. |  | 
|  435   NSTimeInterval timeout_seconds = GetLayoutTestTimeoutForWatchDog() / 1000; |  | 
|  436   WatchDogTarget* watchdog = [[[WatchDogTarget alloc] |  | 
|  437                                 initWithTimeout:timeout_seconds] autorelease]; |  | 
|  438   NSThread* thread = [[NSThread alloc] initWithTarget:watchdog |  | 
|  439                                              selector:@selector(run:) |  | 
|  440                                                object:nil]; |  | 
|  441   [thread start]; |  | 
|  442  |  | 
|  443   // TestFinished() will post a quit message to break this loop when the page |  | 
|  444   // finishes loading. |  | 
|  445   while (test_is_pending_) |  | 
|  446     MessageLoop::current()->Run(); |  | 
|  447  |  | 
|  448   // Tell the watchdog that we're finished. No point waiting to re-join, it'll |  | 
|  449   // die on its own. |  | 
|  450   [thread cancel]; |  | 
|  451   [thread release]; |  | 
|  452 } |  | 
|  453  |  | 
|  454 void TestShell::InteractiveSetFocus(WebWidgetHost* host, bool enable) { |  360 void TestShell::InteractiveSetFocus(WebWidgetHost* host, bool enable) { | 
|  455   if (enable) { |  361   if (enable) { | 
|  456     [[host->view_handle() window] makeKeyAndOrderFront:nil]; |  362     [[host->view_handle() window] makeKeyAndOrderFront:nil]; | 
|  457   } else { |  363   } else { | 
|  458     // There is no way to resign key window status in Cocoa.  Fake it by |  364     // There is no way to resign key window status in Cocoa.  Fake it by | 
|  459     // ordering the window out (transferring key status to another window) and |  365     // ordering the window out (transferring key status to another window) and | 
|  460     // then ordering the window back in, but without making it key. |  366     // then ordering the window back in, but without making it key. | 
|  461     [[host->view_handle() window] orderOut:nil]; |  367     [[host->view_handle() window] orderOut:nil]; | 
|  462     [[host->view_handle() window] orderFront:nil]; |  368     [[host->view_handle() window] orderFront:nil]; | 
|  463   } |  369   } | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  677   return false; |  583   return false; | 
|  678 } |  584 } | 
|  679  |  585  | 
|  680 void DidLoadPlugin(const std::string& filename) { |  586 void DidLoadPlugin(const std::string& filename) { | 
|  681 } |  587 } | 
|  682  |  588  | 
|  683 void DidUnloadPlugin(const std::string& filename) { |  589 void DidUnloadPlugin(const std::string& filename) { | 
|  684 } |  590 } | 
|  685  |  591  | 
|  686 }  // namespace webkit_glue |  592 }  // namespace webkit_glue | 
| OLD | NEW |