Chromium Code Reviews| Index: ppapi/proxy/ppb_url_util_proxy.cc |
| =================================================================== |
| --- ppapi/proxy/ppb_url_util_proxy.cc (revision 0) |
| +++ ppapi/proxy/ppb_url_util_proxy.cc (revision 0) |
| @@ -0,0 +1,208 @@ |
| +// 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/proxy/ppb_url_util_proxy.h" |
| + |
| +#include "base/basictypes.h" |
| +#include "ppapi/c/dev/ppb_url_util_dev.h" |
| +#include "ppapi/c/dev/ppb_var_deprecated.h" |
| +#include "ppapi/c/ppb_core.h" |
| +#include "ppapi/proxy/plugin_dispatcher.h" |
| +#include "ppapi/proxy/ppapi_messages.h" |
| +#include "ppapi/proxy/serialized_var.h" |
|
yzshen1
2011/03/16 21:19:23
It has been included by ppb_url_util_proxy.h.
|
| +#include "ppapi/shared_impl/url_util_impl.h" |
| + |
| +namespace pp { |
| +namespace proxy { |
| + |
| +using pp::shared_impl::URLUtilImpl; |
| + |
| +namespace { |
| + |
| +URLUtilImpl::VarFromUtf8 GetVarFromUtf8() { |
| + const PPB_Var_Deprecated* var_deprecated = |
| + static_cast<const PPB_Var_Deprecated*>( |
| + PluginDispatcher::GetInterfaceFromDispatcher( |
| + PPB_VAR_DEPRECATED_INTERFACE)); |
| + return var_deprecated->VarFromUtf8; |
| +} |
| + |
| +const std::string* GetStringFromVar(PP_Var var) { |
| + return PluginVarTracker::GetInstance()->GetExistingString(var); |
| +} |
| + |
| +PP_Var Canonicalize(PP_Var url, |
| + PP_URLComponents_Dev* components) { |
| + return URLUtilImpl::Canonicalize(&GetStringFromVar, GetVarFromUtf8(), |
| + 0, url, components); |
| +} |
| + |
| +// Helper function for the functions below that optionally take a components |
| +// structure. It's annoying to serialze the large PP_URLComponents structure |
| +// and this data often isn't needed. |
| +// |
| +// To avoid this, we instead just parse the result again in the plugin, which |
| +// this function does if the given URL is valid and the components are |
| +// non-NULL. The URL var will be returned. |
| +PP_Var ConvertComponentsAndReturnURL(PP_Var url, |
| + PP_URLComponents_Dev* components) { |
| + if (!components) |
| + return url; // Common case - plugin doesn't care about parsing. |
| + |
| + const std::string* url_string = GetStringFromVar(url); |
| + if (!url_string) |
| + return url; |
| + |
| + PP_Var result = Canonicalize(url, components); |
| + PluginVarTracker::GetInstance()->Release(url); |
| + return result; |
| +} |
| + |
| +PP_Var ResolveRelativeToURL(PP_Var base_url, |
| + PP_Var relative, |
| + PP_URLComponents_Dev* components) { |
| + return URLUtilImpl::ResolveRelativeToURL(&GetStringFromVar, GetVarFromUtf8(), |
| + 0, base_url, relative, components); |
| +} |
| + |
| +PP_Var ResolveRelativeToDocument(PP_Instance instance, |
| + PP_Var relative_string, |
| + PP_URLComponents_Dev* components) { |
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| + if (!dispatcher) |
| + return PP_MakeUndefined(); |
| + |
| + ReceiveSerializedVarReturnValue result; |
| + dispatcher->Send(new PpapiHostMsg_PPBURLUtil_ResolveRelativeToDocument( |
| + INTERFACE_ID_PPB_URL_UTIL, instance, |
| + SerializedVarSendInput(dispatcher, relative_string), |
| + &result)); |
| + return ConvertComponentsAndReturnURL(result.Return(dispatcher), components); |
| +} |
| + |
| +PP_Bool IsSameSecurityOrigin(PP_Var url_a, PP_Var url_b) { |
| + return URLUtilImpl::IsSameSecurityOrigin(&GetStringFromVar, url_a, url_b); |
| +} |
| + |
| +PP_Bool DocumentCanRequest(PP_Instance instance, PP_Var url) { |
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| + if (!dispatcher) |
| + return PP_FALSE; |
| + |
| + PP_Bool result = PP_FALSE; |
| + dispatcher->Send(new PpapiHostMsg_PPBURLUtil_DocumentCanRequest( |
| + INTERFACE_ID_PPB_URL_UTIL, instance, |
| + SerializedVarSendInput(dispatcher, url), |
| + &result)); |
| + return result; |
| +} |
| + |
| +PP_Bool DocumentCanAccessDocument(PP_Instance active, PP_Instance target) { |
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(active); |
| + if (!dispatcher) |
| + return PP_FALSE; |
| + |
| + PP_Bool result = PP_FALSE; |
| + dispatcher->Send(new PpapiHostMsg_PPBURLUtil_DocumentCanAccessDocument( |
| + INTERFACE_ID_PPB_URL_UTIL, active, target, &result)); |
| + return result; |
| +} |
| + |
| +PP_Var GetDocumentURL(PP_Instance instance, |
| + struct PP_URLComponents_Dev* components) { |
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| + if (!dispatcher) |
| + return PP_MakeNull(); |
|
yzshen1
2011/03/16 21:19:23
Is it intended that line 74 & 116 return different
|
| + |
| + ReceiveSerializedVarReturnValue result; |
| + dispatcher->Send(new PpapiHostMsg_PPBURLUtil_GetDocumentURL( |
| + INTERFACE_ID_PPB_URL_UTIL, instance, &result)); |
| + return ConvertComponentsAndReturnURL(result.Return(dispatcher), components); |
| +} |
| + |
| +const PPB_URLUtil_Dev url_util_interface = { |
| + &Canonicalize, |
| + &ResolveRelativeToURL, |
| + &ResolveRelativeToDocument, |
| + &IsSameSecurityOrigin, |
| + &DocumentCanRequest, |
| + &DocumentCanAccessDocument, |
| + &GetDocumentURL |
| +}; |
| + |
| +InterfaceProxy* CreateURLUtilProxy(Dispatcher* dispatcher, |
| + const void* target_interface) { |
| + return new PPB_URLUtil_Proxy(dispatcher, target_interface); |
| +} |
| + |
| +} // namespace |
| + |
| +PPB_URLUtil_Proxy::PPB_URLUtil_Proxy(Dispatcher* dispatcher, |
| + const void* target_interface) |
| + : InterfaceProxy(dispatcher, target_interface) { |
| +} |
| + |
| +PPB_URLUtil_Proxy::~PPB_URLUtil_Proxy() { |
| +} |
| + |
| +// static |
| +const InterfaceProxy::Info* PPB_URLUtil_Proxy::GetInfo() { |
| + static const Info info = { |
| + &url_util_interface, |
| + PPB_URLUTIL_DEV_INTERFACE, |
| + INTERFACE_ID_PPB_URL_UTIL, |
| + false, |
| + &CreateURLUtilProxy, |
| + }; |
| + return &info; |
| +} |
| + |
| +bool PPB_URLUtil_Proxy::OnMessageReceived(const IPC::Message& msg) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(PPB_URLUtil_Proxy, msg) |
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLUtil_ResolveRelativeToDocument, |
| + OnMsgResolveRelativeToDocument) |
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLUtil_DocumentCanRequest, |
| + OnMsgDocumentCanRequest) |
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLUtil_DocumentCanAccessDocument, |
| + OnMsgDocumentCanAccessDocument) |
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLUtil_GetDocumentURL, |
| + OnMsgGetDocumentURL) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| +void PPB_URLUtil_Proxy::OnMsgResolveRelativeToDocument( |
| + PP_Instance instance, |
| + SerializedVarReceiveInput relative, |
| + SerializedVarReturnValue result) { |
| + result.Return(dispatcher(), |
| + ppb_url_util_target()->ResolveRelativeToDocument( |
| + instance, relative.Get(dispatcher()), NULL)); |
| +} |
| + |
| +void PPB_URLUtil_Proxy::OnMsgDocumentCanRequest(PP_Instance instance, |
| + SerializedVarReceiveInput url, |
| + PP_Bool* result) { |
| + *result = ppb_url_util_target()->DocumentCanRequest(instance, |
| + url.Get(dispatcher())); |
| +} |
| + |
| +void PPB_URLUtil_Proxy::OnMsgDocumentCanAccessDocument(PP_Instance active, |
| + PP_Instance target, |
| + PP_Bool* result) { |
| + *result = ppb_url_util_target()->DocumentCanAccessDocument( |
| + active, target); |
| +} |
| + |
| +void PPB_URLUtil_Proxy::OnMsgGetDocumentURL(PP_Instance instance, |
| + SerializedVarReturnValue result) { |
| + result.Return(dispatcher(), |
| + ppb_url_util_target()->GetDocumentURL(instance, NULL)); |
| +} |
| + |
| +} // namespace proxy |
| +} // namespace pp |
| + |
| Property changes on: ppapi/proxy/ppb_url_util_proxy.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |