| Index: chrome_frame/chrome_frame_npapi.h | 
| =================================================================== | 
| --- chrome_frame/chrome_frame_npapi.h	(revision 0) | 
| +++ chrome_frame/chrome_frame_npapi.h	(revision 0) | 
| @@ -0,0 +1,333 @@ | 
| +// Copyright (c) 2009 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. | 
| + | 
| +#ifndef CHROME_FRAME_CHROME_FRAME_NPAPI_H_ | 
| +#define CHROME_FRAME_CHROME_FRAME_NPAPI_H_ | 
| + | 
| +#include <atlbase.h> | 
| +#include <atlwin.h> | 
| +#include <string> | 
| + | 
| +#include "chrome_frame/chrome_frame_automation.h" | 
| +#include "chrome_frame/chrome_frame_plugin.h" | 
| +#include "chrome_frame/np_browser_functions.h" | 
| +#include "chrome_frame/np_event_listener.h" | 
| +#include "chrome_frame/np_proxy_service.h" | 
| +#include "chrome_frame/npapi_url_request.h" | 
| + | 
| +class MessageLoop; | 
| + | 
| +// ChromeFrameNPAPI: Implementation of the NPAPI plugin, which is responsible | 
| +// for hosting a chrome frame, i.e. an iframe like widget which hosts the the | 
| +// chrome window. This object delegates to Chrome.exe  (via the Chrome | 
| +// IPC-based automation mechanism) for the actual rendering. | 
| +class ChromeFrameNPAPI | 
| +    : public CWindowImpl<ChromeFrameNPAPI>, | 
| +      public ChromeFramePlugin<ChromeFrameNPAPI>, | 
| +      public NpEventDelegate { | 
| + public: | 
| +  typedef ChromeFramePlugin<ChromeFrameNPAPI> Base; | 
| + | 
| +  // NPObject structure which is exposed by us. | 
| +  struct ChromeFrameNPObject : public NPObject { | 
| +    NPP npp; | 
| +    ChromeFrameNPAPI* chrome_frame_plugin_instance; | 
| +  }; | 
| + | 
| +  typedef enum { | 
| +    PLUGIN_PROPERTY_VERSION, | 
| +    PLUGIN_PROPERTY_SRC, | 
| +    PLUGIN_PROPERTY_ONLOAD, | 
| +    PLUGIN_PROPERTY_ONERROR, | 
| +    PLUGIN_PROPERTY_ONMESSAGE, | 
| +    PLUGIN_PROPERTY_READYSTATE, | 
| +    PLUGIN_PROPERTY_ONPRIVATEMESSAGE, | 
| +    PLUGIN_PROPERTY_USECHROMENETWORK, | 
| +    PLUGIN_PROPERTY_COUNT  // must be last | 
| +  } PluginPropertyId; | 
| + | 
| +  static const int kWmSwitchFocusToChromeFrame = WM_APP + 0x100; | 
| + | 
| +  static NPClass plugin_class_; | 
| +  static NPClass* PluginClass() { | 
| +    return &plugin_class_; | 
| +  } | 
| + | 
| +  ChromeFrameNPAPI(); | 
| +  ~ChromeFrameNPAPI(); | 
| + | 
| +  bool Initialize(NPMIMEType mime_type, NPP instance, uint16 mode, | 
| +                  int16 argc, char* argn[], char* argv[]); | 
| +  void Uninitialize(); | 
| + | 
| +  bool SetWindow(NPWindow* window_info); | 
| +  void UrlNotify(const char* url, NPReason reason, void* notify_data); | 
| +  bool NewStream(NPMIMEType type, NPStream* stream, NPBool seekable, | 
| +                 uint16* stream_type); | 
| + | 
| +  void Print(NPPrint* print_info); | 
| + | 
| +  // NPObject functions, which ensure that the plugin object is scriptable. | 
| +  static bool HasMethod(NPObject* obj, NPIdentifier name); | 
| +  static bool Invoke(NPObject* header, NPIdentifier name, | 
| +                     const NPVariant* args, uint32_t arg_count, | 
| +                     NPVariant* result); | 
| +  static NPObject* AllocateObject(NPP instance, NPClass* class_name); | 
| +  static void DeallocateObject(NPObject* header); | 
| + | 
| +  // Called by the scripting environment when the native code is shutdown. | 
| +  // Any attempt to message a NPObject instance after the invalidate callback | 
| +  // has been called will result in undefined behavior, even if the native code | 
| +  // is still retaining those NPObject instances. | 
| +  static void Invalidate(NPObject* header); | 
| + | 
| +  // The following functions need to be implemented to ensure that FF3 | 
| +  // invokes methods on the plugin. If these methods are not implemented | 
| +  // then invokes on the plugin NPObject from the script fail with a | 
| +  // bad NPObject error. | 
| +  static bool HasProperty(NPObject* obj, NPIdentifier name); | 
| +  static bool GetProperty(NPObject* obj, NPIdentifier name, NPVariant *variant); | 
| +  static bool SetProperty(NPObject* obj, NPIdentifier name, | 
| +                          const NPVariant *variant); | 
| + | 
| +  // Returns the ChromeFrameNPAPI object pointer from the NPP instance structure | 
| +  // passed in by the browser. | 
| +  static ChromeFrameNPAPI* ChromeFrameInstanceFromPluginInstance(NPP instance); | 
| + | 
| +  // Returns the ChromeFrameNPAPI object pointer from the NPObject structure | 
| +  // which represents our plugin class. | 
| +  static ChromeFrameNPAPI* ChromeFrameInstanceFromNPObject(void* object); | 
| + | 
| +  // Return a UrlRequest instance associated with the given instance and | 
| +  // stream combination. | 
| +  static NPAPIUrlRequest* ValidateRequest(NPP instance, void* notify_data); | 
| + | 
| +BEGIN_MSG_MAP(ChromeFrameNPAPI) | 
| +  MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) | 
| +  CHAIN_MSG_MAP(Base) | 
| +END_MSG_MAP() | 
| + | 
| +  LRESULT OnSetFocus(UINT message, WPARAM wparam, LPARAM lparam, | 
| +                     BOOL& handled);  // NO_LINT | 
| + | 
| +  // Implementation of NpEventDelegate | 
| +  virtual void OnEvent(const char* event_name); | 
| + | 
| +  void OnFocus(); | 
| +  void OnBlur(); | 
| + | 
| +  // Implementation of SetProperty, public to allow unittesting. | 
| +  bool SetProperty(NPIdentifier name, const NPVariant *variant); | 
| +  // Implementation of GetProperty, public to allow unittesting. | 
| +  bool GetProperty(NPIdentifier name, NPVariant *variant); | 
| + | 
| +  // Initialize string->identifier mapping, public to allow unittesting. | 
| +  static void InitializeIdentifiers(); | 
| + | 
| +  bool HandleContextMenuCommand(UINT cmd); | 
| + protected: | 
| +  // Handler for accelerator messages passed on from the hosted chrome | 
| +  // instance. | 
| +  virtual void OnAcceleratorPressed(int tab_handle, const MSG& accel_message); | 
| +  virtual void OnTabbedOut(int tab_handle, bool reverse); | 
| +  virtual void OnOpenURL(int tab_handle, const GURL& url, int open_disposition); | 
| +  virtual void OnLoad(int tab_handle, const GURL& url); | 
| +  virtual void OnMessageFromChromeFrame(int tab_handle, | 
| +                                        const std::string& message, | 
| +                                        const std::string& origin, | 
| +                                        const std::string& target); | 
| +  virtual void OnRequestStart(int tab_handle, int request_id, | 
| +                              const IPC::AutomationURLRequest& request); | 
| +  virtual void OnRequestRead(int tab_handle, int request_id, | 
| +                             int bytes_to_read); | 
| +  virtual void OnRequestEnd(int tab_handle, int request_id, | 
| +                            const URLRequestStatus& status); | 
| +  virtual void OnSetCookieAsync(int tab_handle, const GURL& url, | 
| +                                const std::string& cookie); | 
| + | 
| +  // ChromeFrameDelegate overrides | 
| +  virtual void OnLoadFailed(int error_code, const std::string& url); | 
| +  virtual void OnAutomationServerReady(); | 
| +  virtual void OnAutomationServerLaunchFailed( | 
| +      AutomationLaunchResult reason, const std::string& server_version); | 
| + | 
| + private: | 
| +  void SubscribeToFocusEvents(); | 
| +  void UnsubscribeFromFocusEvents(); | 
| + | 
| +  // Equivalent of: | 
| +  // event = window.document.createEvent("Event"); | 
| +  // event.initEvent(type, bubbles, cancelable); | 
| +  // and then returns the event object. | 
| +  bool CreateEvent(const std::string& type, bool bubbles, bool cancelable, | 
| +                   NPObject** basic_event); | 
| + | 
| +  // Creates and initializes an event object of type "message". | 
| +  // Used for postMessage. | 
| +  bool CreateMessageEvent(bool bubbles, bool cancelable, | 
| +      const std::string& data, const std::string& origin, | 
| +      NPObject** message_event); | 
| + | 
| +  // Calls chrome_frame.dispatchEvent to fire events to event listeners. | 
| +  void DispatchEvent(NPObject* event); | 
| + | 
| +  // Returns a pointer to the <object> element in the page that | 
| +  // hosts the plugin.  Note that this is the parent element of the <embed> | 
| +  // element.  The <embed> element doesn't support some of the events that | 
| +  // we require, so we use the object element for receiving events. | 
| +  bool GetObjectElement(nsIDOMElement** element); | 
| + | 
| +  // Prototype for all methods that can be invoked from script. | 
| +  typedef bool (ChromeFrameNPAPI::*PluginMethod)(NPObject* npobject, | 
| +                                                 const NPVariant* args, | 
| +                                                 uint32_t arg_count, | 
| +                                                 NPVariant* result); | 
| + | 
| +  // Implementations of scriptable methods. | 
| + | 
| +  bool NavigateToURL(const NPVariant* args, uint32_t arg_count, | 
| +                     NPVariant* result); | 
| + | 
| +  bool postMessage(NPObject* npobject, const NPVariant* args, | 
| +                   uint32_t arg_count, NPVariant* result); | 
| + | 
| +  // This method is only available when the control is in privileged mode. | 
| +  bool postPrivateMessage(NPObject* npobject, const NPVariant* args, | 
| +                          uint32_t arg_count, NPVariant* result); | 
| + | 
| +  // Pointers to method implementations. | 
| +  static PluginMethod plugin_methods_[]; | 
| + | 
| +  // NPObject method ids exposed by the plugin. | 
| +  static NPIdentifier plugin_method_identifiers_[]; | 
| + | 
| +  // NPObject method names exposed by the plugin. | 
| +  static const NPUTF8* plugin_method_identifier_names_[]; | 
| + | 
| +  // NPObject property ids exposed by the plugin. | 
| +  static NPIdentifier plugin_property_identifiers_[]; | 
| + | 
| +  // NPObject property names exposed by the plugin. | 
| +  static const NPUTF8* | 
| +      plugin_property_identifier_names_[]; | 
| + | 
| +  virtual void OnFinalMessage(HWND window); | 
| + | 
| +  // Helper function to invoke a function on a NPObject. | 
| +  bool InvokeDefault(NPObject* object, const std::string& param, | 
| +                     NPVariant* result); | 
| + | 
| +  bool InvokeDefault(NPObject* object, const NPVariant& param, | 
| +                     NPVariant* result); | 
| + | 
| +  bool InvokeDefault(NPObject* object, unsigned param_count, | 
| +                     const NPVariant* params, NPVariant* result); | 
| + | 
| +  // Helper function to convert javascript code to a NPObject we can | 
| +  // invoke on. | 
| +  virtual NPObject* JavascriptToNPObject(const std::string& function_name); | 
| + | 
| +  // Helper function to execute a script. | 
| +  // Returns S_OK on success. | 
| +  bool ExecuteScript(const std::string& script, NPVariant* result); | 
| + | 
| +  // Returns true if the script passed in is a valid function in the DOM. | 
| +  bool IsValidJavascriptFunction(const std::string& script); | 
| + | 
| +  // Converts the data parameter to an NPVariant and forwards the call to the | 
| +  // other FireEvent method. | 
| +  void FireEvent(const std::string& event_type, const std::string& data); | 
| + | 
| +  // Creates an event object, assigns the data parameter to a |data| property | 
| +  // on the event object and then calls DispatchEvent to fire the event to | 
| +  // listeners.  event_type is the name of the event being fired. | 
| +  void FireEvent(const std::string& event_type, const NPVariant& data); | 
| + | 
| +  // Returns a new prefs service. Virtual to allow overriding in unittests. | 
| +  virtual NpProxyService* CreatePrefService(); | 
| + | 
| +  // Returns our associated windows' location. | 
| +  virtual std::string GetLocation(); | 
| + | 
| +  // Returns true iff we're successfully able to query for the browser's | 
| +  // incognito mode, and the browser returns true. | 
| +  virtual bool GetBrowserIncognitoMode(); | 
| + | 
| +  // Returns the window script object for the page. | 
| +  // This function will cache the window object to avoid calling | 
| +  // npapi::GetValue which can cause problems in Opera. | 
| +  NPObject* GetWindowObject() const; | 
| + | 
| +  virtual void SetReadyState(READYSTATE new_state) { | 
| +    ready_state_ = new_state; | 
| +    NPVariant var; | 
| +    INT32_TO_NPVARIANT(ready_state_, var); | 
| +    FireEvent("readystatechanged", var); | 
| +  } | 
| + | 
| +  // Host function to compile-time asserts over members of this class. | 
| +  static void CompileAsserts(); | 
| + | 
| +  // Get request from the stream notify data | 
| +  NPAPIUrlRequest* RequestFromNotifyData(void* notify_data) const; | 
| + | 
| +  static LRESULT CALLBACK DropKillFocusHook(int code, WPARAM wparam, | 
| +                                            LPARAM lparam);  // NO_LINT | 
| + | 
| +  // The plugins opaque instance handle | 
| +  NPP instance_; | 
| + | 
| +  // The plugin instantiation mode (NP_FULL or NP_EMBED) | 
| +  int16 mode_; | 
| +  // The plugins mime type. | 
| +  std::string mime_type_; | 
| + | 
| +  // Set to true if we need a full page plugin. | 
| +  bool force_full_page_plugin_; | 
| + | 
| +  scoped_refptr<NpProxyService> pref_service_; | 
| + | 
| +  // Used to receive focus and blur events from the object element | 
| +  // that hosts the plugin. | 
| +  scoped_refptr<NpEventListener> focus_listener_; | 
| + | 
| +  // In some cases the IPC channel proxy object is instantiated on the UI | 
| +  // thread in FF. It then tries to use the IPC logger, which relies on | 
| +  // the message loop being around. Declaring a dummy message loop | 
| +  // is a hack to get around this. Eventually the automation code needs to | 
| +  // be fixed to ensure that the channel proxy always gets created on a thread | 
| +  // with a message loop. | 
| +  static MessageLoop* message_loop_; | 
| +  static int instance_count_; | 
| + | 
| +  // The following members contain the NPObject pointers representing the | 
| +  // onload/onerror/onmessage handlers on the page. | 
| +  ScopedNpObject<NPObject> onerror_handler_; | 
| +  ScopedNpObject<NPObject> onmessage_handler_; | 
| +  ScopedNpObject<NPObject> onprivatemessage_handler_; | 
| + | 
| +  // As a workaround for a problem in Opera we cache the window object. | 
| +  // The problem stems from two things: window messages aren't always removed | 
| +  // from the message queue and messages can be pumped inside GetValue. | 
| +  // This can cause an infinite recursion of processing the same message | 
| +  // repeatedly. | 
| +  mutable ScopedNpObject<NPObject> window_object_; | 
| + | 
| +  // Note since 'onload' is a registered event name, the browser will | 
| +  // automagically create a code block for the handling code and hook it | 
| +  // up to the CF object via addEventListener. | 
| +  // See this list of known event types: | 
| +  // http://www.w3.org/TR/DOM-Level-3-Events/events.html#Event-types | 
| + | 
| +  READYSTATE ready_state_; | 
| + | 
| + | 
| +  // Popups are enabled | 
| +  bool enabled_popups_; | 
| + | 
| +  // The value of src property keeping the current URL. | 
| +  std::string src_; | 
| +}; | 
| + | 
| +#endif  // CHROME_FRAME_CHROME_FRAME_NPAPI_H_ | 
|  |