summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-24 11:27:55 +0000
committerjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-24 11:27:55 +0000
commitd1a087949d9872142c832293435f30d34e367e43 (patch)
tree00e5ce2e8e608a42b29e48e3a4594cbdb0016cd1 /chrome
parent1784b2fff860f2233d946ad5cb4d53c528f61d91 (diff)
downloadchromium_src-d1a087949d9872142c832293435f30d34e367e43.zip
chromium_src-d1a087949d9872142c832293435f30d34e367e43.tar.gz
chromium_src-d1a087949d9872142c832293435f30d34e367e43.tar.bz2
Revert 111519 - Remove default plug-in on Mac, Gtk and Aura.
Aura doesn't do plug-ins, and Mac and Gtk already use in-renderer placeholders. BUG=62079 TEST=none Review URL: http://codereview.chromium.org/8679004 TBR=bauerb@chromium.org Review URL: http://codereview.chromium.org/8676038 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111521 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/chrome_common.gypi13
-rw-r--r--chrome/default_plugin/default_plugin.gyp6
-rw-r--r--chrome/default_plugin/plugin_impl_aura.cc74
-rw-r--r--chrome/default_plugin/plugin_impl_aura.h119
-rw-r--r--chrome/default_plugin/plugin_impl_gtk.cc147
-rw-r--r--chrome/default_plugin/plugin_impl_gtk.h281
-rw-r--r--chrome/default_plugin/plugin_impl_mac.h295
-rw-r--r--chrome/default_plugin/plugin_impl_mac.mm204
8 files changed, 1133 insertions, 6 deletions
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index 3f2f4871..0111b2d 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -32,6 +32,7 @@
'common_constants',
'common_net',
'common_version',
+ 'default_plugin/default_plugin.gyp:default_plugin',
'../base/base.gyp:base',
'../base/base.gyp:base_i18n',
'../base/base.gyp:base_static',
@@ -246,12 +247,7 @@
['OS=="win"', {
'include_dirs': [
'<(DEPTH)/third_party/wtl/include',
- ]
- }],
- ['OS=="win" and use_aura==0', {
- 'dependencies': [
- 'default_plugin/default_plugin.gyp:default_plugin',
- ]
+ ],
}],
['toolkit_uses_gtk == 1', {
'dependencies': [
@@ -268,6 +264,11 @@
'-lXext',
],
},
+ },],
+ ['use_aura==1', {
+ 'dependencies!': [
+ 'default_plugin/default_plugin.gyp:default_plugin',
+ ],
}],
['OS=="linux" and selinux==1', {
'dependencies': [
diff --git a/chrome/default_plugin/default_plugin.gyp b/chrome/default_plugin/default_plugin.gyp
index 30aab78..4d3f600 100644
--- a/chrome/default_plugin/default_plugin.gyp
+++ b/chrome/default_plugin/default_plugin.gyp
@@ -29,6 +29,12 @@
'<(DEPTH)/third_party/wtl/include',
],
'sources': [
+ 'plugin_impl_aura.cc',
+ 'plugin_impl_aura.h',
+ 'plugin_impl_gtk.cc',
+ 'plugin_impl_gtk.h',
+ 'plugin_impl_mac.h',
+ 'plugin_impl_mac.mm',
'plugin_impl_win.cc',
'plugin_impl_win.h',
'plugin_installer_base.cc',
diff --git a/chrome/default_plugin/plugin_impl_aura.cc b/chrome/default_plugin/plugin_impl_aura.cc
new file mode 100644
index 0000000..4122854
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_aura.cc
@@ -0,0 +1,74 @@
+// Copyright (c) 2011 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 "chrome/default_plugin/plugin_impl_aura.h"
+
+#include "base/file_util.h"
+#include "base/path_service.h"
+#include "base/string_util.h"
+#include "chrome/common/chrome_plugin_messages.h"
+#include "chrome/default_plugin/plugin_main.h"
+#include "content/common/child_thread.h"
+#include "content/public/common/content_constants.h"
+#include "googleurl/src/gurl.h"
+#include "grit/webkit_strings.h"
+#include "unicode/locid.h"
+#include "webkit/plugins/npapi/default_plugin_shared.h"
+
+PluginInstallerImpl::PluginInstallerImpl(int16 mode) {}
+
+PluginInstallerImpl::~PluginInstallerImpl() {
+}
+
+bool PluginInstallerImpl::Initialize(void* module_handle,
+ NPP instance,
+ NPMIMEType mime_type,
+ int16 argc,
+ char* argn[],
+ char* argv[]) {
+ DVLOG(1) << __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;
+ }
+
+ PluginInstallerBase::SetRoutingIds(argc, argn, argv);
+ return true;
+}
+
+bool PluginInstallerImpl::NPP_SetWindow(NPWindow* window_info) {
+ NOTIMPLEMENTED();
+ return true;
+}
+
+void PluginInstallerImpl::Shutdown() {
+}
+
+void PluginInstallerImpl::NewStream(NPStream* stream) {
+ NOTIMPLEMENTED();
+}
+
+void PluginInstallerImpl::DestroyStream(NPStream* stream, NPError reason) {
+ NOTIMPLEMENTED();
+}
+
+bool PluginInstallerImpl::WriteReady(NPStream* stream) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
+int32 PluginInstallerImpl::Write(NPStream* stream, int32 offset,
+ int32 buffer_length, void* buffer) {
+ return true;
+}
+
+void PluginInstallerImpl::URLNotify(const char* url, NPReason reason) {
+}
+
+int16 PluginInstallerImpl::NPP_HandleEvent(void* event) {
+ return 0;
+}
diff --git a/chrome/default_plugin/plugin_impl_aura.h b/chrome/default_plugin/plugin_impl_aura.h
new file mode 100644
index 0000000..ed65932b
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_aura.h
@@ -0,0 +1,119 @@
+// Copyright (c) 2011 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_DEFAULT_PLUGIN_PLUGIN_IMPL_AURA_H_
+#define CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_AURA_H_
+#pragma once
+
+#include <string>
+
+#include "chrome/default_plugin/plugin_installer_base.h"
+#include "third_party/npapi/bindings/npapi.h"
+#include "ui/gfx/native_widget_types.h"
+
+// 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 PluginInstallerBase {
+ 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 pass events (for e.g. input events) to the plugin.
+ int16 NPP_HandleEvent(void* event);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PluginInstallerImpl);
+};
+
+#endif // CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_AURA_H_
diff --git a/chrome/default_plugin/plugin_impl_gtk.cc b/chrome/default_plugin/plugin_impl_gtk.cc
new file mode 100644
index 0000000..0da5f30
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_gtk.cc
@@ -0,0 +1,147 @@
+// Copyright (c) 2011 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 "chrome/default_plugin/plugin_impl_gtk.h"
+
+#include <X11/Xdefs.h>
+#include <gtk/gtk.h>
+
+#include "base/file_util.h"
+#include "base/path_service.h"
+#include "base/string_util.h"
+#include "chrome/common/chrome_plugin_messages.h"
+#include "chrome/default_plugin/plugin_main.h"
+#include "content/common/child_thread.h"
+#include "content/public/common/content_constants.h"
+#include "googleurl/src/gurl.h"
+#include "grit/webkit_strings.h"
+#include "unicode/locid.h"
+#include "webkit/plugins/npapi/default_plugin_shared.h"
+
+// TODO(thakis): Most methods in this class are stubbed out an need to be
+// implemented.
+
+PluginInstallerImpl::PluginInstallerImpl(int16 mode)
+ : instance_(NULL),
+ plugin_install_stream_(NULL),
+ plugin_installer_state_(PluginInstallerStateUndefined),
+ 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[]) {
+ DVLOG(1) << __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;
+
+ PluginInstallerBase::SetRoutingIds(argc, argn, argv);
+ 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) {
+ ChildThread::current()->Send(
+ new ChromePluginProcessHostMsg_MissingPluginStatus(
+ status,
+ renderer_process_id(),
+ render_view_id(),
+ 0));
+}
diff --git a/chrome/default_plugin/plugin_impl_gtk.h b/chrome/default_plugin/plugin_impl_gtk.h
new file mode 100644
index 0000000..ac4a04b
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_gtk.h
@@ -0,0 +1,281 @@
+// Copyright (c) 2011 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_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_
+#define CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_
+#pragma once
+
+#include <string>
+
+#include <gtk/gtk.h>
+
+#include "chrome/default_plugin/plugin_installer_base.h"
+#include "third_party/npapi/bindings/npapi.h"
+#include "ui/gfx/native_widget_types.h"
+
+// Possible plugin installer states.
+enum PluginInstallerState {
+ PluginInstallerStateUndefined,
+ PluginListDownloadInitiated,
+ PluginListDownloaded,
+ PluginListDownloadedPluginNotFound,
+ PluginListDownloadFailed,
+ PluginDownloadInitiated,
+ PluginDownloadCompleted,
+ PluginDownloadFailed,
+ PluginInstallerLaunchSuccess,
+ PluginInstallerLaunchFailure
+};
+
+// 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 PluginInstallerBase {
+ 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 pass events (for e.g. input events) to the plugin.
+ 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.
+ 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 // CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_GTK_H_
diff --git a/chrome/default_plugin/plugin_impl_mac.h b/chrome/default_plugin/plugin_impl_mac.h
new file mode 100644
index 0000000..e7b6eb7
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_mac.h
@@ -0,0 +1,295 @@
+// Copyright (c) 2011 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_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_
+#define CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_
+#pragma once
+
+#include <string>
+
+#include "chrome/default_plugin/plugin_installer_base.h"
+#include "third_party/npapi/bindings/npapi.h"
+#include "ui/gfx/native_widget_types.h"
+
+#ifdef __OBJC__
+@class NSImage;
+@class NSString;
+#else
+class NSImage;
+class NSString;
+#endif
+
+// Possible plugin installer states.
+enum PluginInstallerState {
+ PluginInstallerStateUndefined,
+ PluginListDownloadInitiated,
+ PluginListDownloaded,
+ PluginListDownloadedPluginNotFound,
+ PluginListDownloadFailed,
+ PluginDownloadInitiated,
+ PluginDownloadCompleted,
+ PluginDownloadFailed,
+ PluginInstallerLaunchSuccess,
+ PluginInstallerLaunchFailure
+};
+
+// 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 PluginInstallerBase {
+ 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 pass events (for e.g. input events) to the plugin.
+ 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.
+ 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:
+ int16 OnDrawRect(CGContextRef context, CGRect dirty_rect);
+
+ // 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_;
+ // Dimensions of the plugin
+ uint32_t width_;
+ uint32_t height_;
+ // Plugin icon, weak (owned by ResourceBundle).
+ NSImage* image_;
+ // Displayed text
+ NSString* command_;
+
+ DISALLOW_COPY_AND_ASSIGN(PluginInstallerImpl);
+};
+
+
+#endif // CHROME_DEFAULT_PLUGIN_PLUGIN_IMPL_MAC_H_
diff --git a/chrome/default_plugin/plugin_impl_mac.mm b/chrome/default_plugin/plugin_impl_mac.mm
new file mode 100644
index 0000000..36a7dfd
--- /dev/null
+++ b/chrome/default_plugin/plugin_impl_mac.mm
@@ -0,0 +1,204 @@
+// Copyright (c) 2011 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 "chrome/default_plugin/plugin_impl_mac.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/file_util.h"
+#include "base/path_service.h"
+#include "base/string_util.h"
+#include "chrome/common/chrome_plugin_messages.h"
+#include "chrome/default_plugin/plugin_main.h"
+#include "content/common/child_thread.h"
+#include "googleurl/src/gurl.h"
+#include "grit/default_plugin_resources.h"
+#include "grit/webkit_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
+#include "unicode/locid.h"
+#include "webkit/glue/webkit_glue.h"
+#include "webkit/plugins/npapi/default_plugin_shared.h"
+
+// TODO(thakis): Most methods in this class are stubbed out and need to be
+// implemented.
+
+PluginInstallerImpl::PluginInstallerImpl(int16 mode)
+ : image_(nil),
+ command_(nil) {
+}
+
+PluginInstallerImpl::~PluginInstallerImpl() {
+ [command_ release];
+}
+
+bool PluginInstallerImpl::Initialize(void* module_handle, NPP instance,
+ NPMIMEType mime_type, int16 argc,
+ char* argn[], char* argv[]) {
+ DVLOG(1) << __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;
+
+ command_ = [l10n_util::FixUpWindowsStyleLabel(l10n_util::GetStringUTF16(
+ IDS_DEFAULT_PLUGIN_NO_PLUGIN_AVAILABLE_MSG)) retain];
+
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ image_ = rb.GetNativeImageNamed(IDR_PLUGIN_ICON);
+
+ PluginInstallerBase::SetRoutingIds(argc, argn, argv);
+ return true;
+}
+
+bool PluginInstallerImpl::NPP_SetWindow(NPWindow* window_info) {
+ width_ = window_info->width;
+ height_ = window_info->height;
+ 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) {
+ NPCocoaEvent* npp_event = static_cast<NPCocoaEvent*>(event);
+
+ if (npp_event->type == NPCocoaEventDrawRect) {
+ CGContextRef context = npp_event->data.draw.context;
+ CGRect rect = CGRectMake(npp_event->data.draw.x,
+ npp_event->data.draw.y,
+ npp_event->data.draw.width,
+ npp_event->data.draw.height);
+ return OnDrawRect(context, rect);
+ }
+ 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();
+}
+
+int16 PluginInstallerImpl::OnDrawRect(CGContextRef context, CGRect dirty_rect) {
+ gfx::ScopedNSGraphicsContextSaveGState scoped_state;
+ NSGraphicsContext* ns_context = [NSGraphicsContext
+ graphicsContextWithGraphicsPort:context flipped:YES];
+ [NSGraphicsContext setCurrentContext:ns_context];
+
+ // Fill background.
+ NSColor* bg_color = [NSColor colorWithCalibratedRed:252 / 255.0
+ green:235 / 255.0
+ blue:162 / 255.0
+ alpha:1.0];
+ [bg_color setFill];
+ NSRectFill(NSRectFromCGRect(dirty_rect));
+
+ [[NSColor blackColor] set];
+ NSFrameRect(NSMakeRect(0, 0, width_, height_));
+
+ // Drag image.
+ DCHECK(image_);
+ if (image_) {
+ NSPoint point = NSMakePoint((width_ - [image_ size].width) / 2,
+ (height_ + [image_ size].height) / 2);
+ [image_ dissolveToPoint:point fraction:1.0];
+ }
+
+ // Draw text.
+ NSShadow* shadow = [[[NSShadow alloc] init] autorelease];
+ [shadow setShadowColor:[NSColor colorWithDeviceWhite:1.0 alpha:0.5]];
+ [shadow setShadowOffset:NSMakeSize(0, -1)];
+ NSFont* font = [NSFont systemFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSSmallControlSize]];
+ NSDictionary* attributes = [NSDictionary dictionaryWithObjectsAndKeys:
+ font, NSFontAttributeName,
+ [NSColor blackColor], NSForegroundColorAttributeName,
+ shadow, NSShadowAttributeName,
+ nil];
+
+ NSSize text_size = [command_ sizeWithAttributes:attributes];
+ NSPoint label_point = NSMakePoint((width_ - text_size.width) / 2,
+ (height_ - text_size.height) / 2);
+ if (image_)
+ label_point.y += [image_ size].height / 2 + text_size.height / 2 + 10;
+ label_point = NSMakePoint(roundf(label_point.x), roundf(label_point.y));
+ [command_ drawAtPoint:label_point withAttributes:attributes];
+
+ return 1;
+}
+
+
+void PluginInstallerImpl::ShowInstallDialog() {
+}
+
+void PluginInstallerImpl::NotifyPluginStatus(int status) {
+ ChildThread::current()->Send(
+ new ChromePluginProcessHostMsg_MissingPluginStatus(
+ status,
+ renderer_process_id(),
+ render_view_id(),
+ 0));
+}