text: /*
   * Copyright (C) 2010 Apple Inc. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   * THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  #ifndef TestController_h
  #define TestController_h
  
  #include <WebKit2/WKRetainPtr.h>
  #include <string>
  #include <vector>
  #include <wtf/OwnPtr.h>
  
  namespace WTR {
  
  class TestInvocation;
  class PlatformWebView;
  
  // FIXME: Rename this TestRunner?
  class TestController {
  public:
      static TestController& shared();
  
      TestController(int argc, const char* argv[]);
      ~TestController();
  
      bool verbose() const { return m_verbose; }
  
      WKStringRef injectedBundlePath() { return m_injectedBundlePath.get(); }
      WKStringRef testPluginDirectory() { return m_testPluginDirectory.get(); }
  
      PlatformWebView* mainWebView() { return m_mainWebView.get(); }
      WKContextRef context() { return m_context.get(); }
  
      // Runs the run loop until `done` is true or the timeout elapses.
      enum TimeoutDuration { ShortTimeout, LongTimeout };
      void runUntil(bool& done, TimeoutDuration);
      void notifyDone();
  
  private:
      void initialize(int argc, const char* argv[]);
      void run();
  
      void runTestingServerLoop();
      bool runTest(const char* pathOrURL);
  
      void platformInitialize();
      void platformInitializeContext();
      void platformRunUntil(bool& done, double timeout);
      void initializeInjectedBundlePath();
      void initializeTestPluginDirectory();
  
      bool resetStateToConsistentValues();
  
      // WKContextInjectedBundleClient
      static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void*);
      static void didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void*);
      void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
      WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
  
      // WKPageLoaderClient
      static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void*);
      void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame);
  
      static void processDidCrash(WKPageRef, const void* clientInfo);
      void processDidCrash();
  
      static WKPageRef createOtherPage(WKPageRef oldPage, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*);
  
      static void runModal(WKPageRef, const void* clientInfo);
      static void runModal(PlatformWebView*);
  
      static const char* libraryPathForTesting();
      static const char* platformLibraryPathForTesting();
  
      OwnPtr<TestInvocation> m_currentInvocation;
  
      bool m_dumpPixels;
      bool m_verbose;
      bool m_printSeparators;
      bool m_usingServerMode;
      std::vector<std::string> m_paths;
      WKRetainPtr<WKStringRef> m_injectedBundlePath;
      WKRetainPtr<WKStringRef> m_testPluginDirectory;
  
      OwnPtr<PlatformWebView> m_mainWebView;
      WKRetainPtr<WKContextRef> m_context;
      WKRetainPtr<WKPageGroupRef> m_pageGroup;
  
      enum State {
          Initial,
          Resetting,
          RunningTest
      };
      State m_state;
      bool m_doneResetting;
  
      double m_longTimeout;
      double m_shortTimeout;
  
      bool m_didPrintWebProcessCrashedMessage;
      bool m_shouldExitWhenWebProcessCrashes;
  };
  
  } // namespace WTR
  
  #endif // TestController_h
  