// Copyright (c) 2012 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.

#include "ppapi/c/pp_errors.h"
#include "ppapi/shared_impl/ppb_url_util_shared.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_instance_api.h"
#include "ppapi/thunk/thunk.h"

namespace ppapi {
namespace thunk {

namespace {

PP_Var ResolveRelativeToDocument(PP_Instance instance,
                                 PP_Var relative,
                                 PP_URLComponents_Dev* components) {
  EnterInstance enter(instance);
  if (enter.failed())
    return PP_MakeUndefined();
  return enter.functions()->ResolveRelativeToDocument(instance, relative,
                                                      components);
}

PP_Bool DocumentCanRequest(PP_Instance instance, PP_Var url) {
  EnterInstance enter(instance);
  if (enter.failed())
    return PP_FALSE;
  return enter.functions()->DocumentCanRequest(instance, url);
}

PP_Bool DocumentCanAccessDocument(PP_Instance active, PP_Instance target) {
  EnterInstance enter(active);
  if (enter.failed())
    return PP_FALSE;
  return enter.functions()->DocumentCanAccessDocument(active, target);
}

PP_Var GetDocumentURL(PP_Instance instance,
                      PP_URLComponents_Dev* components) {
  EnterInstance enter(instance);
  if (enter.failed())
    return PP_MakeUndefined();
  return enter.functions()->GetDocumentURL(instance, components);
}

PP_Var GetPluginInstanceURL(PP_Instance instance,
                            PP_URLComponents_Dev* components) {
  EnterInstance enter(instance);
  if (enter.failed())
    return PP_MakeUndefined();
  return enter.functions()->GetPluginInstanceURL(instance, components);
}

PP_Var GetPluginReferrerURL(PP_Instance instance,
                            PP_URLComponents_Dev* components) {
  EnterInstance enter(instance);
  if (enter.failed())
    return PP_MakeUndefined();
  return enter.functions()->GetPluginReferrerURL(instance, components);
}

const PPB_URLUtil_Dev_0_6 g_ppb_url_util_0_6 = {
  &PPB_URLUtil_Shared::Canonicalize,
  &PPB_URLUtil_Shared::ResolveRelativeToURL,
  &ResolveRelativeToDocument,
  &PPB_URLUtil_Shared::IsSameSecurityOrigin,
  &DocumentCanRequest,
  &DocumentCanAccessDocument,
  &GetDocumentURL,
  &GetPluginInstanceURL
};

const PPB_URLUtil_Dev_0_7 g_ppb_url_util_0_7 = {
  &PPB_URLUtil_Shared::Canonicalize,
  &PPB_URLUtil_Shared::ResolveRelativeToURL,
  &ResolveRelativeToDocument,
  &PPB_URLUtil_Shared::IsSameSecurityOrigin,
  &DocumentCanRequest,
  &DocumentCanAccessDocument,
  &GetDocumentURL,
  &GetPluginInstanceURL,
  &GetPluginReferrerURL
};

}  // namespace

const PPB_URLUtil_Dev_0_6* GetPPB_URLUtil_Dev_0_6_Thunk() {
  return &g_ppb_url_util_0_6;
}

const PPB_URLUtil_Dev_0_7* GetPPB_URLUtil_Dev_0_7_Thunk() {
  return &g_ppb_url_util_0_7;
}

}  // namespace thunk
}  // namespace ppapi
