// 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 WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_ #define WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_ #include #include #include "third_party/npapi/bindings/npapi.h" // #include "webkit/default_plugin/install_dialog.h" // #include "webkit/default_plugin/plugin_database_handler.h" // #include "webkit/default_plugin/plugin_install_job_monitor.h" // Possible plugin installer states. enum PluginInstallerState { PluginInstallerStateUndefined, PluginListDownloadInitiated, PluginListDownloaded, PluginListDownloadedPluginNotFound, PluginListDownloadFailed, PluginDownloadInitiated, PluginDownloadCompleted, PluginDownloadFailed, PluginInstallerLaunchSuccess, PluginInstallerLaunchFailure }; class PluginInstallDialog; class PluginDatabaseHandler; // Provides the plugin installation functionality. This class is // instantiated with the information like the mime type of the // target plugin, the display mode, etc. class PluginInstallerImpl { public: // mode is the plugin instantiation mode, i.e. whether it is a full // page plugin (NP_FULL) or an embedded plugin (NP_EMBED) explicit PluginInstallerImpl(int16 mode); virtual ~PluginInstallerImpl(); // Initializes the plugin with the instance information, mime type // and the list of parameters passed down to the plugin from the webpage. // // Parameters: // module_handle // The handle to the dll in which this object is instantiated. // instance // The plugins opaque instance handle. // mime_type // Identifies the third party plugin which would be eventually installed. // argc // Indicates the count of arguments passed in from the webpage. // argv // Pointer to the arguments. // Returns true on success. bool Initialize(void *module_handle, NPP instance, NPMIMEType mime_type, int16 argc, char* argn[], char* argv[]); // Displays the default plugin UI. // // Parameters: // parent_window // Handle to the parent window. bool SetWindow(gfx::NativeView parent_view); // Destroys the install dialog and the plugin window. void Shutdown(); // Starts plugin download. Spawns the plugin installer after it is // downloaded. void DownloadPlugin(); // Indicates that the plugin download was cancelled. void DownloadCancelled(); // Initializes the plugin download stream. // // Parameters: // stream // Pointer to the new stream being created. void NewStream(NPStream* stream); // Uninitializes the plugin download stream. // // Parameters: // stream // Pointer to the stream being destroyed. // reason // Indicates why the stream is being destroyed. // void DestroyStream(NPStream* stream, NPError reason); // Determines whether the plugin is ready to accept data. // We only accept data when we have initiated a download for the plugin // database. // // Parameters: // stream // Pointer to the stream being destroyed. // Returns true if the plugin is ready to accept data. bool WriteReady(NPStream* stream); // Delivers data to the plugin instance. // // Parameters: // stream // Pointer to the stream being destroyed. // offset // Indicates the data offset. // buffer_length // Indicates the length of the data buffer. // buffer // Pointer to the actual buffer. // Returns the number of bytes actually written, 0 on error. int32 Write(NPStream* stream, int32 offset, int32 buffer_length, void* buffer); // Handles notifications received in response to GetURLNotify calls issued // by the plugin. // // Parameters: // url // Pointer to the URL. // reason // Describes why the notification was sent. void URLNotify(const char* url, NPReason reason); // gfx::NativeView window() const { return m_hWnd; } const std::string& mime_type() const { return mime_type_; } // Replaces a resource string with the placeholder passed in as an argument // // Parameters: // message_id_with_placeholders // The resource id of the string with placeholders. This is only used if // the placeholder string (the replacement_string) parameter is valid. // message_id_without_placeholders // The resource id of the string to be returned if the placeholder is // empty. // replacement_string // The placeholder which replaces tokens in the string identified by // resource id message_id_with_placeholders. // Returns a string which has the placeholders replaced, or the string // without placeholders. static std::wstring ReplaceStringForPossibleEmptyReplacement( int message_id_with_placeholders, int message_id_without_placeholders, const std::wstring& replacement_string); // Setter/getter combination to set and retreieve the current // state of the plugin installer. void set_plugin_installer_state(PluginInstallerState new_state) { plugin_installer_state_ = new_state; } PluginInstallerState plugin_installer_state() const { return plugin_installer_state_; } // Getter for the NPP instance member. const NPP instance() const { return instance_; } // Returns whether or not the UI layout is right-to-left (such as Hebrew or // Arabic). bool IsRTLLayout() const; protected: // Displays the plugin install confirmation dialog. void ShowInstallDialog(); // Clears the current display state. void ClearDisplay(); // Displays the status message identified by the message resource id // passed in. // // Parameters: // message_resource_id parameter // The resource id of the message to be displayed. void DisplayStatus(int message_resource_id); // Displays status information for the third party plugin which is needed // by the page. void DisplayAvailablePluginStatus(); // Displays information related to third party plugin download failure. void DisplayPluginDownloadFailedStatus(); // Enables the plugin window if required and initiates an update of the // the plugin window. void RefreshDisplay(); // Create tooltip window. bool CreateToolTip(); // Update ToolTip text with the message shown inside the default plugin. void UpdateToolTip(); // Resolves the relative URL (could be already an absolute URL too) to return // full URL based on current document's URL and base. // // Parameters: // instance // The plugins opaque instance handle. // relative_url // The URL to be resolved. // Returns the resolved URL. std::string ResolveURL(NPP instance, const std::string& relative_url); // Initializes resources like the icon, fonts, etc needed by the plugin // installer // // Parameters: // module_handle // Handle to the dll in which this object is instantiated. // Returns true on success. bool InitializeResources(void *module_handle); // Parses the plugin instantiation arguments. This includes checking for // whether this is an activex install and reading the appropriate // arguments like codebase, etc. For plugin installs we download the // plugin finder URL and initalize the mime type and the plugin instance // info. // // Parameters: // module_handle // The handle to the dll in which this object is instantiated. // instance // The plugins opaque instance handle. // mime_type // Identifies the third party plugin which would be eventually installed. // argc // Indicates the count of arguments passed in from the webpage. // argv // Pointer to the arguments. // raw_activex_clsid // Output parameter which contains the CLSID of the Activex plugin needed. // This is only applicable if the webpage specifically requests an ActiveX // control. // Returns true on success. bool ParseInstantiationArguments(NPMIMEType mime_type, NPP instance, int16 argc, char* argn[], char* argv[], std::string* raw_activex_clsid); // Paints user action messages to the plugin window. These include messages // like whether the user should click on the plugin window to download the // plugin, etc. // // Parameters: // paint_dc // The device context returned in BeginPaint. // x_origin // Horizontal reference point indicating where the text is to be displayed. // y_origin // Vertical reference point indicating where the text is to be displayed. // void PaintUserActionInformation(gfx::NativeDrawingContext paint_dc, int x_origin, int y_origin); private: // Notify the renderer that plugin is available to download. void NotifyPluginStatus(int status); // The plugins opaque instance handle NPP instance_; // If this is to install activex bool is_activex_; // The plugin instantiation mode (NP_FULL or NP_EMBED) int16 mode_; // The handle to the icon displayed in the plugin installation window. // HICON icon_; // The Get plugin link message string displayed at the top left corner of // the plugin window. std::wstring get_plugin_link_message_; // The command string displayed in the plugin installation window. std::wstring command_; // An additional message displayed at times by the plugin. std::wstring optional_additional_message_; // The current stream. NPStream* plugin_install_stream_; // The plugin finder URL. std::string plugin_finder_url_; // The desired mime type. std::string mime_type_; // The desired language. std::string desired_language_; // The plugin name. std::wstring plugin_name_; // The actual download URL. std::string plugin_download_url_; // Indicates if the plugin download URL points to an exe. bool plugin_download_url_for_display_; // The current state of the plugin installer. PluginInstallerState plugin_installer_state_; // Used to display the UI for plugin installation. // PluginInstallDialog install_dialog_; // To enable auto refresh of the plugin window once the installation // is complete, we spawn the installation process in a job, and monitor // IO completion events on the job. When the active process count of the // job falls to zero, we initiate an auto refresh of the plugin list // which enables the downloaded plugin to be instantiated. // The completion events from the job are monitored in an independent // thread. // scoped_refptr // installation_job_monitor_thread_; // This object handles download and parsing of the plugins database. // PluginDatabaseHandler plugin_database_handler_; // Indicates if the left click to download/refresh should be enabled or not. bool enable_click_; // Handles to the fonts used to display text in the plugin window. // HFONT bold_font_; // HFONT regular_font_; // HFONT underline_font_; // Tooltip Window. gfx::NativeWindow tooltip_; DISALLOW_EVIL_CONSTRUCTORS(PluginInstallerImpl); }; #endif // WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_