// 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.
#include "ppapi/cpp/dev/url_util_dev.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/module_impl.h"
namespace pp {
namespace {
template <> const char* interface_name<PPB_URLUtil_Dev_0_6>() {
return PPB_URLUTIL_DEV_INTERFACE_0_6;
}
template <> const char* interface_name<PPB_URLUtil_Dev_0_7>() {
return PPB_URLUTIL_DEV_INTERFACE_0_7;
}
} // namespace
// static
const URLUtil_Dev* URLUtil_Dev::Get() {
static URLUtil_Dev util;
static bool tried_to_init = false;
static bool interface_available = false;
if (!tried_to_init) {
tried_to_init = true;
if (has_interface<PPB_URLUtil_Dev_0_7>() ||
has_interface<PPB_URLUtil_Dev_0_6>())
interface_available = true;
}
if (!interface_available)
return NULL;
return &util;
}
Var URLUtil_Dev::Canonicalize(const Var& url,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->Canonicalize(url.pp_var(),
components));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_6>()->Canonicalize(url.pp_var(),
components));
}
return Var();
}
Var URLUtil_Dev::ResolveRelativeToURL(const Var& base_url,
const Var& relative_string,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->ResolveRelativeToURL(
base_url.pp_var(),
relative_string.pp_var(),
components));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_6>()->ResolveRelativeToURL(
base_url.pp_var(),
relative_string.pp_var(),
components));
}
return Var();
}
Var URLUtil_Dev::ResolveRelativeToDocument(
const InstanceHandle& instance,
const Var& relative_string,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->ResolveRelativeToDocument(
instance.pp_instance(),
relative_string.pp_var(),
components));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_6>()->ResolveRelativeToDocument(
instance.pp_instance(),
relative_string.pp_var(),
components));
}
return Var();
}
bool URLUtil_Dev::IsSameSecurityOrigin(const Var& url_a,
const Var& url_b) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_7>()->IsSameSecurityOrigin(
url_a.pp_var(),
url_b.pp_var()));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_6>()->IsSameSecurityOrigin(
url_a.pp_var(),
url_b.pp_var()));
}
return false;
}
bool URLUtil_Dev::DocumentCanRequest(const InstanceHandle& instance,
const Var& url) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_7>()->DocumentCanRequest(
instance.pp_instance(),
url.pp_var()));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_6>()->DocumentCanRequest(
instance.pp_instance(),
url.pp_var()));
}
return false;
}
bool URLUtil_Dev::DocumentCanAccessDocument(
const InstanceHandle& active,
const InstanceHandle& target) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_7>()->DocumentCanAccessDocument(
active.pp_instance(),
target.pp_instance()));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return PP_ToBool(
get_interface<PPB_URLUtil_Dev_0_6>()->DocumentCanAccessDocument(
active.pp_instance(),
target.pp_instance()));
}
return false;
}
Var URLUtil_Dev::GetDocumentURL(const InstanceHandle& instance,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->GetDocumentURL(
instance.pp_instance(),
components));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_6>()->GetDocumentURL(
instance.pp_instance(),
components));
}
return Var();
}
Var URLUtil_Dev::GetPluginInstanceURL(const InstanceHandle& instance,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->GetPluginInstanceURL(
instance.pp_instance(),
components));
}
if (has_interface<PPB_URLUtil_Dev_0_6>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_6>()->GetPluginInstanceURL(
instance.pp_instance(),
components));
}
return Var();
}
Var URLUtil_Dev::GetPluginReferrerURL(const InstanceHandle& instance,
PP_URLComponents_Dev* components) const {
if (has_interface<PPB_URLUtil_Dev_0_7>()) {
return Var(PASS_REF,
get_interface<PPB_URLUtil_Dev_0_7>()->GetPluginReferrerURL(
instance.pp_instance(),
components));
}
return Var();
}
} // namespace pp