// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_CPP_DEV_URL_UTIL_DEV_H_
#define PPAPI_CPP_DEV_URL_UTIL_DEV_H_

#include "ppapi/c/dev/ppb_url_util_dev.h"
#include "ppapi/cpp/var.h"

namespace pp {

class InstanceHandle;

// Simple wrapper around the PPB_URLUtil interface.
class URLUtil_Dev {
 public:
  // This class is just a collection of random functions that aren't
  // particularly attached to anything. This may return NULL if the
  // browser doesn't support the URLUtil interface. Since this is a
  // singleton, don't delete the pointer.
  static const URLUtil_Dev* Get();

  Var Canonicalize(const Var& url,
                   PP_URLComponents_Dev* components = NULL) const;

  Var ResolveRelativeToURL(const Var& base_url,
                           const Var& relative_string,
                           PP_URLComponents_Dev* components = NULL) const;
  Var ResolveRelativeToDocument(const InstanceHandle& instance,
                                const Var& relative_string,
                                PP_URLComponents_Dev* components = NULL) const;

  bool IsSameSecurityOrigin(const Var& url_a, const Var& url_b) const;
  bool DocumentCanRequest(const InstanceHandle& instance, const Var& url) const;
  bool DocumentCanAccessDocument(const InstanceHandle& active,
                                 const InstanceHandle& target) const;
  Var GetDocumentURL(const InstanceHandle& instance,
                     PP_URLComponents_Dev* components = NULL) const;

  Var GetPluginInstanceURL(const InstanceHandle& instance,
                           PP_URLComponents_Dev* components = NULL) const;
  Var GetPluginReferrerURL(const InstanceHandle& instance,
                           PP_URLComponents_Dev* components = NULL) const;

 private:
  URLUtil_Dev() {}

  // Copy and assignment are disallowed.
  URLUtil_Dev(const URLUtil_Dev& other);
  URLUtil_Dev& operator=(const URLUtil_Dev& other);
};

}  // namespace pp

#endif  // PPAPI_CPP_DEV_URL_UTIL_DEV_H_
