diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-26 22:23:10 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-26 22:23:10 +0000 |
commit | 118586fd1b8e8a40e22f96dede6aef21d2101a65 (patch) | |
tree | 50b2552fcfbd690f5ba47cb1dbbf648a10072241 | |
parent | 0d3a07fe3b5ab17fca5bdd3b60a32593ac7ffff1 (diff) | |
download | chromium_src-118586fd1b8e8a40e22f96dede6aef21d2101a65.zip chromium_src-118586fd1b8e8a40e22f96dede6aef21d2101a65.tar.gz chromium_src-118586fd1b8e8a40e22f96dede6aef21d2101a65.tar.bz2 |
Part 1 of http://codereview.chromium.org/2079016
BUG=10952
Review URL: http://codereview.chromium.org/2295001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48337 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | webkit/default_plugin/plugin_impl_gtk.cc | 139 | ||||
-rw-r--r-- | webkit/default_plugin/plugin_impl_gtk.h | 283 | ||||
-rw-r--r-- | webkit/default_plugin/plugin_impl_mac.h | 9 | ||||
-rw-r--r-- | webkit/default_plugin/plugin_impl_mac.mm | 8 | ||||
-rw-r--r-- | webkit/default_plugin/plugin_impl_win.cc | 8 |
5 files changed, 435 insertions, 12 deletions
diff --git a/webkit/default_plugin/plugin_impl_gtk.cc b/webkit/default_plugin/plugin_impl_gtk.cc new file mode 100644 index 0000000..cfc599a --- /dev/null +++ b/webkit/default_plugin/plugin_impl_gtk.cc @@ -0,0 +1,139 @@ +// 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. + +#include "webkit/default_plugin/plugin_impl_gtk.h" + +#include <gdk/gdkx.h> + +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/string_util.h" +#include "googleurl/src/gurl.h" +#include "grit/webkit_strings.h" +#include "unicode/locid.h" +#include "webkit/default_plugin/default_plugin_shared.h" +#include "webkit/default_plugin/plugin_main.h" +#include "webkit/glue/webkit_glue.h" + +// TODO(thakis): Most methods in this class are stubbed out an need to be +// implemented. + +PluginInstallerImpl::PluginInstallerImpl(int16 mode) + : container_(NULL) { +} + +PluginInstallerImpl::~PluginInstallerImpl() { + if (container_) + gtk_widget_destroy(container_); +} + +bool PluginInstallerImpl::Initialize(void* module_handle, NPP instance, + NPMIMEType mime_type, int16 argc, + char* argn[], char* argv[]) { + DLOG(INFO) << __FUNCTION__ << " MIME Type : " << mime_type; + DCHECK(instance != NULL); + + if (mime_type == NULL || strlen(mime_type) == 0) { + DLOG(WARNING) << __FUNCTION__ << " Invalid parameters passed in"; + NOTREACHED(); + return false; + } + + instance_ = instance; + mime_type_ = mime_type; + + return true; +} + +bool PluginInstallerImpl::NPP_SetWindow(NPWindow* window_info) { + if (container_) + gtk_widget_destroy(container_); + container_ = gtk_plug_new(reinterpret_cast<XID>(window_info->window)); + + // Add label. + GtkWidget* box = gtk_vbox_new(FALSE, 0); + GtkWidget* label = gtk_label_new("Missing Plug-in"); + gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(container_), box); + + gtk_widget_show_all(container_); + + return true; +} + +void PluginInstallerImpl::Shutdown() { +} + +void PluginInstallerImpl::NewStream(NPStream* stream) { + plugin_install_stream_ = stream; +} + +void PluginInstallerImpl::DestroyStream(NPStream* stream, NPError reason) { + if (stream == plugin_install_stream_) + plugin_install_stream_ = NULL; +} + +bool PluginInstallerImpl::WriteReady(NPStream* stream) { + bool ready_to_accept_data = false; + return ready_to_accept_data; +} + +int32 PluginInstallerImpl::Write(NPStream* stream, int32 offset, + int32 buffer_length, void* buffer) { + return true; +} + +void PluginInstallerImpl::ClearDisplay() { +} + +void PluginInstallerImpl::RefreshDisplay() { +} + +bool PluginInstallerImpl::CreateToolTip() { + return true; +} + +void PluginInstallerImpl::UpdateToolTip() { +} + +void PluginInstallerImpl::DisplayAvailablePluginStatus() { +} + +void PluginInstallerImpl::DisplayStatus(int message_resource_id) { +} + +void PluginInstallerImpl::DisplayPluginDownloadFailedStatus() { +} + +void PluginInstallerImpl::URLNotify(const char* url, NPReason reason) { +} + +int16 PluginInstallerImpl::NPP_HandleEvent(void* event) { + return 0; +} + +std::wstring PluginInstallerImpl::ReplaceStringForPossibleEmptyReplacement( + int message_id_with_placeholders, + int messsage_id_without_placeholders, + const std::wstring& replacement_string) { + return L""; +} + +void PluginInstallerImpl::DownloadPlugin() { +} + +void PluginInstallerImpl::DownloadCancelled() { + DisplayAvailablePluginStatus(); +} + +void PluginInstallerImpl::ShowInstallDialog() { +} + +void PluginInstallerImpl::NotifyPluginStatus(int status) { + default_plugin::g_browser->getvalue( + instance_, + static_cast<NPNVariable>( + default_plugin::kMissingPluginStatusStart + status), + NULL); +} diff --git a/webkit/default_plugin/plugin_impl_gtk.h b/webkit/default_plugin/plugin_impl_gtk.h new file mode 100644 index 0000000..7e2113be --- /dev/null +++ b/webkit/default_plugin/plugin_impl_gtk.h @@ -0,0 +1,283 @@ +// 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. + +#ifndef WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_ +#define WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_ + +#include <string> +#include <vector> + +#include <gtk/gtk.h> + +#include "gfx/native_widget_types.h" +#include "third_party/npapi/bindings/npapi.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[]); + + // Informs the plugin of its window information. + // + // Parameters: + // window_info + // The window info passed to npapi. + bool NPP_SetWindow(NPWindow* window_info); + + // Destroys the install dialog. + 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); + + // Used by the renderer to indicate plugin install through the infobar. + int16 NPP_HandleEvent(void* event); + + 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_; + // The current stream. + NPStream* plugin_install_stream_; + // The desired mime type. + std::string mime_type_; + // The current state of the plugin installer. + PluginInstallerState plugin_installer_state_; + // GtkPlug containing everything in the plugin. + GtkWidget* container_; + + DISALLOW_COPY_AND_ASSIGN(PluginInstallerImpl); +}; + +#endif // WEBKIT_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_ diff --git a/webkit/default_plugin/plugin_impl_mac.h b/webkit/default_plugin/plugin_impl_mac.h index 96686a3..dad298e 100644 --- a/webkit/default_plugin/plugin_impl_mac.h +++ b/webkit/default_plugin/plugin_impl_mac.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -8,8 +8,8 @@ #include <string> #include <vector> -#include "third_party/npapi/bindings/npapi.h" #include "gfx/native_widget_types.h" +#include "third_party/npapi/bindings/npapi.h" // Possible plugin installer states. enum PluginInstallerState { @@ -53,7 +53,7 @@ class PluginInstallerImpl { // argv // Pointer to the arguments. // Returns true on success. - bool Initialize(void *module_handle, NPP instance, NPMIMEType mime_type, + bool Initialize(void* module_handle, NPP instance, NPMIMEType mime_type, int16 argc, char* argn[], char* argv[]); // Informs the plugin of its window information. @@ -277,7 +277,8 @@ class PluginInstallerImpl { // Dimensions of the plugin uint32_t width_; uint32_t height_; - DISALLOW_EVIL_CONSTRUCTORS(PluginInstallerImpl); + + DISALLOW_COPY_AND_ASSIGN(PluginInstallerImpl); }; diff --git a/webkit/default_plugin/plugin_impl_mac.mm b/webkit/default_plugin/plugin_impl_mac.mm index 290fa1c..dd3cac8 100644 --- a/webkit/default_plugin/plugin_impl_mac.mm +++ b/webkit/default_plugin/plugin_impl_mac.mm @@ -172,8 +172,8 @@ void PluginInstallerImpl::ShowInstallDialog() { void PluginInstallerImpl::NotifyPluginStatus(int status) { default_plugin::g_browser->getvalue( - instance_, - static_cast<NPNVariable>( - default_plugin::kMissingPluginStatusStart + status), - NULL); + instance_, + static_cast<NPNVariable>( + default_plugin::kMissingPluginStatusStart + status), + NULL); } diff --git a/webkit/default_plugin/plugin_impl_win.cc b/webkit/default_plugin/plugin_impl_win.cc index 097991d..55b9164 100644 --- a/webkit/default_plugin/plugin_impl_win.cc +++ b/webkit/default_plugin/plugin_impl_win.cc @@ -639,8 +639,8 @@ bool PluginInstallerImpl::InitializeResources(HINSTANCE module_handle) { void PluginInstallerImpl::NotifyPluginStatus(int status) { default_plugin::g_browser->getvalue( - instance_, - static_cast<NPNVariable>( - default_plugin::kMissingPluginStatusStart + status), - NULL); + instance_, + static_cast<NPNVariable>( + default_plugin::kMissingPluginStatusStart + status), + NULL); } |