Skip to content

Commit

Permalink
Rename PPB_Flash::NavigateToURL() (to Navigate()) and make it take an…
Browse files Browse the repository at this point in the history
… URLRequestInfo.

This allows us to navigate using POSTs.

BUG=none
TEST=works for Trung's Flapper

Review URL: http://codereview.chromium.org/6745021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79590 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
viettrungluu@chromium.org committed Mar 28, 2011
1 parent 8eeb3e4 commit 181220b
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 53 deletions.
13 changes: 6 additions & 7 deletions ppapi/c/private/ppb_flash.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_var.h"

#define PPB_FLASH_INTERFACE "PPB_Flash;7"
#define PPB_FLASH_INTERFACE "PPB_Flash;8"

struct PPB_Flash {
// Sets or clears the rendering hint that the given plugin instance is always
Expand All @@ -35,12 +35,11 @@ struct PPB_Flash {
// be a string in PAC format, or an undefined var on error.
struct PP_Var (*GetProxyForURL)(PP_Instance instance, const char* url);

// Navigate to URL. May open a new tab if target is not "_self". Return true
// if success. This differs from javascript:window.open() in that it bypasses
// the popup blocker, even when this is not called from an event handler.
PP_Bool (*NavigateToURL)(PP_Instance instance,
const char* url,
const char* target);
// Navigate to the URL given by the given URLRequestInfo. (This supports GETs,
// POSTs, and javascript: URLs.) May open a new tab if target is not "_self".
int32_t (*Navigate)(PP_Resource request_info,
const char* target,
bool from_user_action);

// Runs a nested message loop. The plugin will be reentered from this call.
// This function is used in places where Flash would normally enter a nested
Expand Down
8 changes: 4 additions & 4 deletions ppapi/proxy/ppapi_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -380,11 +380,11 @@ IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBFlash_GetProxyForURL,
PP_Instance /* instance */,
std::string /* url */,
pp::proxy::SerializedVar /* result */)
IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBFlash_NavigateToURL,
PP_Instance /* instance */,
std::string /* url */,
IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBFlash_Navigate,
pp::proxy::HostResource /* request_info */,
std::string /* target */,
PP_Bool /* result */)
bool /* from_user_action */,
int32_t /* result */)
IPC_SYNC_MESSAGE_ROUTED1_0(PpapiHostMsg_PPBFlash_RunMessageLoop,
PP_Instance /* instance */)
IPC_SYNC_MESSAGE_ROUTED1_0(PpapiHostMsg_PPBFlash_QuitMessageLoop,
Expand Down
42 changes: 26 additions & 16 deletions ppapi/proxy/ppb_flash_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "base/logging.h"
#include "base/message_loop.h"
#include "ppapi/c/dev/ppb_font_dev.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/private/ppb_flash.h"
#include "ppapi/proxy/plugin_dispatcher.h"
Expand Down Expand Up @@ -86,16 +87,24 @@ PP_Var GetProxyForURL(PP_Instance instance, const char* url) {
return result.Return(dispatcher);
}

PP_Bool NavigateToURL(PP_Instance instance,
const char* url,
const char* target) {
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
int32_t Navigate(PP_Resource request_id,
const char* target,
bool from_user_action) {
PluginResource* request_object =
PluginResourceTracker::GetInstance()->GetResourceObject(request_id);
if (!request_object)
return PP_ERROR_BADRESOURCE;

PluginDispatcher* dispatcher =
PluginDispatcher::GetForInstance(request_object->instance());
if (!dispatcher)
return PP_FALSE;
return PP_ERROR_FAILED;

PP_Bool result = PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBFlash_NavigateToURL(
INTERFACE_ID_PPB_FLASH, instance, url, target, &result));
int32_t result = PP_ERROR_FAILED;
dispatcher->Send(new PpapiHostMsg_PPBFlash_Navigate(
INTERFACE_ID_PPB_FLASH,
request_object->host_resource(), target, from_user_action,
&result));
return result;
}

Expand All @@ -121,7 +130,7 @@ const PPB_Flash flash_interface = {
&SetInstanceAlwaysOnTop,
&DrawGlyphs,
&GetProxyForURL,
&NavigateToURL,
&Navigate,
&RunMessageLoop,
&QuitMessageLoop,
};
Expand Down Expand Up @@ -162,7 +171,7 @@ bool PPB_Flash_Proxy::OnMessageReceived(const IPC::Message& msg) {
OnMsgDrawGlyphs)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_GetProxyForURL,
OnMsgGetProxyForURL)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_NavigateToURL, OnMsgNavigateToURL)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_Navigate, OnMsgNavigate)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_RunMessageLoop,
OnMsgRunMessageLoop)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_QuitMessageLoop,
Expand Down Expand Up @@ -208,12 +217,13 @@ void PPB_Flash_Proxy::OnMsgGetProxyForURL(PP_Instance instance,
instance, url.c_str()));
}

void PPB_Flash_Proxy::OnMsgNavigateToURL(PP_Instance instance,
const std::string& url,
const std::string& target,
PP_Bool* result) {
*result = ppb_flash_target()->NavigateToURL(instance, url.c_str(),
target.c_str());
void PPB_Flash_Proxy::OnMsgNavigate(const HostResource& request_info,
const std::string& target,
bool from_user_action,
int32_t* result) {
*result = ppb_flash_target()->Navigate(request_info.host_resource(),
target.c_str(),
from_user_action);
}

void PPB_Flash_Proxy::OnMsgRunMessageLoop(PP_Instance instance) {
Expand Down
9 changes: 5 additions & 4 deletions ppapi/proxy/ppb_flash_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "ipc/ipc_platform_file.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_module.h"
#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"

struct PP_FileInfo_Dev;
Expand Down Expand Up @@ -44,10 +45,10 @@ class PPB_Flash_Proxy : public InterfaceProxy {
void OnMsgGetProxyForURL(PP_Instance instance,
const std::string& url,
SerializedVarReturnValue result);
void OnMsgNavigateToURL(PP_Instance instance,
const std::string& url,
const std::string& target,
PP_Bool* result);
void OnMsgNavigate(const HostResource& request_info,
const std::string& target,
bool from_user_action,
int32_t* result);
void OnMsgRunMessageLoop(PP_Instance instance);
void OnMsgQuitMessageLoop(PP_Instance instance);
};
Expand Down
39 changes: 25 additions & 14 deletions webkit/plugins/ppapi/ppapi_plugin_instance.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "ui/gfx/rect.h"
Expand All @@ -53,6 +54,7 @@
#include "webkit/plugins/ppapi/ppb_image_data_impl.h"
#include "webkit/plugins/ppapi/ppb_surface_3d_impl.h"
#include "webkit/plugins/ppapi/ppb_url_loader_impl.h"
#include "webkit/plugins/ppapi/ppb_url_request_info_impl.h"
#include "webkit/plugins/ppapi/ppp_pdf.h"
#include "webkit/plugins/ppapi/string.h"
#include "webkit/plugins/ppapi/var.h"
Expand Down Expand Up @@ -1130,25 +1132,34 @@ void PluginInstance::SetFullscreen(bool fullscreen, bool delay_report) {
}
}

bool PluginInstance::NavigateToURL(const char* url, const char* target) {
if (!url || !target || !container_)
return false;
int32_t PluginInstance::Navigate(PPB_URLRequestInfo_Impl* request,
const char* target,
bool from_user_action) {
if (!container_)
return PP_ERROR_FAILED;

WebDocument document = container_->element().document();
GURL complete_url = document.completeURL(WebString::fromUTF8(url));
// Don't try to deal with the security issues of javascript.
if (complete_url.SchemeIs("javascript"))
return false;
WebFrame* frame = document.frame();
if (!frame)
return PP_ERROR_FAILED;
WebURLRequest web_request(request->ToWebURLRequest(frame));
web_request.setFirstPartyForCookies(document.firstPartyForCookies());
web_request.setHasUserGesture(from_user_action);

WebURLRequest request(complete_url);
document.frame()->setReferrerForRequest(request, GURL());
request.setHTTPMethod(WebString::fromUTF8("GET"));
request.setFirstPartyForCookies(document.firstPartyForCookies());
request.setHasUserGesture(true);
if (GURL(web_request.url()).SchemeIs("javascript")) {
// TODO(vtl)
NOTIMPLEMENTED();
return PP_ERROR_FAILED;
}

// Only GETs and POSTs are supported.
if (web_request.httpMethod() != "GET" &&
web_request.httpMethod() != "POST")
return PP_ERROR_BADARGUMENT;

WebString target_str = WebString::fromUTF8(target);
container_->loadFrameRequest(request, target_str, false, NULL);
return true;
container_->loadFrameRequest(web_request, target_str, false, NULL);
return PP_OK;
}

PluginDelegate::PlatformContext3D* PluginInstance::CreateContext3D() {
Expand Down
5 changes: 4 additions & 1 deletion webkit/plugins/ppapi/ppapi_plugin_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class PPB_Graphics2D_Impl;
class PPB_ImageData_Impl;
class PPB_Surface3D_Impl;
class PPB_URLLoader_Impl;
class PPB_URLRequestInfo_Impl;
class Resource;

// Represents one time a plugin appears on one web page.
Expand Down Expand Up @@ -217,7 +218,9 @@ class PluginInstance : public base::RefCounted<PluginInstance> {
void SetFullscreen(bool fullscreen, bool delay_report);

// Implementation of PPB_Flash.
bool NavigateToURL(const char* url, const char* target);
int32_t Navigate(PPB_URLRequestInfo_Impl* request,
const char* target,
bool from_user_action);

// Implementation of PPB_Messaging and PPP_Messaging.
void PostMessage(PP_Var message);
Expand Down
24 changes: 17 additions & 7 deletions webkit/plugins/ppapi/ppb_flash_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "webkit/plugins/ppapi/common.h"
#include "webkit/plugins/ppapi/plugin_delegate.h"
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
#include "webkit/plugins/ppapi/ppb_url_request_info_impl.h"
#include "webkit/plugins/ppapi/resource_tracker.h"
#include "webkit/plugins/ppapi/var.h"

Expand Down Expand Up @@ -42,13 +43,22 @@ PP_Var GetProxyForURL(PP_Instance pp_instance, const char* url) {
return StringVar::StringToPPVar(instance->module(), proxy_host);
}

PP_Bool NavigateToURL(PP_Instance pp_instance,
const char* url,
const char* target) {
PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance);
int32_t Navigate(PP_Resource request_id,
const char* target,
bool from_user_action) {
scoped_refptr<PPB_URLRequestInfo_Impl> request(
Resource::GetAs<PPB_URLRequestInfo_Impl>(request_id));
if (!request)
return PP_ERROR_BADRESOURCE;

if (!target)
return PP_ERROR_BADARGUMENT;

PluginInstance* instance = request->instance();
if (!instance)
return PP_FALSE;
return BoolToPPBool(instance->NavigateToURL(url, target));
return PP_ERROR_FAILED;

return instance->Navigate(request, target, from_user_action);
}

void RunMessageLoop(PP_Instance instance) {
Expand All @@ -66,7 +76,7 @@ const PPB_Flash ppb_flash = {
&SetInstanceAlwaysOnTop,
&PPB_Flash_Impl::DrawGlyphs,
&GetProxyForURL,
&NavigateToURL,
&Navigate,
&RunMessageLoop,
&QuitMessageLoop,
};
Expand Down

0 comments on commit 181220b

Please sign in to comment.