summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser_resources.grd6
-rw-r--r--chrome/browser/chrome_plugin_message_filter.cc19
-rw-r--r--chrome/browser/chrome_plugin_message_filter.h3
-rw-r--r--chrome/browser/plugin_finder.cc101
-rw-r--r--chrome/browser/plugin_finder.h54
-rw-r--r--chrome/browser/plugin_installer_infobar_delegate.cc35
-rw-r--r--chrome/browser/plugin_installer_infobar_delegate.h13
-rw-r--r--chrome/browser/plugin_observer.cc49
-rw-r--r--chrome/browser/plugin_observer.h13
-rw-r--r--chrome/browser/resources/plugins_mac.json173
-rw-r--r--chrome/browser/resources/plugins_win.json166
11 files changed, 611 insertions, 21 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 630f21a..fa9a07c 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -86,6 +86,12 @@
<include name="IDR_NOTIFICATION_ICON_HTML" file="resources\notification_icon.html" type="BINDATA" />
<include name="IDR_PLUGINS_HTML" file="resources\plugins.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
<include name="IDR_PLUGINS_JS" file="resources\plugins.js" type="BINDATA" />
+ <if expr="is_win">
+ <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_win.json" type="BINDATA" />
+ </if>
+ <if expr="is_macosx">
+ <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_mac.json" type="BINDATA" />
+ </if>
<include name="IDR_POLICY_CSS" file="resources\policy.css" type="BINDATA"/>
<include name="IDR_POLICY_HTML" file="resources\policy.html" flattenhtml="true" allowexternalscript="true" type="BINDATA"/>
<include name="IDR_POLICY_JS" file="resources\policy.js" type="BINDATA"/>
diff --git a/chrome/browser/chrome_plugin_message_filter.cc b/chrome/browser/chrome_plugin_message_filter.cc
index fee4c01..9d9677b 100644
--- a/chrome/browser/chrome_plugin_message_filter.cc
+++ b/chrome/browser/chrome_plugin_message_filter.cc
@@ -93,7 +93,6 @@ void ChromePluginMessageFilter::OnDownloadUrlOnFileThread(
context,
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
}
-
#endif
void ChromePluginMessageFilter::OnGetPluginFinderUrl(
@@ -136,8 +135,10 @@ void ChromePluginMessageFilter::HandleMissingPluginStatus(
InfoBarTabHelper* infobar_helper = tcw->infobar_tab_helper();
if (status == webkit::npapi::default_plugin::MISSING_PLUGIN_AVAILABLE) {
- infobar_helper->AddInfoBar(
- new PluginInstallerInfoBarDelegate(infobar_helper, window));
+ infobar_helper->AddInfoBar(new PluginInstallerInfoBarDelegate(
+ infobar_helper, string16(), GURL(),
+ base::Bind(&ChromePluginMessageFilter::InstallMissingPlugin,
+ base::Unretained(window))));
return;
}
@@ -157,3 +158,15 @@ void ChromePluginMessageFilter::HandleMissingPluginStatus(
NOTIMPLEMENTED();
#endif // OS_WIN
}
+
+// static
+void ChromePluginMessageFilter::InstallMissingPlugin(gfx::NativeWindow window) {
+#if defined(OS_WIN)
+ ::PostMessage(window,
+ webkit::npapi::default_plugin::kInstallMissingPluginMessage,
+ 0,
+ 0);
+#else
+ NOTIMPLEMENTED();
+#endif // OS_WIN
+}
diff --git a/chrome/browser/chrome_plugin_message_filter.h b/chrome/browser/chrome_plugin_message_filter.h
index 08bc147..67642ca 100644
--- a/chrome/browser/chrome_plugin_message_filter.h
+++ b/chrome/browser/chrome_plugin_message_filter.h
@@ -52,12 +52,13 @@ class ChromePluginMessageFilter : public IPC::ChannelProxy::MessageFilter,
int render_view_id,
gfx::NativeWindow window);
- // static
static void HandleMissingPluginStatus(int status,
int render_process_id,
int render_view_id,
gfx::NativeWindow window);
+ static void InstallMissingPlugin(gfx::NativeWindow window);
+
PluginProcessHost* process_;
DISALLOW_COPY_AND_ASSIGN(ChromePluginMessageFilter);
diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc
new file mode 100644
index 0000000..eee7757
--- /dev/null
+++ b/chrome/browser/plugin_finder.cc
@@ -0,0 +1,101 @@
+// 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/browser/plugin_finder.h"
+
+#include "base/bind.h"
+#include "base/json/json_reader.h"
+#include "base/message_loop.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/common/pref_names.h"
+#include "content/public/browser/browser_thread.h"
+#include "googleurl/src/gurl.h"
+#include "grit/browser_resources.h"
+#include "ui/base/resource/resource_bundle.h"
+
+PluginFinder* PluginFinder::GetInstance() {
+ return Singleton<PluginFinder>::get();
+}
+
+PluginFinder::PluginFinder() {
+#if defined(OS_WIN) || defined(OS_MACOSX)
+ base::StringPiece json_resource(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_PLUGIN_DB_JSON));
+ bool allow_trailing_comma = false;
+ std::string error_str;
+ scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
+ json_resource.as_string(),
+ allow_trailing_comma,
+ NULL,
+ &error_str));
+ DLOG_IF(ERROR, !value.get()) << error_str;
+ if (value->IsType(base::Value::TYPE_DICTIONARY)) {
+ base::DictionaryValue* dict =
+ static_cast<base::DictionaryValue*>(value.get());
+ base::ListValue* list = NULL;
+ dict->GetList("plugins", &list);
+ plugin_list_.reset(list->DeepCopy());
+ }
+ DCHECK(plugin_list_.get());
+#endif
+ if (!plugin_list_.get())
+ plugin_list_.reset(new base::ListValue());
+}
+
+PluginFinder::~PluginFinder() {
+}
+
+void PluginFinder::FindPlugin(
+ const std::string& mime_type,
+ const std::string& language,
+ const FindPluginCallback& found_callback,
+ const base::Closure& not_found_callback) {
+ if (g_browser_process->local_state()->GetBoolean(
+ prefs::kDisablePluginFinder)) {
+ MessageLoop::current()->PostTask(FROM_HERE, not_found_callback);
+ return;
+ }
+ for (ListValue::const_iterator plugin_it = plugin_list_->begin();
+ plugin_it != plugin_list_->end(); ++plugin_it) {
+ if (!(*plugin_it)->IsType(base::Value::TYPE_DICTIONARY)) {
+ NOTREACHED();
+ continue;
+ }
+ const base::DictionaryValue* plugin =
+ static_cast<const base::DictionaryValue*>(*plugin_it);
+ std::string language_str;
+ bool success = plugin->GetString("lang", &language_str);
+ DCHECK(success);
+ if (language_str != language)
+ continue;
+ ListValue* mime_types = NULL;
+ success = plugin->GetList("mime_types", &mime_types);
+ DCHECK(success);
+ for (ListValue::const_iterator mime_type_it = mime_types->begin();
+ mime_type_it != mime_types->end(); ++mime_type_it) {
+ std::string mime_type_str;
+ success = (*mime_type_it)->GetAsString(&mime_type_str);
+ DCHECK(success);
+ if (mime_type_str == mime_type) {
+ std::string url;
+ success = plugin->GetString("url", &url);
+ DCHECK(success);
+ string16 name;
+ success = plugin->GetString("name", &name);
+ DCHECK(success);
+ bool display_url = false;
+ plugin->GetBoolean("displayurl", &display_url);
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(found_callback, GURL(url), name, display_url));
+ return;
+ }
+ }
+ }
+ MessageLoop::current()->PostTask(FROM_HERE, not_found_callback);
+}
+
diff --git a/chrome/browser/plugin_finder.h b/chrome/browser/plugin_finder.h
new file mode 100644
index 0000000..e9b18d0
--- /dev/null
+++ b/chrome/browser/plugin_finder.h
@@ -0,0 +1,54 @@
+// 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_BROWSER_PLUGIN_FINDER_H_
+#define CHROME_BROWSER_PLUGIN_FINDER_H_
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/singleton.h"
+#include "base/string16.h"
+
+namespace base {
+class ListValue;
+}
+
+class GURL;
+
+class PluginFinder {
+ public:
+ // If |display_url| is false, |plugin_url| is the URL of the download page for
+ // the plug-in, which should be opened in a new tab. If it is true,
+ // |plugin_url| is the URL of the plug-in installer binary, which can be
+ // directly downloaded.
+ typedef base::Callback<void(GURL /* plugin_url */,
+ string16 /* name */,
+ bool /* display_url */)> FindPluginCallback;
+
+ static PluginFinder* GetInstance();
+
+ // Finds a plug-in for the given MIME type and language (specified as an IETF
+ // language tag, i.e. en-US) and calls one of the two passed in callbacks,
+ // depending on whether a plug-in is found.
+ void FindPlugin(const std::string& mime_type,
+ const std::string& language,
+ const FindPluginCallback& found_callback,
+ const base::Closure& not_found_callback);
+
+ private:
+ friend struct DefaultSingletonTraits<PluginFinder>;
+
+ PluginFinder();
+ ~PluginFinder();
+
+ scoped_ptr<base::ListValue> plugin_list_;
+
+ DISALLOW_COPY_AND_ASSIGN(PluginFinder);
+};
+
+#endif // CHROME_BROWSER_PLUGIN_FINDER_H_
diff --git a/chrome/browser/plugin_installer_infobar_delegate.cc b/chrome/browser/plugin_installer_infobar_delegate.cc
index 02b8f2d..01f054b 100644
--- a/chrome/browser/plugin_installer_infobar_delegate.cc
+++ b/chrome/browser/plugin_installer_infobar_delegate.cc
@@ -13,12 +13,16 @@
#include "grit/theme_resources_standard.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
-#include "webkit/plugins/npapi/default_plugin_shared.h"
PluginInstallerInfoBarDelegate::PluginInstallerInfoBarDelegate(
- InfoBarTabHelper* infobar_helper, gfx::NativeWindow window)
+ InfoBarTabHelper* infobar_helper,
+ const string16& plugin_name,
+ const GURL& learn_more_url,
+ const base::Closure& callback)
: ConfirmInfoBarDelegate(infobar_helper),
- window_(window) {
+ plugin_name_(plugin_name),
+ learn_more_url_(learn_more_url),
+ callback_(callback) {
}
PluginInstallerInfoBarDelegate::~PluginInstallerInfoBarDelegate() {
@@ -35,7 +39,11 @@ PluginInstallerInfoBarDelegate*
}
string16 PluginInstallerInfoBarDelegate::GetMessageText() const {
- return l10n_util::GetStringUTF16(IDS_PLUGININSTALLER_MISSINGPLUGIN_PROMPT);
+ // TODO(bauerb): Remove this check when removing the default plug-in.
+ return plugin_name_.empty() ?
+ l10n_util::GetStringUTF16(IDS_PLUGININSTALLER_MISSINGPLUGIN_PROMPT) :
+ l10n_util::GetStringFUTF16(IDS_PLUGININSTALLER_INSTALLPLUGIN_PROMPT,
+ plugin_name_);
}
int PluginInstallerInfoBarDelegate::GetButtons() const {
@@ -49,13 +57,7 @@ string16 PluginInstallerInfoBarDelegate::GetButtonLabel(
}
bool PluginInstallerInfoBarDelegate::Accept() {
- // TODO(PORT) for other platforms.
-#if defined(OS_WIN)
- ::PostMessage(window_,
- webkit::npapi::default_plugin::kInstallMissingPluginMessage,
- 0,
- 0);
-#endif
+ callback_.Run();
return true;
}
@@ -65,9 +67,14 @@ string16 PluginInstallerInfoBarDelegate::GetLinkText() const {
bool PluginInstallerInfoBarDelegate::LinkClicked(
WindowOpenDisposition disposition) {
- owner()->tab_contents()->OpenURL(google_util::AppendGoogleLocaleParam(GURL(
- "https://www.google.com/support/chrome/bin/answer.py?answer=142064")),
- GURL(),
+ GURL url(learn_more_url_);
+ // TODO(bauerb): Remove this check when removing the default plug-in.
+ if (url.is_empty()) {
+ url = google_util::AppendGoogleLocaleParam(GURL(
+ "https://www.google.com/support/chrome/bin/answer.py?answer=142064"));
+ }
+ owner()->tab_contents()->OpenURL(
+ url, GURL(),
(disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
content::PAGE_TRANSITION_LINK);
return false;
diff --git a/chrome/browser/plugin_installer_infobar_delegate.h b/chrome/browser/plugin_installer_infobar_delegate.h
index 519b73a..3d2f68f 100644
--- a/chrome/browser/plugin_installer_infobar_delegate.h
+++ b/chrome/browser/plugin_installer_infobar_delegate.h
@@ -6,15 +6,20 @@
#define CHROME_BROWSER_PLUGIN_INSTALLER_INFOBAR_DELEGATE_H_
#pragma once
+#include "base/callback.h"
#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
-#include "ui/gfx/native_widget_types.h"
+#include "googleurl/src/gurl.h"
// The main purpose for this class is to popup/close the infobar when there is
// a missing plugin.
class PluginInstallerInfoBarDelegate : public ConfirmInfoBarDelegate {
public:
+ // Shows an infobar asking whether to install the plugin with the name
+ // |plugin_name|. When the user accepts, |callback| is called.
PluginInstallerInfoBarDelegate(InfoBarTabHelper* infobar_helper,
- gfx::NativeWindow window);
+ const string16& plugin_name,
+ const GURL& learn_more_url,
+ const base::Closure& callback);
private:
virtual ~PluginInstallerInfoBarDelegate();
@@ -30,7 +35,9 @@ class PluginInstallerInfoBarDelegate : public ConfirmInfoBarDelegate {
virtual string16 GetLinkText() const OVERRIDE;
virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
- gfx::NativeWindow window_;
+ string16 plugin_name_;
+ GURL learn_more_url_;
+ base::Closure callback_;
DISALLOW_COPY_AND_ASSIGN(PluginInstallerInfoBarDelegate);
};
diff --git a/chrome/browser/plugin_observer.cc b/chrome/browser/plugin_observer.cc
index 8c78fcb..73d9a75 100644
--- a/chrome/browser/plugin_observer.cc
+++ b/chrome/browser/plugin_observer.cc
@@ -4,10 +4,14 @@
#include "chrome/browser/plugin_observer.h"
+#include "base/bind.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/google/google_util.h"
#include "chrome/browser/infobars/infobar_tab_helper.h"
+#include "chrome/browser/plugin_finder.h"
+#include "chrome/browser/plugin_installer_infobar_delegate.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
@@ -282,6 +286,7 @@ bool OutdatedPluginInfoBarDelegate::LinkClicked(
PluginObserver::PluginObserver(TabContentsWrapper* tab_contents)
: TabContentsObserver(tab_contents->tab_contents()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
tab_contents_(tab_contents) {
}
@@ -292,6 +297,8 @@ bool PluginObserver::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(PluginObserver, message)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_BlockedOutdatedPlugin,
OnBlockedOutdatedPlugin)
+ IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FindMissingPlugin,
+ OnFindMissingPlugin)
IPC_MESSAGE_UNHANDLED(return false)
IPC_END_MESSAGE_MAP()
@@ -308,3 +315,45 @@ void PluginObserver::OnBlockedOutdatedPlugin(const string16& name,
name)) :
new OutdatedPluginInfoBarDelegate(infobar_helper, name, update_url));
}
+
+void PluginObserver::OnFindMissingPlugin(int placeholder_id,
+ const std::string& mime_type) {
+ PluginFinder* plugin_finder = PluginFinder::GetInstance();
+ std::string lang = "en-US"; // Oh yes.
+ plugin_finder->FindPlugin(
+ mime_type, lang,
+ base::Bind(&PluginObserver::FoundMissingPlugin,
+ weak_ptr_factory_.GetWeakPtr(), placeholder_id, mime_type),
+ base::Bind(&PluginObserver::DidNotFindMissingPlugin,
+ weak_ptr_factory_.GetWeakPtr(), placeholder_id, mime_type));
+}
+
+void PluginObserver::FoundMissingPlugin(int placeholder_id,
+ const std::string& mime_type,
+ const GURL& url,
+ const string16& name,
+ bool display_url) {
+ Send(new ChromeViewMsg_FoundMissingPlugin(placeholder_id, name));
+ InfoBarTabHelper* infobar_helper = tab_contents_->infobar_tab_helper();
+ infobar_helper->AddInfoBar(new PluginInstallerInfoBarDelegate(
+ infobar_helper,
+ name,
+ GURL(), // TODO(bauerb): Get URL from JSON file.
+ base::Bind(&PluginObserver::InstallMissingPlugin,
+ weak_ptr_factory_.GetWeakPtr(), url, display_url)));
+}
+
+void PluginObserver::DidNotFindMissingPlugin(int placeholder_id,
+ const std::string& mime_type) {
+ Send(new ChromeViewMsg_DidNotFindMissingPlugin(placeholder_id));
+}
+
+void PluginObserver::InstallMissingPlugin(const GURL& url,
+ bool display_url) {
+ if (display_url) {
+ tab_contents()->OpenURL(url, tab_contents()->GetURL(), NEW_FOREGROUND_TAB,
+ content::PAGE_TRANSITION_TYPED);
+ } else {
+ NOTIMPLEMENTED();
+ }
+}
diff --git a/chrome/browser/plugin_observer.h b/chrome/browser/plugin_observer.h
index 082a180..a8a2706 100644
--- a/chrome/browser/plugin_observer.h
+++ b/chrome/browser/plugin_observer.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_PLUGIN_OBSERVER_H_
#pragma once
+#include "base/memory/weak_ptr.h"
#include "content/browser/tab_contents/tab_contents_observer.h"
class GURL;
@@ -22,6 +23,18 @@ class PluginObserver : public TabContentsObserver {
private:
void OnBlockedOutdatedPlugin(const string16& name, const GURL& update_url);
+ void OnFindMissingPlugin(int placeholder_id, const std::string& mime_type);
+
+ void FoundMissingPlugin(int placeholder_id,
+ const std::string& mime_type,
+ const GURL& url,
+ const string16& name,
+ bool display_url);
+ void DidNotFindMissingPlugin(int placeholder_id,
+ const std::string& mime_type);
+ void InstallMissingPlugin(const GURL& url, bool display_url);
+
+ base::WeakPtrFactory<PluginObserver> weak_ptr_factory_;
TabContentsWrapper* tab_contents_;
scoped_ptr<InfoBarDelegate> plugin_installer_; // Lazily created.
diff --git a/chrome/browser/resources/plugins_mac.json b/chrome/browser/resources/plugins_mac.json
new file mode 100644
index 0000000..1f0a456
--- /dev/null
+++ b/chrome/browser/resources/plugins_mac.json
@@ -0,0 +1,173 @@
+{
+ "plugins": [
+ {
+ "mime_types": [
+ "application/x-java-applet",
+ "application/x-java-applet,version=1.1",
+ "application/x-java-applet,version=1.1.1",
+ "application/x-java-applet,version=1.1.2",
+ "application/x-java-applet,version=1.1.3",
+ "application/x-java-applet,version=1.2",
+ "application/x-java-applet,version=1.2.1",
+ "application/x-java-applet,version=1.2.2",
+ "application/x-java-applet,version=1.3",
+ "application/x-java-applet,version=1.3.1",
+ "application/x-java-applet,version=1.4",
+ "application/x-java-applet,version=1.4.1",
+ "application/x-java-applet,version=1.4.2",
+ "application/x-java-applet,version=1.5",
+ "application/x-java-applet,version=1.6",
+ "application/x-java-bean",
+ "application/x-java-bean,version=1.1",
+ "application/x-java-bean,version=1.1.1",
+ "application/x-java-bean,version=1.1.2",
+ "application/x-java-bean,version=1.1.3",
+ "application/x-java-bean,version=1.2",
+ "application/x-java-bean,version=1.2.1",
+ "application/x-java-bean,version=1.2.2",
+ "application/x-java-bean,version=1.3",
+ "application/x-java-bean,version=1.3.1",
+ "application/x-java-bean,version=1.4",
+ "application/x-java-bean,version=1.4.1",
+ "application/x-java-bean,version=1.4.2",
+ "application/x-java-bean,version=1.5",
+ "application/x-java-bean,version=1.6",
+ "application/x-java-vm"
+ ],
+ "lang": "en-US",
+ "name": "Java(TM)",
+ "url": "http://java.com/en/download/apple_manual.jsp",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "audio/vnd.rn-realaudio",
+ "video/vnd.rn-realvideo",
+ "audio/x-pn-realaudio-plugin",
+ "audio/x-pn-realaudio"
+ ],
+ "lang": "en-US",
+ "name": "RealPlayer",
+ "url": "http://www.real.com/realplayer/download",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "application/futuresplash",
+ "application/x-shockwave-flash"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Flash Player",
+ "url": "http://get.adobe.com/flashplayer/",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "application/x-director"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Shockwave Player",
+ "url": "http://www.adobe.com/shockwave/download/",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "application/pdf",
+ "application/vnd.adobe.x-mars",
+ "application/vnd.adobe.xdp+xml",
+ "application/vnd.adobe.xfd+xml",
+ "application/vnd.adobe.xfdf",
+ "application/vnd.fdf"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Reader",
+ "url": "http://get.adobe.com/reader/",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "application/sdp",
+ "application/x-mpeg",
+ "application/x-rtsp",
+ "application/x-sdp",
+ "audio/3ggp",
+ "audio/3ggp2",
+ "audio/aac",
+ "audio/ac3",
+ "audio/aiff",
+ "audio/amr",
+ "audio/basic",
+ "audio/mid",
+ "audio/midi",
+ "audio/mp4",
+ "audio/mpeg",
+ "audio/vnd.qcelp",
+ "audio/wav",
+ "audio/x-aac",
+ "audio/x-ac3",
+ "audio/x-aiff",
+ "audio/x-caf",
+ "audio/x-gsm",
+ "audio/x-m4a",
+ "audio/x-m4b",
+ "audio/x-m4p",
+ "audio/x-midi",
+ "audio/x-mpeg",
+ "audio/x-wav",
+ "image/jp2",
+ "image/jpeg2000",
+ "image/jpeg2000-image",
+ "image/pict",
+ "image/png",
+ "image/x-jpeg2000-image",
+ "image/x-macpaint",
+ "image/x-pict",
+ "image/x-png",
+ "image/x-quicktime",
+ "image/x-sgi",
+ "image/x-targa",
+ "video/3ggp",
+ "video/3ggp2",
+ "video/flc",
+ "video/mp4",
+ "video/mpeg",
+ "video/quicktime",
+ "video/sd-video",
+ "video/x-m4v",
+ "video/x-mpeg"
+ ],
+ "lang": "en-US",
+ "name": "QuickTime Player",
+ "url": "http://www.apple.com/quicktime/download/",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "application/asx",
+ "application/x-mplayer2",
+ "application/x-ms-wmp",
+ "audio/x-ms-wax",
+ "audio/x-ms-wma",
+ "video/x-ms-asf",
+ "video/x-ms-asf-plugin",
+ "video/x-ms-wm",
+ "video/x-ms-wmv",
+ "video/x-ms-wvx"
+ ],
+ "lang": "en-US",
+ "name": "Flip4Mac",
+ "url": "http://www.telestream.net/flip4mac-wmv/overview.htm",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "video/divx",
+ "video/x-matroska"
+ ],
+ "lang": "en-US",
+ "name": "DivX Web Player",
+ "url": "http://www.divx.com/en/downloads/divx/mac",
+ "displayurl": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/chrome/browser/resources/plugins_win.json b/chrome/browser/resources/plugins_win.json
new file mode 100644
index 0000000..0549c6c
--- /dev/null
+++ b/chrome/browser/resources/plugins_win.json
@@ -0,0 +1,166 @@
+{
+ "plugins": [
+ {
+ "mime_types": [
+ "application/x-java-applet",
+ "application/x-java-applet,version=1.1",
+ "application/x-java-applet,version=1.1.1",
+ "application/x-java-applet,version=1.1.2",
+ "application/x-java-applet,version=1.1.3",
+ "application/x-java-applet,version=1.2",
+ "application/x-java-applet,version=1.2.1",
+ "application/x-java-applet,version=1.2.2",
+ "application/x-java-applet,version=1.3",
+ "application/x-java-applet,version=1.3.1",
+ "application/x-java-applet,version=1.4",
+ "application/x-java-applet,version=1.4.1",
+ "application/x-java-applet,version=1.4.2",
+ "application/x-java-applet,version=1.5",
+ "application/x-java-applet,version=1.6",
+ "application/x-java-bean",
+ "application/x-java-bean,version=1.1",
+ "application/x-java-bean,version=1.1.1",
+ "application/x-java-bean,version=1.1.2",
+ "application/x-java-bean,version=1.1.3",
+ "application/x-java-bean,version=1.2",
+ "application/x-java-bean,version=1.2.1",
+ "application/x-java-bean,version=1.2.2",
+ "application/x-java-bean,version=1.3",
+ "application/x-java-bean,version=1.3.1",
+ "application/x-java-bean,version=1.4",
+ "application/x-java-bean,version=1.4.1",
+ "application/x-java-bean,version=1.4.2",
+ "application/x-java-bean,version=1.5",
+ "application/x-java-bean,version=1.6",
+ "application/x-java-vm"
+ ],
+ "lang": "en-US",
+ "name": "Java(TM)",
+ "url": "http://java.com/download",
+ "displayurl": true
+ },
+ {
+ "mime_types": [
+ "audio/vnd.rn-realaudio",
+ "video/vnd.rn-realvideo",
+ "audio/x-pn-realaudio-plugin",
+ "audio/x-pn-realaudio"
+ ],
+ "lang": "en-US",
+ "name": "RealPlayer",
+ "url": "http://forms.real.com/real/realone/download.html?type=rpsp_us"
+ },
+ {
+ "mime_types": [
+ "application/futuresplash",
+ "application/x-shockwave-flash"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Flash Player",
+ "url": "http://fpdownload.adobe.com/get/flashplayer/current/install_flash_player.exe"
+ },
+ {
+ "mime_types": [
+ "application/x-director"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Shockwave Player",
+ "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/Shockwave_Installer_Slim.exe"
+ },
+ {
+ "mime_types": [
+ "application/pdf",
+ "application/vnd.adobe.x-mars",
+ "application/vnd.adobe.xdp+xml",
+ "application/vnd.adobe.xfd+xml",
+ "application/vnd.adobe.xfdf",
+ "application/vnd.fdf"
+ ],
+ "lang": "en-US",
+ "name": "Adobe Reader",
+ "url": "http://ardownload.adobe.com/pub/adobe/reader/win/9.x/9.1/enu/AdbeRdr910_en_US.exe"
+ },
+ {
+ "mime_types": [
+ "application/sdp",
+ "application/x-mpeg",
+ "application/x-rtsp",
+ "application/x-sdp",
+ "audio/3ggp",
+ "audio/3ggp2",
+ "audio/aac",
+ "audio/ac3",
+ "audio/aiff",
+ "audio/amr",
+ "audio/basic",
+ "audio/mid",
+ "audio/midi",
+ "audio/mp4",
+ "audio/mpeg",
+ "audio/vnd.qcelp",
+ "audio/wav",
+ "audio/x-aac",
+ "audio/x-ac3",
+ "audio/x-aiff",
+ "audio/x-caf",
+ "audio/x-gsm",
+ "audio/x-m4a",
+ "audio/x-m4b",
+ "audio/x-m4p",
+ "audio/x-midi",
+ "audio/x-mpeg",
+ "audio/x-wav",
+ "image/jp2",
+ "image/jpeg2000",
+ "image/jpeg2000-image",
+ "image/pict",
+ "image/png",
+ "image/x-jpeg2000-image",
+ "image/x-macpaint",
+ "image/x-pict",
+ "image/x-png",
+ "image/x-quicktime",
+ "image/x-sgi",
+ "image/x-targa",
+ "video/3ggp",
+ "video/3ggp2",
+ "video/flc",
+ "video/mp4",
+ "video/mpeg",
+ "video/quicktime",
+ "video/sd-video",
+ "video/x-m4v",
+ "video/x-mpeg"
+ ],
+ "lang": "en-US",
+ "name": "QuickTime Player",
+ "url": "http://appldnld.apple.com.edgesuite.net/content.info.apple.com/QuickTime/061-6118.20090601.Pq3V9/QuickTimeInstaller.exe"
+ },
+ {
+ "mime_types": [
+ "application/asx",
+ "application/x-mplayer2",
+ "application/x-ms-wmp",
+ "audio/x-ms-wax",
+ "audio/x-ms-wma",
+ "video/x-ms-asf",
+ "video/x-ms-asf-plugin",
+ "video/x-ms-wm",
+ "video/x-ms-wmv",
+ "video/x-ms-wvx"
+ ],
+ "lang": "en-US",
+ "name": "Windows Media Player",
+ "url": "http://port25.technet.com/videos/downloads/wmpfirefoxplugin.exe"
+ },
+ {
+ "mime_types": [
+ "video/divx",
+ "video/x-matroska"
+ ],
+ "lang": "en-US",
+ "name": "DivX Web Player",
+ "url": "http://download.divx.com/player/divxdotcom/DivXWebPlayerInstaller.exe"
+ }
+ ]
+} \ No newline at end of file