| Index: webkit/glue/plugins/plugin_instance.h
|
| ===================================================================
|
| --- webkit/glue/plugins/plugin_instance.h (revision 69426)
|
| +++ webkit/glue/plugins/plugin_instance.h (working copy)
|
| @@ -1,375 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// TODO: Need to deal with NPAPI's NPSavedData.
|
| -// I haven't seen plugins use it yet.
|
| -
|
| -#ifndef WEBKIT_GLUE_PLUGIN_PLUGIN_INSTANCE_H__
|
| -#define WEBKIT_GLUE_PLUGIN_PLUGIN_INSTANCE_H__
|
| -
|
| -#include <map>
|
| -#include <stack>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/file_path.h"
|
| -#include "base/ref_counted.h"
|
| -#include "base/scoped_ptr.h"
|
| -#include "gfx/native_widget_types.h"
|
| -#include "gfx/point.h"
|
| -#include "gfx/rect.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "third_party/npapi/bindings/npapi.h"
|
| -#include "third_party/npapi/bindings/nphostapi.h"
|
| -
|
| -class MessageLoop;
|
| -
|
| -namespace webkit_glue {
|
| -class WebPlugin;
|
| -class WebPluginResourceClient;
|
| -}
|
| -
|
| -namespace NPAPI
|
| -{
|
| -class PluginLib;
|
| -class PluginHost;
|
| -class PluginStream;
|
| -class PluginStreamUrl;
|
| -class PluginDataStream;
|
| -#if defined(OS_MACOSX)
|
| -class ScopedCurrentPluginEvent;
|
| -#endif
|
| -
|
| -// A PluginInstance is an active, running instance of a Plugin.
|
| -// A single plugin may have many PluginInstances.
|
| -class PluginInstance : public base::RefCountedThreadSafe<PluginInstance> {
|
| - public:
|
| - // Create a new instance of a plugin. The PluginInstance
|
| - // will hold a reference to the plugin.
|
| - PluginInstance(PluginLib *plugin, const std::string &mime_type);
|
| -
|
| - // Activates the instance by calling NPP_New.
|
| - // This should be called after our instance is all
|
| - // setup from the host side and we are ready to receive
|
| - // requests from the plugin. We must not call any
|
| - // functions on the plugin instance until start has
|
| - // been called.
|
| - //
|
| - // url: The instance URL.
|
| - // param_names: the list of names of attributes passed via the
|
| - // element.
|
| - // param_values: the list of values corresponding to param_names
|
| - // param_count: number of attributes
|
| - // load_manually: if true indicates that the plugin data would be passed
|
| - // from webkit. if false indicates that the plugin should
|
| - // download the data.
|
| - // This also controls whether the plugin is instantiated as
|
| - // a full page plugin (NP_FULL) or embedded (NP_EMBED)
|
| - //
|
| - bool Start(const GURL& url,
|
| - char** const param_names,
|
| - char** const param_values,
|
| - int param_count,
|
| - bool load_manually);
|
| -
|
| - // NPAPI's instance identifier for this instance
|
| - NPP npp() { return npp_; }
|
| -
|
| - // Get/Set for the instance's window handle.
|
| - gfx::PluginWindowHandle window_handle() const { return window_handle_; }
|
| - void set_window_handle(gfx::PluginWindowHandle value) {
|
| - window_handle_ = value;
|
| - }
|
| -
|
| - // Get/Set whether this instance is in Windowless mode.
|
| - // Default is false.
|
| - bool windowless() { return windowless_; }
|
| - void set_windowless(bool value) { windowless_ = value; }
|
| -
|
| - // Get/Set whether this instance is transparent.
|
| - // This only applies to windowless plugins. Transparent
|
| - // plugins require that webkit paint the background.
|
| - // Default is true.
|
| - bool transparent() { return transparent_; }
|
| - void set_transparent(bool value) { transparent_ = value; }
|
| -
|
| - // Get/Set the WebPlugin associated with this instance
|
| - webkit_glue::WebPlugin* webplugin() { return webplugin_; }
|
| - void set_web_plugin(webkit_glue::WebPlugin* webplugin) {
|
| - webplugin_ = webplugin;
|
| - }
|
| -
|
| - // Get the mimeType for this plugin stream
|
| - const std::string &mime_type() { return mime_type_; }
|
| -
|
| - NPAPI::PluginLib* plugin_lib() { return plugin_; }
|
| -
|
| -#if defined(OS_MACOSX)
|
| - // Get/Set the Mac NPAPI drawing and event models
|
| - NPDrawingModel drawing_model() { return drawing_model_; }
|
| - void set_drawing_model(NPDrawingModel value) { drawing_model_ = value; }
|
| - NPEventModel event_model() { return event_model_; }
|
| - void set_event_model(NPEventModel value) { event_model_ = value; }
|
| - // Updates the instance's tracking of the location of the plugin location
|
| - // relative to the upper left of the screen.
|
| - void set_plugin_origin(const gfx::Point& origin) { plugin_origin_ = origin; }
|
| - // Updates the instance's tracking of the frame of the containing window
|
| - // relative to the upper left of the screen.
|
| - void set_window_frame(const gfx::Rect& frame) {
|
| - containing_window_frame_ = frame;
|
| - }
|
| -#endif
|
| -
|
| - // Creates a stream for sending an URL. If notify_id is non-zero, it will
|
| - // send a notification to the plugin when the stream is complete; otherwise it
|
| - // will not. Set object_url to true if the load is for the object tag's url,
|
| - // or false if it's for a url that the plugin fetched through
|
| - // NPN_GetUrl[Notify].
|
| - PluginStreamUrl* CreateStream(unsigned long resource_id,
|
| - const GURL& url,
|
| - const std::string& mime_type,
|
| - int notify_id);
|
| -
|
| - // For each instance, we track all streams. When the
|
| - // instance closes, all remaining streams are also
|
| - // closed. All streams associated with this instance
|
| - // should call AddStream so that they can be cleaned
|
| - // up when the instance shuts down.
|
| - void AddStream(PluginStream* stream);
|
| -
|
| - // This is called when a stream is closed. We remove the stream from the
|
| - // list, which releases the reference maintained to the stream.
|
| - void RemoveStream(PluginStream* stream);
|
| -
|
| - // Closes all open streams on this instance.
|
| - void CloseStreams();
|
| -
|
| - // Returns the WebPluginResourceClient object for a stream that has become
|
| - // seekable.
|
| - webkit_glue::WebPluginResourceClient* GetRangeRequest(int id);
|
| -
|
| - // Have the plugin create it's script object.
|
| - NPObject *GetPluginScriptableObject();
|
| -
|
| - // WebViewDelegate methods that we implement. This is for handling
|
| - // callbacks during getURLNotify.
|
| - void DidFinishLoadWithReason(const GURL& url, NPReason reason, int notify_id);
|
| -
|
| - // If true, send the Mozilla user agent instead of Chrome's to the plugin.
|
| - bool use_mozilla_user_agent() { return use_mozilla_user_agent_; }
|
| - void set_use_mozilla_user_agent() { use_mozilla_user_agent_ = true; }
|
| -
|
| - // If the plugin instance is backed by a texture, return its ID in the
|
| - // compositor's namespace. Otherwise return 0. Returns 0 by default.
|
| - virtual unsigned GetBackingTextureId();
|
| -
|
| - // Helper that implements NPN_PluginThreadAsyncCall semantics
|
| - void PluginThreadAsyncCall(void (*func)(void *),
|
| - void *userData);
|
| -
|
| - uint32 ScheduleTimer(uint32 interval,
|
| - NPBool repeat,
|
| - void (*func)(NPP id, uint32 timer_id));
|
| -
|
| - void UnscheduleTimer(uint32 timer_id);
|
| -
|
| - bool ConvertPoint(double source_x, double source_y,
|
| - NPCoordinateSpace source_space,
|
| - double* dest_x, double* dest_y,
|
| - NPCoordinateSpace dest_space);
|
| -
|
| - NPError PopUpContextMenu(NPMenu* menu);
|
| -
|
| - //
|
| - // NPAPI methods for calling the Plugin Instance
|
| - //
|
| - NPError NPP_New(unsigned short, short, char *[], char *[]);
|
| - NPError NPP_SetWindow(NPWindow *);
|
| - NPError NPP_NewStream(NPMIMEType, NPStream *, NPBool, unsigned short *);
|
| - NPError NPP_DestroyStream(NPStream *, NPReason);
|
| - int NPP_WriteReady(NPStream *);
|
| - int NPP_Write(NPStream *, int, int, void *);
|
| - void NPP_StreamAsFile(NPStream *, const char *);
|
| - void NPP_URLNotify(const char *, NPReason, void *);
|
| - NPError NPP_GetValue(NPPVariable, void *);
|
| - NPError NPP_SetValue(NPNVariable, void *);
|
| - short NPP_HandleEvent(void*);
|
| - void NPP_Destroy();
|
| - bool NPP_Print(NPPrint* platform_print);
|
| - NPError NPP_ClearSiteData(uint64, const char*, uint64);
|
| - void NPP_URLRedirectNotify(const char* url, int32_t status,
|
| - void* notify_data);
|
| -
|
| - void SendJavaScriptStream(const GURL& url,
|
| - const std::string& result,
|
| - bool success,
|
| - int notify_id);
|
| -
|
| - void DidReceiveManualResponse(const GURL& url,
|
| - const std::string& mime_type,
|
| - const std::string& headers,
|
| - uint32 expected_length,
|
| - uint32 last_modified);
|
| - void DidReceiveManualData(const char* buffer, int length);
|
| - void DidFinishManualLoading();
|
| - void DidManualLoadFail();
|
| -
|
| - void PushPopupsEnabledState(bool enabled);
|
| - void PopPopupsEnabledState();
|
| -
|
| - bool popups_allowed() const {
|
| - return popups_enabled_stack_.empty() ? false : popups_enabled_stack_.top();
|
| - }
|
| -
|
| - // Initiates byte range reads for plugins.
|
| - void RequestRead(NPStream* stream, NPByteRange* range_list);
|
| -
|
| - // Handles GetURL/GetURLNotify/PostURL/PostURLNotify requests initiated
|
| - // by plugins.
|
| - void RequestURL(const char* url,
|
| - const char* method,
|
| - const char* target,
|
| - const char* buf,
|
| - unsigned int len,
|
| - bool notify,
|
| - void* notify_data);
|
| -
|
| - // Handles NPN_URLRedirectResponse calls issued by plugins in response to
|
| - // HTTP URL redirect notifications.
|
| - void URLRedirectResponse(bool allow, void* notify_data);
|
| -
|
| - bool handles_url_redirects() const { return handles_url_redirects_; }
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<PluginInstance>;
|
| -
|
| -#if defined(OS_MACOSX)
|
| - friend class ScopedCurrentPluginEvent;
|
| - // Sets the event that the plugin is currently handling. The object is not
|
| - // owned or copied, so the caller must call this again with NULL before the
|
| - // event pointer becomes invalid. Clients use ScopedCurrentPluginEvent rather
|
| - // than calling this directly.
|
| - void set_currently_handled_event(NPCocoaEvent* event) {
|
| - currently_handled_event_ = event;
|
| - }
|
| -#endif
|
| -
|
| - ~PluginInstance();
|
| - void OnPluginThreadAsyncCall(void (*func)(void *), void *userData);
|
| - void OnTimerCall(void (*func)(NPP id, uint32 timer_id),
|
| - NPP id, uint32 timer_id);
|
| - bool IsValidStream(const NPStream* stream);
|
| - void GetNotifyData(int notify_id, bool* notify, void** notify_data);
|
| -
|
| - // This is a hack to get the real player plugin to work with chrome
|
| - // The real player plugin dll(nppl3260) when loaded by firefox is loaded via
|
| - // the NS COM API which is analogous to win32 COM. So the NPAPI functions in
|
| - // the plugin are invoked via an interface by firefox. The plugin instance
|
| - // handle which is passed to every NPAPI method is owned by the real player
|
| - // plugin, i.e. it expects the ndata member to point to a structure which
|
| - // it knows about. Eventually it dereferences this structure and compares
|
| - // a member variable at offset 0x24(Version 6.0.11.2888) /2D (Version
|
| - // 6.0.11.3088) with 0 and on failing this check, takes a different code
|
| - // path which causes a crash. Safari and Opera work with version 6.0.11.2888
|
| - // by chance as their ndata structure contains a 0 at the location which real
|
| - // player checks:(. They crash with version 6.0.11.3088 as well. The
|
| - // following member just adds a 96 byte padding to our PluginInstance class
|
| - // which is passed in the ndata member. This magic number works correctly on
|
| - // Vista with UAC on or off :(.
|
| - // NOTE: Please dont change the ordering of the member variables
|
| - // New members should be added after this padding array.
|
| - // TODO(iyengar) : Disassemble the Realplayer ndata structure and look into
|
| - // the possiblity of conforming to it (http://b/issue?id=936667). We
|
| - // could also log a bug with Real, which would save the effort.
|
| - uint8 zero_padding_[96];
|
| - scoped_refptr<NPAPI::PluginLib> plugin_;
|
| - NPP npp_;
|
| - scoped_refptr<PluginHost> host_;
|
| - NPPluginFuncs* npp_functions_;
|
| - std::vector<scoped_refptr<PluginStream> > open_streams_;
|
| - gfx::PluginWindowHandle window_handle_;
|
| - bool windowless_;
|
| - bool transparent_;
|
| - webkit_glue::WebPlugin* webplugin_;
|
| - std::string mime_type_;
|
| - GURL get_url_;
|
| - intptr_t get_notify_data_;
|
| - bool use_mozilla_user_agent_;
|
| -#if defined(OS_MACOSX)
|
| - NPDrawingModel drawing_model_;
|
| - NPEventModel event_model_;
|
| - gfx::Point plugin_origin_;
|
| - gfx::Rect containing_window_frame_;
|
| - NPCocoaEvent* currently_handled_event_; // weak
|
| -#endif
|
| - MessageLoop* message_loop_;
|
| - scoped_refptr<PluginStreamUrl> plugin_data_stream_;
|
| -
|
| - // This flag if true indicates that the plugin data would be passed from
|
| - // webkit. if false indicates that the plugin should download the data.
|
| - bool load_manually_;
|
| -
|
| - // Stack indicating if popups are to be enabled for the outgoing
|
| - // NPN_GetURL/NPN_GetURLNotify calls.
|
| - std::stack<bool> popups_enabled_stack_;
|
| -
|
| - // True if in CloseStreams().
|
| - bool in_close_streams_;
|
| -
|
| - // List of files created for the current plugin instance. File names are
|
| - // added to the list every time the NPP_StreamAsFile function is called.
|
| - std::vector<FilePath> files_created_;
|
| -
|
| - // Next unusued timer id.
|
| - uint32 next_timer_id_;
|
| -
|
| - // Map of timer id to settings for timer.
|
| - struct TimerInfo {
|
| - uint32 interval;
|
| - bool repeat;
|
| - };
|
| - typedef std::map<uint32, TimerInfo> TimerMap;
|
| - TimerMap timers_;
|
| -
|
| - // Tracks pending GET/POST requests so that the plugin-given data doesn't
|
| - // cross process boundaries to an untrusted process.
|
| - typedef std::map<int, void*> PendingRequestMap;
|
| - PendingRequestMap pending_requests_;
|
| - int next_notify_id_;
|
| -
|
| - // Used to track pending range requests so that when WebPlugin replies to us
|
| - // we can match the reply to the stream.
|
| - typedef std::map<int, scoped_refptr<PluginStream> > PendingRangeRequestMap;
|
| - PendingRangeRequestMap pending_range_requests_;
|
| - int next_range_request_id_;
|
| - // The plugin handles the NPAPI URL redirect notification API.
|
| - // See here https://wiki.mozilla.org/NPAPI:HTTPRedirectHandling
|
| - bool handles_url_redirects_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PluginInstance);
|
| -};
|
| -
|
| -#if defined(OS_MACOSX)
|
| -// Helper to simplify correct usage of set_currently_handled_event.
|
| -// Instantiating will set |instance|'s currently handled to |event| for the
|
| -// lifetime of the object, then NULL when it goes out of scope.
|
| -class ScopedCurrentPluginEvent {
|
| - public:
|
| - ScopedCurrentPluginEvent(PluginInstance* instance, NPCocoaEvent* event)
|
| - : instance_(instance) {
|
| - instance_->set_currently_handled_event(event);
|
| - }
|
| - ~ScopedCurrentPluginEvent() {
|
| - instance_->set_currently_handled_event(NULL);
|
| - }
|
| - private:
|
| - scoped_refptr<PluginInstance> instance_;
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedCurrentPluginEvent);
|
| -};
|
| -#endif
|
| -
|
| -} // namespace NPAPI
|
| -
|
| -#endif // WEBKIT_GLUE_PLUGIN_PLUGIN_INSTANCE_H__
|
|
|