// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_WEBDRIVER_SCRIPT_EXECUTOR_RESULT_H_
#define COBALT_WEBDRIVER_SCRIPT_EXECUTOR_RESULT_H_

#if defined(ENABLE_WEBDRIVER)

#include <string>

#include "base/threading/thread_checker.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace webdriver {

// An instance of the ScriptExecutorResult is passed to the webdriver script
// execution harness to collect the results of running a script via webdriver.
// The results are forwarded to a ResultHandler instance.
class ScriptExecutorResult : public script::Wrappable {
 public:
  // The ScriptExecutorResult class must only be accessed from the main thread,
  // so use an instance of the ResultHandler class to access the results of
  // execution from another thread.
  // Exactly one of OnResult and OnTimeout will be called. After one of these
  // is called, the ScriptExectutorResult object will no longer hold a pointer
  // to the ResultHandler instance, so it's safe for the owning thread to
  // destroy it.
  class ResultHandler {
   public:
    virtual void OnResult(const std::string& result) = 0;
    virtual void OnTimeout() = 0;
  };

  explicit ScriptExecutorResult(ScriptExecutorResult::ResultHandler* handler)
      : result_handler_(handler) {}

  void OnResult(const std::string& result) {
    DCHECK(thread_checker_.CalledOnValidThread());
    if (result_handler_) {
      result_handler_->OnResult(result);
      result_handler_ = NULL;
    }
  }

  void OnTimeout() {
    DCHECK(thread_checker_.CalledOnValidThread());
    if (result_handler_) {
      result_handler_->OnTimeout();
      result_handler_ = NULL;
    }
  }

  DEFINE_WRAPPABLE_TYPE(ScriptExecutorResult);

 private:
  base::ThreadChecker thread_checker_;
  ResultHandler* result_handler_;
};

}  // namespace webdriver
}  // namespace cobalt

#endif  // defined(ENABLE_WEBDRIVER)

#endif  // COBALT_WEBDRIVER_SCRIPT_EXECUTOR_RESULT_H_
