|  | // 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 |