// Copyright 2014 The Cobalt Authors. 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_SCRIPT_ENVIRONMENT_SETTINGS_H_
#define COBALT_SCRIPT_ENVIRONMENT_SETTINGS_H_

#include <memory>
#include <string>

#include "base/memory/ref_counted.h"
#include "cobalt/base/debugger_hooks.h"
#include "url/gurl.h"

namespace cobalt {
namespace script {

// Environment Settings object as described in
// https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#environment-settings-objects
class EnvironmentSettings {
 public:
  explicit EnvironmentSettings(
      const base::DebuggerHooks& debugger_hooks = null_debugger_hooks_);
  virtual ~EnvironmentSettings() {}

  // The API id.
  //   https://html.spec.whatwg.org/multipage/webappapis.html#concept-environment-id
  const std::string& id() const { return uuid_; }

  // The API base URL.
  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#api-base-url
  void set_base_url(const GURL& url) { base_url_ = url; }
  const GURL& base_url() const { return base_url_; }

  // The API creation URL
  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#concept-environment-creation-url
  const GURL& creation_url() const { return base_url(); }

  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin
  const GURL GetOrigin() const { return creation_url().GetOrigin(); }

  const base::DebuggerHooks& debugger_hooks() const { return debugger_hooks_; }

 protected:
  friend std::unique_ptr<EnvironmentSettings>::deleter_type;

 private:
  DISALLOW_COPY_AND_ASSIGN(EnvironmentSettings);

  std::string uuid_;
  static const base::NullDebuggerHooks null_debugger_hooks_;
  const base::DebuggerHooks& debugger_hooks_;
  GURL base_url_;
};

}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_ENVIRONMENT_SETTINGS_H_
