1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ppapi/cpp/dev/url_util_dev.h" 6 7 #include "ppapi/cpp/instance_handle.h" 8 #include "ppapi/cpp/module_impl.h" 9 10 namespace pp { 11 12 namespace { 13 14 template <> const char* interface_name<PPB_URLUtil_Dev_0_6>() { 15 return PPB_URLUTIL_DEV_INTERFACE_0_6; 16 } 17 18 template <> const char* interface_name<PPB_URLUtil_Dev_0_7>() { 19 return PPB_URLUTIL_DEV_INTERFACE_0_7; 20 } 21 22 } // namespace 23 24 // static 25 const URLUtil_Dev* URLUtil_Dev::Get() { 26 static URLUtil_Dev util; 27 static bool tried_to_init = false; 28 static bool interface_available = false; 29 30 if (!tried_to_init) { 31 tried_to_init = true; 32 if (has_interface<PPB_URLUtil_Dev_0_7>() || 33 has_interface<PPB_URLUtil_Dev_0_6>()) 34 interface_available = true; 35 } 36 37 if (!interface_available) 38 return NULL; 39 return &util; 40 } 41 42 Var URLUtil_Dev::Canonicalize(const Var& url, 43 PP_URLComponents_Dev* components) const { 44 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 45 return Var(PASS_REF, 46 get_interface<PPB_URLUtil_Dev_0_7>()->Canonicalize(url.pp_var(), 47 components)); 48 } 49 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 50 return Var(PASS_REF, 51 get_interface<PPB_URLUtil_Dev_0_6>()->Canonicalize(url.pp_var(), 52 components)); 53 } 54 return Var(); 55 } 56 57 Var URLUtil_Dev::ResolveRelativeToURL(const Var& base_url, 58 const Var& relative_string, 59 PP_URLComponents_Dev* components) const { 60 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 61 return Var(PASS_REF, 62 get_interface<PPB_URLUtil_Dev_0_7>()->ResolveRelativeToURL( 63 base_url.pp_var(), 64 relative_string.pp_var(), 65 components)); 66 } 67 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 68 return Var(PASS_REF, 69 get_interface<PPB_URLUtil_Dev_0_6>()->ResolveRelativeToURL( 70 base_url.pp_var(), 71 relative_string.pp_var(), 72 components)); 73 } 74 return Var(); 75 } 76 77 Var URLUtil_Dev::ResolveRelativeToDocument( 78 const InstanceHandle& instance, 79 const Var& relative_string, 80 PP_URLComponents_Dev* components) const { 81 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 82 return Var(PASS_REF, 83 get_interface<PPB_URLUtil_Dev_0_7>()->ResolveRelativeToDocument( 84 instance.pp_instance(), 85 relative_string.pp_var(), 86 components)); 87 } 88 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 89 return Var(PASS_REF, 90 get_interface<PPB_URLUtil_Dev_0_6>()->ResolveRelativeToDocument( 91 instance.pp_instance(), 92 relative_string.pp_var(), 93 components)); 94 } 95 return Var(); 96 } 97 98 bool URLUtil_Dev::IsSameSecurityOrigin(const Var& url_a, 99 const Var& url_b) const { 100 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 101 return PP_ToBool( 102 get_interface<PPB_URLUtil_Dev_0_7>()->IsSameSecurityOrigin( 103 url_a.pp_var(), 104 url_b.pp_var())); 105 } 106 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 107 return PP_ToBool( 108 get_interface<PPB_URLUtil_Dev_0_6>()->IsSameSecurityOrigin( 109 url_a.pp_var(), 110 url_b.pp_var())); 111 } 112 return false; 113 } 114 115 bool URLUtil_Dev::DocumentCanRequest(const InstanceHandle& instance, 116 const Var& url) const { 117 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 118 return PP_ToBool( 119 get_interface<PPB_URLUtil_Dev_0_7>()->DocumentCanRequest( 120 instance.pp_instance(), 121 url.pp_var())); 122 } 123 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 124 return PP_ToBool( 125 get_interface<PPB_URLUtil_Dev_0_6>()->DocumentCanRequest( 126 instance.pp_instance(), 127 url.pp_var())); 128 } 129 return false; 130 } 131 132 bool URLUtil_Dev::DocumentCanAccessDocument( 133 const InstanceHandle& active, 134 const InstanceHandle& target) const { 135 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 136 return PP_ToBool( 137 get_interface<PPB_URLUtil_Dev_0_7>()->DocumentCanAccessDocument( 138 active.pp_instance(), 139 target.pp_instance())); 140 } 141 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 142 return PP_ToBool( 143 get_interface<PPB_URLUtil_Dev_0_6>()->DocumentCanAccessDocument( 144 active.pp_instance(), 145 target.pp_instance())); 146 } 147 return false; 148 } 149 150 Var URLUtil_Dev::GetDocumentURL(const InstanceHandle& instance, 151 PP_URLComponents_Dev* components) const { 152 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 153 return Var(PASS_REF, 154 get_interface<PPB_URLUtil_Dev_0_7>()->GetDocumentURL( 155 instance.pp_instance(), 156 components)); 157 } 158 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 159 return Var(PASS_REF, 160 get_interface<PPB_URLUtil_Dev_0_6>()->GetDocumentURL( 161 instance.pp_instance(), 162 components)); 163 } 164 return Var(); 165 } 166 167 Var URLUtil_Dev::GetPluginInstanceURL(const InstanceHandle& instance, 168 PP_URLComponents_Dev* components) const { 169 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 170 return Var(PASS_REF, 171 get_interface<PPB_URLUtil_Dev_0_7>()->GetPluginInstanceURL( 172 instance.pp_instance(), 173 components)); 174 } 175 if (has_interface<PPB_URLUtil_Dev_0_6>()) { 176 return Var(PASS_REF, 177 get_interface<PPB_URLUtil_Dev_0_6>()->GetPluginInstanceURL( 178 instance.pp_instance(), 179 components)); 180 } 181 return Var(); 182 } 183 184 Var URLUtil_Dev::GetPluginReferrerURL(const InstanceHandle& instance, 185 PP_URLComponents_Dev* components) const { 186 if (has_interface<PPB_URLUtil_Dev_0_7>()) { 187 return Var(PASS_REF, 188 get_interface<PPB_URLUtil_Dev_0_7>()->GetPluginReferrerURL( 189 instance.pp_instance(), 190 components)); 191 } 192 return Var(); 193 } 194 195 } // namespace pp 196