plugin_host.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_host.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_instance.h"
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_lib.h"
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_stream_url.h"
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin_delegate.h"
20c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "content/public/common/content_switches.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/npapi/bindings/npruntime.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h"
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/user_agent/user_agent.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebBindings;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declarations for stub implementations of deprecated functions, which are no
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// longer listed in npapi.h.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NPN_GetJavaEnv();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NPN_GetJavaPeer(NPP);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finds a PluginInstance from an NPP.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The caller must take a reference if needed.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PluginInstance* FindInstance(NPP id) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id == NULL) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<PluginInstance*>(id->ndata);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if Core Animation plugins are supported. This requires that the
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OS supports shared accelerated surfaces via IOSurface. This is true on Snow
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Leopard and higher.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SupportsCoreAnimationPlugins() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisableCoreAnimationPlugins))
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We also need to be running with desktop GL and not the software
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OSMesa renderer in order to share accelerated surfaces between
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // processes. Because on MacOS we lazy-initialize GLSurface in the
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // renderer process here, ensure we're not also initializing GL somewhere
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // else, and that we only do this once.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static gfx::GLImplementation implementation = gfx::kGLImplementationNone;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (implementation == gfx::kGLImplementationNone) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Not initialized yet.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK_EQ(implementation, gfx::GetGLImplementation())
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        << "GL already initialized by someone else to: "
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        << gfx::GetGLImplementation();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!gfx::GLSurface::InitializeOneOff()) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    implementation = gfx::GetGLImplementation();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (implementation == gfx::kGLImplementationDesktopGL);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginHost::PluginHost() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeHostFuncs();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginHost::~PluginHost() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginHost *PluginHost::Singleton() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(scoped_refptr<PluginHost>, singleton, ());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (singleton.get() == NULL) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    singleton = new PluginHost();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(singleton.get() != NULL);
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return singleton.get();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginHost::InitializeHostFuncs() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&host_funcs_, 0, sizeof(host_funcs_));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.size = sizeof(host_funcs_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.version = (NP_VERSION_MAJOR << 8) | (NP_VERSION_MINOR);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "basic" functions
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.geturl = &NPN_GetURL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.posturl = &NPN_PostURL;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.requestread = &NPN_RequestRead;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.newstream = &NPN_NewStream;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.write = &NPN_Write;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.destroystream = &NPN_DestroyStream;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.status = &NPN_Status;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.uagent = &NPN_UserAgent;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.memalloc = &NPN_MemAlloc;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.memfree = &NPN_MemFree;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.memflush = &NPN_MemFlush;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.reloadplugins = &NPN_ReloadPlugins;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stubs for deprecated Java functions
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getJavaEnv = &NPN_GetJavaEnv;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getJavaPeer = &NPN_GetJavaPeer;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advanced functions we implement
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.geturlnotify = &NPN_GetURLNotify;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.posturlnotify = &NPN_PostURLNotify;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getvalue = &NPN_GetValue;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.setvalue = &NPN_SetValue;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.invalidaterect = &NPN_InvalidateRect;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.invalidateregion = &NPN_InvalidateRegion;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.forceredraw = &NPN_ForceRedraw;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These come from the Javascript Engine
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getstringidentifier = WebBindings::getStringIdentifier;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getstringidentifiers = WebBindings::getStringIdentifiers;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getintidentifier = WebBindings::getIntIdentifier;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.identifierisstring = WebBindings::identifierIsString;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.utf8fromidentifier = WebBindings::utf8FromIdentifier;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.intfromidentifier = WebBindings::intFromIdentifier;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.createobject = WebBindings::createObject;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.retainobject = WebBindings::retainObject;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.releaseobject = WebBindings::releaseObject;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.invoke = WebBindings::invoke;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.invokeDefault = WebBindings::invokeDefault;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.evaluate = WebBindings::evaluate;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getproperty = WebBindings::getProperty;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.setproperty = WebBindings::setProperty;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.removeproperty = WebBindings::removeProperty;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.hasproperty = WebBindings::hasProperty;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.hasmethod = WebBindings::hasMethod;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.releasevariantvalue = WebBindings::releaseVariantValue;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.setexception = WebBindings::setException;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.poppopupsenabledstate = NPN_PopPopupsEnabledState;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.enumerate = WebBindings::enumerate;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.pluginthreadasynccall = NPN_PluginThreadAsyncCall;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.construct = WebBindings::construct;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getvalueforurl = NPN_GetValueForURL;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.setvalueforurl = NPN_SetValueForURL;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.getauthenticationinfo = NPN_GetAuthenticationInfo;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.scheduletimer = NPN_ScheduleTimer;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.unscheduletimer = NPN_UnscheduleTimer;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.popupcontextmenu = NPN_PopUpContextMenu;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.convertpoint = NPN_ConvertPoint;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.handleevent = NPN_HandleEvent;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.unfocusinstance = NPN_UnfocusInstance;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_funcs_.urlredirectresponse = NPN_URLRedirectResponse;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginHost::PatchNPNetscapeFuncs(NPNetscapeFuncs* overrides) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When running in the plugin process, we need to patch the NPN functions
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the plugin calls to interact with NPObjects that we give.  Otherwise
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the plugin will call the v8 NPN functions, which won't work since we have
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an NPObjectProxy and not a real v8 implementation.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->invoke)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.invoke = overrides->invoke;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->invokeDefault)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.invokeDefault = overrides->invokeDefault;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->evaluate)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.evaluate = overrides->evaluate;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->getproperty)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.getproperty = overrides->getproperty;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->setproperty)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.setproperty = overrides->setproperty;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->removeproperty)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.removeproperty = overrides->removeproperty;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->hasproperty)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.hasproperty = overrides->hasproperty;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->hasmethod)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.hasmethod = overrides->hasmethod;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->setexception)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.setexception = overrides->setexception;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (overrides->enumerate)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_funcs_.enumerate = overrides->enumerate;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginHost::SetPostData(const char* buf,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             uint32 length,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<std::string>* names,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<std::string>* values,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<char>* body) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a state table to do the parsing.  Whitespace must be
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trimmed after the fact if desired.  In our case, we actually
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't care about the whitespace, because we're just going to
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pass this back into another POST.  This function strips out the
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Content-length" header and does not append it to the request.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This parser takes action only on state changes.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transition table:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                  :       \n  NULL    Other
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0 GetHeader      1       2   4       0
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 GetValue       1       0   3       1
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 GetData        2       2   3       2
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3 DONE
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4 ERR
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { INPUT_COLON=0, INPUT_NEWLINE, INPUT_NULL, INPUT_OTHER };
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { GETNAME, GETVALUE, GETDATA, DONE, ERR };
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int statemachine[3][4] = { { GETVALUE, GETDATA, GETDATA, GETNAME },
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             { GETVALUE, GETNAME, DONE, GETVALUE },
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             { GETDATA,  GETDATA, DONE, GETDATA } };
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name, value;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* ptr = static_cast<const char*>(buf);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* start = ptr;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state = GETNAME;  // initial state
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool done = false;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool err = false;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int input;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Translate the current character into an input
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for the state table.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (*ptr) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ':' :
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = INPUT_COLON;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\n':
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = INPUT_NEWLINE;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 0   :
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = INPUT_NULL;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default  :
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = INPUT_OTHER;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int newstate = statemachine[state][input];
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Take action based on the new state.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state != newstate) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (newstate) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case GETNAME:
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Got a value.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value = std::string(start, ptr - start);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TrimWhitespace(value, TRIM_ALL, &value);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // If the name field is empty, we'll skip this header
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // but we won't error out.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!name.empty() && name != "content-length") {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            names->push_back(name);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->push_back(value);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          start = ptr + 1;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case GETVALUE:
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Got a header.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name = StringToLowerASCII(std::string(start, ptr - start));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TrimWhitespace(name, TRIM_ALL, &name);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          start = ptr + 1;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case GETDATA: {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Finished headers, now get body
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (*ptr)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            start = ptr + 1;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size_t previous_size = body->size();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size_t new_body_size = length - static_cast<int>(start - buf);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          body->resize(previous_size + new_body_size);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!body->empty())
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            memcpy(&body->front() + previous_size, start, new_body_size);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          done = true;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ERR:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // error
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          err = true;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          done = true;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = newstate;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptr++;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (!done);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !err;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
306ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
310ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::FindInstance;
311ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::PluginHost;
312ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::PluginInstance;
313ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::WebPlugin;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocates memory from the host's memory space.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NPN_MemAlloc(uint32_t size) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: We must use the same allocator/deallocator
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that is used by the javascript library, as some of the
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JS APIs will pass memory to the plugin which the plugin
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will attempt to free.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return malloc(size);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deallocates memory from the host's memory space
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_MemFree(void* ptr) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ptr != NULL && ptr != reinterpret_cast<void*>(-1))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    free(ptr);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Requests that the host free a specified amount of memory.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t NPN_MemFlush(uint32_t size) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is not relevant on Windows; MAC specific
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is for dynamic discovery of new plugins.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Should force a re-scan of the plugins directory to load new ones.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_ReloadPlugins(NPBool reload_pages) {
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::resetPluginCache(reload_pages ? true : false);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Requests a range of bytes for a seekable stream.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_RequestRead(NPStream* stream, NPByteRange* range_list) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!stream || !range_list)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_GENERIC_ERROR;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<PluginInstance*>(stream->ndata));
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!plugin.get())
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_GENERIC_ERROR;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin->RequestRead(stream, range_list);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generic form of GetURL for common code between GetURL and GetURLNotify.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static NPError GetURLNotify(NPP id,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* url,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* target,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool notify,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            void* notify_data) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_URL;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!plugin.get()) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_GENERIC_ERROR;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin->RequestURL(url, "GET", target, NULL, 0, notify, notify_data);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Requests creation of a new stream with the contents of the
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified URL; gets notification of the result.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_GetURLNotify(NPP id,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const char* url,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const char* target,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         void* notify_data) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is identical to NPN_GetURL, but after finishing, the
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser will call NPP_URLNotify to inform the plugin that
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it has completed.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // According to the NPAPI documentation, if target == _self
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or a parent to _self, the browser should return NPERR_INVALID_PARAM,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because it can't notify the plugin once deleted.  This is
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // absolutely false; firefox doesn't do this, and Flash relies on
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being able to use this.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Also according to the NPAPI documentation, we should return
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NPERR_INVALID_URL if the url requested is not valid.  However,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this would require that we synchronously start fetching the
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL.  That just isn't practical.  As such, there really is
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no way to return this error.  From looking at the Firefox
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation, it doesn't look like Firefox does this either.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetURLNotify(id, url, target, true, notify_data);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_GetURL(NPP id, const char* url, const char* target) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notes:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    Request from the Plugin to fetch content either for the plugin
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    or to be placed into a browser window.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If target == null, the browser fetches content and streams to plugin.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    otherwise, the browser loads content into an existing browser frame.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the target is the window/frame containing the plugin, the plugin
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    may be destroyed.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the target is _blank, a mailto: or news: url open content in a new
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    browser window
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the target is _self, no other instance of the plugin is created.  The
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    plugin continues to operate in its own window
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetURLNotify(id, url, target, false, 0);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generic form of PostURL for common code between PostURL and PostURLNotify.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static NPError PostURLNotify(NPP id,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const char* url,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const char* target,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             uint32_t len,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const char* buf,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             NPBool file,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool notify,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             void* notify_data) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_URL;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!plugin.get()) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_GENERIC_ERROR;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string post_file_contents;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Post data to be uploaded from a file. This can be handled in two
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ways.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 1. Read entire file and send the contents as if it was a post data
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    specified in the argument
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2. Send just the file details and read them in the browser at the
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    time of sending the request.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Approach 2 is more efficient but complicated. Approach 1 has a major
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // drawback of sending potentially large data over two IPC hops.  In a way
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 'large data over IPC' problem exists as it is in case of plugin giving
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the data directly instead of in a file.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Currently we are going with the approach 1 to get the feature working.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We can optimize this later with approach 2.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(joshia): Design a scheme to send a file descriptor instead of
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // entire file contents across.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Security alert:
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ---------------
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Here we are blindly uploading whatever file requested by a plugin.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is risky as someone could exploit a plugin to send private
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // data in arbitrary locations.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A malicious (non-sandboxed) plugin has unfeterred access to OS
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // resources and can do this anyway without using browser's HTTP stack.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FWIW, Firefox and Safari don't perform any security checks.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!buf)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_FILE_NOT_FOUND;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string file_path_ascii(buf);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char kFileUrlPrefix[] = "file:";
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (StartsWithASCII(file_path_ascii, kFileUrlPrefix, false)) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL file_url(file_path_ascii);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(file_url.SchemeIsFile());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::FileURLToFilePath(file_url, &file_path);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
474424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      file_path = base::FilePath::FromUTF8Unsafe(file_path_ascii);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info post_file_info;
478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!base::GetFileInfo(file_path, &post_file_info) ||
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        post_file_info.is_directory)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_FILE_NOT_FOUND;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!base::ReadFileToString(file_path, &post_file_contents))
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_FILE_NOT_FOUND;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = post_file_contents.c_str();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = post_file_contents.size();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The post data sent by a plugin contains both headers
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and post data.  Example:
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      Content-type: text/html
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      Content-length: 200
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      <200 bytes of content here>
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unfortunately, our stream needs these broken apart,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we need to parse the data and set headers and data
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separately.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin->RequestURL(url, "POST", target, buf, len, notify, notify_data);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_PostURLNotify(NPP id,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* url,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* target,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint32_t len,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* buf,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          NPBool file,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          void* notify_data) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PostURLNotify(id, url, target, len, buf, file, true, notify_data);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_PostURL(NPP id,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* url,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* target,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    uint32_t len,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* buf,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NPBool file) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // POSTs data to an URL, either from a temp file or a buffer.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If file is true, buf contains a temp file (which host will delete after
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   completing), and len contains the length of the filename.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If file is false, buf contains the data to send, and len contains the
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   length of the buffer
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If target is null,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   server response is returned to the plugin
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If target is _current, _self, or _top,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   server response is written to the plugin window and plugin is unloaded.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If target is _new or _blank,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   server response is written to a new browser window
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If target is an existing frame,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   server response goes to that frame.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For protocols other than FTP
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   file uploads must be line-end converted from \r\n to \n
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note:  you cannot specify headers (even a blank line) in a memory buffer,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //        use NPN_PostURLNotify
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PostURLNotify(id, url, target, len, buf, file, false, 0);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_NewStream(NPP id,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      NPMIMEType type,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* target,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      NPStream** stream) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests creation of a new data stream produced by the plugin,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consumed by the browser.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser should put this stream into a window target.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "NPN_NewStream is not implemented yet.";
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t NPN_Write(NPP id, NPStream* stream, int32_t len, void* buffer) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes data to an existing Plugin-created stream.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "NPN_Write is not implemented yet.";
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_DestroyStream(NPP id, NPStream* stream, NPReason reason) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys a stream (could be created by plugin or browser).
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reasons:
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPRES_DONE          - normal completion
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPRES_USER_BREAK    - user terminated
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPRES_NETWORK_ERROR - network error (all errors fit here?)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin.get() == NULL) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_GENERIC_ERROR;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plugin->NPP_DestroyStream(stream, reason);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* NPN_UserAgent(NPP id) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flash passes in a null id during the NP_initialize call.  We need to
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default to the Mozilla user agent if we don't have an NPP instance or
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // else Flash won't request windowless mode.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_mozilla_user_agent = true;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<PluginInstance> plugin = FindInstance(id);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plugin.get() && !plugin->use_mozilla_user_agent())
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      use_mozilla_user_agent = false;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_mozilla_user_agent)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) "
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Gecko/20061103 Firefox/2.0a1";
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_glue::GetUserAgent(GURL()).c_str();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_Status(NPP id, const char* message) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Displays a message on the status line of the browser window.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "NPN_Status is not implemented yet.";
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_InvalidateRect(NPP id, NPRect *invalidRect) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidates specified drawing area prior to repainting or refreshing a
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // windowless plugin
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before a windowless plugin can refresh part of its drawing area, it must
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first invalidate it.  This function causes the NPP_HandleEvent method to
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pass an update event or a paint message to the plug-in.  After calling
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method, the plug-in recieves a paint message asynchronously.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser redraws invalid areas of the document and any windowless
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plug-ins at regularly timed intervals. To force a paint message, the
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plug-in can call NPN_ForceRedraw after calling this method.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin.get() && plugin->webplugin()) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (invalidRect) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!plugin->windowless()) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RECT rect = {0};
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rect.left = invalidRect->left;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rect.right = invalidRect->right;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rect.top = invalidRect->top;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rect.bottom = invalidRect->bottom;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ::InvalidateRect(plugin->window_handle(), &rect, false);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect rect(invalidRect->left,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     invalidRect->top,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     invalidRect->right - invalidRect->left,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     invalidRect->bottom - invalidRect->top);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin->webplugin()->InvalidateRect(rect);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin->webplugin()->Invalidate();
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_InvalidateRegion(NPP id, NPRegion invalidRegion) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidates a specified drawing region prior to repainting
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or refreshing a window-less plugin.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to NPN_InvalidateRect.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: this is overkill--add platform-specific region handling (at the
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // very least, fetch the region's bounding box and pass it to InvalidateRect).
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(plugin.get() != NULL);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin.get() && plugin->webplugin())
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->webplugin()->Invalidate();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_ForceRedraw(NPP id) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces repaint for a windowless plug-in.
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We deliberately do not implement this; we don't want plugins forcing
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synchronous paints.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_GetValue(NPP id, NPNVariable variable, void* value) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the plugin to query the browser for information
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Variables:
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVxDisplay (unix only)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVxtAppContext (unix only)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVnetscapeWindow (win only) - Gets the native window on which the
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              plug-in drawing occurs, returns HWND
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVjavascriptEnabledBool:  tells whether Javascript is enabled
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVasdEnabledBool:  tells whether SmartUpdate is enabled
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    NPNVOfflineBool: tells whether offline-mode is enabled
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPError rv = NPERR_GENERIC_ERROR;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (static_cast<int>(variable)) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVWindowNPObject: {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get()) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_INVALID_INSTANCE_ERROR;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPObject *np_object = plugin->webplugin()->GetWindowScriptNPObject();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Return value is expected to be retained, as
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // described here:
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (np_object) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebBindings::retainObject(np_object);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void **v = (void **)value;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *v = np_object;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = NPERR_NO_ERROR;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVPluginElementNPObject: {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get()) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_INVALID_INSTANCE_ERROR;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPObject *np_object = plugin->webplugin()->GetPluginElement();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Return value is expected to be retained, as
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // described here:
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (np_object) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebBindings::retainObject(np_object);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void** v = static_cast<void**>(value);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *v = np_object;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = NPERR_NO_ERROR;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if !defined(OS_MACOSX)  // OS X doesn't have windowed plugins.
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVnetscapeWindow: {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin = FindInstance(id);
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get()) {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_INVALID_INSTANCE_ERROR;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::PluginWindowHandle handle = plugin->window_handle();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *((void**)value) = (void*)handle;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVjavascriptEnabledBool: {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // yes, JS is enabled.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *((void**)value) = (void*)1;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if defined(TOOLKIT_GTK)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVToolkit:
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tell them we are GTK2.  (The alternative is GTK 1.2.)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *reinterpret_cast<int*>(value) = NPNVGtk2;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVSupportsXEmbedBool:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *reinterpret_cast<NPBool*>(value) = true;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVSupportsWindowless: {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_windowless = reinterpret_cast<NPBool*>(value);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *supports_windowless = true;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVprivateModeBool: {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* private_mode = reinterpret_cast<NPBool*>(value);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get()) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_INVALID_INSTANCE_ERROR;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *private_mode = plugin->webplugin()->IsOffTheRecord();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if defined(OS_MACOSX)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVpluginDrawingModel: {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // return the drawing model that was negotiated when we initialized.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (!plugin.get()) {
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_INVALID_INSTANCE_ERROR;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *reinterpret_cast<int*>(value) = plugin->drawing_model();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsCoreGraphicsBool:
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsCocoaBool: {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // These drawing and event models are always supported.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_model = reinterpret_cast<NPBool*>(value);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *supports_model = true;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsInvalidatingCoreAnimationBool:
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsCoreAnimationBool: {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_model = reinterpret_cast<NPBool*>(value);
796ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *supports_model = content::SupportsCoreAnimationPlugins();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NP_NO_CARBON
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsCarbonBool:
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NP_NO_QUICKDRAW
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsQuickDrawBool:
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsOpenGLBool: {
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // These models are never supported. OpenGL was never widely supported,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // and QuickDraw and Carbon have been deprecated for quite some time.
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_model = reinterpret_cast<NPBool*>(value);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *supports_model = false;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsCompositingCoreAnimationPluginsBool: {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_compositing = reinterpret_cast<NPBool*>(value);
816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *supports_compositing = content::SupportsCoreAnimationPlugins();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNVsupportsUpdatedCocoaTextInputBool: {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We support the clarifications to the Cocoa IME event spec.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NPBool* supports_update = reinterpret_cast<NPBool*>(value);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *supports_update = true;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = NPERR_NO_ERROR;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif  // OS_MACOSX
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "NPN_GetValue(" << variable << ") is not implemented yet.";
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_SetValue(NPP id, NPPVariable variable, void* value) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the plugin to set various modes
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!plugin.get()) {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_INSTANCE_ERROR;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch(variable) {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVpluginWindowBool: {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Sets windowless mode for display of the plugin
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Note: the documentation at
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // http://developer.mozilla.org/en/docs/NPN_SetValue is wrong.  When
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // value is NULL, the mode is set to true.  This is the same way Mozilla
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // works.
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin->set_windowless(value == 0);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_NO_ERROR;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVpluginTransparentBool: {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Sets transparent mode for display of the plugin
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      //
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Transparent plugins require the browser to paint the background
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // before having the plugin paint.  By default, windowless plugins
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // are transparent.  Making a windowless plugin opaque means that
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the plugin does not require the browser to paint the background.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool mode = (value != 0);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin->set_transparent(mode);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_NO_ERROR;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVjavascriptPushCallerBool:
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Specifies whether you are pushing or popping the JSContext off.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the stack
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO: implement me
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "NPN_SetValue(NPPVJavascriptPushCallerBool) is not "
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "implemented.";
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_GENERIC_ERROR;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVpluginKeepLibraryInMemory:
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tells browser that plugin library should live longer than usual.
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO: implement me
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "NPN_SetValue(NPPVpluginKeepLibraryInMemory) is not "
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "implemented.";
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_GENERIC_ERROR;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if defined(OS_MACOSX)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVpluginDrawingModel: {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intptr_t model = reinterpret_cast<intptr_t>(value);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (model == NPDrawingModelCoreGraphics ||
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ((model == NPDrawingModelInvalidatingCoreAnimation ||
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            model == NPDrawingModelCoreAnimation) &&
883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch           content::SupportsCoreAnimationPlugins())) {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        plugin->set_drawing_model(static_cast<NPDrawingModel>(model));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_NO_ERROR;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_GENERIC_ERROR;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPPVpluginEventModel: {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Only the Cocoa event model is supported.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intptr_t model = reinterpret_cast<intptr_t>(value);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (model == NPEventModelCocoa) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        plugin->set_event_model(static_cast<NPEventModel>(model));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_NO_ERROR;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_GENERIC_ERROR;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO: implement me
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "NPN_SetValue(" << variable << ") is not implemented.";
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NPN_GetJavaEnv() {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "NPN_GetJavaEnv is not implemented.";
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NPN_GetJavaPeer(NPP) {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "NPN_GetJavaPeer is not implemented.";
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_PushPopupsEnabledState(NPP id, NPBool enabled) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get())
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->PushPopupsEnabledState(enabled ? true : false);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_PopPopupsEnabledState(NPP id) {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get())
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->PopPopupsEnabledState();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_PluginThreadAsyncCall(NPP id,
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               void (*func)(void*),
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               void* user_data) {
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get())
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->PluginThreadAsyncCall(func, user_data);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_GetValueForURL(NPP id,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NPNURLVariable variable,
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const char* url,
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           char** value,
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint32_t* len) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!id)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_PARAM;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url || !*url || !len)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_URL;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *len = 0;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (variable) {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNURLVProxy: {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = "DIRECT";
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get())
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebPlugin* webplugin = plugin->webplugin();
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!webplugin)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!webplugin->FindProxyForUrl(GURL(std::string(url)), &result))
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNURLVCookie: {
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get())
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebPlugin* webplugin = plugin->webplugin();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!webplugin)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Bypass third-party cookie blocking by using the url as the
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // first_party_for_cookies.
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL cookies_url((std::string(url)));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = webplugin->GetCookies(cookies_url, cookies_url);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_GENERIC_ERROR;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allocate this using the NPAPI allocator. The plugin will call
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NPN_Free to free this.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<char*>(NPN_MemAlloc(result.length() + 1));
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(*value, result.c_str(), result.length() + 1);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *len = result.length();
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_SetValueForURL(NPP id,
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NPNURLVariable variable,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const char* url,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const char* value,
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint32_t len) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!id)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_PARAM;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url || !*url)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_URL;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (variable) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNURLVCookie: {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<PluginInstance> plugin(FindInstance(id));
1012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!plugin.get())
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebPlugin* webplugin = plugin->webplugin();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!webplugin)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NPERR_GENERIC_ERROR;
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string cookie(value, len);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL cookies_url((std::string(url)));
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webplugin->SetCookie(cookies_url, cookies_url, cookie);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NPERR_NO_ERROR;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NPNURLVProxy:
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We don't support setting proxy values, fall through...
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fall through and return an error...
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_GetAuthenticationInfo(NPP id,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* protocol,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* host,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int32_t port,
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* scheme,
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* realm,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  char** username,
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint32_t* ulen,
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  char** password,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint32_t* plen) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!id || !protocol || !host || !scheme || !realm || !username ||
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ulen || !password || !plen)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_PARAM;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement me (bug 23928)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t NPN_ScheduleTimer(NPP id,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint32_t interval,
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NPBool repeat,
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           void (*func)(NPP id, uint32_t timer_id)) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
1058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!plugin.get())
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plugin->ScheduleTimer(interval, repeat, func);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_UnscheduleTimer(NPP id, uint32_t timer_id) {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
1066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get())
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->UnscheduleTimer(timer_id);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPN_PopUpContextMenu(NPP id, NPMenu* menu) {
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!menu)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_INVALID_PARAM;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
1075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get()) {
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return plugin->PopUpContextMenu(menu);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_GENERIC_ERROR;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPBool NPN_ConvertPoint(NPP id, double sourceX, double sourceY,
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NPCoordinateSpace sourceSpace,
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        double *destX, double *destY,
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NPCoordinateSpace destSpace) {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(id));
1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get()) {
1088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return plugin->ConvertPoint(
1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        sourceX, sourceY, sourceSpace, destX, destY, destSpace);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPBool NPN_HandleEvent(NPP id, void *event, NPBool handled) {
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: Implement advanced key handling: http://crbug.com/46578
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPBool NPN_UnfocusInstance(NPP id, NPFocusDirection direction) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: Implement advanced key handling: http://crbug.com/46578
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPN_URLRedirectResponse(NPP instance, void* notify_data, NPBool allow) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> plugin(FindInstance(instance));
1109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (plugin.get()) {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin->URLRedirectResponse(!!allow, notify_data);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // extern "C"
1115