summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/ppb_url_util_proxy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/proxy/ppb_url_util_proxy.cc')
-rw-r--r--ppapi/proxy/ppb_url_util_proxy.cc207
1 files changed, 207 insertions, 0 deletions
diff --git a/ppapi/proxy/ppb_url_util_proxy.cc b/ppapi/proxy/ppb_url_util_proxy.cc
new file mode 100644
index 0000000..bcff053
--- /dev/null
+++ b/ppapi/proxy/ppb_url_util_proxy.cc
@@ -0,0 +1,207 @@
+// 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/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_MakeNull();
+
+ 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();
+
+ 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
+