summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-01-16 15:17:15 +0000
committerBen Murdoch <benm@google.com>2011-01-16 15:18:37 +0000
commitac1e49eb6695f711d72215fcdf9388548942a00d (patch)
tree88c78e7d66603996cf0dc78d7676b11d57a305bd
parentdac52a1b6f0c401bccca1e5713f782a8b26345b3 (diff)
downloadexternal_chromium-ac1e49eb6695f711d72215fcdf9388548942a00d.zip
external_chromium-ac1e49eb6695f711d72215fcdf9388548942a00d.tar.gz
external_chromium-ac1e49eb6695f711d72215fcdf9388548942a00d.tar.bz2
Merge Chromium at 9.0.597.69: Trivial merge by Git.
/branches/597/src@71538 Change-Id: Id9fad65a5e6d2ab901d9c8bff6dbf96ab7977f36
-rw-r--r--build/all.gyp1
-rw-r--r--chrome/browser/autofill/autofill_ie_toolbar_import_win.cc3
-rw-r--r--chrome/browser/automation/automation_provider.cc6
-rw-r--r--chrome/browser/browser_resources.grd1
-rw-r--r--chrome/browser/dom_ui/app_launcher_handler.cc112
-rw-r--r--chrome/browser/dom_ui/app_launcher_handler.h10
-rw-r--r--chrome/browser/dom_ui/bug_report_ui.cc2
-rw-r--r--chrome/browser/dom_ui/new_tab_ui.cc2
-rw-r--r--chrome/browser/dom_ui/shown_sections_handler.cc9
-rw-r--r--chrome/browser/dom_ui/shown_sections_handler.h4
-rw-r--r--chrome/browser/extensions/crx_installer.cc4
-rw-r--r--chrome/browser/extensions/crx_installer_browsertest.cc6
-rw-r--r--chrome/browser/extensions/default_apps.cc157
-rw-r--r--chrome/browser/extensions/default_apps.h69
-rw-r--r--chrome/browser/extensions/default_apps_unittest.cc213
-rw-r--r--chrome/browser/extensions/extension_install_ui.cc53
-rw-r--r--chrome/browser/extensions/extension_install_ui.h6
-rw-r--r--chrome/browser/extensions/extension_omnibox_apitest.cc4
-rw-r--r--chrome/browser/extensions/extensions_service.cc3
-rw-r--r--chrome/browser/gpu_blacklist.cc422
-rw-r--r--chrome/browser/gpu_blacklist.h190
-rw-r--r--chrome/browser/gpu_blacklist_unittest.cc142
-rw-r--r--chrome/browser/gpu_process_host.cc66
-rw-r--r--chrome/browser/gpu_process_host.h7
-rw-r--r--chrome/browser/instant/instant_controller.cc3
-rw-r--r--chrome/browser/net/chrome_url_request_context.cc9
-rw-r--r--chrome/browser/net/chrome_url_request_context.h2
-rw-r--r--chrome/browser/net/pref_proxy_config_service.cc50
-rw-r--r--chrome/browser/net/pref_proxy_config_service.h2
-rw-r--r--chrome/browser/net/pref_proxy_config_service_unittest.cc2
-rw-r--r--chrome/browser/policy/configuration_policy_pref_store.cc4
-rw-r--r--chrome/browser/policy/configuration_policy_pref_store_unittest.cc4
-rw-r--r--chrome/browser/policy/configuration_policy_store_interface.h1
-rw-r--r--chrome/browser/prefs/browser_prefs.cc4
-rw-r--r--chrome/browser/prefs/command_line_pref_store.cc1
-rw-r--r--chrome/browser/printing/print_job_worker.cc21
-rw-r--r--chrome/browser/printing/print_job_worker.h12
-rw-r--r--chrome/browser/profile_impl.cc26
-rw-r--r--chrome/browser/renderer_host/audio_renderer_host.cc9
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.cc34
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm41
-rw-r--r--chrome/browser/resources/gpu_blacklist.json36
-rw-r--r--chrome/browser/resources/new_new_tab.html18
-rw-r--r--chrome/browser/resources/new_new_tab.js5
-rw-r--r--chrome/browser/resources/ntp/apps.js76
-rw-r--r--chrome/browser/resources/options.html3
-rw-r--r--chrome/browser/resources/webstore_app/manifest.json2
-rw-r--r--chrome/browser/speech/speech_input_bubble.cc5
-rw-r--r--chrome/browser/speech/speech_input_bubble.h8
-rw-r--r--chrome/browser/speech/speech_input_bubble_controller.cc63
-rw-r--r--chrome/browser/speech/speech_input_bubble_controller.h30
-rw-r--r--chrome/browser/speech/speech_input_bubble_controller_unittest.cc33
-rw-r--r--chrome/browser/speech/speech_input_bubble_gtk.cc9
-rw-r--r--chrome/browser/speech/speech_input_bubble_mac.mm7
-rw-r--r--chrome/browser/speech/speech_input_bubble_views.cc37
-rw-r--r--chrome/browser/speech/speech_input_dispatcher_host.cc35
-rw-r--r--chrome/browser/speech/speech_input_manager.cc25
-rw-r--r--chrome/browser/speech/speech_input_manager.h4
-rw-r--r--chrome/browser/tab_contents/render_view_host_delegate_helper.cc1
-rw-r--r--chrome/browser/ui/browser.cc7
-rw-r--r--chrome/common/automation_messages_internal.h7
-rw-r--r--chrome/common/chrome_switches.cc23
-rw-r--r--chrome/common/chrome_switches.h6
-rw-r--r--chrome/common/extensions/api/extension_api.json67
-rw-r--r--chrome/common/extensions/docs/a11y.html2
-rw-r--r--chrome/common/extensions/docs/api_index.html2
-rw-r--r--chrome/common/extensions/docs/api_other.html2
-rw-r--r--chrome/common/extensions/docs/apps.html2
-rw-r--r--chrome/common/extensions/docs/autoupdate.html2
-rw-r--r--chrome/common/extensions/docs/background_pages.html2
-rw-r--r--chrome/common/extensions/docs/bookmarks.html2
-rw-r--r--chrome/common/extensions/docs/browserAction.html2
-rw-r--r--chrome/common/extensions/docs/content_scripts.html2
-rw-r--r--chrome/common/extensions/docs/contextMenus.html2
-rw-r--r--chrome/common/extensions/docs/cookies.html2
-rw-r--r--chrome/common/extensions/docs/crx.html2
-rw-r--r--chrome/common/extensions/docs/devguide.html2
-rw-r--r--chrome/common/extensions/docs/docs.html2
-rw-r--r--chrome/common/extensions/docs/events.html2
-rw-r--r--chrome/common/extensions/docs/examples/api/omnibox/extension-docs.zipbin74348 -> 74355 bytes
-rw-r--r--chrome/common/extensions/docs/examples/api/omnibox/simple-example.zipbin1185 -> 1193 bytes
-rw-r--r--chrome/common/extensions/docs/examples/extensions/chrome_search.zipbin3734 -> 5610 bytes
-rw-r--r--chrome/common/extensions/docs/examples/extensions/chrome_search/background.html44
-rw-r--r--chrome/common/extensions/docs/examples/extensions/chrome_search/manifest.json4
-rw-r--r--chrome/common/extensions/docs/examples/extensions/imageinfo.zipbin46603 -> 45565 bytes
-rw-r--r--chrome/common/extensions/docs/experimental.clipboard.html2
-rw-r--r--chrome/common/extensions/docs/experimental.contextMenus.html2
-rw-r--r--chrome/common/extensions/docs/experimental.cookies.html2
-rw-r--r--chrome/common/extensions/docs/experimental.history.html2
-rw-r--r--chrome/common/extensions/docs/experimental.html2
-rw-r--r--chrome/common/extensions/docs/experimental.idle.html2
-rw-r--r--chrome/common/extensions/docs/experimental.infobars.html2
-rw-r--r--chrome/common/extensions/docs/experimental.processes.html2
-rw-r--r--chrome/common/extensions/docs/experimental.proxy.html2
-rw-r--r--chrome/common/extensions/docs/experimental.sidebar.html4
-rw-r--r--chrome/common/extensions/docs/experimental.webNavigation.html2
-rw-r--r--chrome/common/extensions/docs/experimental.webRequest.html2
-rw-r--r--chrome/common/extensions/docs/extension.html2
-rw-r--r--chrome/common/extensions/docs/external_extensions.html2
-rw-r--r--chrome/common/extensions/docs/faq.html2
-rw-r--r--chrome/common/extensions/docs/getstarted.html2
-rw-r--r--chrome/common/extensions/docs/history.html2
-rw-r--r--chrome/common/extensions/docs/hosting.html2
-rw-r--r--chrome/common/extensions/docs/i18n-messages.html2
-rw-r--r--chrome/common/extensions/docs/i18n.html2
-rw-r--r--chrome/common/extensions/docs/idle.html2
-rw-r--r--chrome/common/extensions/docs/index.html2
-rw-r--r--chrome/common/extensions/docs/management.html2
-rw-r--r--chrome/common/extensions/docs/manifest.html2
-rw-r--r--chrome/common/extensions/docs/match_patterns.html2
-rw-r--r--chrome/common/extensions/docs/messaging.html2
-rw-r--r--chrome/common/extensions/docs/notifications.html2
-rw-r--r--chrome/common/extensions/docs/npapi.html3
-rw-r--r--chrome/common/extensions/docs/omnibox.html696
-rw-r--r--chrome/common/extensions/docs/options.html2
-rw-r--r--chrome/common/extensions/docs/override.html2
-rw-r--r--chrome/common/extensions/docs/overview.html2
-rw-r--r--chrome/common/extensions/docs/packaging.html2
-rw-r--r--chrome/common/extensions/docs/pageAction.html2
-rw-r--r--chrome/common/extensions/docs/permission_warnings.html2
-rw-r--r--chrome/common/extensions/docs/samples.html12
-rw-r--r--chrome/common/extensions/docs/samples.json454
-rw-r--r--chrome/common/extensions/docs/static/npapi.html1
-rw-r--r--chrome/common/extensions/docs/tabs.html2
-rw-r--r--chrome/common/extensions/docs/template/api_template.html2
-rw-r--r--chrome/common/extensions/docs/themes.html2
-rw-r--r--chrome/common/extensions/docs/tut_analytics.html2
-rw-r--r--chrome/common/extensions/docs/tut_debugging.html2
-rw-r--r--chrome/common/extensions/docs/tut_oauth.html2
-rw-r--r--chrome/common/extensions/docs/tutorials.html2
-rw-r--r--chrome/common/extensions/docs/whats_new.html2
-rw-r--r--chrome/common/extensions/docs/windows.html2
-rw-r--r--chrome/common/extensions/docs/xhr.html2
-rw-r--r--chrome/common/extensions/extension_constants.cc2
-rw-r--r--chrome/common/extensions/extension_constants.h3
-rw-r--r--chrome/common/extensions/extension_manifests_unittest.cc2
-rw-r--r--chrome/common/gpu_feature_flags.cc45
-rw-r--r--chrome/common/gpu_feature_flags.h58
-rw-r--r--chrome/common/gpu_feature_flags_unittest.cc51
-rw-r--r--chrome/common/gpu_messages_internal.h12
-rw-r--r--chrome/common/policy_constants.cc1
-rw-r--r--chrome/common/policy_constants.h1
-rw-r--r--chrome/common/pref_names.cc3
-rw-r--r--chrome/common/pref_names.h2
-rw-r--r--chrome/common/resource_dispatcher.cc5
-rw-r--r--chrome/common/sandbox_init_wrapper_mac.cc3
-rw-r--r--chrome/common/sandbox_policy.cc5
-rw-r--r--net/base/mime_sniffer.cc22
-rw-r--r--net/base/ssl_cert_request_info.cc5
-rw-r--r--net/base/ssl_cert_request_info.h3
-rw-r--r--net/base/ssl_false_start_blacklist.txt17
-rw-r--r--net/base/transport_security_state.cc1
-rw-r--r--net/base/transport_security_state_unittest.cc4
-rw-r--r--net/http/http_network_transaction.cc81
-rw-r--r--net/http/http_network_transaction.h5
-rw-r--r--net/http/http_network_transaction_unittest.cc300
-rw-r--r--net/http/http_stream_request.cc48
-rw-r--r--net/http/http_stream_request.h5
-rw-r--r--net/socket/socket_test_util.cc13
-rw-r--r--net/socket/socket_test_util.h6
-rw-r--r--net/socket/ssl_client_socket_mac.cc26
-rw-r--r--net/socket/ssl_client_socket_nss.cc5
-rw-r--r--webkit/glue/resources/webkit_strings_am.xtb2
-rw-r--r--webkit/glue/resources/webkit_strings_ar.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_bg.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_bn.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_ca.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_cs.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_da.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_de.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_el.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_en-GB.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_es-419.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_es.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_et.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_fa.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_fi.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_fil.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_fr.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_gu.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_hi.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_hr.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_hu.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_id.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_it.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_iw.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_ja.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_kn.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_ko.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_lt.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_lv.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_ml.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_mr.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_nl.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_no.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_pl.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_pt-BR.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_pt-PT.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_ro.xtb52
-rw-r--r--webkit/glue/resources/webkit_strings_ru.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_sk.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_sl.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_sr.xtb6
-rw-r--r--webkit/glue/resources/webkit_strings_sv.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_sw.xtb2
-rw-r--r--webkit/glue/resources/webkit_strings_ta.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_te.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_th.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_tr.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_uk.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_vi.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_zh-CN.xtb4
-rw-r--r--webkit/glue/resources/webkit_strings_zh-TW.xtb4
213 files changed, 2905 insertions, 1635 deletions
diff --git a/build/all.gyp b/build/all.gyp
index 9c33cc8..79453dd 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -391,6 +391,7 @@
'../chrome/app/locales/locales.gyp:*',
'../chrome/chrome.gyp:crash_service',
'../chrome/chrome.gyp:page_cycler_tests',
+ '../chrome/chrome.gyp:policy_templates',
'../chrome/chrome.gyp:pyautolib',
'../chrome/chrome.gyp:reliability_tests',
'../chrome/chrome.gyp:startup_tests',
diff --git a/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc b/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
index 2350607..05b7ade 100644
--- a/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
+++ b/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
@@ -249,6 +249,9 @@ bool ImportCurrentUserProfiles(std::vector<AutoFillProfile>* profiles,
}
bool ImportAutofillDataWin(PersonalDataManager* pdm) {
+ // In incognito mode we do not have PDM - and we should not import anything.
+ if (!pdm)
+ return false;
AutoFillImporter *importer = new AutoFillImporter(pdm);
// importer will self delete.
return importer->ImportProfiles();
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc
index 231e875..d903cd9 100644
--- a/chrome/browser/automation/automation_provider.cc
+++ b/chrome/browser/automation/automation_provider.cc
@@ -835,8 +835,10 @@ void AutomationProvider::GetEnabledExtensions(
for (size_t i = 0; i < extensions->size(); ++i) {
const Extension* extension = (*extensions)[i];
DCHECK(extension);
- if (extension->location() == Extension::INTERNAL ||
- extension->location() == Extension::LOAD) {
+ // AutomationProvider only exposes non app internal/loaded extensions.
+ if (!extension->is_app() &&
+ (extension->location() == Extension::INTERNAL ||
+ extension->location() == Extension::LOAD)) {
result->push_back(extension->path());
}
}
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index dc37ee2..b4b335d 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -42,6 +42,7 @@ without changes to the corresponding grd file. etaa -->
<include name="IDR_INCOGNITO_TAB_HTML" file="resources\incognito_tab.html" flattenhtml="true" type="BINDATA" />
<include name="IDR_KEYBOARD_MANIFEST" file="resources\keyboard\manifest.json" type="BINDATA" />
<include name="IDR_FLAGS_HTML" file="resources\flags.html" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_GPU_BLACKLIST" file="resources\gpu_blacklist.json" type="BINDATA" />
<include name="IDR_NEW_INCOGNITO_TAB_THEME_CSS" file="resources\new_incognito_tab_theme.css" flattenhtml="true" type="BINDATA" />
<include name="IDR_NEW_NEW_TAB_HTML" file="resources\new_new_tab.html" flattenhtml="true" type="BINDATA" />
<include name="IDR_NEW_TAB_THEME_CSS" file="resources\new_tab_theme.css" flattenhtml="true" type="BINDATA" />
diff --git a/chrome/browser/dom_ui/app_launcher_handler.cc b/chrome/browser/dom_ui/app_launcher_handler.cc
index 74bea4b..e447da7 100644
--- a/chrome/browser/dom_ui/app_launcher_handler.cc
+++ b/chrome/browser/dom_ui/app_launcher_handler.cc
@@ -12,6 +12,7 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/app_launched_animation.h"
+#include "chrome/browser/dom_ui/shown_sections_handler.h"
#include "chrome/browser/extensions/default_apps.h"
#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/extensions/extensions_service.h"
@@ -75,7 +76,8 @@ bool IsPromoActive(const std::string& path) {
AppLauncherHandler::AppLauncherHandler(ExtensionsService* extension_service)
: extensions_service_(extension_service),
- promo_active_(false) {
+ promo_active_(false),
+ ignore_changes_(false) {
}
AppLauncherHandler::~AppLauncherHandler() {}
@@ -111,16 +113,28 @@ void AppLauncherHandler::CreateAppInfo(const Extension* extension,
}
// static
-bool AppLauncherHandler::HandlePing(const std::string& path) {
- if (path.find(kLaunchWebStorePingURL) != std::string::npos) {
- RecordWebStoreLaunch(IsPromoActive(path));
- return true;
- } else if (path.find(kLaunchAppPingURL) != std::string::npos) {
- RecordAppLaunch(IsPromoActive(path));
- return true;
- }
+bool AppLauncherHandler::HandlePing(Profile* profile, const std::string& path) {
+ bool is_web_store_ping =
+ path.find(kLaunchWebStorePingURL) != std::string::npos;
+ bool is_app_launch_ping =
+ path.find(kLaunchAppPingURL) != std::string::npos;
- return false;
+ // We get called for every URL in chrome://newtab/. Return false if it isn't
+ // one we handle.
+ if (!is_web_store_ping && !is_app_launch_ping)
+ return false;
+
+ bool is_promo_active = IsPromoActive(path);
+
+ if (is_web_store_ping)
+ RecordWebStoreLaunch(is_promo_active);
+ else
+ RecordAppLaunch(is_promo_active);
+
+ if (is_promo_active)
+ profile->GetExtensionsService()->default_apps()->SetPromoHidden();
+
+ return true;
}
DOMMessageHandler* AppLauncherHandler::Attach(DOMUI* dom_ui) {
@@ -146,6 +160,9 @@ void AppLauncherHandler::RegisterMessages() {
void AppLauncherHandler::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
+ if (ignore_changes_)
+ return;
+
switch (type.value) {
case NotificationType::EXTENSION_LOADED:
case NotificationType::EXTENSION_UNLOADED:
@@ -181,29 +198,47 @@ void AppLauncherHandler::FillAppDictionary(DictionaryValue* dictionary) {
}
dictionary->Set("apps", list);
- DefaultApps* default_apps = extensions_service_->default_apps();
- if (default_apps->ShouldShowPromo(extensions_service_->GetAppIds())) {
- dictionary->SetBoolean("showPromo", true);
- default_apps->DidShowPromo();
- promo_active_ = true;
- } else {
- dictionary->SetBoolean("showPromo", false);
- promo_active_ = false;
- }
-
- bool showLauncher =
- CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppLauncher);
- dictionary->SetBoolean("showLauncher", showLauncher);
-
#if defined(OS_MACOSX)
// App windows are not yet implemented on mac.
dictionary->SetBoolean("disableAppWindowLaunch", true);
dictionary->SetBoolean("disableCreateAppShortcut", true);
#endif
+
+ dictionary->SetBoolean(
+ "showLauncher",
+ extensions_service_->default_apps()->ShouldShowAppLauncher(
+ extensions_service_->GetAppIds()));
}
void AppLauncherHandler::HandleGetApps(const ListValue* args) {
DictionaryValue dictionary;
+
+ // Tell the client whether to show the promo for this view. We don't do this
+ // in the case of PREF_CHANGED because:
+ //
+ // a) At that point in time, depending on the pref that changed, it can look
+ // like the set of apps installed has changed, and we will mark the promo
+ // expired.
+ // b) Conceptually, it doesn't really make sense to count a
+ // prefchange-triggered refresh as a promo 'view'.
+ DefaultApps* default_apps = extensions_service_->default_apps();
+ bool promo_just_expired = false;
+ if (default_apps->ShouldShowPromo(extensions_service_->GetAppIds(),
+ &promo_just_expired)) {
+ dictionary.SetBoolean("showPromo", true);
+ promo_active_ = true;
+ } else {
+ if (promo_just_expired) {
+ ignore_changes_ = true;
+ UninstallDefaultApps();
+ ignore_changes_ = false;
+ ShownSectionsHandler::SetShownSection(dom_ui_->GetProfile()->GetPrefs(),
+ THUMB);
+ }
+ dictionary.SetBoolean("showPromo", false);
+ promo_active_ = false;
+ }
+
FillAppDictionary(&dictionary);
dom_ui_->CallJavascriptFunction(L"getAppsCallback", dictionary);
@@ -271,8 +306,10 @@ void AppLauncherHandler::HandleLaunchApp(const ListValue* args) {
if (new_contents != old_contents && browser->tab_count() > 1)
browser->CloseTabContents(old_contents);
- if (extension_id != extension_misc::kWebStoreAppId)
+ if (extension_id != extension_misc::kWebStoreAppId) {
RecordAppLaunch(promo_active_);
+ extensions_service_->default_apps()->SetPromoHidden();
+ }
}
void AppLauncherHandler::HandleSetLaunchType(const ListValue* args) {
@@ -314,17 +351,14 @@ void AppLauncherHandler::HandleHideAppsPromo(const ListValue* args) {
UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
extension_misc::PROMO_CLOSE,
extension_misc::PROMO_BUCKET_BOUNDARY);
- DefaultApps* default_apps = extensions_service_->default_apps();
- const ExtensionIdSet* app_ids = default_apps->GetDefaultApps();
- DCHECK(*app_ids == extensions_service_->GetAppIds());
-
- for (ExtensionIdSet::const_iterator iter = app_ids->begin();
- iter != app_ids->end(); ++iter) {
- if (extensions_service_->GetExtensionById(*iter, true))
- extensions_service_->UninstallExtension(*iter, false);
- }
+ ShownSectionsHandler::SetShownSection(dom_ui_->GetProfile()->GetPrefs(),
+ THUMB);
+ ignore_changes_ = true;
+ UninstallDefaultApps();
extensions_service_->default_apps()->SetPromoHidden();
+ ignore_changes_ = false;
+ HandleGetApps(NULL);
}
void AppLauncherHandler::HandleCreateAppShortcut(const ListValue* args) {
@@ -403,3 +437,13 @@ void AppLauncherHandler::AnimateAppIcon(const Extension* extension,
#endif
}
}
+
+void AppLauncherHandler::UninstallDefaultApps() {
+ DefaultApps* default_apps = extensions_service_->default_apps();
+ const ExtensionIdSet& app_ids = default_apps->default_apps();
+ for (ExtensionIdSet::const_iterator iter = app_ids.begin();
+ iter != app_ids.end(); ++iter) {
+ if (extensions_service_->GetExtensionById(*iter, true))
+ extensions_service_->UninstallExtension(*iter, false);
+ }
+}
diff --git a/chrome/browser/dom_ui/app_launcher_handler.h b/chrome/browser/dom_ui/app_launcher_handler.h
index 2f93c9b..ac711c7 100644
--- a/chrome/browser/dom_ui/app_launcher_handler.h
+++ b/chrome/browser/dom_ui/app_launcher_handler.h
@@ -18,6 +18,7 @@ class ExtensionPrefs;
class ExtensionsService;
class NotificationRegistrar;
class PrefChangeRegistrar;
+class Profile;
namespace gfx {
class Rect;
@@ -38,7 +39,7 @@ class AppLauncherHandler
DictionaryValue* value);
// Callback for pings related to launching apps on the NTP.
- static bool HandlePing(const std::string& path);
+ static bool HandlePing(Profile* profile, const std::string& path);
// DOMMessageHandler implementation.
virtual DOMMessageHandler* Attach(DOMUI* dom_ui);
@@ -91,6 +92,9 @@ class AppLauncherHandler
// Starts the animation of the app icon.
void AnimateAppIcon(const Extension* extension, const gfx::Rect& rect);
+ // Helper that uninstalls all the default apps.
+ void UninstallDefaultApps();
+
// The apps are represented in the extensions model.
scoped_refptr<ExtensionsService> extensions_service_;
@@ -111,6 +115,10 @@ class AppLauncherHandler
// Whether the promo is currently being shown.
bool promo_active_;
+ // When true, we ignore changes to the underlying data rather than immediately
+ // refreshing. This is useful when making many batch updates to avoid flicker.
+ bool ignore_changes_;
+
DISALLOW_COPY_AND_ASSIGN(AppLauncherHandler);
};
diff --git a/chrome/browser/dom_ui/bug_report_ui.cc b/chrome/browser/dom_ui/bug_report_ui.cc
index 74ac629..5bcd846 100644
--- a/chrome/browser/dom_ui/bug_report_ui.cc
+++ b/chrome/browser/dom_ui/bug_report_ui.cc
@@ -196,6 +196,7 @@ void ShowHtmlBugReportView(NSWindow* window, Browser* browser) {
if (feedback_tab_index >=0) {
// Do not refresh screenshot, do not create a new tab
browser->SelectTabContentsAt(feedback_tab_index, true);
+ return;
}
// now for refreshing the last screenshot
@@ -489,6 +490,7 @@ void BugReportData::SendReport() {
BugReportHandler::BugReportHandler(TabContents* tab)
: tab_(tab)
, screenshot_source_(NULL)
+ , bug_report_(NULL)
#if defined(OS_CHROMEOS)
, syslogs_handle_(0)
#endif
diff --git a/chrome/browser/dom_ui/new_tab_ui.cc b/chrome/browser/dom_ui/new_tab_ui.cc
index 817623d..ffad4ee 100644
--- a/chrome/browser/dom_ui/new_tab_ui.cc
+++ b/chrome/browser/dom_ui/new_tab_ui.cc
@@ -605,7 +605,7 @@ void NewTabUI::NewTabHTMLSource::StartDataRequest(const std::string& path,
int request_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (AppLauncherHandler::HandlePing(path)) {
+ if (AppLauncherHandler::HandlePing(profile_, path)) {
return;
} else if (!path.empty() && path[0] != '#') {
// A path under new-tab was requested; it's likely a bad relative
diff --git a/chrome/browser/dom_ui/shown_sections_handler.cc b/chrome/browser/dom_ui/shown_sections_handler.cc
index 52d3ae6..5682ca6 100644
--- a/chrome/browser/dom_ui/shown_sections_handler.cc
+++ b/chrome/browser/dom_ui/shown_sections_handler.cc
@@ -47,6 +47,15 @@ int ShownSectionsHandler::GetShownSections(PrefService* prefs) {
return prefs->GetInteger(prefs::kNTPShownSections);
}
+// static
+void ShownSectionsHandler::SetShownSection(PrefService* prefs,
+ Section section) {
+ int shown_sections = GetShownSections(prefs);
+ shown_sections &= ~ALL_SECTIONS_MASK;
+ shown_sections |= section;
+ prefs->SetInteger(prefs::kNTPShownSections, shown_sections);
+}
+
ShownSectionsHandler::ShownSectionsHandler(PrefService* pref_service)
: pref_service_(pref_service) {
pref_registrar_.Init(pref_service);
diff --git a/chrome/browser/dom_ui/shown_sections_handler.h b/chrome/browser/dom_ui/shown_sections_handler.h
index ad227b4..41c7da8 100644
--- a/chrome/browser/dom_ui/shown_sections_handler.h
+++ b/chrome/browser/dom_ui/shown_sections_handler.h
@@ -43,6 +43,10 @@ class ShownSectionsHandler : public DOMMessageHandler,
// Helper to get the current shown sections.
static int GetShownSections(PrefService* pref_service);
+ // Expands |section|, collapsing any previously expanded section. This is the
+ // same thing that happens if a user clicks on |section|.
+ static void SetShownSection(PrefService* prefs, Section section);
+
// DOMMessageHandler implementation.
virtual void RegisterMessages();
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index efe3ad1..e002314 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -280,7 +280,7 @@ void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir,
return;
}
- if (client_ || extension_->GetFullLaunchURL().is_valid()) {
+ if (client_) {
Extension::DecodeIcon(extension_.get(), Extension::EXTENSION_ICON_LARGE,
&install_icon_);
}
@@ -428,7 +428,7 @@ void CrxInstaller::ReportSuccessFromUIThread() {
// If there is a client, tell the client about installation.
if (client_)
- client_->OnInstallSuccess(extension_.get());
+ client_->OnInstallSuccess(extension_.get(), install_icon_.get());
// Tell the frontend about the installation and hand off ownership of
// extension_ to it.
diff --git a/chrome/browser/extensions/crx_installer_browsertest.cc b/chrome/browser/extensions/crx_installer_browsertest.cc
index 64fee97..f49c577 100644
--- a/chrome/browser/extensions/crx_installer_browsertest.cc
+++ b/chrome/browser/extensions/crx_installer_browsertest.cc
@@ -10,6 +10,8 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/test/ui_test_utils.h"
+class SkBitmap;
+
namespace {
class MockInstallUI : public ExtensionInstallUI {
@@ -25,11 +27,11 @@ class MockInstallUI : public ExtensionInstallUI {
confirmation_requested_ = true;
delegate->InstallUIProceed();
}
- void OnInstallSuccess(const Extension* extension) {
+ void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {
MessageLoopForUI::current()->Quit();
}
void OnInstallFailure(const std::string& error) {
- ADD_FAILURE() << "insall failed";
+ ADD_FAILURE() << "install failed";
MessageLoopForUI::current()->Quit();
}
diff --git a/chrome/browser/extensions/default_apps.cc b/chrome/browser/extensions/default_apps.cc
index 025d834..cee5c32 100644
--- a/chrome/browser/extensions/default_apps.cc
+++ b/chrome/browser/extensions/default_apps.cc
@@ -18,89 +18,146 @@ void DefaultApps::RegisterUserPrefs(PrefService* prefs) {
prefs->RegisterIntegerPref(prefs::kAppsPromoCounter, 0);
}
-DefaultApps::DefaultApps(PrefService* prefs)
- : prefs_(prefs) {
-#if !defined(OS_CHROMEOS)
- // gmail, docs
- ids_.insert("pjkljhegncpnkpknbcohdijeoejaedia");
- ids_.insert("apdfllckaahabafndbhieahigkjlhalf");
-#endif // OS_CHROMEOS
+DefaultApps::DefaultApps(PrefService* prefs,
+ const std::string& application_locale)
+ : prefs_(prefs), application_locale_(application_locale) {
+ // Poppit, Entanglement
+ ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi");
+ ids_.insert("aciahcmjmecflokailenpkdchphgkefd");
}
DefaultApps::~DefaultApps() {}
-const ExtensionIdSet* DefaultApps::GetAppsToInstall() const {
- if (GetDefaultAppsInstalled())
- return NULL;
- else
- return &ids_;
+const ExtensionIdSet& DefaultApps::default_apps() const {
+ return ids_;
}
-const ExtensionIdSet* DefaultApps::GetDefaultApps() const {
- return &ids_;
+bool DefaultApps::DefaultAppSupported() {
+ // On Chrome OS the default apps are installed via a different mechanism.
+#if defined(OS_CHROMEOS)
+ return false;
+#else
+ return DefaultAppsSupportedForLanguage();
+#endif
}
-void DefaultApps::DidInstallApp(const ExtensionIdSet& installed_ids) {
- // If all the default apps have been installed, stop trying to install them.
- // Note that we use std::includes here instead of == because apps might have
- // been manually installed while the the default apps were installing and we
- // wouldn't want to keep trying to install them in that case.
- if (!GetDefaultAppsInstalled() &&
- std::includes(installed_ids.begin(), installed_ids.end(),
- ids_.begin(), ids_.end())) {
+bool DefaultApps::DefaultAppsSupportedForLanguage() {
+ return application_locale_ == "en-US";
+}
+
+bool DefaultApps::ShouldInstallDefaultApps(
+ const ExtensionIdSet& installed_ids) {
+ if (!DefaultAppSupported())
+ return false;
+
+ if (GetDefaultAppsInstalled())
+ return false;
+
+ // If there are any non-default apps installed, we should never try to install
+ // the default apps again, even if the non-default apps are later removed.
+ if (NonDefaultAppIsInstalled(installed_ids)) {
SetDefaultAppsInstalled(true);
+ return false;
}
+
+ return true;
}
-bool DefaultApps::ShouldShowPromo(const ExtensionIdSet& installed_ids) {
-#if defined(OS_CHROMEOS)
- // Don't show the promo at all on Chrome OS.
- return false;
+bool DefaultApps::ShouldShowAppLauncher(const ExtensionIdSet& installed_ids) {
+ // On Chrome OS the default apps are installed via a separate mechanism that
+ // is always enabled. Therefore we always show the launcher.
+#if defined(OS_CHROME)
+ return true;
+#else
+ // The app store only supports en-us at the moment, so we don't show the apps
+ // section by default for users in other locales. But we do show it if a user
+ // from a non-supported locale somehow installs an app (eg by navigating
+ // directly to the store).
+ if (!DefaultAppsSupportedForLanguage())
+ return !installed_ids.empty();
+
+ // For supported locales, we need to wait for all the default apps to be
+ // installed before showing the apps section. We also show it if any
+ // non-default app is installed (eg because the user installed the app in a
+ // previous version of Chrome).
+ if (GetDefaultAppsInstalled() || NonDefaultAppIsInstalled(installed_ids))
+ return true;
+ else
+ return false;
#endif
+}
+
+bool DefaultApps::ShouldShowPromo(const ExtensionIdSet& installed_ids,
+ bool* just_expired) {
+ *just_expired = false;
+
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kForceAppsPromoVisible)) {
return true;
}
- if (GetDefaultAppsInstalled() && GetPromoCounter() < kAppsPromoCounterMax) {
+ if (!DefaultAppSupported())
+ return false;
+
+ if (!GetDefaultAppsInstalled())
+ return false;
+
+ int promo_counter = GetPromoCounter();
+ if (promo_counter <= kAppsPromoCounterMax) {
// If we have the exact set of default apps, show the promo. If we don't
// have the exact set of default apps, this means that the user manually
- // installed one. The promo doesn't make sense if it shows apps the user
- // manually installed, so expire it immediately in that situation.
- if (installed_ids == ids_)
- return true;
- else
+ // installed or uninstalled one. The promo doesn't make sense if it shows
+ // apps the user manually installed, so expire it immediately in that
+ // situation.
+ if (ids_ != installed_ids) {
SetPromoHidden();
+ return false;
+ }
+
+ if (promo_counter == kAppsPromoCounterMax) {
+ *just_expired = true;
+ UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
+ extension_misc::PROMO_EXPIRE,
+ extension_misc::PROMO_BUCKET_BOUNDARY);
+ SetPromoCounter(++promo_counter);
+ return false;
+ } else {
+ UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
+ extension_misc::PROMO_SEEN,
+ extension_misc::PROMO_BUCKET_BOUNDARY);
+ SetPromoCounter(++promo_counter);
+ return true;
+ }
}
return false;
}
-void DefaultApps::DidShowPromo() {
- if (!GetDefaultAppsInstalled()) {
- NOTREACHED() << "Should not show promo until default apps are installed.";
- return;
+void DefaultApps::DidInstallApp(const ExtensionIdSet& installed_ids) {
+ // If all the default apps have been installed, stop trying to install them.
+ // Note that we use std::includes here instead of == because apps might have
+ // been manually installed while the the default apps were installing and we
+ // wouldn't want to keep trying to install them in that case.
+ if (!GetDefaultAppsInstalled() &&
+ std::includes(installed_ids.begin(), installed_ids.end(),
+ ids_.begin(), ids_.end())) {
+ SetDefaultAppsInstalled(true);
}
+}
- int promo_counter = GetPromoCounter();
- if (promo_counter == kAppsPromoCounterMax) {
- NOTREACHED() << "Promo has already been shown the maximum number of times.";
- return;
+bool DefaultApps::NonDefaultAppIsInstalled(
+ const ExtensionIdSet& installed_ids) const {
+ for (ExtensionIdSet::const_iterator iter = installed_ids.begin();
+ iter != installed_ids.end(); ++iter) {
+ if (ids_.find(*iter) == ids_.end())
+ return true;
}
- if (promo_counter < kAppsPromoCounterMax) {
- if (promo_counter + 1 == kAppsPromoCounterMax)
- UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
- extension_misc::PROMO_EXPIRE,
- extension_misc::PROMO_BUCKET_BOUNDARY);
- SetPromoCounter(++promo_counter);
- } else {
- SetPromoHidden();
- }
+ return false;
}
void DefaultApps::SetPromoHidden() {
- SetPromoCounter(kAppsPromoCounterMax);
+ SetPromoCounter(kAppsPromoCounterMax + 1);
}
int DefaultApps::GetPromoCounter() const {
diff --git a/chrome/browser/extensions/default_apps.h b/chrome/browser/extensions/default_apps.h
index 767b2f3..2ff8801 100644
--- a/chrome/browser/extensions/default_apps.h
+++ b/chrome/browser/extensions/default_apps.h
@@ -13,61 +13,59 @@
class PrefService;
-// Manages the installation of the set of default apps into Chrome, and the
-// promotion of those apps in the launcher.
-//
-// It implements the following rules:
-//
-// - Only install default apps once per-profile.
-// - Don't install default apps if any apps are already installed.
-// - Do not start showing the promo until all default apps have been installed.
-// - Do not show the promo if it has been hidden by the user.
-// - Do not show promo after one app has been manually installed or uninstalled.
-// - Do not show promo if the set of installed apps is different than the set of
-// default apps.
-// - Only show promo a certain amount of times.
-//
-// The promo can also be forced on with --force-apps-promo-visible.
+// Encapsulates business logic for:
+// - Whether to install default apps on Chrome startup
+// - Whether to show the app launcher
+// - Whether to show the apps promo in the launcher
class DefaultApps {
public:
- // The maximum number of times to show the apps promo.
+ // The maximum number of times to show the apps promo. The promo counter
+ // actually goes up to this number + 1 because we need to differentiate
+ // between the first time we overflow and subsequent times.
static const int kAppsPromoCounterMax;
// Register our preferences.
static void RegisterUserPrefs(PrefService* prefs);
- explicit DefaultApps(PrefService* prefs);
+ explicit DefaultApps(PrefService* prefs,
+ const std::string& application_locale);
~DefaultApps();
- // Gets the list of default apps that should be installed. Can return NULL if
- // no apps need to be installed.
- const ExtensionIdSet* GetAppsToInstall() const;
+ // Gets the set of default apps.
+ const ExtensionIdSet& default_apps() const;
- // Gets the list of default apps.
- const ExtensionIdSet* GetDefaultApps() const;
+ // Returns true if the default apps should be installed.
+ bool ShouldInstallDefaultApps(const ExtensionIdSet& installed_ids);
+
+ // Returns true if the app launcher in the NTP should be shown.
+ bool ShouldShowAppLauncher(const ExtensionIdSet& installed_ids);
+
+ // Returns true if the apps promo should be displayed in the launcher.
+ //
+ // NOTE: If the default apps have been installed, but |installed_ids| is
+ // different than GetDefaultApps(), this will permanently expire the promo.
+ bool ShouldShowPromo(const ExtensionIdSet& installed_ids, bool* just_expired);
// Should be called after each app is installed. Once installed_ids contains
// all the default apps, GetAppsToInstall() will start returning NULL.
void DidInstallApp(const ExtensionIdSet& installed_ids);
- // Returns true if the apps promo should be displayed in the launcher. This
- // starts returning true once the default apps have all been installed and
- // stops after the promo expires.
- bool ShouldShowPromo(const ExtensionIdSet& installed_ids);
-
- // Should be called after each time the promo is installed.
- void DidShowPromo();
-
// Force the promo to be hidden.
void SetPromoHidden();
private:
- FRIEND_TEST_ALL_PREFIXES(DefaultApps, Basics);
- FRIEND_TEST_ALL_PREFIXES(DefaultApps, HidePromo);
- FRIEND_TEST_ALL_PREFIXES(DefaultApps, InstallingAnAppHidesPromo);
- FRIEND_TEST_ALL_PREFIXES(DefaultApps,
+ FRIEND_TEST_ALL_PREFIXES(ExtensionDefaultApps, HappyPath);
+ FRIEND_TEST_ALL_PREFIXES(ExtensionDefaultApps, UnsupportedLocale);
+ FRIEND_TEST_ALL_PREFIXES(ExtensionDefaultApps, HidePromo);
+ FRIEND_TEST_ALL_PREFIXES(ExtensionDefaultApps, InstallingAnAppHidesPromo);
+ FRIEND_TEST_ALL_PREFIXES(ExtensionDefaultApps,
ManualAppInstalledWhileInstallingDefaultApps);
+ bool DefaultAppSupported();
+ bool DefaultAppsSupportedForLanguage();
+
+ bool NonDefaultAppIsInstalled(const ExtensionIdSet& installed_ids) const;
+
bool GetDefaultAppsInstalled() const;
void SetDefaultAppsInstalled(bool val);
@@ -77,6 +75,9 @@ class DefaultApps {
// Our permanent state is stored in this PrefService instance.
PrefService* prefs_;
+ // The locale the browser is currently in.
+ std::string application_locale_;
+
// The set of default extensions. Initialized to a static list in the
// constructor.
ExtensionIdSet ids_;
diff --git a/chrome/browser/extensions/default_apps_unittest.cc b/chrome/browser/extensions/default_apps_unittest.cc
index 381e679..316568d 100644
--- a/chrome/browser/extensions/default_apps_unittest.cc
+++ b/chrome/browser/extensions/default_apps_unittest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/logging.h"
#include "chrome/browser/extensions/default_apps.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/test/testing_pref_service.h"
@@ -10,97 +11,183 @@
// TODO(dpolukhin): On Chrome OS all apps are installed via external extensions,
// and the web store promo is never shown.
#if !defined(OS_CHROMEOS)
-TEST(DefaultApps, Basics) {
+TEST(ExtensionDefaultApps, HappyPath) {
TestingPrefService pref_service;
DefaultApps::RegisterUserPrefs(&pref_service);
- DefaultApps default_apps(&pref_service);
+ DefaultApps default_apps(&pref_service, "en-US");
- ExtensionIdSet default_app_ids = *default_apps.GetAppsToInstall();
+ const ExtensionIdSet& default_app_ids = default_apps.default_apps();
ASSERT_GT(default_app_ids.size(), 0u);
EXPECT_FALSE(default_apps.GetDefaultAppsInstalled());
EXPECT_EQ(0, default_apps.GetPromoCounter());
- EXPECT_EQ(default_app_ids, *default_apps.GetDefaultApps());
- // The promo should not be shown until the default apps have been installed.
+ // If no apps are installed, the default apps should be installed.
ExtensionIdSet installed_app_ids;
- EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids));
+ EXPECT_TRUE(default_apps.ShouldInstallDefaultApps(installed_app_ids));
+
+ // The launcher should not be shown until the default apps have been
+ // installed.
+ EXPECT_FALSE(default_apps.ShouldShowAppLauncher(installed_app_ids));
+
+ // The promo should not be shown until the default apps have been installed.
+ bool promo_just_expired = false;
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
// Simulate installing the apps one by one and notifying default_apps after
// each intallation. Nothing should change until we have installed all the
// default apps.
- ExtensionIdSet extension_id_sets[] = {
- default_app_ids,
- default_app_ids,
- default_app_ids
- };
- extension_id_sets[0].clear();
- extension_id_sets[1].erase(extension_id_sets[1].begin());
- extension_id_sets[2].erase(extension_id_sets[2].begin(),
- ++extension_id_sets[2].begin());
- for (size_t i = 0; i < arraysize(extension_id_sets); ++i) {
- default_apps.DidInstallApp(extension_id_sets[i]);
- EXPECT_TRUE(default_app_ids == *default_apps.GetAppsToInstall());
+ for (size_t i = 0; i < default_app_ids.size() - 1; ++i) {
+ ExtensionIdSet::const_iterator iter = default_app_ids.begin();
+ for (size_t j = 0; j <= i; ++j)
+ ++iter;
+ installed_app_ids.insert(*iter);
+ default_apps.DidInstallApp(installed_app_ids);
EXPECT_FALSE(default_apps.GetDefaultAppsInstalled());
- EXPECT_FALSE(default_apps.ShouldShowPromo(extension_id_sets[i]));
+ EXPECT_TRUE(default_apps.ShouldInstallDefaultApps(installed_app_ids));
+ EXPECT_FALSE(default_apps.ShouldShowAppLauncher(installed_app_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
}
// Simulate all the default apps being installed. Now we should stop getting
// default apps to install.
- default_apps.DidInstallApp(default_app_ids);
- EXPECT_EQ(NULL, default_apps.GetAppsToInstall());
+ installed_app_ids = default_app_ids;
+ default_apps.DidInstallApp(installed_app_ids);
EXPECT_TRUE(default_apps.GetDefaultAppsInstalled());
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_app_ids));
- // And the promo should become available.
- EXPECT_TRUE(default_apps.ShouldShowPromo(default_app_ids));
+ // And the promo and launcher should become available.
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_app_ids));
+ EXPECT_TRUE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
// The promo should be available up to the max allowed times, then stop.
- for (int i = 0; i < DefaultApps::kAppsPromoCounterMax; ++i) {
- EXPECT_TRUE(default_apps.ShouldShowPromo(default_app_ids));
- default_apps.DidShowPromo();
+ // We start counting at 1 because of the call to ShouldShowPromo() above.
+ for (int i = 1; i < DefaultApps::kAppsPromoCounterMax; ++i) {
+ EXPECT_TRUE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
EXPECT_EQ(i + 1, default_apps.GetPromoCounter());
}
- EXPECT_FALSE(default_apps.ShouldShowPromo(default_app_ids));
- EXPECT_EQ(DefaultApps::kAppsPromoCounterMax, default_apps.GetPromoCounter());
+
+ // The first time, should_show_promo should flip to true, then back to false.
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_TRUE(promo_just_expired);
+ EXPECT_EQ(DefaultApps::kAppsPromoCounterMax + 1,
+ default_apps.GetPromoCounter());
+
+ // Even if all the apps are subsequently removed, the apps section should
+ // remain.
+ installed_app_ids.clear();
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_app_ids));
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_app_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+ EXPECT_EQ(DefaultApps::kAppsPromoCounterMax + 1,
+ default_apps.GetPromoCounter());
+}
+
+TEST(ExtensionDefaultApps, UnsupportedLocale) {
+ TestingPrefService pref_service;
+ DefaultApps::RegisterUserPrefs(&pref_service);
+ DefaultApps default_apps(&pref_service, "fr");
+
+ const ExtensionIdSet& default_app_ids = default_apps.default_apps();
+ EXPECT_GT(default_app_ids.size(), 0u);
+
+ // Since the store only supports en-US at the moment, we don't install default
+ // apps or promote the store.
+ ExtensionIdSet installed_ids;
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowAppLauncher(installed_ids));
+
+ bool promo_just_expired = false;
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+
+ // If the user installs an app manually, then we show the apps section, but
+ // no promotion or default apps.
+ installed_ids.insert(*(default_app_ids.begin()));
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+
+ // Even if the user installs the exact set of default apps, we don't show the
+ // promo.
+ installed_ids = default_app_ids;
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+
+ // If the user uninstalls the apps again, we go back to not showing the
+ // apps section.
+ installed_ids.clear();
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowAppLauncher(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
}
-TEST(DefaultApps, HidePromo) {
+TEST(ExtensionDefaultApps, HidePromo) {
TestingPrefService pref_service;
DefaultApps::RegisterUserPrefs(&pref_service);
- DefaultApps default_apps(&pref_service);
+ DefaultApps default_apps(&pref_service, "en-US");
- ExtensionIdSet default_app_ids = *default_apps.GetAppsToInstall();
+ const ExtensionIdSet& default_app_ids = default_apps.default_apps();
default_apps.DidInstallApp(default_app_ids);
- EXPECT_TRUE(default_apps.ShouldShowPromo(default_app_ids));
- default_apps.DidShowPromo();
+ bool promo_just_expired = false;
+ EXPECT_TRUE(default_apps.ShouldShowPromo(default_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
EXPECT_EQ(1, default_apps.GetPromoCounter());
default_apps.SetPromoHidden();
- EXPECT_FALSE(default_apps.ShouldShowPromo(default_app_ids));
- EXPECT_EQ(DefaultApps::kAppsPromoCounterMax, default_apps.GetPromoCounter());
+ EXPECT_FALSE(default_apps.ShouldShowPromo(default_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+ EXPECT_EQ(DefaultApps::kAppsPromoCounterMax + 1,
+ default_apps.GetPromoCounter());
}
-TEST(DefaultApps, InstallingAnAppHidesPromo) {
+TEST(ExtensionDefaultApps, InstallingAnAppHidesPromo) {
TestingPrefService pref_service;
DefaultApps::RegisterUserPrefs(&pref_service);
- DefaultApps default_apps(&pref_service);
+ DefaultApps default_apps(&pref_service, "en-US");
- ExtensionIdSet default_app_ids = *default_apps.GetAppsToInstall();
+ const ExtensionIdSet& default_app_ids = default_apps.default_apps();
ExtensionIdSet installed_app_ids = default_app_ids;
default_apps.DidInstallApp(installed_app_ids);
- EXPECT_TRUE(default_apps.ShouldShowPromo(installed_app_ids));
- default_apps.DidShowPromo();
+ bool promo_just_expired = false;
+ EXPECT_TRUE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
EXPECT_EQ(1, default_apps.GetPromoCounter());
// Now simulate a new extension being installed. This should cause the promo
// to be hidden.
installed_app_ids.insert("foo");
- EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids));
- EXPECT_EQ(DefaultApps::kAppsPromoCounterMax, default_apps.GetPromoCounter());
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_app_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+ EXPECT_EQ(DefaultApps::kAppsPromoCounterMax + 1,
+ default_apps.GetPromoCounter());
}
-TEST(DefaultApps, ManualAppInstalledWhileInstallingDefaultApps) {
+TEST(ExtensionDefaultApps, ManualAppInstalledWhileInstallingDefaultApps) {
// It is possible to have apps manually installed while the default apps are
// being installed. The network or server might be down, causing the default
// app installation to fail. The updater might take awhile to get around to
@@ -111,27 +198,39 @@ TEST(DefaultApps, ManualAppInstalledWhileInstallingDefaultApps) {
// the default ones.
TestingPrefService pref_service;
DefaultApps::RegisterUserPrefs(&pref_service);
- DefaultApps default_apps(&pref_service);
+ DefaultApps default_apps(&pref_service, "en-US");
// Simulate an app getting installed before the complete set of default apps.
- // This shouldn't affect us installing default apps. We should keep trying.
+ // This should stop the default apps from trying to be installed. The launcher
+ // should also immediately show up.
ExtensionIdSet installed_ids;
installed_ids.insert("foo");
- default_apps.DidInstallApp(installed_ids);
- EXPECT_FALSE(default_apps.GetDefaultAppsInstalled());
- EXPECT_TRUE(default_apps.GetAppsToInstall());
-
- // Now add all the default apps in addition to the extra app. We should stop
- // trying to install default apps.
- installed_ids = *default_apps.GetAppsToInstall();
- installed_ids.insert("foo");
- default_apps.DidInstallApp(installed_ids);
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
EXPECT_TRUE(default_apps.GetDefaultAppsInstalled());
- EXPECT_FALSE(default_apps.GetAppsToInstall());
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_ids));
// The promo shouldn't turn on though, because it would look weird with the
// user's extra, manually installed extensions.
- EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids));
- EXPECT_EQ(DefaultApps::kAppsPromoCounterMax, default_apps.GetPromoCounter());
+ bool promo_just_expired = false;
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+ EXPECT_EQ(DefaultApps::kAppsPromoCounterMax + 1,
+ default_apps.GetPromoCounter());
+
+ // Going back to a subset of the default apps shouldn't allow the default app
+ // install to continue.
+ installed_ids.clear();
+ EXPECT_FALSE(default_apps.ShouldInstallDefaultApps(installed_ids));
+ EXPECT_TRUE(default_apps.GetDefaultAppsInstalled());
+ EXPECT_TRUE(default_apps.ShouldShowAppLauncher(installed_ids));
+ EXPECT_FALSE(default_apps.ShouldShowPromo(installed_ids,
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
+
+ // Going to the exact set of default apps shouldn't show the promo.
+ EXPECT_FALSE(default_apps.ShouldShowPromo(default_apps.default_apps(),
+ &promo_just_expired));
+ EXPECT_FALSE(promo_just_expired);
}
#endif // OS_CHROMEOS
diff --git a/chrome/browser/extensions/extension_install_ui.cc b/chrome/browser/extensions/extension_install_ui.cc
index ce494f0..aca3de6 100644
--- a/chrome/browser/extensions/extension_install_ui.cc
+++ b/chrome/browser/extensions/extension_install_ui.cc
@@ -76,7 +76,22 @@ ExtensionInstallUI::ExtensionInstallUI(Profile* profile)
extension_(NULL),
delegate_(NULL),
prompt_type_(NUM_PROMPT_TYPES),
- ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) {}
+ ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) {
+ // Remember the current theme in case the user presses undo.
+ if (profile_) {
+ const Extension* previous_theme = profile_->GetTheme();
+ if (previous_theme)
+ previous_theme_id_ = previous_theme->id();
+#if defined(TOOLKIT_GTK)
+ // On Linux, we also need to take the user's system settings into account
+ // to undo theme installation.
+ previous_use_system_theme_ =
+ GtkThemeProvider::GetFrom(profile_)->UseGtkTheme();
+#else
+ DCHECK(!previous_use_system_theme_);
+#endif
+ }
+}
ExtensionInstallUI::~ExtensionInstallUI() {
}
@@ -91,20 +106,6 @@ void ExtensionInstallUI::ConfirmInstall(Delegate* delegate,
// immediately installed, and then we show an infobar (see OnInstallSuccess)
// to allow the user to revert if they don't like it.
if (extension->is_theme()) {
- // Remember the current theme in case the user pressed undo.
- const Extension* previous_theme = profile_->GetTheme();
- if (previous_theme)
- previous_theme_id_ = previous_theme->id();
-
-#if defined(TOOLKIT_GTK)
- // On Linux, we also need to take the user's system settings into account
- // to undo theme installation.
- previous_use_system_theme_ =
- GtkThemeProvider::GetFrom(profile_)->UseGtkTheme();
-#else
- DCHECK(!previous_use_system_theme_);
-#endif
-
delegate->InstallUIProceed();
return;
}
@@ -121,18 +122,20 @@ void ExtensionInstallUI::ConfirmUninstall(Delegate* delegate,
ShowConfirmation(UNINSTALL_PROMPT);
}
-void ExtensionInstallUI::OnInstallSuccess(const Extension* extension) {
+void ExtensionInstallUI::OnInstallSuccess(const Extension* extension,
+ SkBitmap* icon) {
+ extension_ = extension;
+ SetIcon(icon);
+
if (extension->is_theme()) {
ShowThemeInfoBar(previous_theme_id_, previous_use_system_theme_,
extension, profile_);
return;
}
- // Note that browser actions don't appear in incognito mode initially,
- // so be sure to use a normal browser window.
- Profile* profile = profile_;
- if (extension->browser_action())
- profile = profile->GetOriginalProfile();
+ // Extensions aren't enabled by default in incognito so we confirm
+ // the install in a normal window.
+ Profile* profile = profile_->GetOriginalProfile();
Browser* browser = Browser::GetOrCreateTabbedBrowser(profile);
if (browser->tab_count() == 0)
browser->AddBlankTab(true);
@@ -180,8 +183,7 @@ void ExtensionInstallUI::OnInstallFailure(const std::string& error) {
UTF8ToUTF16(error));
}
-void ExtensionInstallUI::OnImageLoaded(
- SkBitmap* image, ExtensionResource resource, int index) {
+void ExtensionInstallUI::SetIcon(SkBitmap* image) {
if (image)
icon_ = *image;
else
@@ -195,6 +197,11 @@ void ExtensionInstallUI::OnImageLoaded(
IDR_EXTENSION_DEFAULT_ICON);
}
}
+}
+
+void ExtensionInstallUI::OnImageLoaded(
+ SkBitmap* image, ExtensionResource resource, int index) {
+ SetIcon(image);
switch (prompt_type_) {
case INSTALL_PROMPT: {
diff --git a/chrome/browser/extensions/extension_install_ui.h b/chrome/browser/extensions/extension_install_ui.h
index 6cc8876..1a9b4d7 100644
--- a/chrome/browser/extensions/extension_install_ui.h
+++ b/chrome/browser/extensions/extension_install_ui.h
@@ -68,7 +68,7 @@ class ExtensionInstallUI : public ImageLoadingTracker::Observer {
virtual void ConfirmUninstall(Delegate* delegate, const Extension* extension);
// Installation was successful. This is declared virtual for testing.
- virtual void OnInstallSuccess(const Extension* extension);
+ virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon);
// Installation failed. This is declared virtual for testing.
virtual void OnInstallFailure(const std::string& error);
@@ -88,6 +88,10 @@ class ExtensionInstallUI : public ImageLoadingTracker::Observer {
const Extension* new_theme, Profile* profile);
private:
+ // Sets the icon that will be used in any UI. If |icon| is NULL, or contains
+ // an empty bitmap, then a default icon will be used instead.
+ void SetIcon(SkBitmap* icon);
+
// Starts the process of showing a confirmation UI, which is split into two.
// 1) Set off a 'load icon' task.
// 2) Handle the load icon response and show the UI (OnImageLoaded).
diff --git a/chrome/browser/extensions/extension_omnibox_apitest.cc b/chrome/browser/extensions/extension_omnibox_apitest.cc
index defa068..854662d 100644
--- a/chrome/browser/extensions/extension_omnibox_apitest.cc
+++ b/chrome/browser/extensions/extension_omnibox_apitest.cc
@@ -147,7 +147,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_Basic) {
EXPECT_EQ(ACMatchClassification::MATCH,
result.match_at(1).contents_class[1].style);
- EXPECT_EQ(description.find('>'),
+ EXPECT_EQ(description.find('>') + 1u,
result.match_at(1).contents_class[2].offset);
EXPECT_EQ(ACMatchClassification::NONE,
result.match_at(1).contents_class[2].style);
@@ -157,7 +157,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_Basic) {
EXPECT_EQ(ACMatchClassification::DIM,
result.match_at(1).contents_class[3].style);
- EXPECT_EQ(description.find(']'),
+ EXPECT_EQ(description.find(']') + 1u,
result.match_at(1).contents_class[4].offset);
EXPECT_EQ(ACMatchClassification::NONE,
result.match_at(1).contents_class[4].style);
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index 194d475..6842a84 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -548,7 +548,8 @@ ExtensionsService::ExtensionsService(Profile* profile,
show_extensions_prompts_(true),
ready_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(toolbar_model_(this)),
- default_apps_(profile->GetPrefs()),
+ default_apps_(profile->GetPrefs(),
+ g_browser_process->GetApplicationLocale()),
event_routers_initialized_(false) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
diff --git a/chrome/browser/gpu_blacklist.cc b/chrome/browser/gpu_blacklist.cc
new file mode 100644
index 0000000..6bb33c6
--- /dev/null
+++ b/chrome/browser/gpu_blacklist.cc
@@ -0,0 +1,422 @@
+// 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 "chrome/browser/gpu_blacklist.h"
+
+#include "base/json/json_reader.h"
+#include "base/logging.h"
+#include "base/string_number_conversions.h"
+#include "base/stringprintf.h"
+#include "base/sys_info.h"
+#include "base/values.h"
+#include "base/version.h"
+#include "chrome/common/gpu_info.h"
+
+GpuBlacklist::VersionInfo::VersionInfo(const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2) {
+ op_ = StringToOp(version_op);
+ if (op_ == kUnknown || op_ == kAny)
+ return;
+ version_.reset(Version::GetVersionFromString(version_string));
+ if (version_.get() == NULL) {
+ op_ = kUnknown;
+ return;
+ }
+ if (op_ == kBetween) {
+ version2_.reset(Version::GetVersionFromString(version_string2));
+ if (version2_.get() == NULL)
+ op_ = kUnknown;
+ }
+}
+
+GpuBlacklist::VersionInfo::~VersionInfo() {
+}
+
+bool GpuBlacklist::VersionInfo::Contains(const Version& version) const {
+ if (op_ == kUnknown)
+ return false;
+ if (op_ == kAny)
+ return true;
+ if (op_ == kEQ) {
+ // Handles cases where 10.6 is considered as containing 10.6.*.
+ const std::vector<uint16>& components_reference = version_->components();
+ const std::vector<uint16>& components = version.components();
+ for (size_t i = 0; i < components_reference.size(); ++i) {
+ if (i >= components.size() && components_reference[i] != 0)
+ return false;
+ if (components[i] != components_reference[i])
+ return false;
+ }
+ return true;
+ }
+ int relation = version.CompareTo(*version_);
+ if (op_ == kEQ)
+ return (relation == 0);
+ else if (op_ == kLT)
+ return (relation < 0);
+ else if (op_ == kLE)
+ return (relation <= 0);
+ else if (op_ == kGT)
+ return (relation > 0);
+ else if (op_ == kGE)
+ return (relation >= 0);
+ // op_ == kBetween
+ if (relation < 0)
+ return false;
+ return version.CompareTo(*version2_) <= 0;
+}
+
+bool GpuBlacklist::VersionInfo::IsValid() const {
+ return op_ != kUnknown;
+}
+
+GpuBlacklist::VersionInfo::Op GpuBlacklist::VersionInfo::StringToOp(
+ const std::string& version_op) {
+ if (version_op == "=")
+ return kEQ;
+ else if (version_op == "<")
+ return kLT;
+ else if (version_op == "<=")
+ return kLE;
+ else if (version_op == ">")
+ return kGT;
+ else if (version_op == ">=")
+ return kGE;
+ else if (version_op == "any")
+ return kAny;
+ else if (version_op == "between")
+ return kBetween;
+ return kUnknown;
+}
+
+GpuBlacklist::OsInfo::OsInfo(const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2) {
+ type_ = StringToOsType(os);
+ if (type_ != kOsUnknown) {
+ version_info_.reset(
+ new VersionInfo(version_op, version_string, version_string2));
+ }
+}
+
+bool GpuBlacklist::OsInfo::Contains(OsType type,
+ const Version& version) const {
+ if (!IsValid())
+ return false;
+ if (type_ != type && type_ != kOsAny)
+ return false;
+ return version_info_->Contains(version);
+}
+
+bool GpuBlacklist::OsInfo::IsValid() const {
+ return type_ != kOsUnknown && version_info_->IsValid();
+}
+
+GpuBlacklist::OsType GpuBlacklist::OsInfo::type() const {
+ return type_;
+}
+
+GpuBlacklist::OsType GpuBlacklist::OsInfo::StringToOsType(
+ const std::string& os) {
+ if (os == "win")
+ return kOsWin;
+ else if (os == "macosx")
+ return kOsMacosx;
+ else if (os == "linux")
+ return kOsLinux;
+ else if (os == "any")
+ return kOsAny;
+ return kOsUnknown;
+}
+
+GpuBlacklist::GpuBlacklistEntry*
+GpuBlacklist::GpuBlacklistEntry::GetGpuBlacklistEntryFromValue(
+ DictionaryValue* value) {
+ if (value == NULL)
+ return NULL;
+
+ GpuBlacklistEntry* entry = new GpuBlacklistEntry();
+
+ DictionaryValue* os_value = NULL;
+ if (value->GetDictionary("os", &os_value)) {
+ std::string os_type;
+ std::string os_version_op = "any";
+ std::string os_version_string;
+ std::string os_version_string2;
+ os_value->GetString("type", &os_type);
+ DictionaryValue* os_version_value = NULL;
+ if (os_value->GetDictionary("version", &os_version_value)) {
+ os_version_value->GetString("op", &os_version_op);
+ os_version_value->GetString("number", &os_version_string);
+ os_version_value->GetString("number2", &os_version_string2);
+ }
+ if (!entry->SetOsInfo(os_type, os_version_op, os_version_string,
+ os_version_string2)) {
+ delete entry;
+ return NULL;
+ }
+ }
+
+ std::string vendor_id;
+ if (value->GetString("vendor_id", &vendor_id)) {
+ if (!entry->SetVendorId(vendor_id)) {
+ delete entry;
+ return NULL;
+ }
+ }
+
+ std::string device_id;
+ if (value->GetString("device_id", &device_id)) {
+ if (!entry->SetDeviceId(device_id)) {
+ delete entry;
+ return NULL;
+ }
+ }
+
+ DictionaryValue* driver_version_value = NULL;
+ if (value->GetDictionary("driver_version", &driver_version_value)) {
+ std::string driver_version_op = "any";
+ std::string driver_version_string;
+ std::string driver_version_string2;
+ driver_version_value->GetString("op", &driver_version_op);
+ driver_version_value->GetString("number", &driver_version_string);
+ driver_version_value->GetString("number2", &driver_version_string2);
+ if (!entry->SetDriverVersionInfo(driver_version_op, driver_version_string,
+ driver_version_string2)) {
+ delete entry;
+ return NULL;
+ }
+ }
+
+ ListValue* blacklist_value = NULL;
+ if (!value->GetList("blacklist", &blacklist_value)) {
+ delete entry;
+ return NULL;
+ }
+ std::vector<std::string> blacklist;
+ for (size_t i = 0; i < blacklist_value->GetSize(); ++i) {
+ std::string feature;
+ if (blacklist_value->GetString(i, &feature)) {
+ blacklist.push_back(feature);
+ } else {
+ delete entry;
+ return NULL;
+ }
+ }
+ if (!entry->SetBlacklistedFeatures(blacklist)) {
+ delete entry;
+ return NULL;
+ }
+
+ return entry;
+}
+
+GpuBlacklist::GpuBlacklistEntry::GpuBlacklistEntry()
+ : vendor_id_(0),
+ device_id_(0) {
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::SetOsInfo(
+ const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2) {
+ os_info_.reset(new OsInfo(os, version_op, version_string, version_string2));
+ return os_info_->IsValid();
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::SetVendorId(
+ const std::string& vendor_id_string) {
+ vendor_id_ = 0;
+ return base::HexStringToInt(vendor_id_string,
+ reinterpret_cast<int*>(&vendor_id_));
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::SetDeviceId(
+ const std::string& device_id_string) {
+ device_id_ = 0;
+ return base::HexStringToInt(device_id_string,
+ reinterpret_cast<int*>(&device_id_));
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::SetDriverVersionInfo(
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2) {
+ driver_version_info_.reset(
+ new VersionInfo(version_op, version_string, version_string2));
+ return driver_version_info_->IsValid();
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::SetBlacklistedFeatures(
+ const std::vector<std::string>& blacklisted_features) {
+ size_t size = blacklisted_features.size();
+ if (size == 0)
+ return false;
+ uint32 flags = 0;
+ for (size_t i = 0; i < size; ++i) {
+ GpuFeatureFlags::GpuFeatureType type =
+ GpuFeatureFlags::StringToGpuFeatureType(blacklisted_features[i]);
+ switch (type) {
+ case GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas:
+ case GpuFeatureFlags::kGpuFeatureAcceleratedCompositing:
+ case GpuFeatureFlags::kGpuFeatureWebgl:
+ case GpuFeatureFlags::kGpuFeatureAll:
+ flags |= type;
+ break;
+ case GpuFeatureFlags::kGpuFeatureUnknown:
+ return false;
+ }
+ }
+ feature_flags_.reset(new GpuFeatureFlags());
+ feature_flags_->set_flags(flags);
+ return true;
+}
+
+bool GpuBlacklist::GpuBlacklistEntry::Contains(
+ OsType os_type, const Version& os_version,
+ uint32 vendor_id, uint32 device_id,
+ const Version& driver_version) const {
+ DCHECK(os_type != kOsAny);
+ if (os_info_.get() != NULL && !os_info_->Contains(os_type, os_version))
+ return false;
+ if (vendor_id_ != 0 && vendor_id_ != vendor_id)
+ return false;
+ if (device_id_ != 0 && device_id_ != device_id)
+ return false;
+ if (driver_version_info_.get() == NULL)
+ return true;
+ return driver_version_info_->Contains(driver_version);
+}
+
+GpuBlacklist::OsType GpuBlacklist::GpuBlacklistEntry::GetOsType() const {
+ if (os_info_.get() == NULL)
+ return kOsUnknown;
+ return os_info_->type();
+}
+
+GpuFeatureFlags GpuBlacklist::GpuBlacklistEntry::GetGpuFeatureFlags() const {
+ return *feature_flags_;
+}
+
+GpuBlacklist::GpuBlacklist() {
+}
+
+GpuBlacklist::~GpuBlacklist() {
+ Clear();
+}
+
+bool GpuBlacklist::LoadGpuBlacklist(const std::string& json_context,
+ bool current_os_only) {
+ std::vector<GpuBlacklistEntry*> entries;
+ scoped_ptr<Value> root;
+ root.reset(base::JSONReader::Read(json_context, false));
+ if (root.get() == NULL || !root->IsType(Value::TYPE_DICTIONARY))
+ return false;
+
+ ListValue* list = NULL;
+ static_cast<DictionaryValue*>(root.get())->GetList("entries", &list);
+ if (list == NULL)
+ return false;
+
+ for (size_t i = 0; i < list->GetSize(); ++i) {
+ DictionaryValue* list_item = NULL;
+ bool valid = list->GetDictionary(i, &list_item);
+ if (!valid)
+ break;
+ GpuBlacklistEntry* entry =
+ GpuBlacklistEntry::GetGpuBlacklistEntryFromValue(list_item);
+ if (entry == NULL)
+ break;
+ entries.push_back(entry);
+ }
+
+ if (entries.size() < list->GetSize()) {
+ for (size_t i = 0; i < entries.size(); ++i)
+ delete entries[i];
+ return false;
+ }
+
+ Clear();
+ // Don't apply GPU blacklist for a non-registered OS.
+ OsType os_filter = GetOsType();
+ if (os_filter != kOsUnknown) {
+ for (size_t i = 0; i < entries.size(); ++i) {
+ OsType entry_os = entries[i]->GetOsType();
+ if (!current_os_only ||
+ entry_os == kOsAny || entry_os == os_filter)
+ blacklist_.push_back(entries[i]);
+ else
+ delete entries[i];
+ }
+ }
+ return true;
+}
+
+GpuFeatureFlags GpuBlacklist::DetermineGpuFeatureFlags(
+ GpuBlacklist::OsType os,
+ Version* os_version,
+ const GPUInfo& gpu_info) const {
+ GpuFeatureFlags flags;
+ // No need to go through blacklist entries if GPUInfo isn't available.
+ if (gpu_info.progress() == GPUInfo::kUninitialized)
+ return flags;
+ scoped_ptr<Version> driver_version(
+ Version::GetVersionFromString(gpu_info.driver_version()));
+ if (driver_version.get() == NULL)
+ return flags;
+
+ if (os == kOsAny)
+ os = GetOsType();
+ scoped_ptr<Version> my_os_version;
+ if (os_version == NULL) {
+ std::string version_string;
+#if defined(OS_MACOSX)
+ // Seems like base::SysInfo::OperatingSystemVersion() returns the wrong
+ // version in MacOsx.
+ int32 version_major, version_minor, version_bugfix;
+ base::SysInfo::OperatingSystemVersionNumbers(
+ &version_major, &version_minor, &version_bugfix);
+ version_string = base::StringPrintf("%d.%d.%d",
+ version_major,
+ version_minor,
+ version_bugfix);
+#else
+ version_string = base::SysInfo::OperatingSystemVersion();
+#endif
+ my_os_version.reset(Version::GetVersionFromString(version_string));
+ os_version = my_os_version.get();
+ }
+ DCHECK(os_version != NULL);
+
+ for (size_t i = 0; i < blacklist_.size(); ++i) {
+ if (blacklist_[i]->Contains(os, *os_version,
+ gpu_info.vendor_id(), gpu_info.device_id(),
+ *driver_version)) {
+ flags.Combine(blacklist_[i]->GetGpuFeatureFlags());
+ }
+ }
+ return flags;
+}
+
+GpuBlacklist::OsType GpuBlacklist::GetOsType() {
+#if defined(OS_WIN)
+ return kOsWin;
+#elif defined(OS_LINUX)
+ return kOsLinux;
+#elif defined(OS_MACOSX)
+ return kOsMacosx;
+#else
+ return kOsUnknown;
+#endif
+}
+
+void GpuBlacklist::Clear() {
+ for (size_t i = 0; i < blacklist_.size(); ++i)
+ delete blacklist_[i];
+ blacklist_.clear();
+}
+
diff --git a/chrome/browser/gpu_blacklist.h b/chrome/browser/gpu_blacklist.h
new file mode 100644
index 0000000..ee556b3
--- /dev/null
+++ b/chrome/browser/gpu_blacklist.h
@@ -0,0 +1,190 @@
+// 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 CHROME_BROWSER_GPU_BLACKLIST_H_
+#define CHROME_BROWSER_GPU_BLACKLIST_H_
+#pragma once
+
+// Determines whether certain gpu-related features are blacklisted or not.
+// A valid gpu_blacklist.json file are in the format of
+// {
+// "entries": [
+// { // entry 1
+// },
+// ...
+// { // entry n
+// }
+// ]
+// }
+// Each entry contains the following fields:
+// "os", "vendor_id", "device_id", "driver_version", and "blacklist".
+// Only "blacklist" is mandatory.
+// 1. "os" contains "type" and an optional "version". "type" could be "macosx",
+// "linux", "win", or "any". "any" is the same as not specifying "os".
+// "version" is a VERSION structure (defined later).
+// 2. "vendor_id" has the value of a string.
+// 3. "device_id" has the value of a string.
+// 4. "driver_version" is a VERSION structure (defined later).
+// 5. "blacklist" is a list of gpu feature strings, valid values include
+// "accelerated_2d_canvas", "accelerated_compositing", "webgl", and "all".
+// Currently whatever feature is selected, the effect is the same as "all",
+// i.e., it's not supported to turn off one GPU feature and not the others.
+// VERSION includes "op" "number", and "number2". "op" can be any of the
+// following value: "=", "<", "<=", ">", ">=", "any", "between". "number2" is
+// only used if "op" is "between". "number" is used for all "op" values except
+// "any". "number" and "number2" are in the format of x, x.x, x.x.x, ect.
+// Check out "gpu_blacklist_unittest.cc" for examples.
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "chrome/common/gpu_feature_flags.h"
+
+class DictionaryValue;
+class GPUInfo;
+class Version;
+
+class GpuBlacklist {
+ public:
+ enum OsType {
+ kOsLinux,
+ kOsMacosx,
+ kOsWin,
+ kOsAny,
+ kOsUnknown
+ };
+
+ GpuBlacklist();
+ ~GpuBlacklist();
+
+ // Loads blacklist information from a json file.
+ // current_os_only==true indicates all blacklist entries that don't belong to
+ // the current OS are discarded; current_os_only==false should only be used
+ // for testing purpose.
+ // If failed, the current GpuBlacklist is un-touched.
+ bool LoadGpuBlacklist(const std::string& json_context,
+ bool current_os_only);
+
+ // Collects system information and combines them with gpu_info and blacklist
+ // information to determine gpu feature flags.
+ // If os is kOsAny, use the current OS; if os_version is null, use the
+ // current OS version.
+ GpuFeatureFlags DetermineGpuFeatureFlags(OsType os,
+ Version* os_version,
+ const GPUInfo& gpu_info) const;
+
+ private:
+ class VersionInfo {
+ public:
+ VersionInfo(const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+ ~VersionInfo();
+
+ // Determines if a given version is included in the VersionInfo range.
+ bool Contains(const Version& version) const;
+
+ // Determines if the VersionInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ enum Op {
+ kBetween, // <= * <=
+ kEQ, // =
+ kLT, // <
+ kLE, // <=
+ kGT, // >
+ kGE, // >=
+ kAny,
+ kUnknown // Indicates VersionInfo data is invalid.
+ };
+
+ // Maps string to Op; returns kUnknown if it's not a valid Op.
+ static Op StringToOp(const std::string& version_op);
+
+ Op op_;
+ scoped_ptr<Version> version_;
+ scoped_ptr<Version> version2_;
+ };
+
+ class OsInfo {
+ public:
+ OsInfo(const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ // Determines if a given os/version is included in the OsInfo set.
+ bool Contains(OsType type, const Version& version) const;
+
+ // Determines if the VersionInfo contains valid information.
+ bool IsValid() const;
+
+ OsType type() const;
+
+ // Maps string to OsType; returns kOsUnknown if it's not a valid os.
+ static OsType StringToOsType(const std::string& os);
+
+ private:
+ OsType type_;
+ scoped_ptr<VersionInfo> version_info_;
+ };
+
+ class GpuBlacklistEntry {
+ public:
+ // Constructs GpuBlacklistEntry from DictionaryValue loaded from json.
+ static GpuBlacklistEntry* GetGpuBlacklistEntryFromValue(
+ DictionaryValue* value);
+
+ // Determines if a given os/gc/driver is included in the Entry set.
+ bool Contains(OsType os_type, const Version& os_version,
+ uint32 vendor_id, uint32 device_id,
+ const Version& driver_version) const;
+
+ // Returns the OsType.
+ OsType GetOsType() const;
+
+ // Returns the GpuFeatureFlags.
+ GpuFeatureFlags GetGpuFeatureFlags() const;
+
+ private:
+ GpuBlacklistEntry();
+
+ bool SetOsInfo(const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ bool SetVendorId(const std::string& vendor_id_string);
+
+ bool SetDeviceId(const std::string& device_id_string);
+
+ bool SetDriverVersionInfo(const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ bool SetBlacklistedFeatures(
+ const std::vector<std::string>& blacklisted_features);
+
+ scoped_ptr<OsInfo> os_info_;
+ uint32 vendor_id_;
+ uint32 device_id_;
+ scoped_ptr<VersionInfo> driver_version_info_;
+ scoped_ptr<GpuFeatureFlags> feature_flags_;
+ };
+
+ // Gets the current OS type.
+ static OsType GetOsType();
+
+ void Clear();
+
+ std::vector<GpuBlacklistEntry*> blacklist_;
+
+ DISALLOW_COPY_AND_ASSIGN(GpuBlacklist);
+};
+
+#endif // CHROME_BROWSER_GPU_BLACKLIST_H_
+
diff --git a/chrome/browser/gpu_blacklist_unittest.cc b/chrome/browser/gpu_blacklist_unittest.cc
new file mode 100644
index 0000000..f30d2ab
--- /dev/null
+++ b/chrome/browser/gpu_blacklist_unittest.cc
@@ -0,0 +1,142 @@
+// 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 "base/version.h"
+#include "chrome/browser/gpu_blacklist.h"
+#include "chrome/common/gpu_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(GpuBlacklistTest, BlacklistLogic) {
+ GPUInfo gpu_info;
+ gpu_info.SetGraphicsInfo(0x10de, // Vendor ID
+ 0x0640, // Device ID
+ L"1.6.18", // Driver Version
+ 0x0114, // Pixel Shader Version
+ 0x0114, // Vertex Shader Version
+ 0x0201, // GL version,
+ true); // can_lose_context
+ gpu_info.SetProgress(GPUInfo::kComplete);
+ scoped_ptr<Version> os_version(Version::GetVersionFromString("10.6.4"));
+
+ GpuBlacklist blacklist;
+
+ // Default blacklist settings: all feature are allowed.
+ GpuFeatureFlags flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(), 0u);
+
+ // Empty list: all features are allowed.
+ const std::string empty_list_json =
+ "{\n"
+ " \"name\": \"gpu blacklist\",\n"
+ " \"version\": \"0.0\",\n"
+ " \"entries\": [\n"
+ " ]\n"
+ "}";
+ EXPECT_TRUE(blacklist.LoadGpuBlacklist(empty_list_json, false));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(), 0u);
+
+ // Blacklist accelerated_compositing with exact setting.
+ const std::string exact_list_json =
+ "{\n"
+ " \"name\": \"gpu blacklist\",\n"
+ " \"version\": \"0.1\",\n"
+ " \"entries\": [\n"
+ " {\n"
+ " \"os\": {\n"
+ " \"type\": \"macosx\",\n"
+ " \"version\": {\n"
+ " \"op\": \"=\",\n"
+ " \"number\": \"10.6.4\"\n"
+ " }\n"
+ " },\n"
+ " \"vendor_id\": \"0x10de\",\n"
+ " \"device_id\": \"0x0640\",\n"
+ " \"driver_version\": {\n"
+ " \"op\": \"=\",\n"
+ " \"number\": \"1.6.18\"\n"
+ " },\n"
+ " \"blacklist\": [\n"
+ " \"accelerated_compositing\"\n"
+ " ]\n"
+ " }\n"
+ " ]\n"
+ "}";
+ EXPECT_TRUE(blacklist.LoadGpuBlacklist(exact_list_json, false));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(
+ flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureAcceleratedCompositing));
+
+ // Invalid json input should not change the current blacklist settings.
+ const std::string invalid_json = "invalid";
+ EXPECT_FALSE(blacklist.LoadGpuBlacklist(invalid_json, false));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(
+ flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureAcceleratedCompositing));
+
+ // Blacklist a vendor on all OS.
+ const std::string vendor_json =
+ "{\n"
+ " \"name\": \"gpu blacklist\",\n"
+ " \"version\": \"0.1\",\n"
+ " \"entries\": [\n"
+ " {\n"
+ " \"vendor_id\": \"0x10de\",\n"
+ " \"blacklist\": [\n"
+ " \"webgl\"\n"
+ " ]\n"
+ " }\n"
+ " ]\n"
+ "}";
+ EXPECT_TRUE(blacklist.LoadGpuBlacklist(vendor_json, false));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureWebgl));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsWin, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureWebgl));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsLinux, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureWebgl));
+
+ // Blacklist a vendor on Linux only.
+ const std::string vendor_linux_json =
+ "{\n"
+ " \"name\": \"gpu blacklist\",\n"
+ " \"version\": \"0.1\",\n"
+ " \"entries\": [\n"
+ " {\n"
+ " \"os\": {\n"
+ " \"type\": \"linux\"\n"
+ " },\n"
+ " \"vendor_id\": \"0x10de\",\n"
+ " \"blacklist\": [\n"
+ " \"accelerated_2d_canvas\"\n"
+ " ]\n"
+ " }\n"
+ " ]\n"
+ "}";
+ EXPECT_TRUE(blacklist.LoadGpuBlacklist(vendor_linux_json, false));
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsMacosx, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(), 0u);
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsWin, os_version.get(), gpu_info);
+ EXPECT_EQ(flags.flags(), 0u);
+ flags = blacklist.DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsLinux, os_version.get(), gpu_info);
+ EXPECT_EQ(
+ flags.flags(),
+ static_cast<uint32>(GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas));
+}
+
diff --git a/chrome/browser/gpu_process_host.cc b/chrome/browser/gpu_process_host.cc
index 2ac0534..4c85ad0 100644
--- a/chrome/browser/gpu_process_host.cc
+++ b/chrome/browser/gpu_process_host.cc
@@ -5,20 +5,25 @@
#include "chrome/browser/gpu_process_host.h"
#include "app/app_switches.h"
+#include "app/resource_bundle.h"
#include "base/command_line.h"
#include "base/metrics/histogram.h"
+#include "base/string_piece.h"
#include "base/thread.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_thread.h"
+#include "chrome/browser/gpu_blacklist.h"
#include "chrome/browser/gpu_process_host_ui_shim.h"
#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/browser/renderer_host/render_widget_host_view.h"
#include "chrome/browser/renderer_host/resource_message_filter.h"
#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/gpu_feature_flags.h"
#include "chrome/common/gpu_info.h"
#include "chrome/common/gpu_messages.h"
#include "chrome/common/render_messages.h"
+#include "grit/browser_resources.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_switches.h"
#include "media/base/media_switches.h"
@@ -33,10 +38,16 @@
namespace {
+enum GPUBlacklistTestResult {
+ BLOCKED,
+ ALLOWED,
+ BLACKLIST_TEST_RESULT_MAX
+};
+
enum GPUProcessLifetimeEvent {
- kLaunched,
- kCrashed,
- kGPUProcessLifetimeEvent_Max
+ LAUNCED,
+ CRASHED,
+ GPU_PROCESS_LIFETIME_EVENT_MAX
};
// Tasks used by this file
@@ -75,7 +86,8 @@ void RouteOnUIThread(const IPC::Message& message) {
GpuProcessHost::GpuProcessHost()
: BrowserChildProcessHost(GPU_PROCESS, NULL),
initialized_(false),
- initialized_successfully_(false) {
+ initialized_successfully_(false),
+ blacklist_result_recorded_(false) {
DCHECK_EQ(sole_instance_, static_cast<GpuProcessHost*>(NULL));
}
@@ -97,6 +109,9 @@ bool GpuProcessHost::EnsureInitialized() {
}
bool GpuProcessHost::Init() {
+ if (!LoadGpuBlacklist())
+ return false;
+
if (!CreateChannel())
return false;
@@ -199,8 +214,28 @@ void GpuProcessHost::OnControlMessageReceived(const IPC::Message& message) {
void GpuProcessHost::OnChannelEstablished(
const IPC::ChannelHandle& channel_handle,
const GPUInfo& gpu_info) {
+ GpuFeatureFlags gpu_feature_flags;
+ if (channel_handle.name.size() != 0) {
+ gpu_feature_flags = gpu_blacklist_->DetermineGpuFeatureFlags(
+ GpuBlacklist::kOsAny, NULL, gpu_info);
+ }
const ChannelRequest& request = sent_requests_.front();
- SendEstablishChannelReply(channel_handle, gpu_info, request.filter);
+ // Currently if any of the GPU features are blacklised, we don't establish a
+ // GPU channel.
+ GPUBlacklistTestResult test_result;
+ if (gpu_feature_flags.flags() != 0) {
+ Send(new GpuMsg_CloseChannel(channel_handle));
+ SendEstablishChannelReply(IPC::ChannelHandle(), gpu_info, request.filter);
+ test_result = BLOCKED;
+ } else {
+ SendEstablishChannelReply(channel_handle, gpu_info, request.filter);
+ test_result = ALLOWED;
+ }
+ if (!blacklist_result_recorded_) {
+ UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResults",
+ test_result, BLACKLIST_TEST_RESULT_MAX);
+ blacklist_result_recorded_ = true;
+ }
sent_requests_.pop();
}
@@ -471,7 +506,7 @@ void GpuProcessHost::OnChildDied() {
// Located in OnChildDied because OnProcessCrashed suffers from a race
// condition on Linux. The GPU process will only die if it crashes.
UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessLifetimeEvents",
- kCrashed, kGPUProcessLifetimeEvent_Max);
+ CRASHED, GPU_PROCESS_LIFETIME_EVENT_MAX);
BrowserChildProcessHost::OnChildDied();
}
@@ -528,7 +563,24 @@ bool GpuProcessHost::LaunchGpuProcess() {
cmd_line);
UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessLifetimeEvents",
- kLaunched, kGPUProcessLifetimeEvent_Max);
+ LAUNCED, GPU_PROCESS_LIFETIME_EVENT_MAX);
return true;
}
+bool GpuProcessHost::LoadGpuBlacklist() {
+ if (gpu_blacklist_.get() != NULL)
+ return true;
+ static const base::StringPiece gpu_blacklist_json(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_GPU_BLACKLIST));
+ GpuBlacklist* blacklist = new GpuBlacklist();
+ const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
+ if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) ||
+ blacklist->LoadGpuBlacklist(gpu_blacklist_json.as_string(), true)) {
+ gpu_blacklist_.reset(blacklist);
+ return true;
+ }
+ delete blacklist;
+ return false;
+}
+
diff --git a/chrome/browser/gpu_process_host.h b/chrome/browser/gpu_process_host.h
index 6d8fc9d..762b98f 100644
--- a/chrome/browser/gpu_process_host.h
+++ b/chrome/browser/gpu_process_host.h
@@ -16,6 +16,7 @@
struct GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params;
struct GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params;
+class GpuBlacklist;
class GPUInfo;
class ResourceMessageFilter;
@@ -120,9 +121,15 @@ class GpuProcessHost : public BrowserChildProcessHost, public NonThreadSafe {
bool CanLaunchGpuProcess() const;
bool LaunchGpuProcess();
+ bool LoadGpuBlacklist();
+
bool initialized_;
bool initialized_successfully_;
+ bool blacklist_result_recorded_;
+
+ scoped_ptr<GpuBlacklist> gpu_blacklist_;
+
// These are the channel requests that we have already sent to
// the GPU process, but haven't heard back about yet.
std::queue<ChannelRequest> sent_requests_;
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc
index 57208b5..7517e10 100644
--- a/chrome/browser/instant/instant_controller.cc
+++ b/chrome/browser/instant/instant_controller.cc
@@ -215,7 +215,8 @@ void InstantController::DestroyPreviewContents() {
}
// ReleasePreviewContents sets is_active_ to false, but we need to set it
- // beore notifying the delegate so.
+ // before notifying the delegate, otherwise if the delegate asks for the state
+ // we'll still be active.
is_active_ = false;
delegate_->HideInstant();
delete ReleasePreviewContents(INSTANT_COMMIT_DESTROY);
diff --git a/chrome/browser/net/chrome_url_request_context.cc b/chrome/browser/net/chrome_url_request_context.cc
index 81a0402..f4ba1ca 100644
--- a/chrome/browser/net/chrome_url_request_context.cc
+++ b/chrome/browser/net/chrome_url_request_context.cc
@@ -583,15 +583,6 @@ void ChromeURLRequestContextGetter::ReleaseURLRequestContext() {
url_request_context_ = NULL;
}
-void ChromeURLRequestContextGetter::RegisterUserPrefs(
- PrefService* pref_service) {
- pref_service->RegisterBooleanPref(prefs::kNoProxyServer, false);
- pref_service->RegisterBooleanPref(prefs::kProxyAutoDetect, false);
- pref_service->RegisterStringPref(prefs::kProxyServer, "");
- pref_service->RegisterStringPref(prefs::kProxyPacUrl, "");
- pref_service->RegisterStringPref(prefs::kProxyBypassList, "");
-}
-
net::CookieStore* ChromeURLRequestContextGetter::GetCookieStore() {
// If we are running on the IO thread this is real easy.
if (BrowserThread::CurrentlyOn(BrowserThread::IO))
diff --git a/chrome/browser/net/chrome_url_request_context.h b/chrome/browser/net/chrome_url_request_context.h
index 8f2c852..e4e8ad8 100644
--- a/chrome/browser/net/chrome_url_request_context.h
+++ b/chrome/browser/net/chrome_url_request_context.h
@@ -235,8 +235,6 @@ class ChromeURLRequestContextGetter : public URLRequestContextGetter,
ChromeURLRequestContextGetter(Profile* profile,
ChromeURLRequestContextFactory* factory);
- static void RegisterUserPrefs(PrefService* user_prefs);
-
// Note that GetURLRequestContext() can only be called from the IO
// thread (it will assert otherwise). GetCookieStore() and
// GetIOMessageLoopProxy however can be called from any thread.
diff --git a/chrome/browser/net/pref_proxy_config_service.cc b/chrome/browser/net/pref_proxy_config_service.cc
index 5cd6213..9b0f545 100644
--- a/chrome/browser/net/pref_proxy_config_service.cc
+++ b/chrome/browser/net/pref_proxy_config_service.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/net/pref_proxy_config_service.h"
+#include "base/values.h"
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prefs/pref_set_observer.h"
@@ -12,6 +13,33 @@
#include "chrome/common/notification_type.h"
#include "chrome/common/pref_names.h"
+namespace {
+
+const bool kProxyPrefDefaultBoolean = false;
+const char kProxyPrefDefaultString[] = "";
+
+// Determines if a value of a proxy pref is set to its default. Default values
+// have a special role in the proxy pref system, because if all of the proxy
+// prefs are set to their defaults, then the system proxy settings are applied.
+// TODO(gfeher): Proxy preferences should be refactored to avoid the need
+// for such solutions. See crbug.com/65732
+bool IsDefaultValue(const Value* value) {
+ bool b = false;
+ std::string s;
+ if (value->IsType(Value::TYPE_BOOLEAN) &&
+ value->GetAsBoolean(&b)) {
+ return b == kProxyPrefDefaultBoolean;
+ } else if (value->IsType(Value::TYPE_STRING) &&
+ value->GetAsString(&s)) {
+ return s == kProxyPrefDefaultString;
+ } else {
+ NOTREACHED() << "Invalid type for a proxy preference.";
+ return false;
+ }
+}
+
+} // namespace
+
PrefProxyConfigTracker::PrefProxyConfigTracker(PrefService* pref_service)
: pref_service_(pref_service) {
valid_ = ReadPrefConfig(&pref_config_);
@@ -98,12 +126,17 @@ bool PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config) {
// are ignored. That's because chrome treats the system settings as the
// default values, which should apply if there's no explicit value forced by
// policy or the user.
+ // Preferences that are set to their default values are also ignored,
+ // regardless of their controlling source. This is because 'use system proxy
+ // settings' is currently encoded by all the preferences being set to their
+ // defaults. This will change when crbug.com/65732 is addressed.
bool found_enable_proxy_pref = false;
for (size_t i = 0; i < arraysize(proxy_prefs); i++) {
const PrefService::Preference* pref =
pref_service_->FindPreference(proxy_prefs[i]);
DCHECK(pref);
- if (pref && (!pref->IsUserModifiable() || pref->HasUserSetting())) {
+ if (pref && (!pref->IsUserModifiable() || pref->HasUserSetting()) &&
+ !IsDefaultValue(pref->GetValue())) {
found_enable_proxy_pref = true;
break;
}
@@ -220,3 +253,18 @@ void PrefProxyConfigService::RegisterObservers() {
registered_observers_ = true;
}
}
+
+// static
+void PrefProxyConfigService::RegisterUserPrefs(
+ PrefService* pref_service) {
+ pref_service->RegisterBooleanPref(prefs::kNoProxyServer,
+ kProxyPrefDefaultBoolean);
+ pref_service->RegisterBooleanPref(prefs::kProxyAutoDetect,
+ kProxyPrefDefaultBoolean);
+ pref_service->RegisterStringPref(prefs::kProxyServer,
+ kProxyPrefDefaultString);
+ pref_service->RegisterStringPref(prefs::kProxyPacUrl,
+ kProxyPrefDefaultString);
+ pref_service->RegisterStringPref(prefs::kProxyBypassList,
+ kProxyPrefDefaultString);
+}
diff --git a/chrome/browser/net/pref_proxy_config_service.h b/chrome/browser/net/pref_proxy_config_service.h
index 362b109..fe917bb 100644
--- a/chrome/browser/net/pref_proxy_config_service.h
+++ b/chrome/browser/net/pref_proxy_config_service.h
@@ -103,6 +103,8 @@ class PrefProxyConfigService
virtual bool GetLatestProxyConfig(net::ProxyConfig* config);
virtual void OnLazyPoll();
+ static void RegisterUserPrefs(PrefService* user_prefs);
+
private:
// ProxyConfigService::Observer implementation:
virtual void OnProxyConfigChanged(const net::ProxyConfig& config);
diff --git a/chrome/browser/net/pref_proxy_config_service_unittest.cc b/chrome/browser/net/pref_proxy_config_service_unittest.cc
index e7917b1..fd24dd6 100644
--- a/chrome/browser/net/pref_proxy_config_service_unittest.cc
+++ b/chrome/browser/net/pref_proxy_config_service_unittest.cc
@@ -67,7 +67,7 @@ class PrefProxyConfigServiceTestBase : public TESTBASE {
virtual void SetUp() {
ASSERT_TRUE(pref_service_.get());
- ChromeURLRequestContextGetter::RegisterUserPrefs(pref_service_.get());
+ PrefProxyConfigService::RegisterUserPrefs(pref_service_.get());
fixed_config_.set_pac_url(GURL(kFixedPacUrl));
delegate_service_ = new TestProxyConfigService(fixed_config_);
proxy_config_tracker_ = new PrefProxyConfigTracker(pref_service_.get());
diff --git a/chrome/browser/policy/configuration_policy_pref_store.cc b/chrome/browser/policy/configuration_policy_pref_store.cc
index 7c3d17d..5a1eaaa 100644
--- a/chrome/browser/policy/configuration_policy_pref_store.cc
+++ b/chrome/browser/policy/configuration_policy_pref_store.cc
@@ -183,6 +183,8 @@ const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry
prefs::kAuthNegotiateDelegateWhitelist },
{ Value::TYPE_STRING, kPolicyGSSAPILibraryName,
prefs::kGSSAPILibraryName },
+ { Value::TYPE_BOOLEAN, kPolicyDisable3DAPIs,
+ prefs::kDisable3DAPIs },
#if defined(OS_CHROMEOS)
{ Value::TYPE_BOOLEAN, kPolicyChromeOsLockOnIdleSuspend,
@@ -299,6 +301,8 @@ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() {
key::kAuthNegotiateDelegateWhitelist },
{ kPolicyGSSAPILibraryName, Value::TYPE_STRING,
key::kGSSAPILibraryName },
+ { kPolicyDisable3DAPIs, Value::TYPE_BOOLEAN,
+ key::kDisable3DAPIs },
#if defined(OS_CHROMEOS)
diff --git a/chrome/browser/policy/configuration_policy_pref_store_unittest.cc b/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
index 2595f83..af9f8e4 100644
--- a/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
+++ b/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
@@ -177,7 +177,9 @@ INSTANTIATE_TEST_CASE_P(
TypeAndName(kPolicyDisableAuthNegotiateCnameLookup,
prefs::kDisableAuthNegotiateCnameLookup),
TypeAndName(kPolicyEnableAuthNegotiatePort,
- prefs::kEnableAuthNegotiatePort)));
+ prefs::kEnableAuthNegotiatePort),
+ TypeAndName(kPolicyDisable3DAPIs,
+ prefs::kDisable3DAPIs)));
#if defined(OS_CHROMEOS)
INSTANTIATE_TEST_CASE_P(
diff --git a/chrome/browser/policy/configuration_policy_store_interface.h b/chrome/browser/policy/configuration_policy_store_interface.h
index cfb943e..b47069e 100644
--- a/chrome/browser/policy/configuration_policy_store_interface.h
+++ b/chrome/browser/policy/configuration_policy_store_interface.h
@@ -64,6 +64,7 @@ enum ConfigurationPolicyType {
kPolicyAuthServerWhitelist,
kPolicyAuthNegotiateDelegateWhitelist,
kPolicyGSSAPILibraryName,
+ kPolicyDisable3DAPIs
};
static const int kPolicyNoProxyServerMode = 0;
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index dcc3624..ddc149b 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -29,8 +29,8 @@
#include "chrome/browser/instant/instant_controller.h"
#include "chrome/browser/metrics/metrics_log.h"
#include "chrome/browser/metrics/metrics_service.h"
-#include "chrome/browser/net/chrome_url_request_context.h"
#include "chrome/browser/net/predictor_api.h"
+#include "chrome/browser/net/pref_proxy_config_service.h"
#include "chrome/browser/net/net_pref_observer.h"
#include "chrome/browser/notifications/desktop_notification_service.h"
#include "chrome/browser/page_info_model.h"
@@ -135,7 +135,7 @@ void RegisterUserPrefs(PrefService* user_prefs) {
GeolocationContentSettingsMap::RegisterUserPrefs(user_prefs);
TranslatePrefs::RegisterUserPrefs(user_prefs);
DesktopNotificationService::RegisterUserPrefs(user_prefs);
- ChromeURLRequestContextGetter::RegisterUserPrefs(user_prefs);
+ PrefProxyConfigService::RegisterUserPrefs(user_prefs);
#if defined(TOOLKIT_VIEWS)
BrowserActionsContainer::RegisterUserPrefs(user_prefs);
#elif defined(TOOLKIT_GTK)
diff --git a/chrome/browser/prefs/command_line_pref_store.cc b/chrome/browser/prefs/command_line_pref_store.cc
index 2bebe5b..cbb7ef7 100644
--- a/chrome/browser/prefs/command_line_pref_store.cc
+++ b/chrome/browser/prefs/command_line_pref_store.cc
@@ -31,6 +31,7 @@ const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry
prefs::kDisableAuthNegotiateCnameLookup, true },
{ switches::kEnableAuthNegotiatePort, prefs::kEnableAuthNegotiatePort,
true },
+ { switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true },
};
CommandLinePrefStore::CommandLinePrefStore(const CommandLine* command_line)
diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc
index 111b81b..bf096c8 100644
--- a/chrome/browser/printing/print_job_worker.cc
+++ b/chrome/browser/printing/print_job_worker.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 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.
@@ -82,22 +82,14 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings,
printing_context_->set_use_overlays(use_overlays);
if (ask_user_for_settings) {
-#if defined(OS_MACOSX) || defined(USE_X11)
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this, &PrintJobWorker::GetSettingsWithUI,
parent_view, document_page_count,
has_selection));
-#else
- printing_context_->AskUserForSettings(
- parent_view,
- document_page_count,
- has_selection,
- NewCallback(this, &PrintJobWorker::GetSettingsDone));
-#endif // defined(OS_MACOSX) || defined(USE_X11)
} else {
- PrintingContext::Result result = printing_context_->UseDefaultSettings();
- GetSettingsDone(result);
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &PrintJobWorker::UseDefaultSettings));
}
}
@@ -116,7 +108,6 @@ void PrintJobWorker::GetSettingsDone(PrintingContext::Result result) {
result));
}
-#if defined(OS_MACOSX) || defined(USE_X11)
void PrintJobWorker::GetSettingsWithUI(gfx::NativeView parent_view,
int document_page_count,
bool has_selection) {
@@ -133,7 +124,11 @@ void PrintJobWorker::GetSettingsWithUIDone(PrintingContext::Result result) {
message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
this, &PrintJobWorker::GetSettingsDone, result));
}
-#endif // defined(OS_MACOSX) || defined(USE_X11)
+
+void PrintJobWorker::UseDefaultSettings() {
+ PrintingContext::Result result = printing_context_->UseDefaultSettings();
+ GetSettingsDone(result);
+}
void PrintJobWorker::StartPrinting(PrintedDocument* new_document) {
DCHECK_EQ(message_loop(), MessageLoop::current());
diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h
index a74cb06..817c0b0 100644
--- a/chrome/browser/printing/print_job_worker.h
+++ b/chrome/browser/printing/print_job_worker.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 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.
@@ -83,9 +83,9 @@ class PrintJobWorker : public base::Thread {
// context.
void OnFailure();
-#if defined(OS_MACOSX) || defined(USE_X11)
// Asks the user for print settings. Must be called on the UI thread.
- // Mac and Linux-only since Windows can display UI from non-main threads.
+ // Required on Mac and Linux. Windows can display UI from non-main threads,
+ // but sticks with this for consistency.
void GetSettingsWithUI(gfx::NativeView parent_view,
int document_page_count,
bool has_selection);
@@ -94,11 +94,15 @@ class PrintJobWorker : public base::Thread {
// object that the print settings are set. This is needed in order to bounce
// back into the IO thread for GetSettingsDone().
void GetSettingsWithUIDone(PrintingContext::Result result);
-#endif
// Reports settings back to owner_.
void GetSettingsDone(PrintingContext::Result result);
+ // Use the default settings. When using GTK+ or Mac, this can still end up
+ // displaying a dialog. So this needs to happen from the UI thread on these
+ // systems.
+ void UseDefaultSettings();
+
// Information about the printer setting.
scoped_ptr<PrintingContext> printing_context_;
diff --git a/chrome/browser/profile_impl.cc b/chrome/browser/profile_impl.cc
index 8ee0b5d..816d8ae 100644
--- a/chrome/browser/profile_impl.cc
+++ b/chrome/browser/profile_impl.cc
@@ -399,28 +399,16 @@ void ProfileImpl::RegisterComponentExtensions() {
}
void ProfileImpl::InstallDefaultApps() {
-#if !defined(OS_CHROMEOS)
- // On desktop Chrome, we don't have default apps on by, err, default yet.
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableDefaultApps)) {
- return;
- }
-#endif
-
- // The web store only supports en-US at the moment, so we don't install
- // default apps in other locales.
- if (g_browser_process->GetApplicationLocale() != "en-US")
- return;
+ ExtensionsService* extension_service = GetExtensionsService();
+ DefaultApps* default_apps = extension_service->default_apps();
- ExtensionsService* extensions_service = GetExtensionsService();
- const ExtensionIdSet* app_ids =
- extensions_service->default_apps()->GetAppsToInstall();
- if (!app_ids)
+ if (!default_apps->ShouldInstallDefaultApps(extension_service->GetAppIds()))
return;
- for (ExtensionIdSet::const_iterator iter = app_ids->begin();
- iter != app_ids->end(); ++iter) {
- extensions_service->AddPendingExtensionFromDefaultAppList(*iter);
+ const ExtensionIdSet& app_ids = default_apps->default_apps();
+ for (ExtensionIdSet::const_iterator iter = app_ids.begin();
+ iter != app_ids.end(); ++iter) {
+ extension_service->AddPendingExtensionFromDefaultAppList(*iter);
}
}
diff --git a/chrome/browser/renderer_host/audio_renderer_host.cc b/chrome/browser/renderer_host/audio_renderer_host.cc
index b18c4c3..e77153e 100644
--- a/chrome/browser/renderer_host/audio_renderer_host.cc
+++ b/chrome/browser/renderer_host/audio_renderer_host.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -419,7 +419,8 @@ void AudioRendererHost::OnSetVolume(const IPC::Message& msg, int stream_id,
}
// Make sure the volume is valid.
- CHECK(volume >= 0 && volume <= 1.0);
+ if (volume < 0 || volume > 1.0)
+ return;
entry->controller->SetVolume(volume);
}
@@ -531,7 +532,7 @@ AudioRendererHost::AudioEntry* AudioRendererHost::LookupById(
AudioEntryMap::iterator i = audio_entries_.find(
AudioEntryId(route_id, stream_id));
- if (i != audio_entries_.end())
+ if (i != audio_entries_.end() && !i->second->pending_close)
return i->second;
return NULL;
}
@@ -544,7 +545,7 @@ AudioRendererHost::AudioEntry* AudioRendererHost::LookupByController(
// TODO(hclam): Implement a faster look up method.
for (AudioEntryMap::iterator i = audio_entries_.begin();
i != audio_entries_.end(); ++i) {
- if (controller == i->second->controller.get())
+ if (!i->second->pending_close && controller == i->second->controller.get())
return i->second;
}
return NULL;
diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc
index 6502873..3723be5 100644
--- a/chrome/browser/renderer_host/browser_render_process_host.cc
+++ b/chrome/browser/renderer_host/browser_render_process_host.cc
@@ -48,6 +48,7 @@
#include "chrome/browser/renderer_host/render_widget_host.h"
#include "chrome/browser/renderer_host/resource_message_filter.h"
#include "chrome/browser/renderer_host/web_cache_manager.h"
+#include "chrome/browser/speech/speech_input_manager.h"
#include "chrome/browser/spellcheck_host.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/visitedlink_master.h"
@@ -519,11 +520,19 @@ void BrowserRenderProcessHost::AppendRendererCommandLine(
if (!user_data_dir.empty())
command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir);
#if defined(OS_CHROMEOS)
- const std::string& profile =
+ const std::string& login_profile =
browser_command_line.GetSwitchValueASCII(switches::kLoginProfile);
- if (!profile.empty())
- command_line->AppendSwitchASCII(switches::kLoginProfile, profile);
+ if (!login_profile.empty())
+ command_line->AppendSwitchASCII(switches::kLoginProfile, login_profile);
#endif
+
+ PrefService* prefs = profile()->GetPrefs();
+ // Currently this pref is only registered if applied via a policy.
+ if (prefs->HasPrefPath(prefs::kDisable3DAPIs) &&
+ prefs->GetBoolean(prefs::kDisable3DAPIs)) {
+ // Turn this policy into a command line switch.
+ command_line->AppendSwitch(switches::kDisable3DAPIs);
+ }
}
void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer(
@@ -630,7 +639,8 @@ void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer(
switches::kPpapiOutOfProcess,
switches::kEnablePrintPreview,
switches::kEnableClientSidePhishingDetection,
- switches::kEnableCrxlessWebApps
+ switches::kEnableCrxlessWebApps,
+ switches::kDisable3DAPIs
};
renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames,
arraysize(kSwitchNames));
@@ -687,20 +697,8 @@ void BrowserRenderProcessHost::InitExtensions() {
}
void BrowserRenderProcessHost::InitSpeechInput() {
- bool enabled = true;
- const CommandLine& command_line = *CommandLine::ForCurrentProcess();
-
- if (command_line.HasSwitch(switches::kDisableSpeechInput)) {
- enabled = false;
-#if defined(GOOGLE_CHROME_BUILD)
- } else if (!command_line.HasSwitch(switches::kEnableSpeechInput)) {
- // Official Chrome builds don't have speech input enabled by default in the
- // beta and stable channels.
- enabled = false;
-#endif
- }
-
- Send(new ViewMsg_SpeechInput_SetFeatureEnabled(enabled));
+ Send(new ViewMsg_SpeechInput_SetFeatureEnabled(
+ speech_input::SpeechInputManager::IsFeatureEnabled()));
}
void BrowserRenderProcessHost::SendUserScriptsUpdate(
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
index 058aaf6..3f223a1 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
@@ -948,9 +948,50 @@ void RenderWidgetHostViewMac::DestroyFakePluginWindowHandle(
// taken if a plugin is removed, but the RWHVMac itself stays alive.
}
+namespace {
+class DidDestroyAcceleratedSurfaceSender : public Task {
+ public:
+ DidDestroyAcceleratedSurfaceSender(
+ int renderer_id,
+ int32 renderer_route_id)
+ : renderer_id_(renderer_id),
+ renderer_route_id_(renderer_route_id) {
+ }
+
+ void Run() {
+ GpuProcessHost::Get()->Send(
+ new GpuMsg_DidDestroyAcceleratedSurface(
+ renderer_id_, renderer_route_id_));
+ }
+
+ private:
+ int renderer_id_;
+ int32 renderer_route_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(DidDestroyAcceleratedSurfaceSender);
+};
+} // anonymous namespace
+
// This is called by AcceleratedPluginView's -dealloc.
void RenderWidgetHostViewMac::DeallocFakePluginWindowHandle(
gfx::PluginWindowHandle window) {
+ // When a browser window with a GPUProcessor is closed, the render process
+ // will attempt to finish all GL commands. It will busy-wait on the GPU
+ // process until the command queue is empty. If a paint is pending, the GPU
+ // process won't process any GL commands until the browser sends a paint ack,
+ // but since the browser window is already closed, it will never arrive.
+ // To break this infinite loop, the browser tells the GPU process that the
+ // surface became invalid, which causes the GPU process to not wait for paint
+ // acks.
+ if (render_widget_host_ &&
+ plugin_container_manager_.IsRootContainer(window)) {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ new DidDestroyAcceleratedSurfaceSender(
+ render_widget_host_->process()->id(),
+ render_widget_host_->routing_id()));
+ }
+
plugin_container_manager_.DestroyFakePluginWindowHandle(window);
}
diff --git a/chrome/browser/resources/gpu_blacklist.json b/chrome/browser/resources/gpu_blacklist.json
new file mode 100644
index 0000000..f211db2
--- /dev/null
+++ b/chrome/browser/resources/gpu_blacklist.json
@@ -0,0 +1,36 @@
+{
+ "name": "gpu blacklist",
+ "version": "0.2",
+ "entries": [
+ { // ATI Radeon X1900 on Mac, BUGWEBKIT=47028
+ "os": {
+ "type": "macosx"
+ },
+ "vendor_id": "0x1002",
+ "device_id": "0x7249",
+ "blacklist": [
+ "webgl"
+ ]
+ },
+ { // Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller, BUG=67345,67939
+ "os": {
+ "type": "linux"
+ },
+ "vendor_id": "0x8086",
+ "device_id": "0x2a42",
+ "blacklist": [
+ "webgl"
+ ]
+ },
+ { // Intel Corporation Core Processor Integrated Graphics Controller, BUG=66718
+ "os": {
+ "type": "linux"
+ },
+ "vendor_id": "0x8086",
+ "device_id": "0x0046",
+ "blacklist": [
+ "webgl"
+ ]
+ }
+ ]
+}
diff --git a/chrome/browser/resources/new_new_tab.html b/chrome/browser/resources/new_new_tab.html
index 5722024..9fdde30 100644
--- a/chrome/browser/resources/new_new_tab.html
+++ b/chrome/browser/resources/new_new_tab.html
@@ -143,7 +143,7 @@ if ('mode' in hashParams) {
<div id="apps-promo">
<button id="apps-promo-hide" i18n-content="appspromohide"></button>
<h3 i18n-content="appspromoheader"></h3>
- <p id="apps-promo-text1" i18n-content="appspromotext1"></p>
+ <p id="apps-promo-text1" i18n-values=".innerHTML:appspromotext1"></p>
<p id="apps-promo-text2" i18n-content="appspromotext2"></p>
</div>
<div id="apps-content"></div>
@@ -151,7 +151,7 @@ if ('mode' in hashParams) {
<div class="maxiview" id="most-visited-maxiview"></div>
<div class="sections">
- <!-- Start disabled. We only enable if we have at least one app. -->
+ <!-- Start disabled. We only enable once we have installed default apps. -->
<div id="apps" class="section disabled" section="APPS">
<h2>
<img class="disclosure" img src="ntp/ntp_disclosure_triangle.png">
@@ -319,6 +319,20 @@ i18nTemplate.process(document, templateData);
setSectionVisible(
'recently-closed', undefined,
recentlyClosedInitiallyVisible, MINIMIZED_RECENT);
+
+ // This is insane, but we use the CSS class 'disabled' for both 'minimized'
+ // sections and sections that are actually disabled, as in not accessible in
+ // any way.
+ //
+ // The above code syncs up the DOM and shownSection wrt minimized. But we
+ // don't know until we receive the apps data whether the apps section will be
+ // disabled or not. So we need to add the 'disabled' class back to the apps
+ // section here. We remove it later, once we know for sure we want it to be
+ // enabled.
+ //
+ // See also: crbug.com/67273.
+ $('apps').classList.add('disabled');
+
layoutSections();
</script>
</html>
diff --git a/chrome/browser/resources/new_new_tab.js b/chrome/browser/resources/new_new_tab.js
index 9b1befd..2c8a7cc 100644
--- a/chrome/browser/resources/new_new_tab.js
+++ b/chrome/browser/resources/new_new_tab.js
@@ -1244,10 +1244,7 @@ function isDoneLoading() {
// Initialize the apps promo.
document.addEventListener('DOMContentLoaded', function() {
- var promoText1 = $('apps-promo-text1');
- promoText1.innerHTML = promoText1.textContent;
-
- var promoLink = promoText1.querySelector('a');
+ var promoLink = document.querySelector('#apps-promo-text1 a');
promoLink.id = 'apps-promo-link';
promoLink.href = localStrings.getString('web_store_url');
diff --git a/chrome/browser/resources/ntp/apps.js b/chrome/browser/resources/ntp/apps.js
index 9c032fe..cf92cb8 100644
--- a/chrome/browser/resources/ntp/apps.js
+++ b/chrome/browser/resources/ntp/apps.js
@@ -14,12 +14,18 @@ var PING_WEBSTORE_LAUNCH_PREFIX = 'record-webstore-launch';
function getAppsCallback(data) {
logEvent('received apps');
+
+ // In the case of prefchange-triggered updates, we don't receive this flag.
+ // Just leave it set as it was before in that case.
+ if ('showPromo' in data)
+ apps.showPromo = data.showPromo;
+
var appsSection = $('apps');
var appsSectionContent = $('apps-content');
var appsMiniview = appsSection.getElementsByClassName('miniview')[0];
var appsPromo = $('apps-promo');
- var appsPromoPing = PING_WEBSTORE_LAUNCH_PREFIX + '+' + data.showPromo;
- var webStoreEntry;
+ var appsPromoPing = PING_WEBSTORE_LAUNCH_PREFIX + '+' + apps.showPromo;
+ var webStoreEntry, webStoreMiniEntry;
// Hide menu options that are not supported on the OS or windowing system.
@@ -34,46 +40,51 @@ function getAppsCallback(data) {
appsMiniview.textContent = '';
appsSectionContent.textContent = '';
- apps.showPromo = data.showPromo;
-
data.apps.sort(function(a,b) {
return a.app_launch_index - b.app_launch_index;
});
clearClosedMenu(apps.menu);
- if (data.apps.length == 0 && !data.showLauncher) {
- appsSection.classList.add('disabled');
- layoutSections();
- } else {
- data.apps.forEach(function(app) {
- appsSectionContent.appendChild(apps.createElement(app));
- });
+ data.apps.forEach(function(app) {
+ appsSectionContent.appendChild(apps.createElement(app));
+ });
- webStoreEntry = apps.createWebStoreElement();
- webStoreEntry.querySelector('a').setAttribute('ping', appsPromoPing);
- appsSectionContent.appendChild(webStoreEntry);
+ webStoreEntry = apps.createWebStoreElement();
+ webStoreEntry.querySelector('a').setAttribute('ping', appsPromoPing);
+ appsSectionContent.appendChild(webStoreEntry);
- data.apps.slice(0, MAX_MINIVIEW_ITEMS).forEach(function(app) {
- appsMiniview.appendChild(apps.createMiniviewElement(app));
- addClosedMenuEntryWithLink(apps.menu, apps.createClosedMenuElement(app));
- });
+ data.apps.slice(0, MAX_MINIVIEW_ITEMS).forEach(function(app) {
+ appsMiniview.appendChild(apps.createMiniviewElement(app));
+ addClosedMenuEntryWithLink(apps.menu, apps.createClosedMenuElement(app));
+ });
+ if (data.apps.length < MAX_MINIVIEW_ITEMS) {
+ webStoreMiniEntry = apps.createWebStoreMiniElement();
+ webStoreEntry.querySelector('a').setAttribute('ping', appsPromoPing);
+ appsMiniview.appendChild(webStoreMiniEntry);
+ addClosedMenuEntryWithLink(apps.menu,
+ apps.createWebStoreClosedMenuElement());
+ }
- if (!(shownSections & MINIMIZED_APPS)) {
- appsSection.classList.remove('disabled');
- }
+ if (!data.showLauncher || (shownSections & MINIMIZED_APPS)) {
+ appsSection.classList.add('disabled');
+ } else {
+ appsSection.classList.remove('disabled');
}
addClosedMenuFooter(apps.menu, 'apps', MINIMIZED_APPS, Section.APPS);
apps.loaded = true;
- if (data.showPromo)
+ if (apps.showPromo)
document.documentElement.classList.add('apps-promo-visible');
else
document.documentElement.classList.remove('apps-promo-visible');
- $('apps-promo-link').setAttribute('ping', appsPromoPing);
+
+ var appsPromoLink = $('apps-promo-link');
+ if (appsPromoLink)
+ appsPromoLink.setAttribute('ping', appsPromoPing);
maybeDoneLoading();
- if (data.apps.length > 0 && isDoneLoading()) {
- if (!data.showPromo && data.apps.length >= MAX_APPS_PER_ROW[layoutMode])
+ if (isDoneLoading()) {
+ if (!apps.showPromo && data.apps.length >= MAX_APPS_PER_ROW[layoutMode])
webStoreEntry.classList.add('loner');
else
webStoreEntry.classList.remove('loner');
@@ -334,6 +345,21 @@ var apps = (function() {
});
elm.setAttribute('app-id', 'web-store-entry');
return elm;
+ },
+
+ createWebStoreMiniElement: function() {
+ var span = document.createElement('span');
+ span.appendChild(this.createWebStoreClosedMenuElement());
+ return span;
+ },
+
+ createWebStoreClosedMenuElement: function() {
+ var a = document.createElement('a');
+ a.textContent = localStrings.getString('web_store_title');
+ a.href = localStrings.getString('web_store_url');
+ a.style.backgroundImage = url('chrome://theme/IDR_PRODUCT_LOGO_16');
+ a.className = 'item';
+ return a;
}
};
})();
diff --git a/chrome/browser/resources/options.html b/chrome/browser/resources/options.html
index 47873b3..e679135 100644
--- a/chrome/browser/resources/options.html
+++ b/chrome/browser/resources/options.html
@@ -164,6 +164,8 @@ function load() {
localStrings = new LocalStrings();
+ OptionsPage.register(SearchPage.getInstance());
+
if (cr.isChromeOS) {
OptionsPage.register(SystemOptions.getInstance());
OptionsPage.registerSubPage(AboutPage.getInstance(),
@@ -193,7 +195,6 @@ function load() {
OptionsPage.register(InternetOptions.getInstance());
}
- OptionsPage.register(SearchPage.getInstance());
OptionsPage.register(BrowserOptions.getInstance());
OptionsPage.registerSubPage(SearchEngineManager.getInstance(),
BrowserOptions.getInstance());
diff --git a/chrome/browser/resources/webstore_app/manifest.json b/chrome/browser/resources/webstore_app/manifest.json
index a56d574..c4568e4 100644
--- a/chrome/browser/resources/webstore_app/manifest.json
+++ b/chrome/browser/resources/webstore_app/manifest.json
@@ -7,7 +7,7 @@
},
"app": {
"launch": {
- "web_url": "https://chrome.google.com/extensions"
+ "web_url": "https://chrome.google.com/webstore"
},
"urls": [
"*://chrome.google.com/extensions",
diff --git a/chrome/browser/speech/speech_input_bubble.cc b/chrome/browser/speech/speech_input_bubble.cc
index 655415f..77619e9 100644
--- a/chrome/browser/speech/speech_input_bubble.cc
+++ b/chrome/browser/speech/speech_input_bubble.cc
@@ -32,9 +32,10 @@ SpeechInputBubble* SpeechInputBubble::Create(TabContents* tab_contents,
return CreateNativeBubble(tab_contents, delegate, element_rect);
}
-SpeechInputBubbleBase::SpeechInputBubbleBase()
+SpeechInputBubbleBase::SpeechInputBubbleBase(TabContents* tab_contents)
: ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
- display_mode_(DISPLAY_MODE_RECORDING) {
+ display_mode_(DISPLAY_MODE_RECORDING),
+ tab_contents_(tab_contents) {
if (!mic_empty_) { // Static variables.
mic_empty_ = ResourceBundle::GetSharedInstance().GetBitmapNamed(
IDR_SPEECH_INPUT_MIC_EMPTY);
diff --git a/chrome/browser/speech/speech_input_bubble.h b/chrome/browser/speech/speech_input_bubble.h
index 3faabe0..436e6bb 100644
--- a/chrome/browser/speech/speech_input_bubble.h
+++ b/chrome/browser/speech/speech_input_bubble.h
@@ -99,6 +99,9 @@ class SpeechInputBubble {
// Updates the current captured audio volume displayed on screen.
virtual void SetInputVolume(float volume) = 0;
+ // Returns the TabContents for which this bubble gets displayed.
+ virtual TabContents* tab_contents() = 0;
+
// The horizontal distance between the start of the html widget and the speech
// bubble's arrow.
static const int kBubbleTargetOffsetX;
@@ -119,7 +122,7 @@ class SpeechInputBubbleBase : public SpeechInputBubble {
DISPLAY_MODE_MESSAGE
};
- SpeechInputBubbleBase();
+ explicit SpeechInputBubbleBase(TabContents* tab_contents);
virtual ~SpeechInputBubbleBase();
// SpeechInputBubble methods
@@ -127,6 +130,7 @@ class SpeechInputBubbleBase : public SpeechInputBubble {
virtual void SetRecognizingMode();
virtual void SetMessage(const string16& text);
virtual void SetInputVolume(float volume);
+ virtual TabContents* tab_contents() { return tab_contents_; }
protected:
// Updates the platform specific UI layout for the current display mode.
@@ -159,6 +163,8 @@ class SpeechInputBubbleBase : public SpeechInputBubble {
scoped_ptr<SkBitmap> mic_image_;
// A temporary buffer image used in creating the above mic image.
scoped_ptr<SkBitmap> buffer_image_;
+ // TabContents in which this this bubble gets displayed.
+ TabContents* tab_contents_;
static SkBitmap* mic_full_; // Mic image with full volume.
static SkBitmap* mic_empty_; // Mic image with zero volume.
diff --git a/chrome/browser/speech/speech_input_bubble_controller.cc b/chrome/browser/speech/speech_input_bubble_controller.cc
index 682d028..b048589 100644
--- a/chrome/browser/speech/speech_input_bubble_controller.cc
+++ b/chrome/browser/speech/speech_input_bubble_controller.cc
@@ -7,13 +7,17 @@
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/common/notification_registrar.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/notification_type.h"
#include "gfx/rect.h"
namespace speech_input {
SpeechInputBubbleController::SpeechInputBubbleController(Delegate* delegate)
: delegate_(delegate),
- current_bubble_caller_id_(0) {
+ current_bubble_caller_id_(0),
+ registrar_(new NotificationRegistrar) {
}
SpeechInputBubbleController::~SpeechInputBubbleController() {
@@ -43,6 +47,8 @@ void SpeechInputBubbleController::CreateBubble(int caller_id,
return;
bubbles_[caller_id] = bubble;
+
+ UpdateTabContentsSubscription(caller_id, BUBBLE_ADDED);
}
void SpeechInputBubbleController::CloseBubble(int caller_id) {
@@ -70,6 +76,60 @@ void SpeechInputBubbleController::SetBubbleMessage(int caller_id,
ProcessRequestInUiThread(caller_id, REQUEST_SET_MESSAGE, text, 0);
}
+void SpeechInputBubbleController::UpdateTabContentsSubscription(
+ int caller_id, ManageSubscriptionAction action) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // If there are any other bubbles existing for the same TabContents, we would
+ // have subscribed to tab close notifications on their behalf and we need to
+ // stay registered. So we don't change the subscription in such cases.
+ TabContents* tab_contents = bubbles_[caller_id]->tab_contents();
+ for (BubbleCallerIdMap::iterator iter = bubbles_.begin();
+ iter != bubbles_.end(); ++iter) {
+ if (iter->second->tab_contents() == tab_contents &&
+ iter->first != caller_id) {
+ // At least one other bubble exists for the same TabContents. So don't
+ // make any change to the subscription.
+ return;
+ }
+ }
+
+ if (action == BUBBLE_ADDED) {
+ registrar_->Add(this, NotificationType::TAB_CONTENTS_DESTROYED,
+ Source<TabContents>(tab_contents));
+ } else {
+ registrar_->Remove(this, NotificationType::TAB_CONTENTS_DESTROYED,
+ Source<TabContents>(tab_contents));
+ }
+}
+
+void SpeechInputBubbleController::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NotificationType::TAB_CONTENTS_DESTROYED) {
+ // Cancel all bubbles and active recognition sessions for this tab.
+ TabContents* tab_contents = Source<TabContents>(source).ptr();
+ BubbleCallerIdMap::iterator iter = bubbles_.begin();
+ while (iter != bubbles_.end()) {
+ if (iter->second->tab_contents() == tab_contents) {
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this,
+ &SpeechInputBubbleController::InvokeDelegateButtonClicked,
+ iter->first, SpeechInputBubble::BUTTON_CANCEL));
+ CloseBubble(iter->first);
+ // We expect to have a very small number of items in this map so
+ // redo-ing from start is ok.
+ iter = bubbles_.begin();
+ } else {
+ ++iter;
+ }
+ }
+ } else {
+ NOTREACHED() << "Unknown notification";
+ }
+}
+
void SpeechInputBubbleController::ProcessRequestInUiThread(
int caller_id, RequestType type, const string16& text, float volume) {
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
@@ -109,6 +169,7 @@ void SpeechInputBubbleController::ProcessRequestInUiThread(
case REQUEST_CLOSE:
if (current_bubble_caller_id_ == caller_id)
current_bubble_caller_id_ = 0;
+ UpdateTabContentsSubscription(caller_id, BUBBLE_REMOVED);
delete bubble;
bubbles_.erase(caller_id);
break;
diff --git a/chrome/browser/speech/speech_input_bubble_controller.h b/chrome/browser/speech/speech_input_bubble_controller.h
index 0a20333..7bacfad 100644
--- a/chrome/browser/speech/speech_input_bubble_controller.h
+++ b/chrome/browser/speech/speech_input_bubble_controller.h
@@ -11,10 +11,12 @@
#include "base/ref_counted.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/speech/speech_input_bubble.h"
+#include "chrome/common/notification_observer.h"
namespace gfx {
class Rect;
}
+class NotificationRegistrar;
namespace speech_input {
@@ -25,7 +27,8 @@ namespace speech_input {
// that bubble are reported to the delegate.
class SpeechInputBubbleController
: public base::RefCountedThreadSafe<SpeechInputBubbleController>,
- public SpeechInputBubbleDelegate {
+ public SpeechInputBubbleDelegate,
+ public NotificationObserver {
public:
// All methods of this delegate are called in the IO thread.
class Delegate {
@@ -73,6 +76,11 @@ class SpeechInputBubbleController
virtual void InfoBubbleButtonClicked(SpeechInputBubble::Button button);
virtual void InfoBubbleFocusChanged();
+ // NotificationObserver implementation.
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
private:
// The various calls received by this object and handled in the UI thread.
enum RequestType {
@@ -83,6 +91,11 @@ class SpeechInputBubbleController
REQUEST_CLOSE,
};
+ enum ManageSubscriptionAction {
+ BUBBLE_ADDED,
+ BUBBLE_REMOVED
+ };
+
void InvokeDelegateButtonClicked(int caller_id,
SpeechInputBubble::Button button);
void InvokeDelegateFocusChanged(int caller_id);
@@ -91,10 +104,18 @@ class SpeechInputBubbleController
const string16& text,
float volume);
+ // Called whenever a bubble was added to or removed from the list. If the
+ // bubble was being added, this method registers for close notifications with
+ // the TabContents if this was the first bubble for the tab. Similarly if the
+ // bubble was being removed, this method unregisters from TabContents if this
+ // was the last bubble associated with that tab.
+ void UpdateTabContentsSubscription(int caller_id,
+ ManageSubscriptionAction action);
+
// Only accessed in the IO thread.
Delegate* delegate_;
- //*** The following are accessed only in the UI thread.
+ // *** The following are accessed only in the UI thread.
// The caller id for currently visible bubble (since only one bubble is
// visible at any time).
@@ -102,7 +123,10 @@ class SpeechInputBubbleController
// Map of caller-ids to bubble objects. The bubbles are weak pointers owned by
// this object and get destroyed by |CloseBubble|.
- std::map<int, SpeechInputBubble*> bubbles_;
+ typedef std::map<int, SpeechInputBubble*> BubbleCallerIdMap;
+ BubbleCallerIdMap bubbles_;
+
+ scoped_ptr<NotificationRegistrar> registrar_;
};
// This typedef is to workaround the issue with certain versions of
diff --git a/chrome/browser/speech/speech_input_bubble_controller_unittest.cc b/chrome/browser/speech/speech_input_bubble_controller_unittest.cc
index 2ed1f1b..e0ca5ba 100644
--- a/chrome/browser/speech/speech_input_bubble_controller_unittest.cc
+++ b/chrome/browser/speech/speech_input_bubble_controller_unittest.cc
@@ -5,6 +5,8 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/speech/speech_input_bubble_controller.h"
+#include "chrome/test/browser_with_test_window_test.h"
+#include "chrome/test/testing_profile.h"
#include "gfx/rect.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -22,7 +24,10 @@ class MockSpeechInputBubble : public SpeechInputBubbleBase {
BUBBLE_TEST_CLICK_TRY_AGAIN,
};
- MockSpeechInputBubble(TabContents*, Delegate* delegate, const gfx::Rect&) {
+ MockSpeechInputBubble(TabContents* tab_contents,
+ Delegate* delegate,
+ const gfx::Rect&)
+ : SpeechInputBubbleBase(tab_contents) {
VLOG(1) << "MockSpeechInputBubble created";
MessageLoop::current()->PostTask(
FROM_HERE, NewRunnableFunction(&InvokeDelegate, delegate));
@@ -62,12 +67,11 @@ class MockSpeechInputBubble : public SpeechInputBubbleBase {
// The test fixture.
class SpeechInputBubbleControllerTest
: public SpeechInputBubbleControllerDelegate,
- public testing::Test {
+ public BrowserWithTestWindowTest {
public:
SpeechInputBubbleControllerTest()
- : io_loop_(MessageLoop::TYPE_IO),
- ui_thread_(BrowserThread::UI), // constructs a new thread and loop
- io_thread_(BrowserThread::IO, &io_loop_), // resuses main thread loop
+ : BrowserWithTestWindowTest(),
+ io_thread_(BrowserThread::IO), // constructs a new thread and loop
cancel_clicked_(false),
try_again_clicked_(false),
focus_changed_(false),
@@ -91,26 +95,28 @@ class SpeechInputBubbleControllerTest
} else if (button == SpeechInputBubble::BUTTON_TRY_AGAIN) {
try_again_clicked_ = true;
}
- MessageLoop::current()->Quit();
+ message_loop()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
}
virtual void InfoBubbleFocusChanged(int caller_id) {
VLOG(1) << "Received InfoBubbleFocusChanged";
EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
focus_changed_ = true;
- MessageLoop::current()->Quit();
+ message_loop()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
}
// testing::Test methods.
virtual void SetUp() {
+ BrowserWithTestWindowTest::SetUp();
SpeechInputBubble::set_factory(
&SpeechInputBubbleControllerTest::CreateBubble);
- ui_thread_.Start();
+ io_thread_.Start();
}
virtual void TearDown() {
SpeechInputBubble::set_factory(NULL);
- ui_thread_.Stop();
+ io_thread_.Stop();
+ BrowserWithTestWindowTest::TearDown();
}
static void ActivateBubble() {
@@ -132,14 +138,19 @@ class SpeechInputBubbleControllerTest
// active.
MessageLoop::current()->PostTask(FROM_HERE,
NewRunnableFunction(&ActivateBubble));
+
+ // The |tab_contents| parameter would be NULL since the dummy caller id
+ // passed to CreateBubble would not have matched any active tab. So get a
+ // real TabContents pointer from the test fixture and pass that, because
+ // the bubble controller registers for tab close notifications which need
+ // a valid TabContents.
+ tab_contents = test_fixture_->browser()->GetSelectedTabContents();
return new MockSpeechInputBubble(tab_contents, delegate, element_rect);
}
protected:
// The main thread of the test is marked as the IO thread and we create a new
// one for the UI thread.
- MessageLoop io_loop_;
- BrowserThread ui_thread_;
BrowserThread io_thread_;
bool cancel_clicked_;
bool try_again_clicked_;
diff --git a/chrome/browser/speech/speech_input_bubble_gtk.cc b/chrome/browser/speech/speech_input_bubble_gtk.cc
index 2b159bf..eb8b906 100644
--- a/chrome/browser/speech/speech_input_bubble_gtk.cc
+++ b/chrome/browser/speech/speech_input_bubble_gtk.cc
@@ -54,7 +54,6 @@ class SpeechInputBubbleGtk
Delegate* delegate_;
InfoBubbleGtk* info_bubble_;
- TabContents* tab_contents_;
gfx::Rect element_rect_;
bool did_invoke_close_;
@@ -68,9 +67,9 @@ class SpeechInputBubbleGtk
SpeechInputBubbleGtk::SpeechInputBubbleGtk(TabContents* tab_contents,
Delegate* delegate,
const gfx::Rect& element_rect)
- : delegate_(delegate),
+ : SpeechInputBubbleBase(tab_contents),
+ delegate_(delegate),
info_bubble_(NULL),
- tab_contents_(tab_contents),
element_rect_(element_rect),
did_invoke_close_(false),
label_(NULL),
@@ -145,10 +144,10 @@ void SpeechInputBubbleGtk::Show() {
gtk_container_add(GTK_CONTAINER(content), vbox);
GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(
- tab_contents_->profile());
+ tab_contents()->profile());
gfx::Rect rect(element_rect_.x() + kBubbleTargetOffsetX,
element_rect_.y() + element_rect_.height(), 1, 1);
- info_bubble_ = InfoBubbleGtk::Show(tab_contents_->GetNativeView(),
+ info_bubble_ = InfoBubbleGtk::Show(tab_contents()->GetNativeView(),
&rect,
content,
InfoBubbleGtk::ARROW_LOCATION_TOP_LEFT,
diff --git a/chrome/browser/speech/speech_input_bubble_mac.mm b/chrome/browser/speech/speech_input_bubble_mac.mm
index a48eac6..f70ab13 100644
--- a/chrome/browser/speech/speech_input_bubble_mac.mm
+++ b/chrome/browser/speech/speech_input_bubble_mac.mm
@@ -30,7 +30,6 @@ class SpeechInputBubbleImpl : public SpeechInputBubbleBase {
private:
scoped_nsobject<SpeechInputWindowController> window_;
- TabContents* tab_contents_;
Delegate* delegate_;
gfx::Rect element_rect_;
};
@@ -38,7 +37,7 @@ class SpeechInputBubbleImpl : public SpeechInputBubbleBase {
SpeechInputBubbleImpl::SpeechInputBubbleImpl(TabContents* tab_contents,
Delegate* delegate,
const gfx::Rect& element_rect)
- : tab_contents_(tab_contents),
+ : SpeechInputBubbleBase(tab_contents),
delegate_(delegate),
element_rect_(element_rect) {
}
@@ -62,7 +61,7 @@ void SpeechInputBubbleImpl::Show() {
// Find the screen coordinates for the given tab and position the bubble's
// arrow anchor point inside that to point at the bottom-left of the html
// input element rect.
- gfx::NativeView view = tab_contents_->view()->GetNativeView();
+ gfx::NativeView view = tab_contents()->view()->GetNativeView();
NSRect tab_bounds = [view bounds];
NSPoint anchor = NSMakePoint(
tab_bounds.origin.x + element_rect_.x() + kBubbleTargetOffsetX,
@@ -72,7 +71,7 @@ void SpeechInputBubbleImpl::Show() {
anchor = [[view window] convertBaseToScreen:anchor];
window_.reset([[SpeechInputWindowController alloc]
- initWithParentWindow:tab_contents_->view()->GetTopLevelNativeWindow()
+ initWithParentWindow:tab_contents()->view()->GetTopLevelNativeWindow()
delegate:delegate_
anchoredAt:anchor]);
diff --git a/chrome/browser/speech/speech_input_bubble_views.cc b/chrome/browser/speech/speech_input_bubble_views.cc
index 2dd624f..1eadfc3 100644
--- a/chrome/browser/speech/speech_input_bubble_views.cc
+++ b/chrome/browser/speech/speech_input_bubble_views.cc
@@ -13,10 +13,6 @@
#include "chrome/browser/tab_contents/tab_contents_view.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/views/info_bubble.h"
-#include "chrome/common/notification_observer.h"
-#include "chrome/common/notification_registrar.h"
-#include "chrome/common/notification_service.h"
-#include "chrome/common/notification_type.h"
#include "gfx/canvas.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -196,8 +192,7 @@ void ContentView::Layout() {
// Implementation of SpeechInputBubble.
class SpeechInputBubbleImpl
: public SpeechInputBubbleBase,
- public InfoBubbleDelegate,
- public NotificationObserver {
+ public InfoBubbleDelegate {
public:
SpeechInputBubbleImpl(TabContents* tab_contents,
Delegate* delegate,
@@ -216,11 +211,6 @@ class SpeechInputBubbleImpl
// |element_rect| is the html element's bounds in page coordinates.
gfx::Rect GetInfoBubbleTarget(const gfx::Rect& element_rect);
- // NotificationObserver implementation.
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details);
-
// InfoBubbleDelegate
virtual void InfoBubbleClosing(InfoBubble* info_bubble,
bool closed_by_escape);
@@ -230,9 +220,7 @@ class SpeechInputBubbleImpl
private:
Delegate* delegate_;
InfoBubble* info_bubble_;
- TabContents* tab_contents_;
ContentView* bubble_content_;
- NotificationRegistrar registrar_;
gfx::Rect element_rect_;
// Set to true if the object is being destroyed normally instead of the
@@ -245,9 +233,9 @@ class SpeechInputBubbleImpl
SpeechInputBubbleImpl::SpeechInputBubbleImpl(TabContents* tab_contents,
Delegate* delegate,
const gfx::Rect& element_rect)
- : delegate_(delegate),
+ : SpeechInputBubbleBase(tab_contents),
+ delegate_(delegate),
info_bubble_(NULL),
- tab_contents_(tab_contents),
bubble_content_(NULL),
element_rect_(element_rect),
did_invoke_close_(false) {
@@ -261,26 +249,14 @@ SpeechInputBubbleImpl::~SpeechInputBubbleImpl() {
gfx::Rect SpeechInputBubbleImpl::GetInfoBubbleTarget(
const gfx::Rect& element_rect) {
gfx::Rect container_rect;
- tab_contents_->GetContainerBounds(&container_rect);
+ tab_contents()->GetContainerBounds(&container_rect);
return gfx::Rect(
container_rect.x() + element_rect.x() + kBubbleTargetOffsetX,
container_rect.y() + element_rect.y() + element_rect.height(), 1, 1);
}
-void SpeechInputBubbleImpl::Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- if (type == NotificationType::TAB_CONTENTS_DESTROYED) {
- delegate_->InfoBubbleButtonClicked(SpeechInputBubble::BUTTON_CANCEL);
- } else {
- NOTREACHED() << "Unknown notification";
- }
-}
-
void SpeechInputBubbleImpl::InfoBubbleClosing(InfoBubble* info_bubble,
bool closed_by_escape) {
- registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED,
- Source<TabContents>(tab_contents_));
info_bubble_ = NULL;
bubble_content_ = NULL;
if (!did_invoke_close_)
@@ -303,7 +279,7 @@ void SpeechInputBubbleImpl::Show() {
UpdateLayout();
views::Widget* parent = views::Widget::GetWidgetFromNativeWindow(
- tab_contents_->view()->GetTopLevelNativeWindow());
+ tab_contents()->view()->GetTopLevelNativeWindow());
info_bubble_ = InfoBubble::Show(parent,
GetInfoBubbleTarget(element_rect_),
BubbleBorder::TOP_LEFT, bubble_content_,
@@ -315,9 +291,6 @@ void SpeechInputBubbleImpl::Show() {
// to end so the caller can manage this object's life cycle like a normal
// stack based or member variable object.
info_bubble_->set_fade_away_on_close(false);
-
- registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED,
- Source<TabContents>(tab_contents_));
}
void SpeechInputBubbleImpl::Hide() {
diff --git a/chrome/browser/speech/speech_input_dispatcher_host.cc b/chrome/browser/speech/speech_input_dispatcher_host.cc
index 1563af3..dc5ff07 100644
--- a/chrome/browser/speech/speech_input_dispatcher_host.cc
+++ b/chrome/browser/speech/speech_input_dispatcher_host.cc
@@ -122,19 +122,30 @@ SpeechInputManager* SpeechInputDispatcherHost::manager() {
}
bool SpeechInputDispatcherHost::OnMessageReceived(
- const IPC::Message& msg, bool* msg_was_ok) {
+ const IPC::Message& message, bool* message_was_ok) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP_EX(SpeechInputDispatcherHost, msg, *msg_was_ok)
- IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_StartRecognition,
- OnStartRecognition)
- IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_CancelRecognition,
- OnCancelRecognition)
- IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_StopRecording,
- OnStopRecording)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
+ uint32 message_type = message.type();
+ if (message_type == ViewHostMsg_SpeechInput_StartRecognition::ID ||
+ message_type == ViewHostMsg_SpeechInput_CancelRecognition::ID ||
+ message_type == ViewHostMsg_SpeechInput_StopRecording::ID) {
+ if (!SpeechInputManager::IsFeatureEnabled()) {
+ *message_was_ok = false;
+ return true;
+ }
+
+ IPC_BEGIN_MESSAGE_MAP_EX(SpeechInputDispatcherHost, message,
+ *message_was_ok)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_StartRecognition,
+ OnStartRecognition)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_CancelRecognition,
+ OnCancelRecognition)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SpeechInput_StopRecording,
+ OnStopRecording)
+ IPC_END_MESSAGE_MAP()
+ return true;
+ }
+
+ return false;
}
void SpeechInputDispatcherHost::OnStartRecognition(
diff --git a/chrome/browser/speech/speech_input_manager.cc b/chrome/browser/speech/speech_input_manager.cc
index 7149223..b418265 100644
--- a/chrome/browser/speech/speech_input_manager.cc
+++ b/chrome/browser/speech/speech_input_manager.cc
@@ -5,12 +5,16 @@
#include "chrome/browser/speech/speech_input_manager.h"
#include "app/l10n_util.h"
+#include "base/command_line.h"
#include "base/lock.h"
#include "base/ref_counted.h"
#include "base/singleton.h"
+#include "base/thread_restrictions.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_thread.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/browser/platform_util.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/speech/speech_input_bubble_controller.h"
#include "chrome/browser/speech/speech_recognizer.h"
@@ -134,7 +138,6 @@ class SpeechInputManagerImpl : public SpeechInputManager,
// Starts/restarts recognition for an existing request.
void StartRecognitionForRequest(int caller_id);
- SpeechInputManagerDelegate* delegate_;
typedef std::map<int, SpeechInputRequest> SpeechRecognizerMap;
SpeechRecognizerMap requests_;
int recording_caller_id_;
@@ -146,6 +149,26 @@ SpeechInputManager* SpeechInputManager::Get() {
return Singleton<SpeechInputManagerImpl>::get();
}
+bool SpeechInputManager::IsFeatureEnabled() {
+ bool enabled = true;
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+
+ if (command_line.HasSwitch(switches::kDisableSpeechInput)) {
+ enabled = false;
+#if defined(GOOGLE_CHROME_BUILD)
+ } else if (!command_line.HasSwitch(switches::kEnableSpeechInput)) {
+ // We need to evaluate whether IO is OK here. http://crbug.com/63335.
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
+ // Official Chrome builds have speech input enabled by default only in the
+ // dev channel.
+ std::string channel = platform_util::GetVersionStringModifier();
+ enabled = (channel == "dev");
+#endif
+ }
+
+ return enabled;
+}
+
SpeechInputManagerImpl::SpeechInputManagerImpl()
: recording_caller_id_(0),
bubble_controller_(new SpeechInputBubbleController(
diff --git a/chrome/browser/speech/speech_input_manager.h b/chrome/browser/speech/speech_input_manager.h
index be9779f..b16b76a 100644
--- a/chrome/browser/speech/speech_input_manager.h
+++ b/chrome/browser/speech/speech_input_manager.h
@@ -32,6 +32,10 @@ class SpeechInputManager {
virtual ~Delegate() {}
};
+ // Whether the speech input feature is enabled, based on the browser channel
+ // information and command line flags.
+ static bool IsFeatureEnabled();
+
// Factory method to access the singleton. We have this method here instead of
// using Singleton<> directly in the calling code to aid tests in injection
// mocks.
diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
index c7f59ff..276b72a 100644
--- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
+++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
@@ -274,6 +274,7 @@ WebPreferences RenderViewHostDelegateHelper::GetWebkitPrefs(
!command_line.HasSwitch(switches::kDisableDatabases);
web_prefs.experimental_webgl_enabled =
gpu_enabled() &&
+ !command_line.HasSwitch(switches::kDisable3DAPIs) &&
!command_line.HasSwitch(switches::kDisableExperimentalWebGL);
web_prefs.site_specific_quirks_enabled =
!command_line.HasSwitch(switches::kDisableSiteSpecificQuirks);
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 6df65d9..c943429 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -2039,6 +2039,9 @@ void Browser::RegisterUserPrefs(PrefService* prefs) {
prefs->RegisterStringPref(prefs::kCloudPrintEmail, std::string());
prefs->RegisterBooleanPref(prefs::kDevToolsDisabled, false);
prefs->RegisterRealPref(prefs::kDefaultZoomLevel, 0.0);
+ // We need to register the type of this preference in order to query
+ // it even though it's only typically controlled via policy.
+ prefs->RegisterBooleanPref(prefs::kDisable3DAPIs, false);
}
// static
@@ -4134,9 +4137,11 @@ bool Browser::OpenInstant(WindowOpenDisposition disposition) {
return true;
}
if (disposition == NEW_FOREGROUND_TAB || disposition == NEW_BACKGROUND_TAB) {
- HideInstant();
TabContentsWrapper* preview_contents = instant()->ReleasePreviewContents(
INSTANT_COMMIT_PRESSED_ENTER);
+ // HideInstant is invoked after release so that InstantController is not
+ // active when HideInstant asks it for its state.
+ HideInstant();
preview_contents->controller().PruneAllButActive();
tab_handler_->GetTabStripModel()->AddTabContents(
preview_contents,
diff --git a/chrome/common/automation_messages_internal.h b/chrome/common/automation_messages_internal.h
index e2198a1..6888ea4 100644
--- a/chrome/common/automation_messages_internal.h
+++ b/chrome/common/automation_messages_internal.h
@@ -1169,10 +1169,9 @@ IPC_BEGIN_MESSAGES(Automation)
// Retrieves a list of the root directories of all enabled extensions
// that have been installed into Chrome by dropping a .crx file onto
// Chrome or an equivalent action (including loaded extensions).
- // Other types of extensions are not included on the list (e.g. "component"
- // or "external" extensions) since they are generally not useful for testing
- // (e.g. an external extension could mess with an automated test if it's
- // present on some systems only).
+ // Other types of extensions are not included on the list (e.g. "component",
+ // "app" or "external" extensions) since since CEEE does not yet support them
+ // (and it actually only support a single extension in its profile for now).
IPC_SYNC_MESSAGE_ROUTED0_1(AutomationMsg_GetEnabledExtensions,
std::vector<FilePath>)
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 965c067..fe27f65 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -135,6 +135,12 @@ const char kDeviceManagementUrl[] = "device-management-url";
// Triggers a pletora of diagnostic modes.
const char kDiagnostics[] = "diagnostics";
+// Disables client-visible 3D APIs, in particular WebGL and Pepper 3D.
+// This is controlled by policy and is kept separate from the other
+// enable/disable switches to avoid accidentally regressing the policy
+// support for controlling access to these APIs.
+const char kDisable3DAPIs[] = "disable-3d-apis";
+
// Disables accelerated compositing.
const char kDisableAcceleratedCompositing[] =
"disable-accelerated-compositing";
@@ -211,9 +217,6 @@ const char kDisableExtensionsFileAccessCheck[] =
// Disable FileSystem API.
const char kDisableFileSystem[] = "disable-file-system";
-// Disables the sandbox for the built-in flash player.
-const char kDisableFlashSandbox[] = "disable-flash-sandbox";
-
// Suppresses support for the Geolocation javascript API.
const char kDisableGeolocation[] = "disable-geolocation";
@@ -395,9 +398,6 @@ const char kEnableAccessibility[] = "enable-accessibility";
// Enables AeroPeek for each tab. (This switch only works on Windows 7).
const char kEnableAeroPeekTabs[] = "enable-aero-peek-tabs";
-// Enables the application section of the new tab page.
-const char kEnableAppLauncher[] = "enable-app-launcher";
-
// Enable the inclusion of non-standard ports when generating the Kerberos SPN
// in response to a Negotiate challenge. See HttpAuthHandlerNegotiate::CreateSPN
// for more background.
@@ -448,10 +448,6 @@ const char kEnableContentPrefetch[] = "enable-content-prefetch";
// Enables web developers to create apps for Chrome without using crx packages.
const char kEnableCrxlessWebApps[] = "enable-crxless-web-apps";
-// Whether default apps should be installed in this profile. This flag has no
-// effect on Chrome OS because default apps are always enabled there.
-const char kEnableDefaultApps[] = "enable-default-apps";
-
// Enables device motion events.
const char kEnableDeviceMotion[] = "enable-device-motion";
@@ -476,6 +472,10 @@ const char kEnableFastback[] = "enable-fastback";
// testing, for example page cycler and layout tests. See bug 1157243.
const char kEnableFileCookies[] = "enable-file-cookies";
+// Enables the sandbox for the built-in flash player.
+const char kEnableFlashSandbox[] = "enable-flash-sandbox";
+
+
// Enable IPv6 support, even if probes suggest that it may not be fully
// supported. Some probes may require internet connections, and this flag will
// allow support independent of application testing.
@@ -717,6 +717,9 @@ const char kHostResolverParallelism[] = "host-resolver-parallelism";
// These mappings only apply to the host resolver.
const char kHostResolverRules[] = "host-resolver-rules";
+// Ignores GPU blacklist.
+const char kIgnoreGpuBlacklist[] = "ignore-gpu-blacklist";
+
// Perform importing from another browser. The value associated with this
// setting encodes the target browser and what items to import.
const char kImport[] = "import";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 6b8570d..4d0c4c7 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -51,6 +51,7 @@ extern const char kCountry[];
extern const char kDebugPrint[];
extern const char kDeviceManagementUrl[];
extern const char kDiagnostics[];
+extern const char kDisable3DAPIs[];
extern const char kDisableAcceleratedCompositing[];
extern const char kDisableAltWinstation[];
extern const char kDisableApplicationCache[];
@@ -70,7 +71,6 @@ extern const char kDisableExperimentalWebGL[];
extern const char kDisableExtensionsFileAccessCheck[];
extern const char kDisableExtensions[];
extern const char kDisableFileSystem[];
-extern const char kDisableFlashSandbox[];
extern const char kDisableGLSLTranslator[];
extern const char kDisableGeolocation[];
extern const char kDisableGpuWatchdog[];
@@ -121,7 +121,6 @@ extern const char kEnableAccelerated2dCanvas[];
extern const char kEnableAcceleratedLayers[];
extern const char kEnableAccessibility[];
extern const char kEnableAeroPeekTabs[];
-extern const char kEnableAppLauncher[];
extern const char kEnableAuthNegotiatePort[];
extern const char kEnableBackgroundMode[];
extern const char kEnableBenchmarking[];
@@ -135,7 +134,6 @@ extern const char kEnableConfirmToQuit[];
extern const char kEnableConnectBackupJobs[];
extern const char kEnableContentPrefetch[];
extern const char kEnableCrxlessWebApps[];
-extern const char kEnableDefaultApps[];
extern const char kEnableDeviceMotion[];
extern const char kEnableDNSCertProvenanceChecking[];
extern const char kEnableDNSSECCerts[];
@@ -143,6 +141,7 @@ extern const char kEnableExperimentalExtensionApis[];
extern const char kEnableExtensionTimelineApi[];
extern const char kEnableFastback[];
extern const char kEnableFileCookies[];
+extern const char kEnableFlashSandbox[];
extern const char kEnableGPUPlugin[];
extern const char kEnableIPv6[];
extern const char kEnableLogging[];
@@ -206,6 +205,7 @@ extern const char kHomePage[];
extern const char kHostRules[];
extern const char kHostResolverParallelism[];
extern const char kHostResolverRules[];
+extern const char kIgnoreGpuBlacklist[];
extern const char kImport[];
extern const char kImportFromFile[];
extern const char kInProcessPlugins[];
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index 4463a3c..1cb4a0e 100644
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -3941,20 +3941,7 @@
"description": {
"type": "string",
"minLength": 1,
- "description": "The text that is displayed in the URL dropdown. Can optionally be stylized by the descriptionStyles parameter."
- },
- "descriptionStyles": {
- "type": "array",
- "optional": true,
- "description": "An array of style objects, created using styleUrl, styleMatch, or styleDim. A style applies to the region of text specified by the style's starting offset and length. If there are any overlapping regions of text covered by multiple styles, they will be added together (e.g. 'match' + 'dim' will display a dimmed match). Not all style combinations will be visually distinct (e.g. 'url' + 'dim' may look identical to 'url').",
- "items": {
- "type": "object",
- "properties": {
- "type": {"type": "string", "enum": ["url", "match", "dim"]},
- "offset": {"type": "integer"},
- "length": {"type": "integer", "optional": true}
- }
- }
+ "description": "The text that is displayed in the URL dropdown. Can contain XML-style markup for styling. The supported tags are 'url' (for a literal URL), 'match' (for highlighting text that matched what the user's query), and 'dim' (for dim helper text). The styles can be nested, eg. <dim><match>dimmed match</match></dim>."
}
}
}
@@ -3971,7 +3958,8 @@
"type": "array",
"description": "Array of suggest results",
"items": {
- "$ref": "SuggestResult"
+ "type": "object",
+ "additionalProperties": { "type": "any" }
}
}
]
@@ -3986,53 +3974,14 @@
"name": "suggestion",
"description": "A partial SuggestResult object, without the 'content' parameter. See SuggestResult for a description of the parameters.",
"properties": {
- "description": {
- "type": "string",
- "minLength": 1,
- "description": "The text to display in the default suggestion. The placeholder string '%s' can be included and will be replaced with the user's input."
- },
- "descriptionStyles": {
- "type": "array",
- "optional": true,
- "items": {
- "type": "object",
- "properties": {
- "type": {"type": "string", "enum": ["url", "match", "dim"]},
- "offset": {"type": "integer"},
- "length": {"type": "integer", "optional": true}
- }
- }
- }
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The text to display in the default suggestion. The placeholder string '%s' can be included and will be replaced with the user's input."
+ }
}
}
]
- },
- {
- "name": "styleUrl",
- "type": "function",
- "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching a URL or filename. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.",
- "parameters": [
- {"type": "integer", "name": "offset"},
- {"type": "integer", "name": "length", "minimum": 0, "optional": true}
- ]
- },
- {
- "name": "styleMatch",
- "type": "function",
- "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching what the user typed. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.",
- "parameters": [
- {"type": "integer", "name": "offset"},
- {"type": "integer", "name": "length", "minimum": 0, "optional": true}
- ]
- },
- {
- "name": "styleDim",
- "type": "function",
- "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of dim helper text. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.",
- "parameters": [
- {"type": "integer", "name": "offset"},
- {"type": "integer", "name": "length", "minimum": 0, "optional": true}
- ]
}
],
"events": [
diff --git a/chrome/common/extensions/docs/a11y.html b/chrome/common/extensions/docs/a11y.html
index 721b93a..d18f6f7 100644
--- a/chrome/common/extensions/docs/a11y.html
+++ b/chrome/common/extensions/docs/a11y.html
@@ -956,7 +956,7 @@ see <a href="samples.html">Samples</a>.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/api_index.html b/chrome/common/extensions/docs/api_index.html
index 5480998..af8e72b 100644
--- a/chrome/common/extensions/docs/api_index.html
+++ b/chrome/common/extensions/docs/api_index.html
@@ -523,7 +523,7 @@ For more information, see the video
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/api_other.html b/chrome/common/extensions/docs/api_other.html
index baa17f2..7a0077e 100644
--- a/chrome/common/extensions/docs/api_other.html
+++ b/chrome/common/extensions/docs/api_other.html
@@ -555,7 +555,7 @@ just as they do in other web pages.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/apps.html b/chrome/common/extensions/docs/apps.html
index 0d3b3aa..0b50ed7 100644
--- a/chrome/common/extensions/docs/apps.html
+++ b/chrome/common/extensions/docs/apps.html
@@ -653,7 +653,7 @@ basic concepts about extensions.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/autoupdate.html b/chrome/common/extensions/docs/autoupdate.html
index b65e2a8..d3aaf51 100644
--- a/chrome/common/extensions/docs/autoupdate.html
+++ b/chrome/common/extensions/docs/autoupdate.html
@@ -612,7 +612,7 @@ Another option is to use the --extensions-update-frequency command-line flag to
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/background_pages.html b/chrome/common/extensions/docs/background_pages.html
index 68dfa2d..85d9b99 100644
--- a/chrome/common/extensions/docs/background_pages.html
+++ b/chrome/common/extensions/docs/background_pages.html
@@ -605,7 +605,7 @@ from a file named <code>image.html</code>.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/bookmarks.html b/chrome/common/extensions/docs/bookmarks.html
index 1f31c7b..33dd392 100644
--- a/chrome/common/extensions/docs/bookmarks.html
+++ b/chrome/common/extensions/docs/bookmarks.html
@@ -5323,7 +5323,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/browserAction.html b/chrome/common/extensions/docs/browserAction.html
index 639fd88..f8b505f 100644
--- a/chrome/common/extensions/docs/browserAction.html
+++ b/chrome/common/extensions/docs/browserAction.html
@@ -1909,7 +1909,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/content_scripts.html b/chrome/common/extensions/docs/content_scripts.html
index 3e529d2..e64f704 100644
--- a/chrome/common/extensions/docs/content_scripts.html
+++ b/chrome/common/extensions/docs/content_scripts.html
@@ -961,7 +961,7 @@ sending a request to its parent extension.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/contextMenus.html b/chrome/common/extensions/docs/contextMenus.html
index 1265b34..981c17d 100644
--- a/chrome/common/extensions/docs/contextMenus.html
+++ b/chrome/common/extensions/docs/contextMenus.html
@@ -2933,7 +2933,7 @@ You can find samples of this API on the
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/cookies.html b/chrome/common/extensions/docs/cookies.html
index 582afa1..f45e8ef 100644
--- a/chrome/common/extensions/docs/cookies.html
+++ b/chrome/common/extensions/docs/cookies.html
@@ -3611,7 +3611,7 @@ see <a href="samples.html">Samples</a>.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/crx.html b/chrome/common/extensions/docs/crx.html
index b1b2df7..9a72d60 100644
--- a/chrome/common/extensions/docs/crx.html
+++ b/chrome/common/extensions/docs/crx.html
@@ -638,7 +638,7 @@ echo "Wrote $crx"
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/devguide.html b/chrome/common/extensions/docs/devguide.html
index a806b4b..8e489a6 100644
--- a/chrome/common/extensions/docs/devguide.html
+++ b/chrome/common/extensions/docs/devguide.html
@@ -607,7 +607,7 @@ applies to packaged apps, as well as extensions.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/docs.html b/chrome/common/extensions/docs/docs.html
index aa629a7..baab851 100644
--- a/chrome/common/extensions/docs/docs.html
+++ b/chrome/common/extensions/docs/docs.html
@@ -610,7 +610,7 @@ The following table lists the doc locations and explains how they differ.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/events.html b/chrome/common/extensions/docs/events.html
index e6a3bb2..3136703 100644
--- a/chrome/common/extensions/docs/events.html
+++ b/chrome/common/extensions/docs/events.html
@@ -515,7 +515,7 @@ bool hasListener(function callback(...))
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/examples/api/omnibox/extension-docs.zip b/chrome/common/extensions/docs/examples/api/omnibox/extension-docs.zip
index cc0a940..b19a20a 100644
--- a/chrome/common/extensions/docs/examples/api/omnibox/extension-docs.zip
+++ b/chrome/common/extensions/docs/examples/api/omnibox/extension-docs.zip
Binary files differ
diff --git a/chrome/common/extensions/docs/examples/api/omnibox/simple-example.zip b/chrome/common/extensions/docs/examples/api/omnibox/simple-example.zip
index 069886a..17d22b2 100644
--- a/chrome/common/extensions/docs/examples/api/omnibox/simple-example.zip
+++ b/chrome/common/extensions/docs/examples/api/omnibox/simple-example.zip
Binary files differ
diff --git a/chrome/common/extensions/docs/examples/extensions/chrome_search.zip b/chrome/common/extensions/docs/examples/extensions/chrome_search.zip
index fc89e2f..d0ad166 100644
--- a/chrome/common/extensions/docs/examples/extensions/chrome_search.zip
+++ b/chrome/common/extensions/docs/examples/extensions/chrome_search.zip
Binary files differ
diff --git a/chrome/common/extensions/docs/examples/extensions/chrome_search/background.html b/chrome/common/extensions/docs/examples/extensions/chrome_search/background.html
index 07f9740..e796e77 100644
--- a/chrome/common/extensions/docs/examples/extensions/chrome_search/background.html
+++ b/chrome/common/extensions/docs/examples/extensions/chrome_search/background.html
@@ -3,10 +3,6 @@ var currentRequest = null;
chrome.omnibox.onInputChanged.addListener(
function(text, suggest) {
- if (text == '') {
- return;
- }
-
if (currentRequest != null) {
currentRequest.onreadystatechange = null;
currentRequest.abort();
@@ -14,8 +10,7 @@ chrome.omnibox.onInputChanged.addListener(
}
updateDefaultSuggestion(text);
-
- if (text == 'halp')
+ if (text == '' || text == 'halp')
return;
currentRequest = search(text, function(xml) {
@@ -32,25 +27,32 @@ chrome.omnibox.onInputChanged.addListener(
if (/^file:/.test(text)) {
description += ' <dim>' + path + '</dim>';
} else {
- description += ' ';
-
- // Highlight all occurrences of the match text.
var content = entry.getElementsByTagName("content")[0].textContent;
- var start = 0;
- var index = 0;
- for (;;) {
- var index = content.toLowerCase().indexOf(
- text.toLowerCase(), start);
- if (index < 0) {
- description += content.substring(start);
+
+ // There can be multiple lines. Kill all the ones except the one that
+ // contains the first match. We can ocassionally fail to find a single
+ // line that matches, so we still handle multiple lines below.
+ var matches = content.split(/\n/);
+ for (var j = 0, match; match = matches[j]; j++) {
+ if (match.indexOf('<b>') > -1) {
+ content = match;
break;
}
-
- description += content.substring(start, index);
- description +=
- '<match>' + content.substr(index, text.length) + '</match>';
- start = index + text.length;
}
+
+ // Replace any extraneous whitespace to make it look nicer.
+ content = content.replace(/[\n\t]/g, ' ');
+ content = content.replace(/ {2,}/g, ' ');
+
+ // Codesearch wraps the result in <pre> tags. Remove those if they're
+ // still there.
+ content = content.replace(/<\/?pre>/g, '');
+
+ // Codesearch highlights the matches with 'b' tags. Replaces those
+ // with 'match'.
+ content = content.replace(/<(\/)?b>/g, '<$1match>');
+
+ description += ' ' + content;
}
results.push({
diff --git a/chrome/common/extensions/docs/examples/extensions/chrome_search/manifest.json b/chrome/common/extensions/docs/examples/extensions/chrome_search/manifest.json
index 3254391..54de17c 100644
--- a/chrome/common/extensions/docs/examples/extensions/chrome_search/manifest.json
+++ b/chrome/common/extensions/docs/examples/extensions/chrome_search/manifest.json
@@ -1,9 +1,9 @@
{
"background_page": "background.html",
"description": "Add support to the omnibox to search the Chromium source code.",
- "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRx0y4f/CuomPPeGxcVMo7yfYZ1apxD+9e3ItNtPRBi8WMmzG0xhjnqvm03LTfTljbzA1L93s31HkjS5Bd12qM8SSZxOOizsZveK1tdpX0QelikSUaz1wwIyjatoC/jJy7vuuk0j5kPeLkNAhYGJTqN3H/Pqt0lFF1VFX4+fCEvQIDAQAB",
"name": "Chromium Search",
"omnibox": { "keyword" : "src" },
"permissions": [ "tabs", "http://www.google.com/" ],
- "version": "4"
+ "version": "5",
+ "minimum_chrome_version": "9"
}
diff --git a/chrome/common/extensions/docs/examples/extensions/imageinfo.zip b/chrome/common/extensions/docs/examples/extensions/imageinfo.zip
index 1fb7a3a..9ab6603 100644
--- a/chrome/common/extensions/docs/examples/extensions/imageinfo.zip
+++ b/chrome/common/extensions/docs/examples/extensions/imageinfo.zip
Binary files differ
diff --git a/chrome/common/extensions/docs/experimental.clipboard.html b/chrome/common/extensions/docs/experimental.clipboard.html
index 4852c75..24287e0 100644
--- a/chrome/common/extensions/docs/experimental.clipboard.html
+++ b/chrome/common/extensions/docs/experimental.clipboard.html
@@ -966,7 +966,7 @@ generally indicates the tab is going away.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.contextMenus.html b/chrome/common/extensions/docs/experimental.contextMenus.html
index 5f246fd..aa7a362 100644
--- a/chrome/common/extensions/docs/experimental.contextMenus.html
+++ b/chrome/common/extensions/docs/experimental.contextMenus.html
@@ -480,7 +480,7 @@ You can read all about it at its new home:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.cookies.html b/chrome/common/extensions/docs/experimental.cookies.html
index b179e08..5fdcdcc 100644
--- a/chrome/common/extensions/docs/experimental.cookies.html
+++ b/chrome/common/extensions/docs/experimental.cookies.html
@@ -480,7 +480,7 @@ You can read all about it at its new home:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.history.html b/chrome/common/extensions/docs/experimental.history.html
index b839162..0e45ec7 100644
--- a/chrome/common/extensions/docs/experimental.history.html
+++ b/chrome/common/extensions/docs/experimental.history.html
@@ -480,7 +480,7 @@ You can read all about it at its new home:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.html b/chrome/common/extensions/docs/experimental.html
index fd600a2..1c9ebe1 100644
--- a/chrome/common/extensions/docs/experimental.html
+++ b/chrome/common/extensions/docs/experimental.html
@@ -547,7 +547,7 @@ For information on the standard APIs that extensions can use, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.idle.html b/chrome/common/extensions/docs/experimental.idle.html
index 6f709ae..6d1ae19 100644
--- a/chrome/common/extensions/docs/experimental.idle.html
+++ b/chrome/common/extensions/docs/experimental.idle.html
@@ -480,7 +480,7 @@ You can read all about it at its new home:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.infobars.html b/chrome/common/extensions/docs/experimental.infobars.html
index 59e642d..f542b7a 100644
--- a/chrome/common/extensions/docs/experimental.infobars.html
+++ b/chrome/common/extensions/docs/experimental.infobars.html
@@ -800,7 +800,7 @@ For example:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.processes.html b/chrome/common/extensions/docs/experimental.processes.html
index a41a1c6..f2a289e 100644
--- a/chrome/common/extensions/docs/experimental.processes.html
+++ b/chrome/common/extensions/docs/experimental.processes.html
@@ -1107,7 +1107,7 @@ http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.proxy.html b/chrome/common/extensions/docs/experimental.proxy.html
index 3f97065..07c2ed9 100644
--- a/chrome/common/extensions/docs/experimental.proxy.html
+++ b/chrome/common/extensions/docs/experimental.proxy.html
@@ -1455,7 +1455,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.sidebar.html b/chrome/common/extensions/docs/experimental.sidebar.html
index 09e6819..148de03 100644
--- a/chrome/common/extensions/docs/experimental.sidebar.html
+++ b/chrome/common/extensions/docs/experimental.sidebar.html
@@ -952,7 +952,7 @@
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
- <dd>'hidden' indicates sidebar is not defined for the specified tab (show was never called or hide() was called). Nothing is displayed for this sidebar.'shown' means sidebar is defined for the specified tab; mini tab is displayed for this sidebar. Sidebar UI is either collapsed or displaying a content of some other extension's sidebar.'active' indicates that sidebar is defined for the specified tab; sidebar UI is expanded and displaying this sidebar's content.</dd>
+ <dd>'hidden' indicates sidebar is not defined for the specified tab (show was never called or hide() was called). Nothing is displayed for this sidebar.<br>'shown' means sidebar is defined for the specified tab; mini tab is displayed for this sidebar. Sidebar UI is either collapsed or displaying a content of some other extension's sidebar.<br>'active' indicates that sidebar is defined for the specified tab; sidebar UI is expanded and displaying this sidebar's content.</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
@@ -2583,7 +2583,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.webNavigation.html b/chrome/common/extensions/docs/experimental.webNavigation.html
index 237ee23..52a04af 100644
--- a/chrome/common/extensions/docs/experimental.webNavigation.html
+++ b/chrome/common/extensions/docs/experimental.webNavigation.html
@@ -2555,7 +2555,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/experimental.webRequest.html b/chrome/common/extensions/docs/experimental.webRequest.html
index 14346ff..71769af 100644
--- a/chrome/common/extensions/docs/experimental.webRequest.html
+++ b/chrome/common/extensions/docs/experimental.webRequest.html
@@ -2493,7 +2493,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/extension.html b/chrome/common/extensions/docs/extension.html
index e7bb9e7..a0e11fd 100644
--- a/chrome/common/extensions/docs/extension.html
+++ b/chrome/common/extensions/docs/extension.html
@@ -3556,7 +3556,7 @@ For details, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/external_extensions.html b/chrome/common/extensions/docs/external_extensions.html
index 39c1540..0ee2ed5 100644
--- a/chrome/common/extensions/docs/external_extensions.html
+++ b/chrome/common/extensions/docs/external_extensions.html
@@ -768,7 +768,7 @@ through the UI, and then uninstalling it. </p>
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/faq.html b/chrome/common/extensions/docs/faq.html
index 66cc1b4..0e17982 100644
--- a/chrome/common/extensions/docs/faq.html
+++ b/chrome/common/extensions/docs/faq.html
@@ -872,7 +872,7 @@ win,stable,#.#.###.#,#.#.###.#</pre>
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/getstarted.html b/chrome/common/extensions/docs/getstarted.html
index d7e94c8..3adba4e 100644
--- a/chrome/common/extensions/docs/getstarted.html
+++ b/chrome/common/extensions/docs/getstarted.html
@@ -656,7 +656,7 @@ If you don't feel like reading, try these:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/history.html b/chrome/common/extensions/docs/history.html
index ce1c49e..e6be466 100644
--- a/chrome/common/extensions/docs/history.html
+++ b/chrome/common/extensions/docs/history.html
@@ -3150,7 +3150,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/hosting.html b/chrome/common/extensions/docs/hosting.html
index e852619..0a688fb 100644
--- a/chrome/common/extensions/docs/hosting.html
+++ b/chrome/common/extensions/docs/hosting.html
@@ -560,7 +560,7 @@ or try hosting the <code>.crx</code> file at another server.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/i18n-messages.html b/chrome/common/extensions/docs/i18n-messages.html
index cf07efd..3c85b6b 100644
--- a/chrome/common/extensions/docs/i18n-messages.html
+++ b/chrome/common/extensions/docs/i18n-messages.html
@@ -814,7 +814,7 @@ because its value is obvious from the "content" field.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/i18n.html b/chrome/common/extensions/docs/i18n.html
index 39d0f83..d5e3bb9 100644
--- a/chrome/common/extensions/docs/i18n.html
+++ b/chrome/common/extensions/docs/i18n.html
@@ -1421,7 +1421,7 @@ For details on calling <code>getAcceptLanguages()</code>, see the
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/idle.html b/chrome/common/extensions/docs/idle.html
index 6b3aa54..1ab1b64 100644
--- a/chrome/common/extensions/docs/idle.html
+++ b/chrome/common/extensions/docs/idle.html
@@ -713,7 +713,7 @@ For example:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/index.html b/chrome/common/extensions/docs/index.html
index 15f26c3..0e40220 100644
--- a/chrome/common/extensions/docs/index.html
+++ b/chrome/common/extensions/docs/index.html
@@ -582,7 +582,7 @@ For more information, see the
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/management.html b/chrome/common/extensions/docs/management.html
index d14251b..3bb1d52 100644
--- a/chrome/common/extensions/docs/management.html
+++ b/chrome/common/extensions/docs/management.html
@@ -2661,7 +2661,7 @@ For example:</p>
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/manifest.html b/chrome/common/extensions/docs/manifest.html
index 458421c..658290f 100644
--- a/chrome/common/extensions/docs/manifest.html
+++ b/chrome/common/extensions/docs/manifest.html
@@ -950,7 +950,7 @@ For more information, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/match_patterns.html b/chrome/common/extensions/docs/match_patterns.html
index c9aa23c..ddbc56b 100644
--- a/chrome/common/extensions/docs/match_patterns.html
+++ b/chrome/common/extensions/docs/match_patterns.html
@@ -702,7 +702,7 @@ Here are some examples of <em>invalid</em> pattern matches:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/messaging.html b/chrome/common/extensions/docs/messaging.html
index 4d7d884..19e683d 100644
--- a/chrome/common/extensions/docs/messaging.html
+++ b/chrome/common/extensions/docs/messaging.html
@@ -768,7 +768,7 @@ For more examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/notifications.html b/chrome/common/extensions/docs/notifications.html
index 3afbd73..82c5e07 100644
--- a/chrome/common/extensions/docs/notifications.html
+++ b/chrome/common/extensions/docs/notifications.html
@@ -609,7 +609,7 @@ see the <a href="http://dev.chromium.org/developers/design-documents/desktop-not
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/npapi.html b/chrome/common/extensions/docs/npapi.html
index 19fdc3a..8aad2ea 100644
--- a/chrome/common/extensions/docs/npapi.html
+++ b/chrome/common/extensions/docs/npapi.html
@@ -320,6 +320,7 @@ allowing you to call into native binary code from JavaScript.
</p><p>Code running in an NPAPI plugin has the full permissions of the current user and is not sandboxed or shielded from malicious input by Google Chrome in any way. You should be especially cautious when processing input from untrusted sources, such as when working with <a href="content_scripts.html#security-considerations">content scripts</a> or XMLHttpRequest.
</p><p>Because of the additional security risks NPAPI poses to users, extensions that use it will require manual review before being accepted in the
+<a href="https://chrome.google.com/webstore">web store</a> or
<a href="https://chrome.google.com/extensions">extension gallery</a>.
</p><h2>Details</h2>
@@ -566,7 +567,7 @@ avoid making your NPAPI plugin public whenever possible.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/omnibox.html b/chrome/common/extensions/docs/omnibox.html
index e983fc7..6f7afa7 100644
--- a/chrome/common/extensions/docs/omnibox.html
+++ b/chrome/common/extensions/docs/omnibox.html
@@ -280,12 +280,6 @@
<a href="#method-anchor">methodName</a>
</li><li>
<a href="#method-setDefaultSuggestion">setDefaultSuggestion</a>
- </li><li>
- <a href="#method-styleDim">styleDim</a>
- </li><li>
- <a href="#method-styleMatch">styleMatch</a>
- </li><li>
- <a href="#method-styleUrl">styleUrl</a>
</li>
</ol>
</li>
@@ -614,623 +608,6 @@ You can find samples of this API on the
</dd>
</div>
- </div><div>
- <div>
- <dt>
- <var>descriptionStyles</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span>
- array of <span><span>
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>object</span>
- <span style="display: none; "></span>
- </span>
- </span></span>
- </span>
- <span style="display: none; ">paramType</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div>
- </dl>
-
- <!-- RETURNS -->
- <h4 style="display: none; ">Returns</h4>
- <dl>
- <div style="display: none; ">
- <div>
- </div>
- </div>
- </dl>
-
- <!-- CALLBACK -->
- <div style="display: none; ">
- <div>
- <h4>Callback function</h4>
- <p>
- The callback <em>parameter</em> should specify a function
- that looks like this:
- </p>
- <p>
- If you specify the <em>callback</em> parameter, it should
- specify a function that looks like this:
- </p>
-
- <!-- Note: intentionally longer 80 columns -->
- <pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre>
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </div>
- </div>
-
- <!-- MIN_VERSION -->
- <p style="display: none; ">
- This function was added in version <b><span></span></b>.
- If you require this function, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </p>
- </div> <!-- /description -->
-
- </div><div class="apiItem">
- <a name="method-styleDim"></a> <!-- method-anchor -->
- <h4>styleDim</h4>
-
- <div class="summary"><span style="display: none; ">void</span>
- <!-- Note: intentionally longer 80 columns -->
- <span>chrome.omnibox.styleDim</span>(<span class="null"><span style="display: none; ">, </span><span>integer</span>
- <var><span>offset</span></var></span><span class="optional"><span>, </span><span>integer</span>
- <var><span>length</span></var></span>)</div>
-
- <div class="description">
- <p class="todo" style="display: none; ">Undocumented.</p>
- <p>Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of dim helper text. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.</p>
-
- <!-- PARAMETERS -->
- <h4>Parameters</h4>
- <dl>
- <div>
- <div>
- <dt>
- <var>offset</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional" style="display: none; ">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div><div>
- <div>
- <dt>
- <var>length</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div>
- </dl>
-
- <!-- RETURNS -->
- <h4 style="display: none; ">Returns</h4>
- <dl>
- <div style="display: none; ">
- <div>
- </div>
- </div>
- </dl>
-
- <!-- CALLBACK -->
- <div style="display: none; ">
- <div>
- <h4>Callback function</h4>
- <p>
- The callback <em>parameter</em> should specify a function
- that looks like this:
- </p>
- <p>
- If you specify the <em>callback</em> parameter, it should
- specify a function that looks like this:
- </p>
-
- <!-- Note: intentionally longer 80 columns -->
- <pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre>
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </div>
- </div>
-
- <!-- MIN_VERSION -->
- <p style="display: none; ">
- This function was added in version <b><span></span></b>.
- If you require this function, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </p>
- </div> <!-- /description -->
-
- </div><div class="apiItem">
- <a name="method-styleMatch"></a> <!-- method-anchor -->
- <h4>styleMatch</h4>
-
- <div class="summary"><span style="display: none; ">void</span>
- <!-- Note: intentionally longer 80 columns -->
- <span>chrome.omnibox.styleMatch</span>(<span class="null"><span style="display: none; ">, </span><span>integer</span>
- <var><span>offset</span></var></span><span class="optional"><span>, </span><span>integer</span>
- <var><span>length</span></var></span>)</div>
-
- <div class="description">
- <p class="todo" style="display: none; ">Undocumented.</p>
- <p>Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching what the user typed. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.</p>
-
- <!-- PARAMETERS -->
- <h4>Parameters</h4>
- <dl>
- <div>
- <div>
- <dt>
- <var>offset</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional" style="display: none; ">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div><div>
- <div>
- <dt>
- <var>length</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div>
- </dl>
-
- <!-- RETURNS -->
- <h4 style="display: none; ">Returns</h4>
- <dl>
- <div style="display: none; ">
- <div>
- </div>
- </div>
- </dl>
-
- <!-- CALLBACK -->
- <div style="display: none; ">
- <div>
- <h4>Callback function</h4>
- <p>
- The callback <em>parameter</em> should specify a function
- that looks like this:
- </p>
- <p>
- If you specify the <em>callback</em> parameter, it should
- specify a function that looks like this:
- </p>
-
- <!-- Note: intentionally longer 80 columns -->
- <pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre>
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </div>
- </div>
-
- <!-- MIN_VERSION -->
- <p style="display: none; ">
- This function was added in version <b><span></span></b>.
- If you require this function, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </p>
- </div> <!-- /description -->
-
- </div><div class="apiItem">
- <a name="method-styleUrl"></a> <!-- method-anchor -->
- <h4>styleUrl</h4>
-
- <div class="summary"><span style="display: none; ">void</span>
- <!-- Note: intentionally longer 80 columns -->
- <span>chrome.omnibox.styleUrl</span>(<span class="null"><span style="display: none; ">, </span><span>integer</span>
- <var><span>offset</span></var></span><span class="optional"><span>, </span><span>integer</span>
- <var><span>length</span></var></span>)</div>
-
- <div class="description">
- <p class="todo" style="display: none; ">Undocumented.</p>
- <p>Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching a URL or filename. A negative offset means the region will start at that many characters from the end of the description. If length is omitted, the region will apply for the rest of the description text.</p>
-
- <!-- PARAMETERS -->
- <h4>Parameters</h4>
- <dl>
- <div>
- <div>
- <dt>
- <var>offset</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional" style="display: none; ">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div><div>
- <div>
- <dt>
- <var>length</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>integer</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo">
- Undocumented.
- </dd>
- <dd style="display: none; ">
- Description of this parameter from the json schema.
- </dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
</div>
</dl>
</dd>
@@ -1785,76 +1162,7 @@ You can find samples of this API on the
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
- <dd>The text that is displayed in the URL dropdown. Can optionally be stylized by the descriptionStyles parameter.</dd>
- <dd style="display: none; ">
- This parameter was added in version
- <b><span></span></b>.
- You must omit this parameter in earlier versions,
- and you may omit it in any version. If you require this
- parameter, the manifest key
- <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
- can ensure that your extension won't be run in an earlier browser version.
- </dd>
-
- <!-- OBJECT PROPERTIES -->
- <dd style="display: none; ">
- <dl>
- <div>
- <div>
- </div>
- </div>
- </dl>
- </dd>
-
- <!-- FUNCTION PARAMETERS -->
- <dd style="display: none; ">
- <div></div>
- </dd>
-
- </div>
- </div><div>
- <div>
- <dt>
- <var>descriptionStyles</var>
- <em>
-
- <!-- TYPE -->
- <div style="display:inline">
- (
- <span class="optional">optional</span>
- <span class="enum" style="display: none; ">enumerated</span>
- <span id="typeTemplate">
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span>
- array of <span><span>
- <span style="display: none; ">
- <a> Type</a>
- </span>
- <span>
- <span style="display: none; ">
- array of <span><span></span></span>
- </span>
- <span>object</span>
- <span style="display: none; "></span>
- </span>
- </span></span>
- </span>
- <span style="display: none; ">paramType</span>
- <span style="display: none; "></span>
- </span>
- </span>
- )
- </div>
-
- </em>
- </dt>
- <dd class="todo" style="display: none; ">
- Undocumented.
- </dd>
- <dd>An array of style objects, created using styleUrl, styleMatch, or styleDim. A style applies to the region of text specified by the style's starting offset and length. If there are any overlapping regions of text covered by multiple styles, they will be added together (e.g. 'match' + 'dim' will display a dimmed match). Not all style combinations will be visually distinct (e.g. 'url' + 'dim' may look identical to 'url').</dd>
+ <dd>The text that is displayed in the URL dropdown. Can contain XML-style markup for styling. The supported tags are 'url' (for a literal URL), 'match' (for highlighting text that matched what the user's query), and 'dim' (for dim helper text). The styles can be nested, eg. <dim><match>dimmed match</match></dim>.</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
@@ -1909,7 +1217,7 @@ You can find samples of this API on the
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/options.html b/chrome/common/extensions/docs/options.html
index 701630a..982032f 100644
--- a/chrome/common/extensions/docs/options.html
+++ b/chrome/common/extensions/docs/options.html
@@ -558,7 +558,7 @@ Favorite Color:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/override.html b/chrome/common/extensions/docs/override.html
index 6d03561..bfa7e7d 100644
--- a/chrome/common/extensions/docs/override.html
+++ b/chrome/common/extensions/docs/override.html
@@ -663,7 +663,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/overview.html b/chrome/common/extensions/docs/overview.html
index 2d5760f..49e7d8c 100644
--- a/chrome/common/extensions/docs/overview.html
+++ b/chrome/common/extensions/docs/overview.html
@@ -937,7 +937,7 @@ Here are some ideas for where to go next:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/packaging.html b/chrome/common/extensions/docs/packaging.html
index 4939c6c..ccfa542 100644
--- a/chrome/common/extensions/docs/packaging.html
+++ b/chrome/common/extensions/docs/packaging.html
@@ -649,7 +649,7 @@ to create <code>.crx</code> files, see <a href="crx.html">CRX package format</a>
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/pageAction.html b/chrome/common/extensions/docs/pageAction.html
index b086ab8..f6d0ac4 100644
--- a/chrome/common/extensions/docs/pageAction.html
+++ b/chrome/common/extensions/docs/pageAction.html
@@ -1664,7 +1664,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/permission_warnings.html b/chrome/common/extensions/docs/permission_warnings.html
index 8b59ddd..eb062e3 100644
--- a/chrome/common/extensions/docs/permission_warnings.html
+++ b/chrome/common/extensions/docs/permission_warnings.html
@@ -825,7 +825,7 @@ by clicking the <b>chrome://extensions</b> page's
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/samples.html b/chrome/common/extensions/docs/samples.html
index 9c44a23..f57fa01 100644
--- a/chrome/common/extensions/docs/samples.html
+++ b/chrome/common/extensions/docs/samples.html
@@ -303,7 +303,7 @@
<!-- STATIC CONTENT PLACEHOLDER -->
<div id="static"><link rel="stylesheet" href="css/samples.css">
-<script>var search_data = {"0262260daf0c8f7b28feff2ef23b05e7abf9d1e0":"A BROWSER ACTION WHICH CHANGES ITS ICON WHEN CLICKED. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON","ea2894c41cb8e80a4433a3e6c5772dadce9be90d":"A BROWSER ACTION WITH A POPUP THAT CHANGES THE PAGE COLOR. BROWSER_ACTION POPUP TABS CHROME.TABS.EXECUTESCRIPT","ede3c47b7757245be42ec33fd5ca63df4b490066":"A BROWSER ACTION WITH NO ICON THAT MAKES THE PAGE RED BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.EXECUTESCRIPT","fbf0aa1a09a15ff8cc4fc7de4fd176d6c663d07a":"ACCEPTLANGUAGE RETURNS ACCEPT LANGUAGES OF THE BROWSER BROWSER_ACTION POPUP CHROME.I18N.GETACCEPTLANGUAGES CHROME.I18N.GETMESSAGE","9a6e4ec46997fb92b324974afa08a3d007e2537f":"ANIMATED PAGE ACTION THIS EXTENSION ADDS AN ANIMATED BROWSER ACTION TO THE TOOLBAR. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.ONCLICKED CHROME.PAGEACTION.SETICON CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED","9747e3d6a3eab39bc7c17f11a80573c62d44c7e5":"BLANK NEW TAB PAGE CHROME_URL_OVERRIDES","903e7277139e1e6caec123d3319cab295d8d1b3a":"CHROME SOUNDS ENJOY A MORE MAGICAL AND IMMERSIVE EXPERIENCE WHEN BROWSING THE WEB USING THE POWER OF SOUND. BACKGROUND_PAGE BOOKMARKS OPTIONS_PAGE TABS CHROME.BOOKMARKS.ONCREATED CHROME.BOOKMARKS.ONMOVED CHROME.BOOKMARKS.ONREMOVED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.TABS.GET CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED","0e790e035a4a00b6f1def5ef9a7d7be1bce95ab5":"CHROMIUM BUILDBOT MONITOR DISPLAYS THE STATUS OF THE CHROMIUM BUILDBOT IN THE TOOLBAR. CLICK TO SEE MORE DETAILED STATUS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION NOTIFICATIONS OPTIONS_PAGE POPUP CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETURL","ac31228200b41a87982e386cc90d3a6eee4ad885":"CHROMIUM SEARCH ADD SUPPORT TO THE OMNIBOX TO SEARCH THE CHROMIUM SOURCE CODE. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.STYLEMATCH CHROME.OMNIBOX.STYLEURL CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE","7d5d6cf195bc25480256618e360aa38c6e6fba82":"CLD DISPLAYS THE LANGUAGE OF A TAB BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.DETECTLANGUAGE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED","5d81304a17cf7ac2887484f730fbd2b01e51e166":"CONTEXT MENUS SAMPLE SHOWS SOME OF THE FEATURES OF THE CONTEXT MENUS API BACKGROUND_PAGE CONTEXTMENUS CHROME.CONTEXTMENUS.CREATE","4daa6becd0899a54776d9cf7f09613ed1a9f4d77":"COOKIE API TEST EXTENSION TESTING COOKIE API BACKGROUND_PAGE BROWSER_ACTION COOKIES TABS CHROME.BROWSERACTION.ONCLICKED CHROME.COOKIES.GET CHROME.COOKIES.GETALL CHROME.COOKIES.ONCHANGED CHROME.COOKIES.REMOVE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL","6871d09f4a96bf9d4b6cc724d00e909cee0f3902":"CROSS-DOMAIN XMLHTTPREQUEST FROM A CONTENT SCRIPT DEMONSTRATES A METHOD TO MAKE A CROSS-DOMAIN XMLHTTPREQUEST FETCH FROM A CONTENT SCRIPT. THIS EXTENSION FETCHES THE CURRENT TRENDING TOPICS FROM TWITTER AND INSERTS THEM IN AN OVERLAY AT THE TOP OF GOOGLE NEWS. VISIT HTTP://NEWS.GOOGLE.COM TO TEST THIS EXTENSION. BACKGROUND_PAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST","028eb5364924344029bcbe1d527f132fc72b34e5":"EMAIL THIS PAGE (BY GOOGLE) THIS EXTENSION ADDS AN EMAIL BUTTON TO THE TOOLBAR WHICH ALLOWS YOU TO EMAIL THE PAGE LINK USING YOUR DEFAULT MAIL CLIENT OR GMAIL. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.CONNECT CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.UPDATE","763a08e9b06595d785568a8d392b95a2f3700258":"EVENT TRACKING WITH GOOGLE ANALYTICS A SAMPLE EXTENSION WHICH USES GOOGLE ANALYTICS TO TRACK USAGE. BACKGROUND_PAGE BROWSER_ACTION POPUP","e3df888a89e35bdeb9c8bc8d03be5e1851b97c68":"EXTENSION DOCS SEARCH SEARCH THE CHROME EXTENSIONS DOCUMENTATION. TO USE, TYPE CRDOC PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.STYLEMATCH CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.ONREMOVED CHROME.TABS.UPDATE","8b0dd31216235941bdd8eb33fda915ef5cf79a82":"GOOGLE CALENDAR CHECKER (BY GOOGLE) QUICKLY SEE THE TIME UNTIL YOUR NEXT MEETING FROM ANY OF YOUR CALENDARS. CLICK ON THE BUTTON TO BE TAKEN TO YOUR CALENDAR. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE","4e35caa9742fb82dbd628892d23a781614f6eff6":"GOOGLE DOCUMENT LIST VIEWER DEMONSTRATES HOW TO USE OAUTH TO CONNECT THE GOOGLE DOCUMENTS LIST DATA API. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","bb57f7a0132cbeb36ad7e7bb0ab75c21704234ca":"GOOGLE MAIL CHECKER DISPLAYS THE NUMBER OF UNREAD MESSAGES IN YOUR GOOGLE MAIL INBOX. YOU CAN ALSO CLICK THE BUTTON TO OPEN YOUR INBOX. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE","1682e05ea9a1bde985123b04f6f8ac50a8a64033":"GOOGLE WAVE NOTIFIER FIND OUT WHEN YOU HAVE NEW WAVES AND PREVIEW THEM FAST. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","14b9651fda4e57b2a5914ba73a779812201b750a":"HELLO WORLD THE FIRST EXTENSION THAT I MADE. BROWSER_ACTION POPUP","2020d72f2577f53caf8e94e3dbac0fb849ceaa4d":"IDLE - SIMPLE EXAMPLE DEMONSTRATES THE IDLE API BACKGROUND_PAGE BROWSER_ACTION IDLE CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.IDLE.ONSTATECHANGED CHROME.IDLE.QUERYSTATE","0ea1588bd07b20338fc21f725de1542a5fdf9726":"IGOOGLE NEW TAB PAGE CHROME_URL_OVERRIDES","646325c25f572a1d15edc73d057f821d847a4fbe":"IMAGEINFO GET IMAGE INFO FOR IMAGES, INCLUDING EXIF DATA BACKGROUND_PAGE CONTEXTMENUS TABS CHROME.CONTEXTMENUS.CREATE CHROME.TABS.GET CHROME.TABS.GETCURRENT CHROME.WINDOWS.CREATE CHROME.WINDOWS.UPDATE","ec97ec20ca2f095d081e39f1565fc12af09ef067":"MAPPY FINDS ADDRESSES IN THE WEB PAGE YOURE ON AND POPS UP A MAP WINDOW. BACKGROUND_PAGE PAGE_ACTION POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.SENDREQUEST","b2f5f8a790e16f091a7e4e0a39b2d0a6d32e3a6d":"MERGE WINDOWS MERGES ALL OF THE BROWSERS WINDOWS INTO THE CURRENT WINDOW BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.MOVE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT","51a83d2ba3a32e3ff1bdb624d4e18ccec4c4038e":"MESSAGE TIMER TIMES HOW LONG IT TAKES TO SEND A MESSAGE TO A CONTENT SCRIPT AND BACK. BROWSER_ACTION POPUP TABS CHROME.EXTENSION.ONCONNECT CHROME.EXTENSION.ONREQUEST CHROME.TABS.CONNECT CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.SENDREQUEST","4f6785ec4f937add6728615682dd37c9a42d9548":"MY BOOKMARKS A BROWSER ACTION WITH A POPUP DUMP OF ALL BOOKMARKS, INCLUDING SEARCH, ADD, EDIT AND DELETE. BOOKMARKS BROWSER_ACTION POPUP TABS CHROME.BOOKMARKS.CREATE CHROME.BOOKMARKS.GET CHROME.BOOKMARKS.GETTREE CHROME.BOOKMARKS.REMOVE CHROME.BOOKMARKS.UPDATE CHROME.TABS.CREATE","597015d3bcce3da693b02314afd607bec4f55291":"NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.TABS.CREATE","6444e5c8ae112a6a433909c5e770669cd16e2e5f":"NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE","3aea027164cb9b732ba4a8c51cb93708891726ef":"NEWS READER (BY GOOGLE) DISPLAYS THE LATEST STORIES FROM GOOGLE NEWS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETURL CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE","f799e26ceef2367cf836f24bcb47df4398b0df58":"NOTIFICATION DEMO SHOWS OFF DESKTOP NOTIFICATIONS, WHICH ARE TOAST WINDOWS THAT POP UP ON THE DESKTOP. BACKGROUND_PAGE NOTIFICATIONS OPTIONS_PAGE TABS CHROME.TABS.CREATE","e787b322bddbc6289bb31b7d7550b1bf6456a80b":"OMNIBOX EXAMPLE TO USE, TYPE OMNIX PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED","8d0a50b57c26bb498be592e871001ffed91541b4":"PAGE ACTION BY CONTENT SHOWS A PAGE ACTION FOR HTML PAGES CONTAINING THE WORD SANDWICH BACKGROUND_PAGE PAGE_ACTION CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.PAGEACTION.SHOW","80b86ccc6e8520660fa591caa565826f0ed1b12c":"PAGE ACTION BY URL SHOWS A PAGE ACTION FOR URLS WHICH HAVE THE LETTER G IN THEM. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.SHOW CHROME.TABS.ONUPDATED","d74c3c18a1c1dd18b035149105a306f837c8823e":"PAGE BENCHMARKER CHROMIUM PAGE BENCHMARKER. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.CONNECT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETEXTENSIONTABS CHROME.EXTENSION.GETURL CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETCURRENT","e6ae17ab4ccfd7e059c8c01f25760ca5d894c7fd":"PRINT THIS PAGE ADDS A PRINT BUTTON TO THE BROWSER. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.UPDATE","beff6ecd9677dea0a7c648c5042165b48bb66f09":"PROCESS MONITOR ADDS A BROWSER ACTION THAT MONITORS RESOURCE USAGE OF ALL BROWSER PROCESSES. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.ONUPDATED","56a8d2ac24ca7bba78fd88ad57f43fc13c784497":"SAMPLE - OAUTH CONTACTS USES OAUTH TO CONNECT TO GOOGLES CONTACTS SERVICE AND DISPLAY A LIST OF YOUR CONTACTS. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","38f6e1e17756ede38b1364c7114a738ca717dcbb":"SANDWICHBAR SHOWS AN INFOBAR ON PAGES WHICH CONTAIN THE WORD SANDWICH BACKGROUND_PAGE EXPERIMENTAL CHROME.EXPERIMENTAL.INFOBARS.SHOW CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST","fc89b35755483af30b66cd72cefa34a43a3e8312":"SHOW TABS IN PROCESS ADDS A BROWSER ACTION SHOWING WHICH TABS SHARE THE CURRENT TABS PROCESS. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.GETPROCESSIDFORTAB CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.UPDATE","230463f2d5c3d4d0ca13c230e1f00f2aae0a8a64":"TAB INSPECTOR UTILITY FOR WORKING WITH THE EXTENSION TABS API BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.MOVE CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.CREATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.GETLASTFOCUSED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED CHROME.WINDOWS.REMOVE CHROME.WINDOWS.UPDATE","e1697cacebad05218798bf3e8a0f724517f0e8c3":"TEST SCREENSHOT EXTENSION DEMONSTRATE SCREENSHOT FUNCTIONALITY IN THE CHROME.TABS API. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.EXTENSION.GETVIEWS CHROME.TABS.CAPTUREVISIBLETAB CHROME.TABS.CREATE CHROME.TABS.ONUPDATED","b3de91ab04b7d7a2670ca7ee9d740eb42cead0b6":"TYPED URL HISTORY READS YOUR HISTORY, AND SHOWS THE TOP TEN PAGES YOU GO TO BY TYPING THE URL. BROWSER_ACTION HISTORY TABS CHROME.HISTORY.GETVISITS CHROME.HISTORY.SEARCH CHROME.TABS.CREATE"}</script>
+<script>var search_data = {"0262260daf0c8f7b28feff2ef23b05e7abf9d1e0":"A BROWSER ACTION WHICH CHANGES ITS ICON WHEN CLICKED. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON","ea2894c41cb8e80a4433a3e6c5772dadce9be90d":"A BROWSER ACTION WITH A POPUP THAT CHANGES THE PAGE COLOR. BROWSER_ACTION POPUP TABS CHROME.TABS.EXECUTESCRIPT","ede3c47b7757245be42ec33fd5ca63df4b490066":"A BROWSER ACTION WITH NO ICON THAT MAKES THE PAGE RED BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.EXECUTESCRIPT","fbf0aa1a09a15ff8cc4fc7de4fd176d6c663d07a":"ACCEPTLANGUAGE RETURNS ACCEPT LANGUAGES OF THE BROWSER BROWSER_ACTION POPUP CHROME.I18N.GETACCEPTLANGUAGES CHROME.I18N.GETMESSAGE","9a6e4ec46997fb92b324974afa08a3d007e2537f":"ANIMATED PAGE ACTION THIS EXTENSION ADDS AN ANIMATED BROWSER ACTION TO THE TOOLBAR. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.ONCLICKED CHROME.PAGEACTION.SETICON CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED","9747e3d6a3eab39bc7c17f11a80573c62d44c7e5":"BLANK NEW TAB PAGE CHROME_URL_OVERRIDES","903e7277139e1e6caec123d3319cab295d8d1b3a":"CHROME SOUNDS ENJOY A MORE MAGICAL AND IMMERSIVE EXPERIENCE WHEN BROWSING THE WEB USING THE POWER OF SOUND. BACKGROUND_PAGE BOOKMARKS OPTIONS_PAGE TABS CHROME.BOOKMARKS.ONCREATED CHROME.BOOKMARKS.ONMOVED CHROME.BOOKMARKS.ONREMOVED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.TABS.GET CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED","0e790e035a4a00b6f1def5ef9a7d7be1bce95ab5":"CHROMIUM BUILDBOT MONITOR DISPLAYS THE STATUS OF THE CHROMIUM BUILDBOT IN THE TOOLBAR. CLICK TO SEE MORE DETAILED STATUS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION NOTIFICATIONS OPTIONS_PAGE POPUP CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETURL","ac31228200b41a87982e386cc90d3a6eee4ad885":"CHROMIUM SEARCH ADD SUPPORT TO THE OMNIBOX TO SEARCH THE CHROMIUM SOURCE CODE. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCANCELLED CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.ONINPUTSTARTED CHROME.OMNIBOX.SETDEFAULTSUGGESTION CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE","7d5d6cf195bc25480256618e360aa38c6e6fba82":"CLD DISPLAYS THE LANGUAGE OF A TAB BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.DETECTLANGUAGE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED","5d81304a17cf7ac2887484f730fbd2b01e51e166":"CONTEXT MENUS SAMPLE SHOWS SOME OF THE FEATURES OF THE CONTEXT MENUS API BACKGROUND_PAGE CONTEXTMENUS CHROME.CONTEXTMENUS.CREATE","4daa6becd0899a54776d9cf7f09613ed1a9f4d77":"COOKIE API TEST EXTENSION TESTING COOKIE API BACKGROUND_PAGE BROWSER_ACTION COOKIES TABS CHROME.BROWSERACTION.ONCLICKED CHROME.COOKIES.GET CHROME.COOKIES.GETALL CHROME.COOKIES.ONCHANGED CHROME.COOKIES.REMOVE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL","6871d09f4a96bf9d4b6cc724d00e909cee0f3902":"CROSS-DOMAIN XMLHTTPREQUEST FROM A CONTENT SCRIPT DEMONSTRATES A METHOD TO MAKE A CROSS-DOMAIN XMLHTTPREQUEST FETCH FROM A CONTENT SCRIPT. THIS EXTENSION FETCHES THE CURRENT TRENDING TOPICS FROM TWITTER AND INSERTS THEM IN AN OVERLAY AT THE TOP OF GOOGLE NEWS. VISIT HTTP://NEWS.GOOGLE.COM TO TEST THIS EXTENSION. BACKGROUND_PAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST","028eb5364924344029bcbe1d527f132fc72b34e5":"EMAIL THIS PAGE (BY GOOGLE) THIS EXTENSION ADDS AN EMAIL BUTTON TO THE TOOLBAR WHICH ALLOWS YOU TO EMAIL THE PAGE LINK USING YOUR DEFAULT MAIL CLIENT OR GMAIL. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.CONNECT CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.UPDATE","763a08e9b06595d785568a8d392b95a2f3700258":"EVENT TRACKING WITH GOOGLE ANALYTICS A SAMPLE EXTENSION WHICH USES GOOGLE ANALYTICS TO TRACK USAGE. BACKGROUND_PAGE BROWSER_ACTION POPUP","e3df888a89e35bdeb9c8bc8d03be5e1851b97c68":"EXTENSION DOCS SEARCH SEARCH THE CHROME EXTENSIONS DOCUMENTATION. TO USE, TYPE CRDOC PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.ONREMOVED CHROME.TABS.UPDATE","8b0dd31216235941bdd8eb33fda915ef5cf79a82":"GOOGLE CALENDAR CHECKER (BY GOOGLE) QUICKLY SEE THE TIME UNTIL YOUR NEXT MEETING FROM ANY OF YOUR CALENDARS. CLICK ON THE BUTTON TO BE TAKEN TO YOUR CALENDAR. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE","4e35caa9742fb82dbd628892d23a781614f6eff6":"GOOGLE DOCUMENT LIST VIEWER DEMONSTRATES HOW TO USE OAUTH TO CONNECT THE GOOGLE DOCUMENTS LIST DATA API. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","bb57f7a0132cbeb36ad7e7bb0ab75c21704234ca":"GOOGLE MAIL CHECKER DISPLAYS THE NUMBER OF UNREAD MESSAGES IN YOUR GOOGLE MAIL INBOX. YOU CAN ALSO CLICK THE BUTTON TO OPEN YOUR INBOX. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE","1682e05ea9a1bde985123b04f6f8ac50a8a64033":"GOOGLE WAVE NOTIFIER FIND OUT WHEN YOU HAVE NEW WAVES AND PREVIEW THEM FAST. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","14b9651fda4e57b2a5914ba73a779812201b750a":"HELLO WORLD THE FIRST EXTENSION THAT I MADE. BROWSER_ACTION POPUP","2020d72f2577f53caf8e94e3dbac0fb849ceaa4d":"IDLE - SIMPLE EXAMPLE DEMONSTRATES THE IDLE API BACKGROUND_PAGE BROWSER_ACTION IDLE CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.IDLE.ONSTATECHANGED CHROME.IDLE.QUERYSTATE","0ea1588bd07b20338fc21f725de1542a5fdf9726":"IGOOGLE NEW TAB PAGE CHROME_URL_OVERRIDES","646325c25f572a1d15edc73d057f821d847a4fbe":"IMAGEINFO GET IMAGE INFO FOR IMAGES, INCLUDING EXIF DATA BACKGROUND_PAGE CONTEXTMENUS TABS CHROME.CONTEXTMENUS.CREATE CHROME.TABS.GET CHROME.TABS.GETCURRENT CHROME.WINDOWS.CREATE CHROME.WINDOWS.UPDATE","ec97ec20ca2f095d081e39f1565fc12af09ef067":"MAPPY FINDS ADDRESSES IN THE WEB PAGE YOURE ON AND POPS UP A MAP WINDOW. BACKGROUND_PAGE PAGE_ACTION POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.SENDREQUEST","b2f5f8a790e16f091a7e4e0a39b2d0a6d32e3a6d":"MERGE WINDOWS MERGES ALL OF THE BROWSERS WINDOWS INTO THE CURRENT WINDOW BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.MOVE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT","51a83d2ba3a32e3ff1bdb624d4e18ccec4c4038e":"MESSAGE TIMER TIMES HOW LONG IT TAKES TO SEND A MESSAGE TO A CONTENT SCRIPT AND BACK. BROWSER_ACTION POPUP TABS CHROME.EXTENSION.ONCONNECT CHROME.EXTENSION.ONREQUEST CHROME.TABS.CONNECT CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.SENDREQUEST","4f6785ec4f937add6728615682dd37c9a42d9548":"MY BOOKMARKS A BROWSER ACTION WITH A POPUP DUMP OF ALL BOOKMARKS, INCLUDING SEARCH, ADD, EDIT AND DELETE. BOOKMARKS BROWSER_ACTION POPUP TABS CHROME.BOOKMARKS.CREATE CHROME.BOOKMARKS.GET CHROME.BOOKMARKS.GETTREE CHROME.BOOKMARKS.REMOVE CHROME.BOOKMARKS.UPDATE CHROME.TABS.CREATE","597015d3bcce3da693b02314afd607bec4f55291":"NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.TABS.CREATE","6444e5c8ae112a6a433909c5e770669cd16e2e5f":"NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE","3aea027164cb9b732ba4a8c51cb93708891726ef":"NEWS READER (BY GOOGLE) DISPLAYS THE LATEST STORIES FROM GOOGLE NEWS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETURL CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE","f799e26ceef2367cf836f24bcb47df4398b0df58":"NOTIFICATION DEMO SHOWS OFF DESKTOP NOTIFICATIONS, WHICH ARE TOAST WINDOWS THAT POP UP ON THE DESKTOP. BACKGROUND_PAGE NOTIFICATIONS OPTIONS_PAGE TABS CHROME.TABS.CREATE","e787b322bddbc6289bb31b7d7550b1bf6456a80b":"OMNIBOX EXAMPLE TO USE, TYPE OMNIX PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED","8d0a50b57c26bb498be592e871001ffed91541b4":"PAGE ACTION BY CONTENT SHOWS A PAGE ACTION FOR HTML PAGES CONTAINING THE WORD SANDWICH BACKGROUND_PAGE PAGE_ACTION CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.PAGEACTION.SHOW","80b86ccc6e8520660fa591caa565826f0ed1b12c":"PAGE ACTION BY URL SHOWS A PAGE ACTION FOR URLS WHICH HAVE THE LETTER G IN THEM. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.SHOW CHROME.TABS.ONUPDATED","d74c3c18a1c1dd18b035149105a306f837c8823e":"PAGE BENCHMARKER CHROMIUM PAGE BENCHMARKER. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.CONNECT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETEXTENSIONTABS CHROME.EXTENSION.GETURL CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETCURRENT","e6ae17ab4ccfd7e059c8c01f25760ca5d894c7fd":"PRINT THIS PAGE ADDS A PRINT BUTTON TO THE BROWSER. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.UPDATE","beff6ecd9677dea0a7c648c5042165b48bb66f09":"PROCESS MONITOR ADDS A BROWSER ACTION THAT MONITORS RESOURCE USAGE OF ALL BROWSER PROCESSES. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.ONUPDATED","56a8d2ac24ca7bba78fd88ad57f43fc13c784497":"SAMPLE - OAUTH CONTACTS USES OAUTH TO CONNECT TO GOOGLES CONTACTS SERVICE AND DISPLAY A LIST OF YOUR CONTACTS. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE","38f6e1e17756ede38b1364c7114a738ca717dcbb":"SANDWICHBAR SHOWS AN INFOBAR ON PAGES WHICH CONTAIN THE WORD SANDWICH BACKGROUND_PAGE EXPERIMENTAL CHROME.EXPERIMENTAL.INFOBARS.SHOW CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST","fc89b35755483af30b66cd72cefa34a43a3e8312":"SHOW TABS IN PROCESS ADDS A BROWSER ACTION SHOWING WHICH TABS SHARE THE CURRENT TABS PROCESS. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.GETPROCESSIDFORTAB CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.UPDATE","230463f2d5c3d4d0ca13c230e1f00f2aae0a8a64":"TAB INSPECTOR UTILITY FOR WORKING WITH THE EXTENSION TABS API BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.MOVE CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.CREATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.GETLASTFOCUSED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED CHROME.WINDOWS.REMOVE CHROME.WINDOWS.UPDATE","e1697cacebad05218798bf3e8a0f724517f0e8c3":"TEST SCREENSHOT EXTENSION DEMONSTRATE SCREENSHOT FUNCTIONALITY IN THE CHROME.TABS API. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.EXTENSION.GETVIEWS CHROME.TABS.CAPTUREVISIBLETAB CHROME.TABS.CREATE CHROME.TABS.ONUPDATED","b3de91ab04b7d7a2670ca7ee9d740eb42cead0b6":"TYPED URL HISTORY READS YOUR HISTORY, AND SHOWS THE TOP TEN PAGES YOU GO TO BY TYPING THE URL. BROWSER_ACTION HISTORY TABS CHROME.HISTORY.GETVISITS CHROME.HISTORY.SEARCH CHROME.TABS.CREATE"}</script>
<script src="js/sample_search.js"></script>
@@ -736,13 +736,15 @@
<div class="apicalls"><strong>Calls:</strong>
<ul>
<li>
+ <code><a href="omnibox.html#event-onInputCancelled">chrome.omnibox.onInputCancelled</a></code>
+ </li><li>
<code><a href="omnibox.html#event-onInputChanged">chrome.omnibox.onInputChanged</a></code>
</li><li>
<code><a href="omnibox.html#event-onInputEntered">chrome.omnibox.onInputEntered</a></code>
</li><li>
- <code><a href="omnibox.html#method-styleMatch">chrome.omnibox.styleMatch</a></code>
+ <code><a href="omnibox.html#event-onInputStarted">chrome.omnibox.onInputStarted</a></code>
</li><li>
- <code><a href="omnibox.html#method-styleUrl">chrome.omnibox.styleUrl</a></code>
+ <code><a href="omnibox.html#method-setDefaultSuggestion">chrome.omnibox.setDefaultSuggestion</a></code>
</li><li>
<code><a href="tabs.html#method-get">chrome.tabs.get</a></code>
</li><li>
@@ -1052,8 +1054,6 @@
</li><li>
<code><a href="omnibox.html#event-onInputEntered">chrome.omnibox.onInputEntered</a></code>
</li><li>
- <code><a href="omnibox.html#method-styleMatch">chrome.omnibox.styleMatch</a></code>
- </li><li>
<code><a href="tabs.html#method-create">chrome.tabs.create</a></code>
</li><li>
<code><a href="tabs.html#method-get">chrome.tabs.get</a></code>
@@ -2777,7 +2777,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/samples.json b/chrome/common/extensions/docs/samples.json
index edd54bc..b5cc0eb 100644
--- a/chrome/common/extensions/docs/samples.json
+++ b/chrome/common/extensions/docs/samples.json
@@ -102,9 +102,7 @@
"chrome.omnibox.onInputEntered": "omnibox.html#event-onInputEntered",
"chrome.omnibox.onInputStarted": "omnibox.html#event-onInputStarted",
"chrome.omnibox.sendSuggestions": "omnibox.html#method-sendSuggestions",
- "chrome.omnibox.styleDim": "omnibox.html#method-styleDim",
- "chrome.omnibox.styleMatch": "omnibox.html#method-styleMatch",
- "chrome.omnibox.styleUrl": "omnibox.html#method-styleUrl",
+ "chrome.omnibox.setDefaultSuggestion": "omnibox.html#method-setDefaultSuggestion",
"chrome.pageAction.hide": "pageAction.html#method-hide",
"chrome.pageAction.onClicked": "pageAction.html#event-onClicked",
"chrome.pageAction.setIcon": "pageAction.html#method-setIcon",
@@ -158,9 +156,9 @@
"icon": null,
"id": "0262260daf0c8f7b28feff2ef23b05e7abf9d1e0",
"name": "A browser action which changes its icon when clicked.",
- "path": "examples\/api\/browserAction\/set_icon_path\/",
+ "path": "examples/api/browserAction/set_icon_path/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "A BROWSER ACTION WHICH CHANGES ITS ICON WHEN CLICKED. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON",
"source_files": [
@@ -168,7 +166,7 @@
"manifest.json"
],
"source_hash": "c5752555642e89340c57657b48440b0dcd74ee99",
- "zip_path": "examples\/api\/browserAction\/set_icon_path.zip"
+ "zip_path": "examples/api/browserAction/set_icon_path.zip"
},
{
"api_calls": [
@@ -183,10 +181,10 @@
"icon": null,
"id": "ea2894c41cb8e80a4433a3e6c5772dadce9be90d",
"name": "A browser action with a popup that changes the page color.",
- "path": "examples\/api\/browserAction\/set_page_color\/",
+ "path": "examples/api/browserAction/set_page_color/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "A BROWSER ACTION WITH A POPUP THAT CHANGES THE PAGE COLOR. BROWSER_ACTION POPUP TABS CHROME.TABS.EXECUTESCRIPT",
"source_files": [
@@ -194,7 +192,7 @@
"popup.html"
],
"source_hash": "c8d14b6893e75a62f3bd150d5d2cc5bb785bc411",
- "zip_path": "examples\/api\/browserAction\/set_page_color.zip"
+ "zip_path": "examples/api/browserAction/set_page_color.zip"
},
{
"api_calls": [
@@ -212,9 +210,9 @@
"icon": null,
"id": "ede3c47b7757245be42ec33fd5ca63df4b490066",
"name": "A browser action with no icon that makes the page red",
- "path": "examples\/api\/browserAction\/make_page_red\/",
+ "path": "examples/api/browserAction/make_page_red/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "A BROWSER ACTION WITH NO ICON THAT MAKES THE PAGE RED BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.EXECUTESCRIPT",
"source_files": [
@@ -222,7 +220,7 @@
"manifest.json"
],
"source_hash": "dfbb05ead54a0228a6d2f591ce1038d5c625249a",
- "zip_path": "examples\/api\/browserAction\/make_page_red.zip"
+ "zip_path": "examples/api/browserAction/make_page_red.zip"
},
{
"api_calls": [
@@ -237,18 +235,18 @@
"icon": null,
"id": "fbf0aa1a09a15ff8cc4fc7de4fd176d6c663d07a",
"name": "AcceptLanguage",
- "path": "examples\/api\/i18n\/getMessage\/",
+ "path": "examples/api/i18n/getMessage/",
"protocols": [],
"search_string": "ACCEPTLANGUAGE RETURNS ACCEPT LANGUAGES OF THE BROWSER BROWSER_ACTION POPUP CHROME.I18N.GETACCEPTLANGUAGES CHROME.I18N.GETMESSAGE",
"source_files": [
- "_locales\/en_US\/messages.json",
- "_locales\/es\/messages.json",
- "_locales\/sr\/messages.json",
+ "_locales/en_US/messages.json",
+ "_locales/es/messages.json",
+ "_locales/sr/messages.json",
"manifest.json",
"popup.html"
],
"source_hash": "67f203e2773eebf401d0aa0a9709d961e506d875",
- "zip_path": "examples\/api\/i18n\/getMessage.zip"
+ "zip_path": "examples/api/i18n/getMessage.zip"
},
{
"api_calls": [
@@ -270,7 +268,7 @@
"icon": null,
"id": "9a6e4ec46997fb92b324974afa08a3d007e2537f",
"name": "Animated Page Action",
- "path": "examples\/api\/pageAction\/set_icon\/",
+ "path": "examples/api/pageAction/set_icon/",
"protocols": [],
"search_string": "ANIMATED PAGE ACTION THIS EXTENSION ADDS AN ANIMATED BROWSER ACTION TO THE TOOLBAR. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.ONCLICKED CHROME.PAGEACTION.SETICON CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED",
"source_files": [
@@ -278,7 +276,7 @@
"manifest.json"
],
"source_hash": "9d5e9f8fd525c6d02fe03e1843041f5b0f94f690",
- "zip_path": "examples\/api\/pageAction\/set_icon.zip"
+ "zip_path": "examples/api/pageAction/set_icon.zip"
},
{
"api_calls": [],
@@ -289,7 +287,7 @@
"icon": null,
"id": "9747e3d6a3eab39bc7c17f11a80573c62d44c7e5",
"name": "Blank new tab page",
- "path": "examples\/api\/override\/blank_ntp\/",
+ "path": "examples/api/override/blank_ntp/",
"protocols": [],
"search_string": "BLANK NEW TAB PAGE CHROME_URL_OVERRIDES",
"source_files": [
@@ -297,7 +295,7 @@
"manifest.json"
],
"source_hash": "477acf6d15e3fa252e6307e156707538b61c86db",
- "zip_path": "examples\/api\/override\/blank_ntp.zip"
+ "zip_path": "examples/api/override/blank_ntp.zip"
},
{
"api_calls": [
@@ -329,10 +327,10 @@
"icon": "icon.png",
"id": "903e7277139e1e6caec123d3319cab295d8d1b3a",
"name": "Chrome Sounds",
- "path": "examples\/extensions\/fx\/",
+ "path": "examples/extensions/fx/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "CHROME SOUNDS ENJOY A MORE MAGICAL AND IMMERSIVE EXPERIENCE WHEN BROWSING THE WEB USING THE POWER OF SOUND. BACKGROUND_PAGE BOOKMARKS OPTIONS_PAGE TABS CHROME.BOOKMARKS.ONCREATED CHROME.BOOKMARKS.ONMOVED CHROME.BOOKMARKS.ONREMOVED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.TABS.GET CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED",
"source_files": [
@@ -343,7 +341,7 @@
"options.html"
],
"source_hash": "4155e4e6ba7d523ba7bc3b75da352c22e534c3c3",
- "zip_path": "examples\/extensions\/fx.zip"
+ "zip_path": "examples/extensions/fx.zip"
},
{
"api_calls": [
@@ -363,10 +361,10 @@
"icon": "icon.png",
"id": "0e790e035a4a00b6f1def5ef9a7d7be1bce95ab5",
"name": "Chromium Buildbot Monitor",
- "path": "examples\/extensions\/buildbot\/",
+ "path": "examples/extensions/buildbot/",
"protocols": [
- "http:\/\/",
- "http:\/\/"
+ "http://",
+ "http://"
],
"search_string": "CHROMIUM BUILDBOT MONITOR DISPLAYS THE STATUS OF THE CHROMIUM BUILDBOT IN THE TOOLBAR. CLICK TO SEE MORE DETAILED STATUS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION NOTIFICATIONS OPTIONS_PAGE POPUP CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETURL",
"source_files": [
@@ -376,14 +374,15 @@
"popup.html"
],
"source_hash": "bbd36a3d1d5580b477929d081f5a3a467ad32c63",
- "zip_path": "examples\/extensions\/buildbot.zip"
+ "zip_path": "examples/extensions/buildbot.zip"
},
{
"api_calls": [
+ "chrome.omnibox.onInputCancelled",
"chrome.omnibox.onInputChanged",
"chrome.omnibox.onInputEntered",
- "chrome.omnibox.styleMatch",
- "chrome.omnibox.styleUrl",
+ "chrome.omnibox.onInputStarted",
+ "chrome.omnibox.setDefaultSuggestion",
"chrome.tabs.get",
"chrome.tabs.getSelected",
"chrome.tabs.update"
@@ -396,17 +395,17 @@
"icon": null,
"id": "ac31228200b41a87982e386cc90d3a6eee4ad885",
"name": "Chromium Search",
- "path": "examples\/extensions\/chrome_search\/",
+ "path": "examples/extensions/chrome_search/",
"protocols": [
- "http:\/\/"
+ "http://"
],
- "search_string": "CHROMIUM SEARCH ADD SUPPORT TO THE OMNIBOX TO SEARCH THE CHROMIUM SOURCE CODE. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.STYLEMATCH CHROME.OMNIBOX.STYLEURL CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE",
+ "search_string": "CHROMIUM SEARCH ADD SUPPORT TO THE OMNIBOX TO SEARCH THE CHROMIUM SOURCE CODE. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCANCELLED CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.ONINPUTSTARTED CHROME.OMNIBOX.SETDEFAULTSUGGESTION CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE",
"source_files": [
"background.html",
"manifest.json"
],
- "source_hash": "e8fce958ebb0661a38bf8f75b71fa66559ad8877",
- "zip_path": "examples\/extensions\/chrome_search.zip"
+ "source_hash": "37dd43080094bbe459b0429f1a2b995c33bab7c3",
+ "zip_path": "examples/extensions/chrome_search.zip"
},
{
"api_calls": [
@@ -426,7 +425,7 @@
"icon": null,
"id": "7d5d6cf195bc25480256618e360aa38c6e6fba82",
"name": "CLD",
- "path": "examples\/api\/i18n\/cld\/",
+ "path": "examples/api/i18n/cld/",
"protocols": [],
"search_string": "CLD DISPLAYS THE LANGUAGE OF A TAB BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.TABS.DETECTLANGUAGE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED",
"source_files": [
@@ -434,7 +433,7 @@
"manifest.json"
],
"source_hash": "913694d89e0b081f1ea5ad6f07b60b0141e82394",
- "zip_path": "examples\/api\/i18n\/cld.zip"
+ "zip_path": "examples/api/i18n/cld.zip"
},
{
"api_calls": [
@@ -448,7 +447,7 @@
"icon": null,
"id": "5d81304a17cf7ac2887484f730fbd2b01e51e166",
"name": "Context Menus Sample",
- "path": "examples\/api\/contextMenus\/basic\/",
+ "path": "examples/api/contextMenus/basic/",
"protocols": [],
"search_string": "CONTEXT MENUS SAMPLE SHOWS SOME OF THE FEATURES OF THE CONTEXT MENUS API BACKGROUND_PAGE CONTEXTMENUS CHROME.CONTEXTMENUS.CREATE",
"source_files": [
@@ -457,7 +456,7 @@
"sample.js"
],
"source_hash": "0e35ce268b3b2cf3d9830e6411c85c5dfef2ffdf",
- "zip_path": "examples\/api\/contextMenus\/basic.zip"
+ "zip_path": "examples/api/contextMenus/basic.zip"
},
{
"api_calls": [
@@ -482,10 +481,10 @@
"icon": "cookie.png",
"id": "4daa6becd0899a54776d9cf7f09613ed1a9f4d77",
"name": "Cookie API Test Extension",
- "path": "examples\/api\/cookies\/",
+ "path": "examples/api/cookies/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "COOKIE API TEST EXTENSION TESTING COOKIE API BACKGROUND_PAGE BROWSER_ACTION COOKIES TABS CHROME.BROWSERACTION.ONCLICKED CHROME.COOKIES.GET CHROME.COOKIES.GETALL CHROME.COOKIES.ONCHANGED CHROME.COOKIES.REMOVE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL",
"source_files": [
@@ -494,32 +493,32 @@
"manifest.json"
],
"source_hash": "d0741a5ff0ce9ac38a1be3e6abc46065d74cb498",
- "zip_path": "examples\/api\/cookies.zip"
+ "zip_path": "examples/api/cookies.zip"
},
{
"api_calls": [
"chrome.extension.onRequest",
"chrome.extension.sendRequest"
],
- "description": "Demonstrates a method to make a cross-domain XMLHttpRequest fetch from a content script. This extension fetches the current trending topics from Twitter and inserts them in an overlay at the top of Google News. Visit http:\/\/news.google.com to test this extension.",
+ "description": "Demonstrates a method to make a cross-domain XMLHttpRequest fetch from a content script. This extension fetches the current trending topics from Twitter and inserts them in an overlay at the top of Google News. Visit http://news.google.com to test this extension.",
"features": [
"background_page"
],
"icon": "sample-128.png",
"id": "6871d09f4a96bf9d4b6cc724d00e909cee0f3902",
"name": "Cross-domain XMLHttpRequest from a content script",
- "path": "examples\/howto\/contentscript_xhr\/",
+ "path": "examples/howto/contentscript_xhr/",
"protocols": [
- "http:\/\/"
+ "http://"
],
- "search_string": "CROSS-DOMAIN XMLHTTPREQUEST FROM A CONTENT SCRIPT DEMONSTRATES A METHOD TO MAKE A CROSS-DOMAIN XMLHTTPREQUEST FETCH FROM A CONTENT SCRIPT. THIS EXTENSION FETCHES THE CURRENT TRENDING TOPICS FROM TWITTER AND INSERTS THEM IN AN OVERLAY AT THE TOP OF GOOGLE NEWS. VISIT HTTP:\/\/NEWS.GOOGLE.COM TO TEST THIS EXTENSION. BACKGROUND_PAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST",
+ "search_string": "CROSS-DOMAIN XMLHTTPREQUEST FROM A CONTENT SCRIPT DEMONSTRATES A METHOD TO MAKE A CROSS-DOMAIN XMLHTTPREQUEST FETCH FROM A CONTENT SCRIPT. THIS EXTENSION FETCHES THE CURRENT TRENDING TOPICS FROM TWITTER AND INSERTS THEM IN AN OVERLAY AT THE TOP OF GOOGLE NEWS. VISIT HTTP://NEWS.GOOGLE.COM TO TEST THIS EXTENSION. BACKGROUND_PAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST",
"source_files": [
"background.html",
"contentscript.js",
"manifest.json"
],
"source_hash": "0fe56cea50dc18b7e5e31d47c383356a85d8b896",
- "zip_path": "examples\/howto\/contentscript_xhr.zip"
+ "zip_path": "examples/howto/contentscript_xhr.zip"
},
{
"api_calls": [
@@ -540,10 +539,10 @@
"icon": "mail_128x128.png",
"id": "028eb5364924344029bcbe1d527f132fc72b34e5",
"name": "Email this page (by Google)",
- "path": "examples\/extensions\/email_this_page\/",
+ "path": "examples/extensions/email_this_page/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "EMAIL THIS PAGE (BY GOOGLE) THIS EXTENSION ADDS AN EMAIL BUTTON TO THE TOOLBAR WHICH ALLOWS YOU TO EMAIL THE PAGE LINK USING YOUR DEFAULT MAIL CLIENT OR GMAIL. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.CONNECT CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.UPDATE",
"source_files": [
@@ -553,7 +552,7 @@
"options.html"
],
"source_hash": "54b5469031ddcb2097f39dbaae1bcd81ae650154",
- "zip_path": "examples\/extensions\/email_this_page.zip"
+ "zip_path": "examples/extensions/email_this_page.zip"
},
{
"api_calls": [],
@@ -566,7 +565,7 @@
"icon": "analytics-extension-icon-128.png",
"id": "763a08e9b06595d785568a8d392b95a2f3700258",
"name": "Event Tracking with Google Analytics",
- "path": "examples\/tutorials\/analytics\/",
+ "path": "examples/tutorials/analytics/",
"protocols": [],
"search_string": "EVENT TRACKING WITH GOOGLE ANALYTICS A SAMPLE EXTENSION WHICH USES GOOGLE ANALYTICS TO TRACK USAGE. BACKGROUND_PAGE BROWSER_ACTION POPUP",
"source_files": [
@@ -576,13 +575,12 @@
"popup.html"
],
"source_hash": "b02f040a3eb56f8a0e780549954f69172d62dcd3",
- "zip_path": "examples\/tutorials\/analytics.zip"
+ "zip_path": "examples/tutorials/analytics.zip"
},
{
"api_calls": [
"chrome.omnibox.onInputChanged",
"chrome.omnibox.onInputEntered",
- "chrome.omnibox.styleMatch",
"chrome.tabs.create",
"chrome.tabs.get",
"chrome.tabs.onRemoved",
@@ -596,17 +594,17 @@
"icon": "icon-128.png",
"id": "e3df888a89e35bdeb9c8bc8d03be5e1851b97c68",
"name": "Extension Docs Search",
- "path": "examples\/api\/omnibox\/extension-docs\/",
+ "path": "examples/api/omnibox/extension-docs/",
"protocols": [
- "http:\/\/"
+ "http://"
],
- "search_string": "EXTENSION DOCS SEARCH SEARCH THE CHROME EXTENSIONS DOCUMENTATION. TO USE, TYPE CRDOC PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.OMNIBOX.STYLEMATCH CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.ONREMOVED CHROME.TABS.UPDATE",
+ "search_string": "EXTENSION DOCS SEARCH SEARCH THE CHROME EXTENSIONS DOCUMENTATION. TO USE, TYPE CRDOC PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE TABS CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.ONREMOVED CHROME.TABS.UPDATE",
"source_files": [
"background.html",
"manifest.json"
],
- "source_hash": "041b3aeae42eefd5eba6458bc6e3e051590716b7",
- "zip_path": "examples\/api\/omnibox\/extension-docs.zip"
+ "source_hash": "eb3c20a0f9b6035a8e9e3a7448d5608bcc44fce7",
+ "zip_path": "examples/api/omnibox/extension-docs.zip"
},
{
"api_calls": [
@@ -632,26 +630,26 @@
"options_page",
"tabs"
],
- "icon": "images\/icon-128.gif",
+ "icon": "images/icon-128.gif",
"id": "8b0dd31216235941bdd8eb33fda915ef5cf79a82",
"name": "Google Calendar Checker (by Google)",
- "path": "examples\/extensions\/calendar\/",
+ "path": "examples/extensions/calendar/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "GOOGLE CALENDAR CHECKER (BY GOOGLE) QUICKLY SEE THE TIME UNTIL YOUR NEXT MEETING FROM ANY OF YOUR CALENDARS. CLICK ON THE BUTTON TO BE TAKEN TO YOUR CALENDAR. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE",
"source_files": [
- "_locales\/en\/messages.json",
- "javascript\/background.js",
- "javascript\/options.js",
- "javascript\/util.js",
+ "_locales/en/messages.json",
+ "javascript/background.js",
+ "javascript/options.js",
+ "javascript/util.js",
"manifest.json",
- "views\/background.html",
- "views\/options.html"
+ "views/background.html",
+ "views/options.html"
],
"source_hash": "3d9782a3e8315bbbca36c63297db2c8926df4521",
- "zip_path": "examples\/extensions\/calendar.zip"
+ "zip_path": "examples/extensions/calendar.zip"
},
{
"api_calls": [
@@ -672,15 +670,15 @@
"popup",
"tabs"
],
- "icon": "img\/docs_spreadsheets-128.gif",
+ "icon": "img/docs_spreadsheets-128.gif",
"id": "4e35caa9742fb82dbd628892d23a781614f6eff6",
"name": "Google Document List Viewer",
- "path": "examples\/extensions\/gdocs\/",
+ "path": "examples/extensions/gdocs/",
"protocols": [
- "https:\/\/",
- "https:\/\/",
- "https:\/\/",
- "https:\/\/"
+ "https://",
+ "https://",
+ "https://",
+ "https://"
],
"search_string": "GOOGLE DOCUMENT LIST VIEWER DEMONSTRATES HOW TO USE OAUTH TO CONNECT THE GOOGLE DOCUMENTS LIST DATA API. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.BROWSERACTION.SETBADGETEXT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE",
"source_files": [
@@ -688,13 +686,13 @@
"chrome_ex_oauth.html",
"chrome_ex_oauth.js",
"chrome_ex_oauthsimple.js",
- "js\/jquery-1.4.1.min.js",
+ "js/jquery-1.4.1.min.js",
"manifest.json",
"options.html",
"popup.html"
],
"source_hash": "284e44d603a62348dd1b7e98e593f3f4b877b124",
- "zip_path": "examples\/extensions\/gdocs.zip"
+ "zip_path": "examples/extensions/gdocs.zip"
},
{
"api_calls": [
@@ -720,61 +718,61 @@
"icon": "icon_128.png",
"id": "bb57f7a0132cbeb36ad7e7bb0ab75c21704234ca",
"name": "Google Mail Checker",
- "path": "examples\/extensions\/gmail\/",
+ "path": "examples/extensions/gmail/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "GOOGLE MAIL CHECKER DISPLAYS THE NUMBER OF UNREAD MESSAGES IN YOUR GOOGLE MAIL INBOX. YOU CAN ALSO CLICK THE BUTTON TO OPEN YOUR INBOX. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.ONUPDATED CHROME.TABS.UPDATE",
"source_files": [
- "_locales\/ar\/messages.json",
- "_locales\/bg\/messages.json",
- "_locales\/ca\/messages.json",
- "_locales\/cs\/messages.json",
- "_locales\/da\/messages.json",
- "_locales\/de\/messages.json",
- "_locales\/el\/messages.json",
- "_locales\/en\/messages.json",
- "_locales\/en_GB\/messages.json",
- "_locales\/es\/messages.json",
- "_locales\/es_419\/messages.json",
- "_locales\/et\/messages.json",
- "_locales\/fi\/messages.json",
- "_locales\/fil\/messages.json",
- "_locales\/fr\/messages.json",
- "_locales\/he\/messages.json",
- "_locales\/hi\/messages.json",
- "_locales\/hr\/messages.json",
- "_locales\/hu\/messages.json",
- "_locales\/id\/messages.json",
- "_locales\/it\/messages.json",
- "_locales\/ja\/messages.json",
- "_locales\/ko\/messages.json",
- "_locales\/lt\/messages.json",
- "_locales\/lv\/messages.json",
- "_locales\/nb\/messages.json",
- "_locales\/nl\/messages.json",
- "_locales\/pl\/messages.json",
- "_locales\/pt_BR\/messages.json",
- "_locales\/pt_PT\/messages.json",
- "_locales\/ro\/messages.json",
- "_locales\/ru\/messages.json",
- "_locales\/sk\/messages.json",
- "_locales\/sl\/messages.json",
- "_locales\/sr\/messages.json",
- "_locales\/sv\/messages.json",
- "_locales\/th\/messages.json",
- "_locales\/tr\/messages.json",
- "_locales\/uk\/messages.json",
- "_locales\/vi\/messages.json",
- "_locales\/zh_CN\/messages.json",
- "_locales\/zh_TW\/messages.json",
+ "_locales/ar/messages.json",
+ "_locales/bg/messages.json",
+ "_locales/ca/messages.json",
+ "_locales/cs/messages.json",
+ "_locales/da/messages.json",
+ "_locales/de/messages.json",
+ "_locales/el/messages.json",
+ "_locales/en/messages.json",
+ "_locales/en_GB/messages.json",
+ "_locales/es/messages.json",
+ "_locales/es_419/messages.json",
+ "_locales/et/messages.json",
+ "_locales/fi/messages.json",
+ "_locales/fil/messages.json",
+ "_locales/fr/messages.json",
+ "_locales/he/messages.json",
+ "_locales/hi/messages.json",
+ "_locales/hr/messages.json",
+ "_locales/hu/messages.json",
+ "_locales/id/messages.json",
+ "_locales/it/messages.json",
+ "_locales/ja/messages.json",
+ "_locales/ko/messages.json",
+ "_locales/lt/messages.json",
+ "_locales/lv/messages.json",
+ "_locales/nb/messages.json",
+ "_locales/nl/messages.json",
+ "_locales/pl/messages.json",
+ "_locales/pt_BR/messages.json",
+ "_locales/pt_PT/messages.json",
+ "_locales/ro/messages.json",
+ "_locales/ru/messages.json",
+ "_locales/sk/messages.json",
+ "_locales/sl/messages.json",
+ "_locales/sr/messages.json",
+ "_locales/sv/messages.json",
+ "_locales/th/messages.json",
+ "_locales/tr/messages.json",
+ "_locales/uk/messages.json",
+ "_locales/vi/messages.json",
+ "_locales/zh_CN/messages.json",
+ "_locales/zh_TW/messages.json",
"background.html",
"manifest.json",
"options.html"
],
"source_hash": "030b77992ed5bbbbc18f1b717bc330b965b26aaf",
- "zip_path": "examples\/extensions\/gmail.zip"
+ "zip_path": "examples/extensions/gmail.zip"
},
{
"api_calls": [
@@ -797,10 +795,10 @@
"icon": "128.png",
"id": "1682e05ea9a1bde985123b04f6f8ac50a8a64033",
"name": "Google Wave Notifier",
- "path": "examples\/extensions\/wave\/",
+ "path": "examples/extensions/wave/",
"protocols": [
- "https:\/\/",
- "http:\/\/"
+ "https://",
+ "http://"
],
"search_string": "GOOGLE WAVE NOTIFIER FIND OUT WHEN YOU HAVE NEW WAVES AND PREVIEW THEM FAST. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE",
"source_files": [
@@ -814,7 +812,7 @@
"prettyload.js"
],
"source_hash": "9f360bf8772e8a23862d854ea088e0bec867ba02",
- "zip_path": "examples\/extensions\/wave.zip"
+ "zip_path": "examples/extensions/wave.zip"
},
{
"api_calls": [],
@@ -826,9 +824,9 @@
"icon": null,
"id": "14b9651fda4e57b2a5914ba73a779812201b750a",
"name": "Hello World",
- "path": "examples\/tutorials\/getstarted\/",
+ "path": "examples/tutorials/getstarted/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "HELLO WORLD THE FIRST EXTENSION THAT I MADE. BROWSER_ACTION POPUP",
"source_files": [
@@ -836,7 +834,7 @@
"popup.html"
],
"source_hash": "1a3139dcb7f3e3499023703643e7056c61235123",
- "zip_path": "examples\/tutorials\/getstarted.zip"
+ "zip_path": "examples/tutorials/getstarted.zip"
},
{
"api_calls": [
@@ -854,7 +852,7 @@
"icon": "sample-128.png",
"id": "2020d72f2577f53caf8e94e3dbac0fb849ceaa4d",
"name": "Idle - Simple Example",
- "path": "examples\/api\/idle\/idle_simple\/",
+ "path": "examples/api/idle/idle_simple/",
"protocols": [],
"search_string": "IDLE - SIMPLE EXAMPLE DEMONSTRATES THE IDLE API BACKGROUND_PAGE BROWSER_ACTION IDLE CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.IDLE.ONSTATECHANGED CHROME.IDLE.QUERYSTATE",
"source_files": [
@@ -863,7 +861,7 @@
"manifest.json"
],
"source_hash": "1378042fee96e115d7b8003588eca369b43f772b",
- "zip_path": "examples\/api\/idle\/idle_simple.zip"
+ "zip_path": "examples/api/idle/idle_simple.zip"
},
{
"api_calls": [],
@@ -874,7 +872,7 @@
"icon": null,
"id": "0ea1588bd07b20338fc21f725de1542a5fdf9726",
"name": "iGoogle new tab page",
- "path": "examples\/api\/override\/override_igoogle\/",
+ "path": "examples/api/override/override_igoogle/",
"protocols": [],
"search_string": "IGOOGLE NEW TAB PAGE CHROME_URL_OVERRIDES",
"source_files": [
@@ -882,7 +880,7 @@
"redirect.html"
],
"source_hash": "8ee76608adbf87c3260f9905e6cb1c8a45bd8e0c",
- "zip_path": "examples\/api\/override\/override_igoogle.zip"
+ "zip_path": "examples/api/override/override_igoogle.zip"
},
{
"api_calls": [
@@ -901,22 +899,22 @@
"icon": "imageinfo-128.png",
"id": "646325c25f572a1d15edc73d057f821d847a4fbe",
"name": "Imageinfo",
- "path": "examples\/extensions\/imageinfo\/",
+ "path": "examples/extensions/imageinfo/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "IMAGEINFO GET IMAGE INFO FOR IMAGES, INCLUDING EXIF DATA BACKGROUND_PAGE CONTEXTMENUS TABS CHROME.CONTEXTMENUS.CREATE CHROME.TABS.GET CHROME.TABS.GETCURRENT CHROME.WINDOWS.CREATE CHROME.WINDOWS.UPDATE",
"source_files": [
"background.html",
- "imageinfo\/binaryajax.js",
- "imageinfo\/exif.js",
- "imageinfo\/imageinfo.js",
+ "imageinfo/binaryajax.js",
+ "imageinfo/exif.js",
+ "imageinfo/imageinfo.js",
"info.html",
"manifest.json"
],
- "source_hash": "c746d9114348f4b414c1ec05e988e2807feb963a",
- "zip_path": "examples\/extensions\/imageinfo.zip"
+ "source_hash": "672f49ed8edbe0829c7ba5a1d890b4440b157991",
+ "zip_path": "examples/extensions/imageinfo.zip"
},
{
"api_calls": [
@@ -941,9 +939,9 @@
"icon": "icon.png",
"id": "ec97ec20ca2f095d081e39f1565fc12af09ef067",
"name": "Mappy",
- "path": "examples\/extensions\/mappy\/",
+ "path": "examples/extensions/mappy/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "MAPPY FINDS ADDRESSES IN THE WEB PAGE YOURE ON AND POPS UP A MAP WINDOW. BACKGROUND_PAGE PAGE_ACTION POPUP TABS CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.ONREQUEST CHROME.PAGEACTION.HIDE CHROME.PAGEACTION.SETTITLE CHROME.PAGEACTION.SHOW CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.SENDREQUEST",
"source_files": [
@@ -953,7 +951,7 @@
"popup.html"
],
"source_hash": "81cf2d3975d7df8b58e5226c5b2b6df026446511",
- "zip_path": "examples\/extensions\/mappy.zip"
+ "zip_path": "examples/extensions/mappy.zip"
},
{
"api_calls": [
@@ -974,7 +972,7 @@
"icon": "merge_windows_128.png",
"id": "b2f5f8a790e16f091a7e4e0a39b2d0a6d32e3a6d",
"name": "Merge Windows",
- "path": "examples\/api\/windows\/merge_windows\/",
+ "path": "examples/api/windows/merge_windows/",
"protocols": [],
"search_string": "MERGE WINDOWS MERGES ALL OF THE BROWSERS WINDOWS INTO THE CURRENT WINDOW BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.MOVE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT",
"source_files": [
@@ -982,7 +980,7 @@
"manifest.json"
],
"source_hash": "4b5fe52788e0bef2f3871b36105eb53cc760c454",
- "zip_path": "examples\/api\/windows\/merge_windows.zip"
+ "zip_path": "examples/api/windows/merge_windows.zip"
},
{
"api_calls": [
@@ -1002,7 +1000,7 @@
"icon": null,
"id": "51a83d2ba3a32e3ff1bdb624d4e18ccec4c4038e",
"name": "Message Timer",
- "path": "examples\/api\/messaging\/timer\/",
+ "path": "examples/api/messaging/timer/",
"protocols": [],
"search_string": "MESSAGE TIMER TIMES HOW LONG IT TAKES TO SEND A MESSAGE TO A CONTENT SCRIPT AND BACK. BROWSER_ACTION POPUP TABS CHROME.EXTENSION.ONCONNECT CHROME.EXTENSION.ONREQUEST CHROME.TABS.CONNECT CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.SENDREQUEST",
"source_files": [
@@ -1011,7 +1009,7 @@
"popup.html"
],
"source_hash": "927cf398a95a665beb64f56a4bfb791b98a8ee96",
- "zip_path": "examples\/api\/messaging\/timer.zip"
+ "zip_path": "examples/api/messaging/timer.zip"
},
{
"api_calls": [
@@ -1032,7 +1030,7 @@
"icon": null,
"id": "4f6785ec4f937add6728615682dd37c9a42d9548",
"name": "My Bookmarks",
- "path": "examples\/api\/bookmarks\/basic\/",
+ "path": "examples/api/bookmarks/basic/",
"protocols": [],
"search_string": "MY BOOKMARKS A BROWSER ACTION WITH A POPUP DUMP OF ALL BOOKMARKS, INCLUDING SEARCH, ADD, EDIT AND DELETE. BOOKMARKS BROWSER_ACTION POPUP TABS CHROME.BOOKMARKS.CREATE CHROME.BOOKMARKS.GET CHROME.BOOKMARKS.GETTREE CHROME.BOOKMARKS.REMOVE CHROME.BOOKMARKS.UPDATE CHROME.TABS.CREATE",
"source_files": [
@@ -1040,7 +1038,7 @@
"popup.html"
],
"source_hash": "4f7509c56c2943cf8aedf1ee0b4b4a7d1e49f7d3",
- "zip_path": "examples\/api\/bookmarks\/basic.zip"
+ "zip_path": "examples/api/bookmarks/basic.zip"
},
{
"api_calls": [
@@ -1055,9 +1053,9 @@
"icon": "news_icon.png",
"id": "597015d3bcce3da693b02314afd607bec4f55291",
"name": "News Reader",
- "path": "examples\/extensions\/news_a11y\/",
+ "path": "examples/extensions/news_a11y/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.TABS.CREATE",
"source_files": [
@@ -1065,7 +1063,7 @@
"manifest.json"
],
"source_hash": "af7474bf0d3ef1a407f27ae0900167a1408ead35",
- "zip_path": "examples\/extensions\/news_a11y.zip"
+ "zip_path": "examples/extensions/news_a11y.zip"
},
{
"api_calls": [
@@ -1081,21 +1079,21 @@
"icon": "news_icon.png",
"id": "6444e5c8ae112a6a433909c5e770669cd16e2e5f",
"name": "News Reader",
- "path": "examples\/extensions\/news_i18n\/",
+ "path": "examples/extensions/news_i18n/",
"protocols": [
- "http:\/\/",
- "http:\/\/"
+ "http://",
+ "http://"
],
"search_string": "NEWS READER DISPLAYS THE FIRST 5 ITEMS FROM THE GOOGLE NEWS - TOP NEWS RSS FEED IN A POPUP. BROWSER_ACTION POPUP TABS CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE",
"source_files": [
- "_locales\/en\/messages.json",
- "_locales\/es\/messages.json",
- "_locales\/sr\/messages.json",
+ "_locales/en/messages.json",
+ "_locales/es/messages.json",
+ "_locales/sr/messages.json",
"feed.html",
"manifest.json"
],
"source_hash": "381268f1183beaeba8d6596e736dc2c00a55fd21",
- "zip_path": "examples\/extensions\/news_i18n.zip"
+ "zip_path": "examples/extensions/news_i18n.zip"
},
{
"api_calls": [
@@ -1111,28 +1109,28 @@
"popup",
"tabs"
],
- "icon": "images\/news_icon.png",
+ "icon": "images/news_icon.png",
"id": "3aea027164cb9b732ba4a8c51cb93708891726ef",
"name": "News Reader (by Google)",
- "path": "examples\/extensions\/news\/",
+ "path": "examples/extensions/news/",
"protocols": [
- "http:\/\/"
+ "http://"
],
"search_string": "NEWS READER (BY GOOGLE) DISPLAYS THE LATEST STORIES FROM GOOGLE NEWS IN A POPUP. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE POPUP TABS CHROME.EXTENSION.GETURL CHROME.I18N.GETMESSAGE CHROME.TABS.CREATE",
"source_files": [
- "_locales\/en\/messages.json",
- "css\/feed.css",
- "css\/options.css",
- "javascript\/feed.js",
- "javascript\/options.js",
- "javascript\/util.js",
+ "_locales/en/messages.json",
+ "css/feed.css",
+ "css/options.css",
+ "javascript/feed.js",
+ "javascript/options.js",
+ "javascript/util.js",
"manifest.json",
- "views\/background.html",
- "views\/feed.html",
- "views\/options.html"
+ "views/background.html",
+ "views/feed.html",
+ "views/options.html"
],
"source_hash": "cc21920e101dd4d4c535f4842e3f0ab4be285166",
- "zip_path": "examples\/extensions\/news.zip"
+ "zip_path": "examples/extensions/news.zip"
},
{
"api_calls": [
@@ -1148,7 +1146,7 @@
"icon": "128.png",
"id": "f799e26ceef2367cf836f24bcb47df4398b0df58",
"name": "Notification Demo",
- "path": "examples\/api\/notifications\/",
+ "path": "examples/api/notifications/",
"protocols": [],
"search_string": "NOTIFICATION DEMO SHOWS OFF DESKTOP NOTIFICATIONS, WHICH ARE TOAST WINDOWS THAT POP UP ON THE DESKTOP. BACKGROUND_PAGE NOTIFICATIONS OPTIONS_PAGE TABS CHROME.TABS.CREATE",
"source_files": [
@@ -1158,7 +1156,7 @@
"options.html"
],
"source_hash": "bc2985ef75d717779cb6e1e523a3e063067c3494",
- "zip_path": "examples\/api\/notifications.zip"
+ "zip_path": "examples/api/notifications.zip"
},
{
"api_calls": [
@@ -1172,15 +1170,15 @@
"icon": null,
"id": "e787b322bddbc6289bb31b7d7550b1bf6456a80b",
"name": "Omnibox Example",
- "path": "examples\/api\/omnibox\/simple-example\/",
+ "path": "examples/api/omnibox/simple-example/",
"protocols": [],
"search_string": "OMNIBOX EXAMPLE TO USE, TYPE OMNIX PLUS A SEARCH TERM INTO THE OMNIBOX. BACKGROUND_PAGE CHROME.OMNIBOX.ONINPUTCHANGED CHROME.OMNIBOX.ONINPUTENTERED",
"source_files": [
"background.html",
"manifest.json"
],
- "source_hash": "60a9ea6b33c157ac1f8026fa7e834668716b0dcb",
- "zip_path": "examples\/api\/omnibox\/simple-example.zip"
+ "source_hash": "21f142aad0637086ec08923a11ce3dee70e42bc6",
+ "zip_path": "examples/api/omnibox/simple-example.zip"
},
{
"api_calls": [
@@ -1196,7 +1194,7 @@
"icon": "sandwich-128.png",
"id": "8d0a50b57c26bb498be592e871001ffed91541b4",
"name": "Page action by content",
- "path": "examples\/api\/pageAction\/pageaction_by_content\/",
+ "path": "examples/api/pageAction/pageaction_by_content/",
"protocols": [],
"search_string": "PAGE ACTION BY CONTENT SHOWS A PAGE ACTION FOR HTML PAGES CONTAINING THE WORD SANDWICH BACKGROUND_PAGE PAGE_ACTION CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST CHROME.PAGEACTION.SHOW",
"source_files": [
@@ -1205,7 +1203,7 @@
"manifest.json"
],
"source_hash": "0f4b881b1bc2e2fd6098fd219ca061b72a9654b7",
- "zip_path": "examples\/api\/pageAction\/pageaction_by_content.zip"
+ "zip_path": "examples/api/pageAction/pageaction_by_content.zip"
},
{
"api_calls": [
@@ -1221,7 +1219,7 @@
"icon": "icon-128.png",
"id": "80b86ccc6e8520660fa591caa565826f0ed1b12c",
"name": "Page action by URL",
- "path": "examples\/api\/pageAction\/pageaction_by_url\/",
+ "path": "examples/api/pageAction/pageaction_by_url/",
"protocols": [],
"search_string": "PAGE ACTION BY URL SHOWS A PAGE ACTION FOR URLS WHICH HAVE THE LETTER G IN THEM. BACKGROUND_PAGE PAGE_ACTION TABS CHROME.PAGEACTION.SHOW CHROME.TABS.ONUPDATED",
"source_files": [
@@ -1229,7 +1227,7 @@
"manifest.json"
],
"source_hash": "732ef0951e1d6ff4afedb884b0e63cb342bb1499",
- "zip_path": "examples\/api\/pageAction\/pageaction_by_url.zip"
+ "zip_path": "examples/api/pageAction/pageaction_by_url.zip"
},
{
"api_calls": [
@@ -1262,34 +1260,34 @@
"icon": null,
"id": "d74c3c18a1c1dd18b035149105a306f837c8823e",
"name": "Page Benchmarker",
- "path": "examples\/extensions\/benchmark\/",
+ "path": "examples/extensions/benchmark/",
"protocols": [
- "https:\/\/",
- "http:\/\/"
+ "https://",
+ "http://"
],
"search_string": "PAGE BENCHMARKER CHROMIUM PAGE BENCHMARKER. BACKGROUND_PAGE BROWSER_ACTION OPTIONS_PAGE TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETBADGEBACKGROUNDCOLOR CHROME.BROWSERACTION.SETBADGETEXT CHROME.BROWSERACTION.SETTITLE CHROME.EXTENSION.CONNECT CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETEXTENSIONTABS CHROME.EXTENSION.GETURL CHROME.EXTENSION.ONCONNECT CHROME.TABS.CREATE CHROME.TABS.EXECUTESCRIPT CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETCURRENT",
"source_files": [
"background.html",
- "jquery\/jquery-1.4.2.min.js",
- "jquery\/jquery-ui-1.8.4.custom.min.js",
- "jquery\/jquery.client.js",
- "jquery\/jquery.flot.dashes.js",
- "jquery\/jquery.flot.js",
- "jquery\/jquery.flot.min.js",
- "jquery\/jquery.flot.navigate.js",
- "jquery\/jquery.flot.valuelabels.js",
- "jst\/jsevalcontext.js",
- "jst\/jstemplate.js",
- "jst\/jstemplate_test.js",
- "jst\/util.js",
+ "jquery/jquery-1.4.2.min.js",
+ "jquery/jquery-ui-1.8.4.custom.min.js",
+ "jquery/jquery.client.js",
+ "jquery/jquery.flot.dashes.js",
+ "jquery/jquery.flot.js",
+ "jquery/jquery.flot.min.js",
+ "jquery/jquery.flot.navigate.js",
+ "jquery/jquery.flot.valuelabels.js",
+ "jst/jsevalcontext.js",
+ "jst/jstemplate.js",
+ "jst/jstemplate_test.js",
+ "jst/util.js",
"manifest.json",
"options.html",
"script.js",
- "util\/sorttable.js",
- "util\/table2CSV.js"
+ "util/sorttable.js",
+ "util/table2CSV.js"
],
"source_hash": "7b6fde63c8dd0e626d176e8ce34ad43649746436",
- "zip_path": "examples\/extensions\/benchmark.zip"
+ "zip_path": "examples/extensions/benchmark.zip"
},
{
"api_calls": [
@@ -1305,10 +1303,10 @@
"icon": null,
"id": "e6ae17ab4ccfd7e059c8c01f25760ca5d894c7fd",
"name": "Print this page",
- "path": "examples\/api\/browserAction\/print\/",
+ "path": "examples/api/browserAction/print/",
"protocols": [
- "http:\/\/",
- "https:\/\/"
+ "http://",
+ "https://"
],
"search_string": "PRINT THIS PAGE ADDS A PRINT BUTTON TO THE BROWSER. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.TABS.UPDATE",
"source_files": [
@@ -1316,7 +1314,7 @@
"manifest.json"
],
"source_hash": "be980117222f6b041bb012c5a0793040cef747b6",
- "zip_path": "examples\/api\/browserAction\/print.zip"
+ "zip_path": "examples/api/browserAction/print.zip"
},
{
"api_calls": [
@@ -1332,7 +1330,7 @@
"icon": null,
"id": "beff6ecd9677dea0a7c648c5042165b48bb66f09",
"name": "Process Monitor",
- "path": "examples\/api\/processes\/process_monitor\/",
+ "path": "examples/api/processes/process_monitor/",
"protocols": [],
"search_string": "PROCESS MONITOR ADDS A BROWSER ACTION THAT MONITORS RESOURCE USAGE OF ALL BROWSER PROCESSES. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.ONUPDATED",
"source_files": [
@@ -1340,7 +1338,7 @@
"popup.html"
],
"source_hash": "a4d002a65d5ec54ef4495f8b5552a260119df739",
- "zip_path": "examples\/api\/processes\/process_monitor.zip"
+ "zip_path": "examples/api/processes/process_monitor.zip"
},
{
"api_calls": [
@@ -1360,15 +1358,15 @@
"browser_action",
"tabs"
],
- "icon": "img\/icon-128.png",
+ "icon": "img/icon-128.png",
"id": "56a8d2ac24ca7bba78fd88ad57f43fc13c784497",
"name": "Sample - OAuth Contacts",
- "path": "examples\/extensions\/oauth_contacts\/",
+ "path": "examples/extensions/oauth_contacts/",
"protocols": [
- "http:\/\/",
- "https:\/\/",
- "https:\/\/",
- "https:\/\/"
+ "http://",
+ "https://",
+ "https://",
+ "https://"
],
"search_string": "SAMPLE - OAUTH CONTACTS USES OAUTH TO CONNECT TO GOOGLES CONTACTS SERVICE AND DISPLAY A LIST OF YOUR CONTACTS. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.BROWSERACTION.SETICON CHROME.EXTENSION.GETBACKGROUNDPAGE CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE",
"source_files": [
@@ -1380,7 +1378,7 @@
"manifest.json"
],
"source_hash": "e9afbd588b1593c9d3e9b9612ac242c781871f34",
- "zip_path": "examples\/extensions\/oauth_contacts.zip"
+ "zip_path": "examples/extensions/oauth_contacts.zip"
},
{
"api_calls": [
@@ -1396,7 +1394,7 @@
"icon": "sandwich-128.png",
"id": "38f6e1e17756ede38b1364c7114a738ca717dcbb",
"name": "SandwichBar",
- "path": "examples\/api\/infobars\/sandwichbar\/",
+ "path": "examples/api/infobars/sandwichbar/",
"protocols": [],
"search_string": "SANDWICHBAR SHOWS AN INFOBAR ON PAGES WHICH CONTAIN THE WORD SANDWICH BACKGROUND_PAGE EXPERIMENTAL CHROME.EXPERIMENTAL.INFOBARS.SHOW CHROME.EXTENSION.ONREQUEST CHROME.EXTENSION.SENDREQUEST",
"source_files": [
@@ -1406,7 +1404,7 @@
"manifest.json"
],
"source_hash": "890d698634e5228ef7da8ffca3008f843b9a7cab",
- "zip_path": "examples\/api\/infobars\/sandwichbar.zip"
+ "zip_path": "examples/api/infobars/sandwichbar.zip"
},
{
"api_calls": [
@@ -1429,7 +1427,7 @@
"icon": null,
"id": "fc89b35755483af30b66cd72cefa34a43a3e8312",
"name": "Show Tabs in Process",
- "path": "examples\/api\/processes\/show_tabs\/",
+ "path": "examples/api/processes/show_tabs/",
"protocols": [],
"search_string": "SHOW TABS IN PROCESS ADDS A BROWSER ACTION SHOWING WHICH TABS SHARE THE CURRENT TABS PROCESS. BROWSER_ACTION EXPERIMENTAL POPUP TABS CHROME.EXPERIMENTAL.PROCESSES.GETPROCESSIDFORTAB CHROME.TABS.GET CHROME.TABS.GETSELECTED CHROME.TABS.UPDATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.UPDATE",
"source_files": [
@@ -1437,7 +1435,7 @@
"popup.html"
],
"source_hash": "c9818c3c4c2e4fae0a7cc29588514e050356fd52",
- "zip_path": "examples\/api\/processes\/show_tabs.zip"
+ "zip_path": "examples/api/processes/show_tabs.zip"
},
{
"api_calls": [
@@ -1477,7 +1475,7 @@
"icon": null,
"id": "230463f2d5c3d4d0ca13c230e1f00f2aae0a8a64",
"name": "Tab Inspector",
- "path": "examples\/api\/tabs\/inspector\/",
+ "path": "examples/api/tabs/inspector/",
"protocols": [],
"search_string": "TAB INSPECTOR UTILITY FOR WORKING WITH THE EXTENSION TABS API BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.TABS.CREATE CHROME.TABS.GET CHROME.TABS.GETALLINWINDOW CHROME.TABS.GETSELECTED CHROME.TABS.MOVE CHROME.TABS.ONATTACHED CHROME.TABS.ONCREATED CHROME.TABS.ONDETACHED CHROME.TABS.ONMOVED CHROME.TABS.ONREMOVED CHROME.TABS.ONSELECTIONCHANGED CHROME.TABS.ONUPDATED CHROME.TABS.REMOVE CHROME.TABS.UPDATE CHROME.WINDOWS.CREATE CHROME.WINDOWS.GET CHROME.WINDOWS.GETALL CHROME.WINDOWS.GETCURRENT CHROME.WINDOWS.GETLASTFOCUSED CHROME.WINDOWS.ONCREATED CHROME.WINDOWS.ONFOCUSCHANGED CHROME.WINDOWS.ONREMOVED CHROME.WINDOWS.REMOVE CHROME.WINDOWS.UPDATE",
"source_files": [
@@ -1487,7 +1485,7 @@
"tabs_api.html"
],
"source_hash": "3076b39a4302d8e86f456e6d7367129187cce0c0",
- "zip_path": "examples\/api\/tabs\/inspector.zip"
+ "zip_path": "examples/api/tabs/inspector.zip"
},
{
"api_calls": [
@@ -1507,7 +1505,7 @@
"icon": null,
"id": "e1697cacebad05218798bf3e8a0f724517f0e8c3",
"name": "Test Screenshot Extension",
- "path": "examples\/api\/tabs\/screenshot\/",
+ "path": "examples/api/tabs/screenshot/",
"protocols": [],
"search_string": "TEST SCREENSHOT EXTENSION DEMONSTRATE SCREENSHOT FUNCTIONALITY IN THE CHROME.TABS API. BACKGROUND_PAGE BROWSER_ACTION TABS CHROME.BROWSERACTION.ONCLICKED CHROME.EXTENSION.GETURL CHROME.EXTENSION.GETVIEWS CHROME.TABS.CAPTUREVISIBLETAB CHROME.TABS.CREATE CHROME.TABS.ONUPDATED",
"source_files": [
@@ -1517,7 +1515,7 @@
"screenshot.js"
],
"source_hash": "6be9b92850e86ce311cc12a2cf0cda3b47ab5d58",
- "zip_path": "examples\/api\/tabs\/screenshot.zip"
+ "zip_path": "examples/api/tabs/screenshot.zip"
},
{
"api_calls": [
@@ -1534,7 +1532,7 @@
"icon": null,
"id": "b3de91ab04b7d7a2670ca7ee9d740eb42cead0b6",
"name": "Typed URL History",
- "path": "examples\/api\/history\/showHistory\/",
+ "path": "examples/api/history/showHistory/",
"protocols": [],
"search_string": "TYPED URL HISTORY READS YOUR HISTORY, AND SHOWS THE TOP TEN PAGES YOU GO TO BY TYPING THE URL. BROWSER_ACTION HISTORY TABS CHROME.HISTORY.GETVISITS CHROME.HISTORY.SEARCH CHROME.TABS.CREATE",
"source_files": [
@@ -1543,7 +1541,7 @@
"typedUrls.js"
],
"source_hash": "72d5c3586feefc692c63039ce8bdb5f9d366c0e2",
- "zip_path": "examples\/api\/history\/showHistory.zip"
+ "zip_path": "examples/api/history/showHistory.zip"
}
]
} \ No newline at end of file
diff --git a/chrome/common/extensions/docs/static/npapi.html b/chrome/common/extensions/docs/static/npapi.html
index 8490bb3..72f3bd0 100644
--- a/chrome/common/extensions/docs/static/npapi.html
+++ b/chrome/common/extensions/docs/static/npapi.html
@@ -16,6 +16,7 @@ allowing you to call into native binary code from JavaScript.
<p>Code running in an NPAPI plugin has the full permissions of the current user and is not sandboxed or shielded from malicious input by Google Chrome in any way. You should be especially cautious when processing input from untrusted sources, such as when working with <a href="content_scripts.html#security-considerations">content scripts</a> or XMLHttpRequest.
<p>Because of the additional security risks NPAPI poses to users, extensions that use it will require manual review before being accepted in the
+<a href="https://chrome.google.com/webstore">web store</a> or
<a href="https://chrome.google.com/extensions">extension gallery</a>.
<h2>Details</h2>
diff --git a/chrome/common/extensions/docs/tabs.html b/chrome/common/extensions/docs/tabs.html
index cf7d2f6..27b26be 100644
--- a/chrome/common/extensions/docs/tabs.html
+++ b/chrome/common/extensions/docs/tabs.html
@@ -7373,7 +7373,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/template/api_template.html b/chrome/common/extensions/docs/template/api_template.html
index b495e8d..1b47011 100644
--- a/chrome/common/extensions/docs/template/api_template.html
+++ b/chrome/common/extensions/docs/template/api_template.html
@@ -471,7 +471,7 @@
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- &copy;2010 Google
+ &copy;2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/themes.html b/chrome/common/extensions/docs/themes.html
index b488a9d..56c5cf0 100644
--- a/chrome/common/extensions/docs/themes.html
+++ b/chrome/common/extensions/docs/themes.html
@@ -627,7 +627,7 @@ Community-written documentation to help you write themes is here:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/tut_analytics.html b/chrome/common/extensions/docs/tut_analytics.html
index d6a070f..4c695ff 100644
--- a/chrome/common/extensions/docs/tut_analytics.html
+++ b/chrome/common/extensions/docs/tut_analytics.html
@@ -695,7 +695,7 @@ extension.</p>
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/tut_debugging.html b/chrome/common/extensions/docs/tut_debugging.html
index 64a4ae1..3111f76 100644
--- a/chrome/common/extensions/docs/tut_debugging.html
+++ b/chrome/common/extensions/docs/tut_debugging.html
@@ -743,7 +743,7 @@ of Getting Started.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/tut_oauth.html b/chrome/common/extensions/docs/tut_oauth.html
index 1783eda..1d21c96 100644
--- a/chrome/common/extensions/docs/tut_oauth.html
+++ b/chrome/common/extensions/docs/tut_oauth.html
@@ -685,7 +685,7 @@ Sample extensions that use these techniques are available in the Chromium source
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/tutorials.html b/chrome/common/extensions/docs/tutorials.html
index b88a9cf..8657aed 100644
--- a/chrome/common/extensions/docs/tutorials.html
+++ b/chrome/common/extensions/docs/tutorials.html
@@ -498,7 +498,7 @@ more specialized topics:
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/whats_new.html b/chrome/common/extensions/docs/whats_new.html
index 5b644f7..2449352 100644
--- a/chrome/common/extensions/docs/whats_new.html
+++ b/chrome/common/extensions/docs/whats_new.html
@@ -572,7 +572,7 @@ No API or manifest changes worth noting.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/windows.html b/chrome/common/extensions/docs/windows.html
index f821c30..ad163a2 100644
--- a/chrome/common/extensions/docs/windows.html
+++ b/chrome/common/extensions/docs/windows.html
@@ -3668,7 +3668,7 @@ For other examples and for help in viewing the source code, see
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/docs/xhr.html b/chrome/common/extensions/docs/xhr.html
index b76acc5..4710c3e 100644
--- a/chrome/common/extensions/docs/xhr.html
+++ b/chrome/common/extensions/docs/xhr.html
@@ -628,7 +628,7 @@ prefer HTTPS whenever possible.
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
- ©2010 Google
+ ©2011 Google
</p>
<!-- begin analytics -->
diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc
index 8efa529..2e99e2b 100644
--- a/chrome/common/extensions/extension_constants.cc
+++ b/chrome/common/extensions/extension_constants.cc
@@ -277,7 +277,7 @@ const char* kIllegalPlugins =
} // namespace extension_manifest_errors
namespace extension_urls {
-const char* kGalleryBrowsePrefix = "https://chrome.google.com/extensions";
+const char* kGalleryBrowsePrefix = "https://chrome.google.com/webstore";
const char* kMiniGalleryBrowsePrefix = "https://tools.google.com/chrome/";
const char* kMiniGalleryDownloadPrefix = "https://dl-ssl.google.com/chrome/";
}
diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h
index 065fd0c..cf09515 100644
--- a/chrome/common/extensions/extension_constants.h
+++ b/chrome/common/extensions/extension_constants.h
@@ -243,7 +243,8 @@ namespace extension_misc {
PROMO_LAUNCH_WEB_STORE,
PROMO_CLOSE,
PROMO_EXPIRE,
- PROMO_BUCKET_BOUNDARY = PROMO_EXPIRE + 1
+ PROMO_SEEN,
+ PROMO_BUCKET_BOUNDARY
};
} // extension_misc
diff --git a/chrome/common/extensions/extension_manifests_unittest.cc b/chrome/common/extensions/extension_manifests_unittest.cc
index 446ff31..2132b6c 100644
--- a/chrome/common/extensions/extension_manifests_unittest.cc
+++ b/chrome/common/extensions/extension_manifests_unittest.cc
@@ -349,7 +349,7 @@ TEST_F(ExtensionManifestTest, GetHomepageURL) {
// can be different in testing, so we just check the part before id.
extension = LoadAndExpectSuccess("homepage_google_hosted.json");
EXPECT_TRUE(StartsWithASCII(extension->GetHomepageURL().spec(),
- "https://chrome.google.com/extensions/detail/",
+ "https://chrome.google.com/webstore/detail/",
false));
extension = LoadAndExpectSuccess("homepage_externally_hosted.json");
diff --git a/chrome/common/gpu_feature_flags.cc b/chrome/common/gpu_feature_flags.cc
new file mode 100644
index 0000000..12b857b
--- /dev/null
+++ b/chrome/common/gpu_feature_flags.cc
@@ -0,0 +1,45 @@
+// 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 "chrome/common/gpu_feature_flags.h"
+
+#include "base/logging.h"
+
+const char GpuFeatureFlags::kGpuFeatureNameAccelerated2dCanvas[] =
+ "accelerated_2d_canvas";
+const char GpuFeatureFlags::kGpuFeatureNameAcceleratedCompositing[] =
+ "accelerated_compositing";
+const char GpuFeatureFlags::kGpuFeatureNameWebgl[] = "webgl";
+const char GpuFeatureFlags::kGpuFeatureNameAll[] = "all";
+
+GpuFeatureFlags::GpuFeatureFlags()
+ : flags_(0) {
+}
+
+void GpuFeatureFlags::set_flags(uint32 flags) {
+ DCHECK_EQ(flags & (~kGpuFeatureAll), 0u);
+ flags_ = flags;
+}
+
+uint32 GpuFeatureFlags::flags() const {
+ return flags_;
+}
+
+void GpuFeatureFlags::Combine(const GpuFeatureFlags& other) {
+ flags_ |= other.flags_;
+}
+
+GpuFeatureFlags::GpuFeatureType GpuFeatureFlags::StringToGpuFeatureType(
+ const std::string& feature_string) {
+ if (feature_string == kGpuFeatureNameAccelerated2dCanvas)
+ return kGpuFeatureAccelerated2dCanvas;
+ else if (feature_string == kGpuFeatureNameAcceleratedCompositing)
+ return kGpuFeatureAcceleratedCompositing;
+ else if (feature_string == kGpuFeatureNameWebgl)
+ return kGpuFeatureWebgl;
+ else if (feature_string == kGpuFeatureNameAll)
+ return kGpuFeatureAll;
+ return kGpuFeatureUnknown;
+}
+
diff --git a/chrome/common/gpu_feature_flags.h b/chrome/common/gpu_feature_flags.h
new file mode 100644
index 0000000..5b9d3ed
--- /dev/null
+++ b/chrome/common/gpu_feature_flags.h
@@ -0,0 +1,58 @@
+// 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 CHROME_COMMON_GPU_FEATURE_FLAGS_H__
+#define CHROME_COMMON_GPU_FEATURE_FLAGS_H__
+#pragma once
+
+// Provides flags indicating which gpu features are blacklisted for the system
+// on which chrome is currently running.
+
+#include <string>
+
+#include "base/basictypes.h"
+
+class GpuFeatureFlags {
+ public:
+ enum GpuFeatureType {
+ kGpuFeatureAccelerated2dCanvas = 1 << 0,
+ kGpuFeatureAcceleratedCompositing = 1 << 1,
+ kGpuFeatureWebgl = 1 << 2,
+ kGpuFeatureAll = kGpuFeatureAccelerated2dCanvas |
+ kGpuFeatureAcceleratedCompositing |
+ kGpuFeatureWebgl,
+ kGpuFeatureUnknown = 0
+ };
+
+ // All flags initialized to false, i.e., no feature is blacklisted.
+ GpuFeatureFlags();
+
+ // flags are OR combination of GpuFeatureType.
+ void set_flags(uint32 flags);
+
+ uint32 flags() const;
+
+ // Resets each flag by OR with the corresponding flag in "other".
+ void Combine(const GpuFeatureFlags& other);
+
+ // Maps string to GpuFeatureType; returns kGpuFeatureUnknown if none of the
+ // following is input (case-sensitive):
+ // "accelerated_2d_canvas"
+ // "accelerated_compositing"
+ // "webgl"
+ static GpuFeatureType StringToGpuFeatureType(
+ const std::string& feature_string);
+
+ private:
+ static const char kGpuFeatureNameAccelerated2dCanvas[];
+ static const char kGpuFeatureNameAcceleratedCompositing[];
+ static const char kGpuFeatureNameWebgl[];
+ static const char kGpuFeatureNameAll[];
+
+ // If a bit is set to 1, corresponding feature is blacklisted.
+ uint32 flags_;
+};
+
+#endif // CHROME_COMMON_GPU_FEATURE_FLAGS_H__
+
diff --git a/chrome/common/gpu_feature_flags_unittest.cc b/chrome/common/gpu_feature_flags_unittest.cc
new file mode 100644
index 0000000..1bd8f40
--- /dev/null
+++ b/chrome/common/gpu_feature_flags_unittest.cc
@@ -0,0 +1,51 @@
+// 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 "chrome/common/gpu_feature_flags.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(GpuFeatureFlagsTest, GpuFeatureFlagsBasic) {
+ // Test that by default all flags are set to false.
+ GpuFeatureFlags flags;
+ EXPECT_EQ(flags.flags(), 0u);
+
+ // Test SetFlags().
+ GpuFeatureFlags flags2;
+ flags2.set_flags(GpuFeatureFlags::kGpuFeatureAcceleratedCompositing |
+ GpuFeatureFlags::kGpuFeatureWebgl);
+ EXPECT_EQ(flags2.flags(),
+ static_cast<uint32>(
+ GpuFeatureFlags::kGpuFeatureAcceleratedCompositing |
+ GpuFeatureFlags::kGpuFeatureWebgl));
+
+ // Test Combine() is basically OR operation per flag.
+ flags.set_flags(GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas);
+ flags.Combine(flags2);
+ EXPECT_EQ(flags.flags(),
+ static_cast<uint32>(
+ GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas |
+ GpuFeatureFlags::kGpuFeatureAcceleratedCompositing |
+ GpuFeatureFlags::kGpuFeatureWebgl));
+
+ // Test the currently supported feature set.
+ flags.set_flags(GpuFeatureFlags::kGpuFeatureAll);
+ EXPECT_EQ(flags.flags(),
+ static_cast<uint32>(
+ GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas |
+ GpuFeatureFlags::kGpuFeatureAcceleratedCompositing |
+ GpuFeatureFlags::kGpuFeatureWebgl));
+
+ // Test StringToGpuFeatureType.
+ EXPECT_EQ(GpuFeatureFlags::StringToGpuFeatureType("accelerated_2d_canvas"),
+ GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas);
+ EXPECT_EQ(GpuFeatureFlags::StringToGpuFeatureType("accelerated_compositing"),
+ GpuFeatureFlags::kGpuFeatureAcceleratedCompositing);
+ EXPECT_EQ(GpuFeatureFlags::StringToGpuFeatureType("webgl"),
+ GpuFeatureFlags::kGpuFeatureWebgl);
+ EXPECT_EQ(GpuFeatureFlags::StringToGpuFeatureType("all"),
+ GpuFeatureFlags::kGpuFeatureAll);
+ EXPECT_EQ(GpuFeatureFlags::StringToGpuFeatureType("xxx"),
+ GpuFeatureFlags::kGpuFeatureUnknown);
+}
+
diff --git a/chrome/common/gpu_messages_internal.h b/chrome/common/gpu_messages_internal.h
index e4badaa..1872992 100644
--- a/chrome/common/gpu_messages_internal.h
+++ b/chrome/common/gpu_messages_internal.h
@@ -40,6 +40,11 @@ IPC_BEGIN_MESSAGES(Gpu)
IPC_MESSAGE_CONTROL1(GpuMsg_EstablishChannel,
int /* renderer_id */)
+ // Tells the GPU process to close the channel identified by IPC channel
+ // handle. If no channel can be identified, do nothing.
+ IPC_MESSAGE_CONTROL1(GpuMsg_CloseChannel,
+ IPC::ChannelHandle /* channel_handle */)
+
// Provides a synchronization point to guarantee that the processing of
// previous asynchronous messages (i.e., GpuMsg_EstablishChannel) has
// completed. (This message can't be synchronous because the
@@ -61,6 +66,13 @@ IPC_BEGIN_MESSAGES(Gpu)
int /* renderer_id */,
int32 /* route_id */,
uint64 /* swap_buffers_count */)
+
+// Tells the GPU process that the IOSurface of the buffer belonging to
+// |renderer_route_id| a given id was destroyed, either by the user closing the
+// tab hosting the surface, or by the renderer navigating to a new page.
+IPC_MESSAGE_CONTROL2(GpuMsg_DidDestroyAcceleratedSurface,
+ int /* renderer_id */,
+ int32 /* renderer_route_id */)
#endif
// Tells the GPU process to crash.
diff --git a/chrome/common/policy_constants.cc b/chrome/common/policy_constants.cc
index 36e6874..42efba9 100644
--- a/chrome/common/policy_constants.cc
+++ b/chrome/common/policy_constants.cc
@@ -69,6 +69,7 @@ const char kEnableAuthNegotiatePort[] = "EnableAuthNegotiatePort";
const char kAuthServerWhitelist[] = "AuthServerWhitelist";
const char kAuthNegotiateDelegateWhitelist[] = "AuthNegotiateDelegateWhitelist";
const char kGSSAPILibraryName[] = "GSSAPILibraryName";
+const char kDisable3DAPIs[] = "Disable3DAPIs";
// Chrome Frame specific policy constants
const char kChromeFrameRendererSettings[] = "ChromeFrameRendererSettings";
diff --git a/chrome/common/policy_constants.h b/chrome/common/policy_constants.h
index 623cc17..c5b8536 100644
--- a/chrome/common/policy_constants.h
+++ b/chrome/common/policy_constants.h
@@ -65,6 +65,7 @@ extern const char kEnableAuthNegotiatePort[];
extern const char kAuthServerWhitelist[];
extern const char kAuthNegotiateDelegateWhitelist[];
extern const char kGSSAPILibraryName[];
+extern const char kDisable3DAPIs[];
// Chrome Frame specific policy constants
extern const char kChromeFrameRendererSettings[];
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index b43b59a..8adb8fc 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -598,6 +598,9 @@ const char kGeolocationDefaultContentSetting[] =
// Dictionary that maps [frame, toplevel] to their Geolocation content setting.
const char kGeolocationContentSettings[] = "geolocation.content_settings";
+// Preference to disable 3D APIs (WebGL, Pepper 3D).
+const char kDisable3DAPIs[] = "disable_3d_apis";
+
// *************** LOCAL STATE ***************
// These are attached to the machine/installation
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 621cbe3..fae79ec 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -430,6 +430,8 @@ extern const char kGSSAPILibraryName[];
extern const char kKnownBackgroundPages[];
+extern const char kDisable3DAPIs[];
+
} // namespace prefs
#endif // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chrome/common/resource_dispatcher.cc b/chrome/common/resource_dispatcher.cc
index 1b2e175..aff0367 100644
--- a/chrome/common/resource_dispatcher.cc
+++ b/chrome/common/resource_dispatcher.cc
@@ -401,6 +401,11 @@ void ResourceDispatcher::OnReceivedRedirect(
if (request_info->peer->OnReceivedRedirect(new_url, info,
&has_new_first_party_for_cookies,
&new_first_party_for_cookies)) {
+ // Double-check if the request is still around. The call above could
+ // potentially remove it.
+ request_info = GetPendingRequestInfo(request_id);
+ if (!request_info)
+ return;
request_info->pending_redirect_message.reset(
new ViewHostMsg_FollowRedirect(routing_id, request_id,
has_new_first_party_for_cookies,
diff --git a/chrome/common/sandbox_init_wrapper_mac.cc b/chrome/common/sandbox_init_wrapper_mac.cc
index d65ee70..adffd0c 100644
--- a/chrome/common/sandbox_init_wrapper_mac.cc
+++ b/chrome/common/sandbox_init_wrapper_mac.cc
@@ -24,7 +24,8 @@ bool SandboxInitWrapper::InitializeSandbox(const CommandLine& command_line,
// Browser process isn't sandboxed.
return true;
} else if (process_type == switches::kRendererProcess) {
- if (!command_line.HasSwitch(switches::kDisableExperimentalWebGL) &&
+ if (!command_line.HasSwitch(switches::kDisable3DAPIs) &&
+ !command_line.HasSwitch(switches::kDisableExperimentalWebGL) &&
command_line.HasSwitch(switches::kInProcessWebGL)) {
// TODO(kbr): this check seems to be necessary only on this
// platform because the sandbox is initialized later. Remove
diff --git a/chrome/common/sandbox_policy.cc b/chrome/common/sandbox_policy.cc
index 7adf2b9..75e6469 100644
--- a/chrome/common/sandbox_policy.cc
+++ b/chrome/common/sandbox_policy.cc
@@ -532,7 +532,7 @@ base::ProcessHandle StartProcessWithAccess(CommandLine* cmd_line,
if (!in_sandbox && (type == ChildProcessInfo::PLUGIN_PROCESS)) {
in_sandbox = browser_command_line.HasSwitch(switches::kSafePlugins) ||
(IsBuiltInFlash(cmd_line, NULL) &&
- !browser_command_line.HasSwitch(switches::kDisableFlashSandbox));
+ browser_command_line.HasSwitch(switches::kEnableFlashSandbox));
}
if (browser_command_line.HasSwitch(switches::kNoSandbox)) {
@@ -546,7 +546,8 @@ base::ProcessHandle StartProcessWithAccess(CommandLine* cmd_line,
in_sandbox = false;
}
#endif
- if (!browser_command_line.HasSwitch(switches::kDisableExperimentalWebGL) &&
+ if (!browser_command_line.HasSwitch(switches::kDisable3DAPIs) &&
+ !browser_command_line.HasSwitch(switches::kDisableExperimentalWebGL) &&
browser_command_line.HasSwitch(switches::kInProcessWebGL)) {
// In process WebGL won't work if the sandbox is enabled.
in_sandbox = false;
diff --git a/net/base/mime_sniffer.cc b/net/base/mime_sniffer.cc
index 1a52b99..bd16462 100644
--- a/net/base/mime_sniffer.cc
+++ b/net/base/mime_sniffer.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -146,6 +146,8 @@ static const MagicNumber kMagicNumbers[] = {
MAGIC_NUMBER("image/tiff", "II*")
MAGIC_NUMBER("image/tiff", "MM\x00*")
MAGIC_NUMBER("audio/mpeg", "ID3")
+ MAGIC_NUMBER("image/webp", "RIFF....WEBPVP8 ")
+ MAGIC_NUMBER("video/webm", "\x1A\x45\xDF\xA3")
// TODO(abarth): we don't handle partial byte matches yet
// MAGIC_NUMBER("video/mpeg", "\x00\x00\x01\xB")
// MAGIC_NUMBER("audio/mpeg", "\xFF\xE")
@@ -215,6 +217,19 @@ static scoped_refptr<base::Histogram> UMASnifferHistogramGet(const char* name,
return counter;
}
+// Compare content header to a magic number where magic_entry can contain '.'
+// for single character of anything, allowing some bytes to be skipped.
+static bool MagicCmp(const char* magic_entry, const char* content, size_t len) {
+ while (len) {
+ if ((*magic_entry != '.') && (*magic_entry != *content))
+ return false;
+ ++magic_entry;
+ ++content;
+ --len;
+ }
+ return true;
+}
+
static bool MatchMagicNumber(const char* content, size_t size,
const MagicNumber* magic_entry,
std::string* result) {
@@ -239,7 +254,7 @@ static bool MatchMagicNumber(const char* content, size_t size,
}
} else {
if (size >= len)
- match = (memcmp(magic_entry->magic, content, len) == 0);
+ match = MagicCmp(magic_entry->magic, content, len);
}
if (match) {
@@ -251,7 +266,8 @@ static bool MatchMagicNumber(const char* content, size_t size,
static bool CheckForMagicNumbers(const char* content, size_t size,
const MagicNumber* magic, size_t magic_len,
- base::Histogram* counter, std::string* result) {
+ base::Histogram* counter,
+ std::string* result) {
for (size_t i = 0; i < magic_len; ++i) {
if (MatchMagicNumber(content, size, &(magic[i]), result)) {
if (counter) counter->Add(static_cast<int>(i));
diff --git a/net/base/ssl_cert_request_info.cc b/net/base/ssl_cert_request_info.cc
index bb91632..b7728e5 100644
--- a/net/base/ssl_cert_request_info.cc
+++ b/net/base/ssl_cert_request_info.cc
@@ -11,6 +11,11 @@ namespace net {
SSLCertRequestInfo::SSLCertRequestInfo() {
}
+void SSLCertRequestInfo::Reset() {
+ host_and_port.clear();
+ client_certs.clear();
+}
+
SSLCertRequestInfo::~SSLCertRequestInfo() {
}
diff --git a/net/base/ssl_cert_request_info.h b/net/base/ssl_cert_request_info.h
index 22eecfe..416e902 100644
--- a/net/base/ssl_cert_request_info.h
+++ b/net/base/ssl_cert_request_info.h
@@ -22,6 +22,9 @@ class SSLCertRequestInfo
public:
SSLCertRequestInfo();
+ // Resets the SSLCertRequestInfo as if no certificate had been requested.
+ void Reset();
+
// The host and port of the SSL server that requested client authentication.
std::string host_and_port;
diff --git a/net/base/ssl_false_start_blacklist.txt b/net/base/ssl_false_start_blacklist.txt
index e78b354..22fb224 100644
--- a/net/base/ssl_false_start_blacklist.txt
+++ b/net/base/ssl_false_start_blacklist.txt
@@ -174,6 +174,7 @@ amo-happy-patients.com
amo-signature.net
amo-top.net
ampecommerce.com
+amsbwm.org
amsi.alliedgroup.net
amwaylive.com
analytics.sonymusic.com
@@ -740,6 +741,7 @@ cmithun.dojiggy.com
cms.whereilive.com.au
cnw.albertaequestrian.com
cnw.hcbc.ca
+co-labs.org
codarts.nl
coddy.com
cofunds.co.uk
@@ -859,7 +861,9 @@ cwa.fandr.com
cwa.telecomputing.no
cwt.no
cwtnordic.com
+cyberobservatories.net
cybershoppersonline.com
+cybs.rogers.com
d-ikt.no
d-starjob.com
d115.de
@@ -879,6 +883,7 @@ datasettlement.com
datatel.com
davidson.edu
davisregional.com
+daymet.org
dbpn.com
dc.myflorida.com
dc110.4shared.com
@@ -931,6 +936,7 @@ district205.net
djmmusic.com
dl.com
dl.rakuten.co.jp
+dlese.org
dmgov.org
dmz.rgcweb.org
docmesa.com
@@ -1353,6 +1359,7 @@ geometrik.golder.se
geonosis.itsso.gc.ca
georgefox.edu
gepartsrebates.com
+gepon.org
germfree.org
get1931roadster.com
get1933caddy.com
@@ -1453,6 +1460,7 @@ ggusd.us
ggy.com
gilmorehealth.com
giltcdn.com
+gisclimatechange.org
global2.mtsallstream.com
glove.mizunoballpark.com
glowinghealth.com.au
@@ -1992,6 +2000,7 @@ leshamwowoffre.com
level.mol.hu
lexor.lsp.at
lexsan.vestingonline.nl
+lgelements.com
lh.k12.ar.us
library.failteireland.ie
liemerscollege.nl
@@ -2813,6 +2822,7 @@ nraesafe.com
nrwbank.com
ns002.toshiba-sol.co.jp
ns11mm.sept11mm.org
+nsdlnetwork.org
nsw.gov.au
nswmentors.com
ntdira.com
@@ -3521,6 +3531,7 @@ s-yoyaku.city.urayasu.chiba.jp
s.ixiaa.com
s.ncp.imrworldwide.com
s1defense.com
+s2task.globe.gov
saab-leadengine.de
saas.dynamate.eu
saas.it-telcom.nl
@@ -4028,6 +4039,7 @@ tc4men.com
tco.cfbt-inspections.com
tcspost.thomassen.com
tdj.ac.jp
+teachingboxes.org
teachingpersonnel.com
teambrandon.ca
tecdlr.com
@@ -4047,6 +4059,7 @@ terrabanking.romexterra.ro
testdrivereward.com
testdriveunlimited2.com
tewkesburyschool.org
+tfelements.com
tge.cl
tgn.co.jp
tgw.com
@@ -4138,6 +4151,7 @@ toranomon-ichiba.com
tosti-asia.com
totalcore.com
touchnbrush.tv
+touchnet.com
toutatice.fr
tpmail.transplace.com
tracs.txstate.edu
@@ -4216,6 +4230,7 @@ uab.edu
uatoa.americanexpress.com
ube-ind.co.jp
ubi.pt
+ucar.edu
ucf.edu
uci.edu
uckac.edu
@@ -4312,6 +4327,7 @@ vfwsturgis.org
vhspoint.lt
vi.macromill.com
viacord.com
+vibe.novell.com
vic33.win.kennesaw.edu
video.actadvantage.org
videocamerashop.be
@@ -4461,6 +4477,7 @@ wastis-eu.st.com
wcupa.edu
wcvpn.wartburg.edu
wdpartnersonline.com
+weathercoalition.org
web-opas.osakaya.co.jp
web-pl.daikin.co.jp
web-vpn.hefr.ch
diff --git a/net/base/transport_security_state.cc b/net/base/transport_security_state.cc
index 69c915d..598ed48 100644
--- a/net/base/transport_security_state.cc
+++ b/net/base/transport_security_state.cc
@@ -412,6 +412,7 @@ bool TransportSecurityState::IsPreloadedSTS(
{21, false, "\003www\013noisebridge\003net"},
{10, false, "\004neg9\003org"},
{11, false, "\006factor\002cc"},
+ {19, true, "\015splendidbacon\003com"},
};
static const size_t kNumPreloadedSTS = ARRAYSIZE_UNSAFE(kPreloadedSTS);
diff --git a/net/base/transport_security_state_unittest.cc b/net/base/transport_security_state_unittest.cc
index 47a3562..126ca2b 100644
--- a/net/base/transport_security_state_unittest.cc
+++ b/net/base/transport_security_state_unittest.cc
@@ -348,6 +348,10 @@ TEST_F(TransportSecurityStateTest, Preloaded) {
EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "factor.cc"));
EXPECT_FALSE(state->IsEnabledForHost(&domain_state, "www.factor.cc"));
+
+ EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "splendidbacon.com"));
+ EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "www.splendidbacon.com"));
+ EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "foo.splendidbacon.com"));
}
TEST_F(TransportSecurityStateTest, LongNames) {
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index c84dfa4..7621e5a 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -537,6 +537,10 @@ int HttpNetworkTransaction::DoCreateStreamComplete(int result) {
result = HandleCertificateRequest(result);
}
+ // Handle possible handshake errors that may have occurred if the stream
+ // used SSL for one or more of the layers.
+ result = HandleSSLHandshakeError(result);
+
// At this point we are done with the stream_request_.
stream_request_.reset();
return result;
@@ -679,23 +683,6 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
result = HandleCertificateRequest(result);
if (result == OK)
return result;
- } else if ((result == ERR_SSL_DECOMPRESSION_FAILURE_ALERT ||
- result == ERR_SSL_BAD_RECORD_MAC_ALERT) &&
- ssl_config_.tls1_enabled &&
- !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) {
- // Some buggy servers select DEFLATE compression when offered and then
- // fail to ever decompress anything. They will send a fatal alert telling
- // us this. Normally we would pick this up during the handshake because
- // our Finished message is compressed and we'll never get the server's
- // Finished if it fails to process ours.
- //
- // However, with False Start, we'll believe that the handshake is
- // complete as soon as we've /sent/ our Finished message. In this case,
- // we only find out that the server is buggy here, when we try to read
- // the initial reply.
- session_->http_stream_factory()->AddTLSIntolerantServer(request_->url);
- ResetConnectionAndRequestForResend();
- return OK;
}
if (result < 0 && result != ERR_CONNECTION_CLOSED)
@@ -1007,11 +994,61 @@ int HttpNetworkTransaction::HandleCertificateRequest(int error) {
return OK;
}
+// TODO(rch): This does not correctly handle errors when an SSL proxy is
+// being used, as all of the errors are handled as if they were generated
+// by the endpoint host, request_->url, rather than considering if they were
+// generated by the SSL proxy. http://crbug.com/66424
+int HttpNetworkTransaction::HandleSSLHandshakeError(int error) {
+ DCHECK(request_);
+ if (ssl_config_.send_client_cert &&
+ (error == ERR_SSL_PROTOCOL_ERROR ||
+ error == ERR_BAD_SSL_CLIENT_AUTH_CERT)) {
+ session_->ssl_client_auth_cache()->Remove(
+ GetHostAndPort(request_->url));
+ }
+
+ switch (error) {
+ case ERR_SSL_PROTOCOL_ERROR:
+ case ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
+ case ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
+ case ERR_SSL_BAD_RECORD_MAC_ALERT:
+ if (ssl_config_.tls1_enabled &&
+ !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) {
+ // This could be a TLS-intolerant server, an SSL 3.0 server that
+ // chose a TLS-only cipher suite or a server with buggy DEFLATE
+ // support. Turn off TLS 1.0, DEFLATE support and retry.
+ session_->http_stream_factory()->AddTLSIntolerantServer(request_->url);
+ ResetConnectionAndRequestForResend();
+ error = OK;
+ }
+ break;
+ case ERR_SSL_SNAP_START_NPN_MISPREDICTION:
+ // This means that we tried to Snap Start a connection, but we
+ // mispredicted the NPN result. This isn't a problem from the point of
+ // view of the SSL layer because the server will ignore the application
+ // data in the Snap Start extension. However, at the HTTP layer, we have
+ // already decided that it's a HTTP or SPDY connection and it's easier to
+ // abort and start again.
+ ResetConnectionAndRequestForResend();
+ error = OK;
+ break;
+ }
+ return error;
+}
+
// This method determines whether it is safe to resend the request after an
// IO error. It can only be called in response to request header or body
// write errors or response header read errors. It should not be used in
// other cases, such as a Connect error.
int HttpNetworkTransaction::HandleIOError(int error) {
+ // SSL errors may happen at any time during the stream and indicate issues
+ // with the underlying connection. Because the peer may request
+ // renegotiation at any time, check and handle any possible SSL handshake
+ // related errors. In addition to renegotiation, TLS False/Snap Start may
+ // cause SSL handshake errors to be delayed until the first Read on the
+ // underlying connection.
+ error = HandleSSLHandshakeError(error);
+
switch (error) {
// If we try to reuse a connection that the server is in the process of
// closing, we may end up successfully writing out our request (or a
@@ -1025,16 +1062,6 @@ int HttpNetworkTransaction::HandleIOError(int error) {
error = OK;
}
break;
- case ERR_SSL_SNAP_START_NPN_MISPREDICTION:
- // This means that we tried to Snap Start a connection, but we
- // mispredicted the NPN result. This isn't a problem from the point of
- // view of the SSL layer because the server will ignore the application
- // data in the Snap Start extension. However, at the HTTP layer, we have
- // already decided that it's a HTTP or SPDY connection and it's easier to
- // abort and start again.
- ResetConnectionAndRequestForResend();
- error = OK;
- break;
}
return error;
}
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index 255fcdf..0595813 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -135,6 +135,11 @@ class HttpNetworkTransaction : public HttpTransaction,
// Called to handle a client certificate request.
int HandleCertificateRequest(int error);
+ // Called to possibly recover from an SSL handshake error. Sets next_state_
+ // and returns OK if recovering from the error. Otherwise, the same error
+ // code is returned.
+ int HandleSSLHandshakeError(int error);
+
// Called to possibly recover from the given error. Sets next_state_ and
// returns OK if recovering from the error. Otherwise, the same error code
// is returned.
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index f765696..b9acbfc 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -20,6 +20,7 @@
#include "net/base/net_log.h"
#include "net/base/net_log_unittest.h"
#include "net/base/request_priority.h"
+#include "net/base/ssl_cert_request_info.h"
#include "net/base/ssl_config_service_defaults.h"
#include "net/base/ssl_info.h"
#include "net/base/test_completion_callback.h"
@@ -7951,4 +7952,303 @@ TEST_F(HttpNetworkTransactionTest, NPNMispredict) {
EXPECT_EQ("hello world", contents);
}
+// Ensure that a client certificate is removed from the SSL client auth
+// cache when:
+// 1) No proxy is involved.
+// 2) TLS False Start is disabled.
+// 3) The initial TLS handshake requests a client certificate.
+// 4) The client supplies an invalid/unacceptable certificate.
+TEST_F(HttpNetworkTransactionTest, ClientAuthCertCache_Direct_NoFalseStart) {
+ SessionDependencies session_deps;
+
+ scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo());
+ cert_request->host_and_port = "www.example.com:443";
+
+ // [ssl_]data1 contains the data for the first SSL handshake. When a
+ // CertificateRequest is received for the first time, the handshake will
+ // be aborted to allow the caller to provide a certificate.
+ SSLSocketDataProvider ssl_data1(true /* async */,
+ net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED);
+ ssl_data1.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data1);
+ net::StaticSocketDataProvider data1(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data1);
+
+ // [ssl_]data2 contains the data for the second SSL handshake. When TLS
+ // False Start is not being used, the result of the SSL handshake will be
+ // returned as part of the SSLClientSocket::Connect() call. This test
+ // matches the result of a server sending a handshake_failure alert,
+ // rather than a Finished message, because it requires a client
+ // certificate and none was supplied.
+ SSLSocketDataProvider ssl_data2(true /* async */,
+ net::ERR_SSL_PROTOCOL_ERROR);
+ ssl_data2.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data2);
+ net::StaticSocketDataProvider data2(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data2);
+
+ // [ssl_]data3 contains the data for the third SSL handshake. When a
+ // connection to a server fails during an SSL handshake,
+ // HttpNetworkTransaction will attempt to fallback to SSLv3 if the initial
+ // connection was attempted with TLSv1. This is transparent to the caller
+ // of the HttpNetworkTransaction. Because this test failure is due to
+ // requiring a client certificate, this fallback handshake should also
+ // fail.
+ SSLSocketDataProvider ssl_data3(true /* async */,
+ net::ERR_SSL_PROTOCOL_ERROR);
+ ssl_data3.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data3);
+ net::StaticSocketDataProvider data3(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data3);
+
+ scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
+ scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session));
+
+ net::HttpRequestInfo request_info;
+ request_info.url = GURL("https://www.example.com/");
+ request_info.method = "GET";
+ request_info.load_flags = net::LOAD_NORMAL;
+
+ // Begin the SSL handshake with the peer. This consumes ssl_data1.
+ TestCompletionCallback callback;
+ int rv = trans->Start(&request_info, &callback, net::BoundNetLog());
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Complete the SSL handshake, which should abort due to requiring a
+ // client certificate.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv);
+
+ // Indicate that no certificate should be supplied. From the perspective
+ // of SSLClientCertCache, NULL is just as meaningful as a real
+ // certificate, so this is the same as supply a
+ // legitimate-but-unacceptable certificate.
+ rv = trans->RestartWithCertificate(NULL, &callback);
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Ensure the certificate was added to the client auth cache before
+ // allowing the connection to continue restarting.
+ scoped_refptr<X509Certificate> client_cert;
+ ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+ ASSERT_EQ(NULL, client_cert.get());
+
+ // Restart the handshake. This will consume ssl_data2, which fails, and
+ // then consume ssl_data3, which should also fail. The result code is
+ // checked against what ssl_data3 should return.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_SSL_PROTOCOL_ERROR, rv);
+
+ // Ensure that the client certificate is removed from the cache on a
+ // handshake failure.
+ ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+}
+
+// Ensure that a client certificate is removed from the SSL client auth
+// cache when:
+// 1) No proxy is involved.
+// 2) TLS False Start is enabled.
+// 3) The initial TLS handshake requests a client certificate.
+// 4) The client supplies an invalid/unacceptable certificate.
+TEST_F(HttpNetworkTransactionTest, ClientAuthCertCache_Direct_FalseStart) {
+ SessionDependencies session_deps;
+
+ scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo());
+ cert_request->host_and_port = "www.example.com:443";
+
+ // When TLS False Start is used, SSLClientSocket::Connect() calls will
+ // return successfully after reading up to the peer's Certificate message.
+ // This is to allow the caller to call SSLClientSocket::Write(), which can
+ // enqueue application data to be sent in the same packet as the
+ // ChangeCipherSpec and Finished messages.
+ // The actual handshake will be finished when SSLClientSocket::Read() is
+ // called, which expects to process the peer's ChangeCipherSpec and
+ // Finished messages. If there was an error negotiating with the peer,
+ // such as due to the peer requiring a client certificate when none was
+ // supplied, the alert sent by the peer won't be processed until Read() is
+ // called.
+
+ // Like the non-False Start case, when a client certificate is requested by
+ // the peer, the handshake is aborted during the Connect() call.
+ // [ssl_]data1 represents the initial SSL handshake with the peer.
+ SSLSocketDataProvider ssl_data1(true /* async */,
+ net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED);
+ ssl_data1.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data1);
+ net::StaticSocketDataProvider data1(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data1);
+
+ // When a client certificate is supplied, Connect() will not be aborted
+ // when the peer requests the certificate. Instead, the handshake will
+ // artificially succeed, allowing the caller to write the HTTP request to
+ // the socket. The handshake messages are not processed until Read() is
+ // called, which then detects that the handshake was aborted, due to the
+ // peer sending a handshake_failure because it requires a client
+ // certificate.
+ SSLSocketDataProvider ssl_data2(true /* async */, net::OK);
+ ssl_data2.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data2);
+ net::MockRead data2_reads[] = {
+ net::MockRead(true /* async */, net::ERR_SSL_PROTOCOL_ERROR),
+ };
+ net::StaticSocketDataProvider data2(
+ data2_reads, arraysize(data2_reads), NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data2);
+
+ // As described in ClientAuthCertCache_Direct_NoFalseStart, [ssl_]data3 is
+ // the data for the SSL handshake once the TLSv1 connection falls back to
+ // SSLv3. It has the same behaviour as [ssl_]data2.
+ SSLSocketDataProvider ssl_data3(true /* async */, net::OK);
+ ssl_data3.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data3);
+ net::StaticSocketDataProvider data3(
+ data2_reads, arraysize(data2_reads), NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data3);
+
+ scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
+ scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session));
+
+ net::HttpRequestInfo request_info;
+ request_info.url = GURL("https://www.example.com/");
+ request_info.method = "GET";
+ request_info.load_flags = net::LOAD_NORMAL;
+
+ // Begin the initial SSL handshake.
+ TestCompletionCallback callback;
+ int rv = trans->Start(&request_info, &callback, net::BoundNetLog());
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Complete the SSL handshake, which should abort due to requiring a
+ // client certificate.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv);
+
+ // Indicate that no certificate should be supplied. From the perspective
+ // of SSLClientCertCache, NULL is just as meaningful as a real
+ // certificate, so this is the same as supply a
+ // legitimate-but-unacceptable certificate.
+ rv = trans->RestartWithCertificate(NULL, &callback);
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Ensure the certificate was added to the client auth cache before
+ // allowing the connection to continue restarting.
+ scoped_refptr<X509Certificate> client_cert;
+ ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+ ASSERT_EQ(NULL, client_cert.get());
+
+
+ // Restart the handshake. This will consume ssl_data2, which fails, and
+ // then consume ssl_data3, which should also fail. The result code is
+ // checked against what ssl_data3 should return.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_SSL_PROTOCOL_ERROR, rv);
+
+ // Ensure that the client certificate is removed from the cache on a
+ // handshake failure.
+ ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+}
+
+// Ensure that a client certificate is removed from the SSL client auth
+// cache when:
+// 1) An HTTPS proxy is involved.
+// 3) The HTTPS proxy requests a client certificate.
+// 4) The client supplies an invalid/unacceptable certificate for the
+// proxy.
+// The test is repeated twice, first for connecting to an HTTPS endpoint,
+// then for connecting to an HTTP endpoint.
+TEST_F(HttpNetworkTransactionTest, ClientAuthCertCache_Proxy_Fail) {
+ SessionDependencies session_deps(
+ ProxyService::CreateFixed("https://proxy:70"));
+ CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
+ session_deps.net_log = log.bound().net_log();
+
+ scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo());
+ cert_request->host_and_port = "proxy:70";
+
+ // See ClientAuthCertCache_Direct_NoFalseStart for the explanation of
+ // [ssl_]data[1-3]. Rather than represending the endpoint
+ // (www.example.com:443), they represent failures with the HTTPS proxy
+ // (proxy:70).
+ SSLSocketDataProvider ssl_data1(true /* async */,
+ net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED);
+ ssl_data1.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data1);
+ net::StaticSocketDataProvider data1(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data1);
+
+ SSLSocketDataProvider ssl_data2(true /* async */,
+ net::ERR_SSL_PROTOCOL_ERROR);
+ ssl_data2.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data2);
+ net::StaticSocketDataProvider data2(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data2);
+
+ SSLSocketDataProvider ssl_data3(true /* async */,
+ net::ERR_SSL_PROTOCOL_ERROR);
+ ssl_data3.cert_request_info = cert_request.get();
+ session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_data3);
+ net::StaticSocketDataProvider data3(NULL, 0, NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data3);
+
+ net::HttpRequestInfo requests[2];
+ requests[0].url = GURL("https://www.example.com/");
+ requests[0].method = "GET";
+ requests[0].load_flags = net::LOAD_NORMAL;
+
+ requests[1].url = GURL("http://www.example.com/");
+ requests[1].method = "GET";
+ requests[1].load_flags = net::LOAD_NORMAL;
+
+ for (size_t i = 0; i < arraysize(requests); ++i) {
+ session_deps.socket_factory.ResetNextMockIndexes();
+ scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
+ scoped_ptr<HttpNetworkTransaction> trans(
+ new HttpNetworkTransaction(session));
+
+ // Begin the SSL handshake with the proxy.
+ TestCompletionCallback callback;
+ int rv = trans->Start(&requests[i], &callback, net::BoundNetLog());
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Complete the SSL handshake, which should abort due to requiring a
+ // client certificate.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv);
+
+ // Indicate that no certificate should be supplied. From the perspective
+ // of SSLClientCertCache, NULL is just as meaningful as a real
+ // certificate, so this is the same as supply a
+ // legitimate-but-unacceptable certificate.
+ rv = trans->RestartWithCertificate(NULL, &callback);
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Ensure the certificate was added to the client auth cache before
+ // allowing the connection to continue restarting.
+ scoped_refptr<X509Certificate> client_cert;
+ ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup("proxy:70",
+ &client_cert));
+ ASSERT_EQ(NULL, client_cert.get());
+ // Ensure the certificate was NOT cached for the endpoint. This only
+ // applies to HTTPS requests, but is fine to check for HTTP requests.
+ ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+
+ // Restart the handshake. This will consume ssl_data2, which fails, and
+ // then consume ssl_data3, which should also fail. The result code is
+ // checked against what ssl_data3 should return.
+ rv = callback.WaitForResult();
+ ASSERT_EQ(net::ERR_PROXY_CONNECTION_FAILED, rv);
+
+ // Now that the new handshake has failed, ensure that the client
+ // certificate was removed from the client auth cache.
+ ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("proxy:70",
+ &client_cert));
+ ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443",
+ &client_cert));
+ }
+}
+
} // namespace net
diff --git a/net/http/http_stream_request.cc b/net/http/http_stream_request.cc
index 6f0a39e..8d59d44 100644
--- a/net/http/http_stream_request.cc
+++ b/net/http/http_stream_request.cc
@@ -701,7 +701,7 @@ int HttpStreamRequest::DoInitConnectionComplete(int result) {
}
}
if (result < 0)
- return HandleSSLHandshakeError(result);
+ return result;
}
next_state_ = STATE_CREATE_STREAM;
@@ -848,6 +848,18 @@ scoped_refptr<SSLSocketParams> HttpStreamRequest::GenerateSSLParams(
ssl_config()->tls1_enabled = false;
}
+ if (proxy_info()->is_https() && ssl_config()->send_client_cert) {
+ // When connecting through an HTTPS proxy, disable TLS False Start so
+ // that client authentication errors can be distinguished between those
+ // originating from the proxy server (ERR_PROXY_CONNECTION_FAILED) and
+ // those originating from the endpoint (ERR_SSL_PROTOCOL_ERROR /
+ // ERR_BAD_SSL_CLIENT_AUTH_CERT).
+ // TODO(rch): This assumes that the HTTPS proxy will only request a
+ // client certificate during the initial handshake.
+ // http://crbug.com/FIXME
+ ssl_config()->false_start_enabled = false;
+ }
+
UMA_HISTOGRAM_ENUMERATION("Net.ConnectionUsedSSLv3Fallback",
static_cast<int>(ssl_config()->ssl3_fallback), 2);
@@ -936,6 +948,11 @@ int HttpStreamRequest::ReconsiderProxyAfterError(int error) {
return error;
}
+ if (proxy_info()->is_https() && ssl_config_->send_client_cert) {
+ session_->ssl_client_auth_cache()->Remove(
+ proxy_info()->proxy_server().host_port_pair().ToString());
+ }
+
int rv = session_->proxy_service()->ReconsiderProxyAfterError(
request_info().url, proxy_info(), &io_callback_, &pac_request_,
net_log_);
@@ -982,35 +999,6 @@ int HttpStreamRequest::HandleCertificateError(int error) {
return error;
}
-int HttpStreamRequest::HandleSSLHandshakeError(int error) {
- if (ssl_config()->send_client_cert &&
- (error == ERR_SSL_PROTOCOL_ERROR ||
- error == ERR_BAD_SSL_CLIENT_AUTH_CERT)) {
- session_->ssl_client_auth_cache()->Remove(
- GetHostAndPort(request_info().url));
- }
-
- switch (error) {
- case ERR_SSL_PROTOCOL_ERROR:
- case ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
- case ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
- case ERR_SSL_BAD_RECORD_MAC_ALERT:
- if (ssl_config()->tls1_enabled &&
- !SSLConfigService::IsKnownStrictTLSServer(
- request_info().url.host())) {
- // This could be a TLS-intolerant server, an SSL 3.0 server that
- // chose a TLS-only cipher suite or a server with buggy DEFLATE
- // support. Turn off TLS 1.0, DEFLATE support and retry.
- factory_->AddTLSIntolerantServer(request_info().url);
- next_state_ = STATE_INIT_CONNECTION;
- DCHECK(!connection_.get() || !connection_->socket());
- error = OK;
- }
- break;
- }
- return error;
-}
-
void HttpStreamRequest::SwitchToSpdyMode() {
if (HttpStreamFactory::spdy_enabled())
using_spdy_ = true;
diff --git a/net/http/http_stream_request.h b/net/http/http_stream_request.h
index d0decb4..c07dc1c 100644
--- a/net/http/http_stream_request.h
+++ b/net/http/http_stream_request.h
@@ -172,11 +172,6 @@ class HttpStreamRequest : public StreamRequest {
// Called to handle a client certificate request.
int HandleCertificateRequest(int error);
- // Called to possibly recover from an SSL handshake error. Sets next_state_
- // and returns OK if recovering from the error. Otherwise, the same error
- // code is returned.
- int HandleSSLHandshakeError(int error);
-
// Moves this stream request into SPDY mode.
void SwitchToSpdyMode();
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index b2e738a..96280b6 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -15,6 +15,7 @@
#include "net/base/address_family.h"
#include "net/base/auth.h"
#include "net/base/host_resolver_proc.h"
+#include "net/base/ssl_cert_request_info.h"
#include "net/base/ssl_info.h"
#include "net/http/http_network_session.h"
#include "net/http/http_request_headers.h"
@@ -531,6 +532,18 @@ void MockSSLClientSocket::GetSSLInfo(net::SSLInfo* ssl_info) {
ssl_info->Reset();
}
+void MockSSLClientSocket::GetSSLCertRequestInfo(
+ net::SSLCertRequestInfo* cert_request_info) {
+ DCHECK(cert_request_info);
+ if (data_->cert_request_info) {
+ cert_request_info->host_and_port =
+ data_->cert_request_info->host_and_port;
+ cert_request_info->client_certs = data_->cert_request_info->client_certs;
+ } else {
+ cert_request_info->Reset();
+ }
+}
+
SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
std::string* proto) {
*proto = data_->next_proto;
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h
index 0a01df3..38b0054 100644
--- a/net/socket/socket_test_util.h
+++ b/net/socket/socket_test_util.h
@@ -245,12 +245,14 @@ struct SSLSocketDataProvider {
SSLSocketDataProvider(bool async, int result)
: connect(async, result),
next_proto_status(SSLClientSocket::kNextProtoUnsupported),
- was_npn_negotiated(false) { }
+ was_npn_negotiated(false),
+ cert_request_info(NULL) { }
MockConnect connect;
SSLClientSocket::NextProtoStatus next_proto_status;
std::string next_proto;
bool was_npn_negotiated;
+ net::SSLCertRequestInfo* cert_request_info;
};
// A DataProvider where the client must write a request before the reads (e.g.
@@ -713,6 +715,8 @@ class MockSSLClientSocket : public MockClientSocket {
// SSLClientSocket methods:
virtual void GetSSLInfo(net::SSLInfo* ssl_info);
+ virtual void GetSSLCertRequestInfo(
+ net::SSLCertRequestInfo* cert_request_info);
virtual NextProtoStatus GetNextProto(std::string* proto);
virtual bool was_npn_negotiated() const;
virtual bool set_was_npn_negotiated(bool negotiated);
diff --git a/net/socket/ssl_client_socket_mac.cc b/net/socket/ssl_client_socket_mac.cc
index 7c5445f..f10dd34 100644
--- a/net/socket/ssl_client_socket_mac.cc
+++ b/net/socket/ssl_client_socket_mac.cc
@@ -11,9 +11,11 @@
#include <algorithm>
+#include "base/lazy_instance.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/singleton.h"
#include "base/string_util.h"
+#include "base/sys_info.h"
#include "net/base/address_list.h"
#include "net/base/cert_verifier.h"
#include "net/base/io_buffer.h"
@@ -140,6 +142,27 @@ enum {
};
#endif
+// On OS X 10.5.x, SSLHandshake() is broken with respect to renegotiation
+// handshakes, and the only way to advance the handshake state machine is
+// to use SSLRead(), which transparently re-handshakes and then reads
+// application data. Using SSLRead() to pump the handshake, rather than
+// SSLHandshake(), is not presently implemented, so on 10.5.x, SSL
+// renegotiation is disabled entirely. On 10.6.x, SSLHandshake() behaves as
+// expected/documented, so renegotiation is supported.
+struct RenegotiationBroken {
+ RenegotiationBroken() : broken(false) {
+ int32 major, minor, bugfix;
+ base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix);
+ if (major < 10 || (major == 10 && minor < 6))
+ broken = true;
+ }
+
+ bool broken;
+};
+
+base::LazyInstance<RenegotiationBroken> g_renegotiation_broken(
+ base::LINKER_INITIALIZED);
+
// For an explanation of the Mac OS X error codes, please refer to:
// http://developer.apple.com/mac/library/documentation/Security/Reference/secureTransportRef/Reference/reference.html
int NetErrorFromOSStatus(OSStatus status) {
@@ -1114,6 +1137,9 @@ int SSLClientSocketMac::DoPayloadRead() {
OSStatus status = SSLRead(ssl_context_, user_read_buf_->data(),
user_read_buf_len_, &processed);
if (status == errSSLWouldBlock && renegotiating_) {
+ if (g_renegotiation_broken.Get().broken)
+ return ERR_SSL_RENEGOTIATION_REQUESTED;
+
CHECK_EQ(static_cast<size_t>(0), processed);
next_handshake_state_ = STATE_HANDSHAKE;
return DoHandshakeLoop(OK);
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index b9c6dff..1594490 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -504,13 +504,14 @@ void SSLClientSocketNSS::SaveSnapStartInfo() {
if (hello_data_len > std::numeric_limits<uint16>::max())
return;
SSLHostInfo::State* state = ssl_host_info_->mutable_state();
- state->server_hello =
- std::string(reinterpret_cast<const char *>(hello_data), hello_data_len);
if (hello_data_len > 0) {
+ state->server_hello =
+ std::string(reinterpret_cast<const char *>(hello_data), hello_data_len);
state->npn_valid = true;
state->npn_status = GetNextProto(&state->npn_protocol);
} else {
+ state->server_hello.clear();
state->npn_valid = false;
}
diff --git a/webkit/glue/resources/webkit_strings_am.xtb b/webkit/glue/resources/webkit_strings_am.xtb
index 1a71058..4f5108e 100644
--- a/webkit/glue/resources/webkit_strings_am.xtb
+++ b/webkit/glue/resources/webkit_strings_am.xtb
@@ -8,6 +8,7 @@
<translation id="7658239707568436148">ሰርዝ</translation>
<translation id="795667975304826397">ምንም ፋይል አልተመረጠም</translation>
<translation id="8141602879876242471">ይህ ሊፈለግ የሚችል መረጃ ጠቋሚ ነው። የፍለጋ ቁልፍ ቃላት አስገባ፦</translation>
+<translation id="370665806235115550">በመጫን ላይ...</translation>
<translation id="6845533974506654842">ተጫን</translation>
<translation id="8244226242650769279">የምስል ካርታ</translation>
<translation id="2548326553472216322">የቅርብ ጊዜ ፍለጋዎች የሉም</translation>
@@ -20,7 +21,6 @@
<translation id="5476505524087279545">አታመልክት</translation>
<translation id="3789841737615482174">ጫን</translation>
<translation id="6663448176199120256">የቅርብ ጊዜ ፍለጋዎችን</translation>
-<translation id="6807599807928161586">የድር ክልል</translation>
<translation id="5939518447894949180">ዳግም አስጀምር</translation>
<translation id="1842960171412779397">ምረጥ</translation>
<translation id="6119846243427417423">አንቃ</translation>
diff --git a/webkit/glue/resources/webkit_strings_ar.xtb b/webkit/glue/resources/webkit_strings_ar.xtb
index 6f454f7..0f2e739 100644
--- a/webkit/glue/resources/webkit_strings_ar.xtb
+++ b/webkit/glue/resources/webkit_strings_ar.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ar">
<translation id="4519964825805946997">أخفق تثبيت المكون الإضافي من <ph name="URL"/></translation>
+<translation id="9186171386827445984">جارٍ تحميل المستند: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> من الصفحات...</translation>
<translation id="1235745349614807883">محو آخر عمليات البحث</translation>
<translation id="5048533449481078685">محدّد القائمة</translation>
<translation id="372362261556059955">المكوّن الإضافي المطلوب</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">أخفق تثبيت المكون الإضافي</translation>
<translation id="8141602879876242471">يمكن البحث في هذا الفهرس بإدخال كلمات مفتاحية:</translation>
<translation id="5650795167354946011">بعد تثبيت المكون الإضافي، انقر هنا للتحديث</translation>
+<translation id="370665806235115550">تحميل...</translation>
<translation id="6845533974506654842">اضغط</translation>
<translation id="8244226242650769279">مخطّط صورة</translation>
<translation id="2548326553472216322">لا عمليات بحث حديثة</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">الرجاء التأكيد على أنك تريد تثبيت المكوّن الإضافي <ph name="PLUGIN"/>. يجب تثبيت المكونات الإضافية التي تثق فيها فقط.</translation>
<translation id="6663448176199120256">آخر عمليات البحث</translation>
<translation id="2597378329261239068">هذا المستند محمي بكلمة المرور. الرجاء إدخال كلمة مرور.</translation>
-<translation id="6807599807928161586">منطقة الويب</translation>
+<translation id="7740050170769002709">محتوى HTML</translation>
<translation id="5939518447894949180">إعادة</translation>
<translation id="1842960171412779397">الاختيار</translation>
<translation id="7638452146404718955">انقر هنا لتنزيل المكون الإضافي</translation>
diff --git a/webkit/glue/resources/webkit_strings_bg.xtb b/webkit/glue/resources/webkit_strings_bg.xtb
index 4edbd69..09f4a71 100644
--- a/webkit/glue/resources/webkit_strings_bg.xtb
+++ b/webkit/glue/resources/webkit_strings_bg.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="bg">
<translation id="4519964825805946997">Инсталирането на приставката от <ph name="URL"/> не бе успешно</translation>
+<translation id="9186171386827445984">Документът се зарежда: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> страници...</translation>
<translation id="1235745349614807883">Изчистване на скорошните търсения</translation>
<translation id="5048533449481078685">списъчен показалец</translation>
<translation id="372362261556059955">Необходима е допълнителна приставка</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Инсталирането на приставката не бе успешно</translation>
<translation id="8141602879876242471">В този индекс може да се търси. Въведете ключови думи за търсене:</translation>
<translation id="5650795167354946011">След инсталирането на приставката кликнете тук за опресняване</translation>
+<translation id="370665806235115550">Зарежда се...</translation>
<translation id="6845533974506654842">натискане</translation>
<translation id="8244226242650769279">карта с изображения</translation>
<translation id="2548326553472216322">Няма скорошни търсения</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Моля, потвърдете, че искате да инсталирате приставката <ph name="PLUGIN"/>. Трябва да инсталирате само приставки, на които имате доверие.</translation>
<translation id="6663448176199120256">Скорошни търсения</translation>
<translation id="2597378329261239068">Този документ е защитен с парола. Моля, въведете я.</translation>
-<translation id="6807599807928161586">уеб зона</translation>
+<translation id="7740050170769002709">HTML съдържание</translation>
<translation id="5939518447894949180">Повторно задаване</translation>
<translation id="1842960171412779397">Избиране</translation>
<translation id="7638452146404718955">Кликнете тук, за да изтеглите приставката</translation>
diff --git a/webkit/glue/resources/webkit_strings_bn.xtb b/webkit/glue/resources/webkit_strings_bn.xtb
index 1a29278..7143769 100644
--- a/webkit/glue/resources/webkit_strings_bn.xtb
+++ b/webkit/glue/resources/webkit_strings_bn.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="bn">
<translation id="4519964825805946997"><ph name="URL"/>-এর থেকে প্ল্যাগ-ইন ইনস্টল করতে ব্যর্থ হয়েছে</translation>
+<translation id="9186171386827445984">নথি লোড হচ্ছে: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> পৃষ্ঠা...</translation>
<translation id="1235745349614807883">সাম্প্রতিক অনুসন্ধানগুলি সাফ করুন</translation>
<translation id="5048533449481078685">তালিকা নির্দেশক</translation>
<translation id="372362261556059955">অতিরিক্ত প্লাগ-ইন দরকার</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">প্লাগ-ইন ইনস্টলেশান ব্যর্থ হয়েছে</translation>
<translation id="8141602879876242471">এটি অনুসন্ধানযোগ্য সূচি৷ অনুসন্ধানের মূলশব্দ প্রবেশ করান:</translation>
<translation id="5650795167354946011">প্ল্যাগ-ইন ইনস্টল করার পরে, রিফ্রেশ করার জন্য এখানে ক্লিক করুন</translation>
+<translation id="370665806235115550">লোড হচ্ছে...</translation>
<translation id="6845533974506654842">টিপুন</translation>
<translation id="8244226242650769279">ছবি মানচিত্র</translation>
<translation id="2548326553472216322">কোন সাম্প্রতিক অনুসন্ধান নেই</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">আপনি <ph name="PLUGIN"/> প্ল্যাগ-ইনটি ইনস্টল করতে চান কি না দয়া করে নিশ্চিত করুন৷ আপনার কেবল সেই প্ল্যাগ-ইনগুলি ইনস্টল করার উচিত যেগুলিকে আপনি বিশ্বাস করেন৷</translation>
<translation id="6663448176199120256">সাম্প্রতিক অনুসন্ধানগুলি</translation>
<translation id="2597378329261239068">এই দস্তাবেজটি পাসওয়ার্ড সুরক্ষিত৷ দয়া করে একটি পাসওয়ার্ড লিখুন৷</translation>
-<translation id="6807599807928161586">ওয়েব এলাকা</translation>
+<translation id="7740050170769002709">HTML সামগ্রী</translation>
<translation id="5939518447894949180">রিসেট করুন</translation>
<translation id="1842960171412779397">নির্বাচন করুন</translation>
<translation id="7638452146404718955">প্ল্যাগ-ইন ডাউনলোড করার জন্য এখানে ক্লিক করুন</translation>
diff --git a/webkit/glue/resources/webkit_strings_ca.xtb b/webkit/glue/resources/webkit_strings_ca.xtb
index 6f3dc90..59756a8 100644
--- a/webkit/glue/resources/webkit_strings_ca.xtb
+++ b/webkit/glue/resources/webkit_strings_ca.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ca">
<translation id="4519964825805946997">S'ha produït un error en instal·lar el connector des de <ph name="URL"/></translation>
+<translation id="9186171386827445984">S'està carregant el document: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pàgines...</translation>
<translation id="1235745349614807883">Esborra les cerques recents</translation>
<translation id="5048533449481078685">marcador de llistes</translation>
<translation id="372362261556059955">Es necessita un connector addicional</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">S'ha produït un error en instal·lar el connector </translation>
<translation id="8141602879876242471">És un índex on es poden realitzar cerques. Introdueix els termes de cerca:</translation>
<translation id="5650795167354946011">Després d'instal·lar el connector, feu clic aquí per actualitzar</translation>
+<translation id="370665806235115550">S'està carregant...</translation>
<translation id="6845533974506654842">prem</translation>
<translation id="8244226242650769279">mapa d'imatges</translation>
<translation id="2548326553472216322">No hi ha cerques recents</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Confirmeu que voleu instal·lar el connector <ph name="PLUGIN"/>. Us recomanem que només instal·leu connectors de la vostra confiança.</translation>
<translation id="6663448176199120256">Cerques recents</translation>
<translation id="2597378329261239068">Aquest document està protegit mitjançant contrasenya. Introduïu una contrasenya.</translation>
-<translation id="6807599807928161586">àrea web</translation>
+<translation id="7740050170769002709">Contingut HTML</translation>
<translation id="5939518447894949180">Restablir</translation>
<translation id="1842960171412779397">selecciona</translation>
<translation id="7638452146404718955">Feu clic aquí per baixar el connector</translation>
diff --git a/webkit/glue/resources/webkit_strings_cs.xtb b/webkit/glue/resources/webkit_strings_cs.xtb
index 33a0d12..8d3784f 100644
--- a/webkit/glue/resources/webkit_strings_cs.xtb
+++ b/webkit/glue/resources/webkit_strings_cs.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="cs">
<translation id="4519964825805946997">Instalace pluginu z adresy URL <ph name="URL"/> se nezdařila</translation>
+<translation id="9186171386827445984">Načítání dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stran...</translation>
<translation id="1235745349614807883">Smazat nedávná vyhledávání</translation>
<translation id="5048533449481078685">značka seznamu</translation>
<translation id="372362261556059955">Je zapotřebí další plugin</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Instalace pluginu selhala</translation>
<translation id="8141602879876242471">Toto je prohledávatelný index. Zadejte hledaná klíčová slova:</translation>
<translation id="5650795167354946011">Po instalaci pluginu obnovte okno kliknutím sem</translation>
+<translation id="370665806235115550">Načítání...</translation>
<translation id="6845533974506654842">zmáčknout</translation>
<translation id="8244226242650769279">obrázková mapa</translation>
<translation id="2548326553472216322">Žádná nedávná vyhledávání</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Potvrďte prosím, zda chcete nainstalovat plugin <ph name="PLUGIN"/>. Instalujte pouze pluginy, kterým důvěřujete.</translation>
<translation id="6663448176199120256">Nedávná vyhledávání</translation>
<translation id="2597378329261239068">Tento dokument je chráněn heslem. Zadejte prosím heslo.</translation>
-<translation id="6807599807928161586">oblast webu</translation>
+<translation id="7740050170769002709">Obsah ve formátu HTML</translation>
<translation id="5939518447894949180">Resetovat</translation>
<translation id="1842960171412779397">zvolit</translation>
<translation id="7638452146404718955">Plugin můžete stáhnout kliknutím sem</translation>
diff --git a/webkit/glue/resources/webkit_strings_da.xtb b/webkit/glue/resources/webkit_strings_da.xtb
index 78f06ff..71d2a6a 100644
--- a/webkit/glue/resources/webkit_strings_da.xtb
+++ b/webkit/glue/resources/webkit_strings_da.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="da">
<translation id="4519964825805946997">Installation af plugin fra <ph name="URL"/> mislykkedes</translation>
+<translation id="9186171386827445984">Indlæser dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sider...</translation>
<translation id="1235745349614807883">Slet nylige søgninger</translation>
<translation id="5048533449481078685">listemarkering</translation>
<translation id="372362261556059955">Ekstra plugin påkrævet</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Installation af plugin mislykkedes</translation>
<translation id="8141602879876242471">Der kan søges i dette indeks. Indtast søge-nøgleord:</translation>
<translation id="5650795167354946011">Når du har installeret plugin'et, skal du klikke her for at opdatere</translation>
+<translation id="370665806235115550">Indlæser ...</translation>
<translation id="6845533974506654842">tryk</translation>
<translation id="8244226242650769279">billedekort</translation>
<translation id="2548326553472216322">Ingen nylige søgninger</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Bekræft, at du vil installere dette <ph name="PLUGIN"/>-plugin. Du skal kun installere plugins, som du har tillid til.</translation>
<translation id="6663448176199120256">Nylige søgninger</translation>
<translation id="2597378329261239068">Dette dokument er adgangskodebeskyttet. Indtast en adgangskode.</translation>
-<translation id="6807599807928161586">webområde</translation>
+<translation id="7740050170769002709">HTML-indhold</translation>
<translation id="5939518447894949180">Nulstil</translation>
<translation id="1842960171412779397">vælg</translation>
<translation id="7638452146404718955">Klik her for at downloade plugin</translation>
diff --git a/webkit/glue/resources/webkit_strings_de.xtb b/webkit/glue/resources/webkit_strings_de.xtb
index 45fab1b..6d27410 100644
--- a/webkit/glue/resources/webkit_strings_de.xtb
+++ b/webkit/glue/resources/webkit_strings_de.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="de">
<translation id="4519964825805946997">Installation des Plug-ins von <ph name="URL"/> fehlgeschlagen</translation>
+<translation id="9186171386827445984">Dokument wird geladen <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> Seiten...</translation>
<translation id="1235745349614807883">Vor kurzem durchgeführte Suchanfragen löschen</translation>
<translation id="5048533449481078685">Listenmarkierung</translation>
<translation id="372362261556059955">Zusätzliches Plug-in erforderlich</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Plug-in-Installation fehlgeschlagen</translation>
<translation id="8141602879876242471">Dieser Index kann durchsucht werden. Geben Sie Suchbegriffe ein:</translation>
<translation id="5650795167354946011">Klicken Sie nach der Installation des Plug-ins hier, um eine Aktualisierung durchzuführen.</translation>
+<translation id="370665806235115550">Wird geladen...</translation>
<translation id="6845533974506654842">klicken</translation>
<translation id="8244226242650769279">Imagemap</translation>
<translation id="2548326553472216322">Keine vor kurzem durchgeführte Suchanfragen</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Bitte bestätigen Sie, dass Sie das Plug-in <ph name="PLUGIN"/> installieren möchten. Installieren Sie nur Plug-ins, denen Sie vertrauen.</translation>
<translation id="6663448176199120256">Vor kurzem durchgeführte Suchanfragen</translation>
<translation id="2597378329261239068">Dieses Dokument ist passwortgeschützt. Geben Sie ein Passwort ein.</translation>
-<translation id="6807599807928161586">Webbereich</translation>
+<translation id="7740050170769002709">HTML-Inhalte</translation>
<translation id="5939518447894949180">Zurücksetzen</translation>
<translation id="1842960171412779397">auswählen</translation>
<translation id="7638452146404718955">Hier klicken, um das Plug-in herunterzuladen</translation>
diff --git a/webkit/glue/resources/webkit_strings_el.xtb b/webkit/glue/resources/webkit_strings_el.xtb
index 509307e..c429294 100644
--- a/webkit/glue/resources/webkit_strings_el.xtb
+++ b/webkit/glue/resources/webkit_strings_el.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="el">
<translation id="4519964825805946997">Η εγκατάσταση της προσθήκης από τη διεύθυνση <ph name="URL"/> απέτυχε</translation>
+<translation id="9186171386827445984">Φόρτωση εγγράφου: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> σελίδες...</translation>
<translation id="1235745349614807883">Εκκαθάριση πρόσφατων αναζητήσεων</translation>
<translation id="5048533449481078685">δείκτης λίστας</translation>
<translation id="372362261556059955">Απαιτείται επιπλέον προσθήκη</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Η εγκατάσταση προσθήκης απέτυχε</translation>
<translation id="8141602879876242471">Πρόκειται για ευρετήριο με δυνατότητα αναζήτησης. Πληκτρολογήστε λέξεις-κλειδιά αναζήτησης:</translation>
<translation id="5650795167354946011">Μετά την εγκατάσταση της προσθήκης, κάντε κλικ εδώ για ανανέωση των δεδομένων</translation>
+<translation id="370665806235115550">Φόρτωση...</translation>
<translation id="6845533974506654842">πατήστε</translation>
<translation id="8244226242650769279">χάρτης εικόνας</translation>
<translation id="2548326553472216322">Δεν υπάρχουν πρόσφατες αναζητήσεις</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Επιβεβαιώστε ότι θέλετε να εγκαταστήσετε την προσθήκη <ph name="PLUGIN"/>. Πρέπει να εγκαθιστάτε μόνο προσθήκες που θεωρείτε αξιόπιστες.</translation>
<translation id="6663448176199120256">Πρόσφατες αναζητήσεις</translation>
<translation id="2597378329261239068">Αυτό το έγγραφο προστατεύεται με κωδικό πρόσβασης. Πληκτρολογήστε έναν κωδικό πρόσβασης.</translation>
-<translation id="6807599807928161586">περιοχή ιστού</translation>
+<translation id="7740050170769002709">Περιεχόμενο HTML</translation>
<translation id="5939518447894949180">Επαναφορά</translation>
<translation id="1842960171412779397">επιλογή</translation>
<translation id="7638452146404718955">Κάντε κλικ εδώ για να κάνετε λήψη της προσθήκης</translation>
diff --git a/webkit/glue/resources/webkit_strings_en-GB.xtb b/webkit/glue/resources/webkit_strings_en-GB.xtb
index 14befa8..417f44a 100644
--- a/webkit/glue/resources/webkit_strings_en-GB.xtb
+++ b/webkit/glue/resources/webkit_strings_en-GB.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="en-GB">
<translation id="4519964825805946997">Failed to install plug-in from <ph name="URL"/></translation>
+<translation id="9186171386827445984">Loading document: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pages...</translation>
<translation id="1235745349614807883">Clear Recent Searches</translation>
<translation id="5048533449481078685">list marker</translation>
<translation id="372362261556059955">Additional plug-in needed</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Plug-in installation failed</translation>
<translation id="8141602879876242471">This is a searchable index. Enter search keywords:</translation>
<translation id="5650795167354946011">After installing the plug-in, click here to refresh</translation>
+<translation id="370665806235115550">Loading...</translation>
<translation id="6845533974506654842">press</translation>
<translation id="8244226242650769279">image map</translation>
<translation id="2548326553472216322">No recent searches</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Please confirm that you would like to install the <ph name="PLUGIN"/> plug-in. You should only install plug-ins that you trust.</translation>
<translation id="6663448176199120256">Recent Searches</translation>
<translation id="2597378329261239068">This document is password-protected. Please enter a password.</translation>
-<translation id="6807599807928161586">web area</translation>
+<translation id="7740050170769002709">HTML content</translation>
<translation id="5939518447894949180">Reset</translation>
<translation id="1842960171412779397">select</translation>
<translation id="7638452146404718955">Click here to download plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_es-419.xtb b/webkit/glue/resources/webkit_strings_es-419.xtb
index 12bc57b..5ec0935 100644
--- a/webkit/glue/resources/webkit_strings_es-419.xtb
+++ b/webkit/glue/resources/webkit_strings_es-419.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="es-419">
<translation id="4519964825805946997">Error al instalar el complemento desde <ph name="URL"/></translation>
+<translation id="9186171386827445984">Cargando documento: páginas <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Eliminar búsquedas recientes</translation>
<translation id="5048533449481078685">marcador de listas</translation>
<translation id="372362261556059955">Se necesita un complemento adicional</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Error de instalación del complemento</translation>
<translation id="8141602879876242471">Se trata de un índice que admite búsquedas. Escribe las palabras clave de búsqueda:</translation>
<translation id="5650795167354946011">Después de instalar el complemento, haz clic aquí para actualizar</translation>
+<translation id="370665806235115550">Cargando...</translation>
<translation id="6845533974506654842">hacer clic</translation>
<translation id="8244226242650769279">mapa de imágenes</translation>
<translation id="2548326553472216322">No hay búsquedas recientes</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Confirma que deseas instalar el complemento <ph name="PLUGIN"/>. Sólo deberías instalar los complementos confiables.</translation>
<translation id="6663448176199120256">Búsquedas recientes</translation>
<translation id="2597378329261239068">Este documento está protegido por contraseña. Ingresa una contraseña.</translation>
-<translation id="6807599807928161586">área web</translation>
+<translation id="7740050170769002709">Contenido HTML</translation>
<translation id="5939518447894949180">Restablecer</translation>
<translation id="1842960171412779397">seleccionar</translation>
<translation id="7638452146404718955">Haz clic aquí para descargar el complemento</translation>
diff --git a/webkit/glue/resources/webkit_strings_es.xtb b/webkit/glue/resources/webkit_strings_es.xtb
index 5f9a245..8315543 100644
--- a/webkit/glue/resources/webkit_strings_es.xtb
+++ b/webkit/glue/resources/webkit_strings_es.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="es">
<translation id="4519964825805946997">Se ha producido un error al descargar el complemento de la página <ph name="URL"/>.</translation>
+<translation id="9186171386827445984">Cargando documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Eliminar búsquedas recientes</translation>
<translation id="5048533449481078685">marcador de listas</translation>
<translation id="372362261556059955">Se necesita un complemento adicional</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Se ha producido un error al instalar el complemento.</translation>
<translation id="8141602879876242471">Se trata de un índice que admite búsquedas. Introduce las palabras clave de búsqueda:</translation>
<translation id="5650795167354946011">Una vez que hayas instalado el complemento, haz clic aquí para actualizar la ventana.</translation>
+<translation id="370665806235115550">Cargando...</translation>
<translation id="6845533974506654842">pulsar</translation>
<translation id="8244226242650769279">mapa de imágenes</translation>
<translation id="2548326553472216322">No hay búsquedas recientes</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Confirma que quieres instalar el complemento <ph name="PLUGIN"/>. Solo debes instalar complementos en los que confíes.</translation>
<translation id="6663448176199120256">Búsquedas recientes</translation>
<translation id="2597378329261239068">Este documento está protegido por contraseña. Introduce una contraseña.</translation>
-<translation id="6807599807928161586">área web</translation>
+<translation id="7740050170769002709">Contenido HTML</translation>
<translation id="5939518447894949180">Restablecer</translation>
<translation id="1842960171412779397">seleccionar</translation>
<translation id="7638452146404718955">Haz clic aquí para descargar el complemento.</translation>
diff --git a/webkit/glue/resources/webkit_strings_et.xtb b/webkit/glue/resources/webkit_strings_et.xtb
index 2ac3c7a..e5932ac 100644
--- a/webkit/glue/resources/webkit_strings_et.xtb
+++ b/webkit/glue/resources/webkit_strings_et.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="et">
<translation id="4519964825805946997">Pistikprogrammi installimine asukohast <ph name="URL"/> ebaõnnestus.</translation>
+<translation id="9186171386827445984">Dokumendi laadimine: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> lehte ...</translation>
<translation id="1235745349614807883">Kustuta viimased otsingud</translation>
<translation id="5048533449481078685">loendilooja</translation>
<translation id="372362261556059955">Vaja on täiendavat pistikprogrammi</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Pistikprogrammi installimine nurjus</translation>
<translation id="8141602879876242471">See on otsitav indeks. Sisestage otsingu jaoks märksõnad:</translation>
<translation id="5650795167354946011">Pärast lisandmooduli installimist klõpsake värskendamiseks siin</translation>
+<translation id="370665806235115550">Laadimine...</translation>
<translation id="6845533974506654842">vajuta</translation>
<translation id="8244226242650769279">hüperpilt</translation>
<translation id="2548326553472216322">Pole viimaseid otsingud</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Palun kinnitage, et soovite pistikprogrammi <ph name="PLUGIN"/> installida. Peaksite installima vaid usaldusväärseid pistikprogramme.</translation>
<translation id="6663448176199120256">Viimased otsingud</translation>
<translation id="2597378329261239068">Dokument on parooliga kaitstud. Sisestage parool.</translation>
-<translation id="6807599807928161586">veebiala</translation>
+<translation id="7740050170769002709">HTML-sisu</translation>
<translation id="5939518447894949180">Lähtesta</translation>
<translation id="1842960171412779397">vali</translation>
<translation id="7638452146404718955">Pistikprogrammi allalaadimiseks klõpsake siin</translation>
diff --git a/webkit/glue/resources/webkit_strings_fa.xtb b/webkit/glue/resources/webkit_strings_fa.xtb
index 870dcf6..094ad9f 100644
--- a/webkit/glue/resources/webkit_strings_fa.xtb
+++ b/webkit/glue/resources/webkit_strings_fa.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fa">
<translation id="4519964825805946997">نصب افزونه از <ph name="URL"/> ناموفق بود</translation>
+<translation id="9186171386827445984">در حال بارگیری سند: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> صفحات...</translation>
<translation id="1235745349614807883">پاک کردن جستجوهای اخیر</translation>
<translation id="5048533449481078685">علامت گذار لیست</translation>
<translation id="372362261556059955">افزونه دیگری مورد نیاز است</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">نصب افزونه انجام نشد</translation>
<translation id="8141602879876242471">این نمایه قابل جستجو است. کلمات کلیدی جستجو را وارد کنید:</translation>
<translation id="5650795167354946011">بعد از نصب افزونه، برای تازه کردن اینجا را کلیک کنید</translation>
+<translation id="370665806235115550">درحال بارگیری...</translation>
<translation id="6845533974506654842">فشار دادن</translation>
<translation id="8244226242650769279">نقشه تصویر</translation>
<translation id="2548326553472216322">جستجوی جدیدی وجود ندارد</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">لطفاً تأیید کنید که مایلید افزونه <ph name="PLUGIN"/> نصب شود. فقط باید افزونه هایی را نصب کنید که به آنها اعتماد دارید.</translation>
<translation id="6663448176199120256">جستجوهای جدید</translation>
<translation id="2597378329261239068">این سند توسط رمز ورود محافظت می شود. لطفاً یک رمز ورود وارد کنید.</translation>
-<translation id="6807599807928161586">حیطه وب</translation>
+<translation id="7740050170769002709">محتوای HTML</translation>
<translation id="5939518447894949180">بازنشانی</translation>
<translation id="1842960171412779397">انتخاب</translation>
<translation id="7638452146404718955">برای دانلود کردن افزونه اینجا را کلیک کنید</translation>
diff --git a/webkit/glue/resources/webkit_strings_fi.xtb b/webkit/glue/resources/webkit_strings_fi.xtb
index 4a1b6a3..604021f 100644
--- a/webkit/glue/resources/webkit_strings_fi.xtb
+++ b/webkit/glue/resources/webkit_strings_fi.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fi">
<translation id="4519964825805946997">Laajennuksen asennus osoitteesta <ph name="URL"/> epäonnistui</translation>
+<translation id="9186171386827445984">Ladataan asiakirjaa: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sivua...</translation>
<translation id="1235745349614807883">Poista viimeisimmät haut</translation>
<translation id="5048533449481078685">luettelon merkitsijä</translation>
<translation id="372362261556059955">Toinen laajennus vaaditaan</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Laajennuksen asennus epäonnistui</translation>
<translation id="8141602879876242471">Tämä on haettavissa oleva hakemisto. Anna hakusanat:</translation>
<translation id="5650795167354946011">Päivitä laajennuksen asennuksen jälkeen napsauttamalla tästä</translation>
+<translation id="370665806235115550">Ladataan...</translation>
<translation id="6845533974506654842">paina</translation>
<translation id="8244226242650769279">kuvakartta</translation>
<translation id="2548326553472216322">Ei viimeisimpiä hakuja</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Vahvista, että haluat asentaa laajennuksen <ph name="PLUGIN"/>. Suosittelemme asentamaan vain laajennuksia, joihin luotat.</translation>
<translation id="6663448176199120256">Viimeisimmät haut</translation>
<translation id="2597378329261239068">Tämä asiakirja on suojattu salasanalla. Anna salasana.</translation>
-<translation id="6807599807928161586">verkkoalue</translation>
+<translation id="7740050170769002709">HTML-sisältö</translation>
<translation id="5939518447894949180">Tyhjennä</translation>
<translation id="1842960171412779397">Valitse</translation>
<translation id="7638452146404718955">Lataa laajennus napsauttamalla tätä</translation>
diff --git a/webkit/glue/resources/webkit_strings_fil.xtb b/webkit/glue/resources/webkit_strings_fil.xtb
index 43f88c3..8459aca 100644
--- a/webkit/glue/resources/webkit_strings_fil.xtb
+++ b/webkit/glue/resources/webkit_strings_fil.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fil">
<translation id="4519964825805946997">Nabigong ma-install ang plug-in mula sa <ph name="URL"/></translation>
+<translation id="9186171386827445984">Nilo-load ang dokumento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> (na) pahina...</translation>
<translation id="1235745349614807883">Lisiman ang Kasalukuyang Mga Paghahanap</translation>
<translation id="5048533449481078685">Ilista ang marker</translation>
<translation id="372362261556059955">Kinakailangan ang karagdagang plug-in</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Nabigo ang pag-install ng plug-in</translation>
<translation id="8141602879876242471">Isa itong paghahanap ng index. Ipasok ang paghahanap sa mga keyword:</translation>
<translation id="5650795167354946011">Pagkatapos i-install ng plug-in, mag-click dito upang mag-refresh</translation>
+<translation id="370665806235115550">Kumakarga...</translation>
<translation id="6845533974506654842">pindutin</translation>
<translation id="8244226242650769279">mapa ng imahe</translation>
<translation id="2548326553472216322">Walang kamakailang mga paghahanap</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Pakikumpirma na gusto mong i-install ang <ph name="PLUGIN"/> plug-in na ito. Dapat mong i-install lamang ang mga plug-in na iyong pinagkakatiwalaan.</translation>
<translation id="6663448176199120256">Kasalukuyang Mga Paghahanap</translation>
<translation id="2597378329261239068">Protektado ng password ang dokumentong ito. Mangyaring magpasok ng password.</translation>
-<translation id="6807599807928161586">web area</translation>
+<translation id="7740050170769002709">HTML na nilalaman</translation>
<translation id="5939518447894949180">I-reset</translation>
<translation id="1842960171412779397">piliin</translation>
<translation id="7638452146404718955">Mag-click dito upang ma-download ang plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_fr.xtb b/webkit/glue/resources/webkit_strings_fr.xtb
index 00ab953..ab1e32f 100644
--- a/webkit/glue/resources/webkit_strings_fr.xtb
+++ b/webkit/glue/resources/webkit_strings_fr.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fr">
<translation id="4519964825805946997">Échec de l'installation du plug-in depuis <ph name="URL"/></translation>
+<translation id="9186171386827445984">Chargement du document : <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pages...</translation>
<translation id="1235745349614807883">Effacer les recherches récentes</translation>
<translation id="5048533449481078685">marqueur de liste</translation>
<translation id="372362261556059955">Plug-in supplémentaire requis</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Échec de l'installation du plug-in</translation>
<translation id="8141602879876242471">Vous pouvez lancer des recherches dans cet index. Pour cela, entrez des mots clés de recherche :</translation>
<translation id="5650795167354946011">Après l'installation du plug-in, cliquez ici pour actualiser.</translation>
+<translation id="370665806235115550">Chargement...</translation>
<translation id="6845533974506654842">appuyer</translation>
<translation id="8244226242650769279">image map</translation>
<translation id="2548326553472216322">Aucune recherche récente</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Merci de confirmer que vous souhaitez installer le plug-in <ph name="PLUGIN"/>. N'installez que les plug-ins que vous considérez fiables.</translation>
<translation id="6663448176199120256">Recherches récentes</translation>
<translation id="2597378329261239068">Ce document est protégé par mot de passe. Veuillez saisir ce dernier.</translation>
-<translation id="6807599807928161586">Zone Web</translation>
+<translation id="7740050170769002709">Contenu HTML</translation>
<translation id="5939518447894949180">Réinitialiser</translation>
<translation id="1842960171412779397">sélectionner</translation>
<translation id="7638452146404718955">Cliquer ici pour télécharger le plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_gu.xtb b/webkit/glue/resources/webkit_strings_gu.xtb
index e7160bb..ad48fa1 100644
--- a/webkit/glue/resources/webkit_strings_gu.xtb
+++ b/webkit/glue/resources/webkit_strings_gu.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="gu">
<translation id="4519964825805946997"><ph name="URL"/> થી પ્લગ-ઇન ઇન્સ્ટોલ કરવામાં નિષ્ફળ રહ્યાં</translation>
+<translation id="9186171386827445984">દસ્તાવેજ લોડ કરી રહ્યું છે: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> પૃષ્ઠ...</translation>
<translation id="1235745349614807883">હાલની શોધને સાફ કરો</translation>
<translation id="5048533449481078685">સૂચિ માર્કર</translation>
<translation id="372362261556059955">વધારાનું પ્લગ-ઇન આવશ્યક છે </translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">પ્લગ-ઇન ઇન્સ્ટોલેશન નિષ્ફળ ગયું</translation>
<translation id="8141602879876242471">આ એક શોધસક્ષમ અનુક્રમણિકા છે. શોધ કીવર્ડ્સ દાખલ કરો:</translation>
<translation id="5650795167354946011">પ્લગ-ઇન ઇન્સ્ટોલ કર્યા પછી, રીફ્રેશ કરવા અહીં ક્લિક કરો</translation>
+<translation id="370665806235115550">લોડ કરી રહ્યું છે...</translation>
<translation id="6845533974506654842">દબાવો</translation>
<translation id="8244226242650769279">છબી નકશો</translation>
<translation id="2548326553472216322">હાલની શોધો નથી</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">કૃપા કરીને પુષ્ટી કરો કે તમે <ph name="PLUGIN"/> પ્લગ-ઇન ઇન્સ્ટોલ કરવાનું પસંદ કરશો. તમારે ફક્ત તે જ પ્લગ-ઇન્સ ઇન્સ્ટોલ કરવા જોઈએ જે વિશ્વસ્ત હોય.</translation>
<translation id="6663448176199120256">તાજેતરની શોધ</translation>
<translation id="2597378329261239068">આ દસ્તાવેજ પાસવર્ડ સુરક્ષિત છે. કૃપા કરીને પાસવર્ડ દાખલ કરો.</translation>
-<translation id="6807599807928161586">વેબ ક્ષેત્ર</translation>
+<translation id="7740050170769002709">HTML સામગ્રી</translation>
<translation id="5939518447894949180">રીસેટ કરો</translation>
<translation id="1842960171412779397">પસંદ કરો</translation>
<translation id="7638452146404718955">પ્લગ-ઇન ડાઉનલોડ કરવા માટે અહીં ક્લિક કરો</translation>
diff --git a/webkit/glue/resources/webkit_strings_hi.xtb b/webkit/glue/resources/webkit_strings_hi.xtb
index e9bf9e7..e7ef77f 100644
--- a/webkit/glue/resources/webkit_strings_hi.xtb
+++ b/webkit/glue/resources/webkit_strings_hi.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hi">
<translation id="4519964825805946997"><ph name="URL"/> से प्लग-इन स्थापित करने में विफल हुआ</translation>
+<translation id="9186171386827445984">दस्तावेज़ लोड कर रहा है: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> पृष्ठ...</translation>
<translation id="1235745349614807883">हाल ही की खोजें साफ़ करें</translation>
<translation id="5048533449481078685">सूची चिन्हक</translation>
<translation id="372362261556059955">अतिरिक्त प्‍लग-इन की आवश्यकता है</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">प्लग-इन स्थापना विफल हुई</translation>
<translation id="8141602879876242471">यह एक खोजने योग्य इंडेक्स है. खोज कुंजीशब्द प्रविष्ट करें :</translation>
<translation id="5650795167354946011">प्लग-इन स्थापित करने के बाद, रीफ़्रेश करने के लिए यहां क्लिक करें</translation>
+<translation id="370665806235115550">लोड हो रहा है ...</translation>
<translation id="6845533974506654842">दबाएँ</translation>
<translation id="8244226242650769279">चित्र मैप</translation>
<translation id="2548326553472216322">हाल ही में कोई खोज नहीं</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">कृपया पुष्टि करें कि आप <ph name="PLUGIN"/> प्लग-इन स्थापित करना चाहेंगे. आपको केवल वे प्लग-इन स्थापित करने चाहिए जिन पर आप विश्वास करते हैं.</translation>
<translation id="6663448176199120256">हाल ही में की गई खोजें</translation>
<translation id="2597378329261239068">यह दस्तावेज़ पासवर्ड सुरक्षित है. कृपया एक पासवर्ड दर्ज करें.</translation>
-<translation id="6807599807928161586">वेब क्षेत्र</translation>
+<translation id="7740050170769002709">HTML सामग्री</translation>
<translation id="5939518447894949180">पुन: सेट करें</translation>
<translation id="1842960171412779397">चुनें</translation>
<translation id="7638452146404718955">प्लग-इन डाउनलोड करने के लिए यहां क्लिक करें</translation>
diff --git a/webkit/glue/resources/webkit_strings_hr.xtb b/webkit/glue/resources/webkit_strings_hr.xtb
index 89458bb..dfef690 100644
--- a/webkit/glue/resources/webkit_strings_hr.xtb
+++ b/webkit/glue/resources/webkit_strings_hr.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hr">
<translation id="4519964825805946997">Nije uspjela instalacija dodatka s adrese <ph name="URL"/></translation>
+<translation id="9186171386827445984">Učitavanje dokumenta: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stranica...</translation>
<translation id="1235745349614807883">Obriši najnovija pretraživanja</translation>
<translation id="5048533449481078685">oznaka popisa</translation>
<translation id="372362261556059955">Potreban je dodatni dodatak</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Nije uspjela instalacija dodatka</translation>
<translation id="8141602879876242471">Ovaj je indeks moguće pretraživati. Unesite ključne riječi za pretraživanje:</translation>
<translation id="5650795167354946011">Nakon instalacije dodatka kliknite ovdje za osvježenje stranice</translation>
+<translation id="370665806235115550">Učitavanje...</translation>
<translation id="6845533974506654842">pritisni</translation>
<translation id="8244226242650769279">karta slika</translation>
<translation id="2548326553472216322">Nema najnovijih pretraživanja</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Potvrdite da želite instalirati dodatak <ph name="PLUGIN"/>. Instalirajte samo dodatke koje smatrate pouzdanima.</translation>
<translation id="6663448176199120256">Najnovija pretraživanja</translation>
<translation id="2597378329261239068">Ovaj je dokument zaštićen zaporkom. Unesite zaporku.</translation>
-<translation id="6807599807928161586">web područje</translation>
+<translation id="7740050170769002709">HTML sadržaj</translation>
<translation id="5939518447894949180">Ponovno postavi</translation>
<translation id="1842960171412779397">odaberi</translation>
<translation id="7638452146404718955">Kliknite ovdje za preuzimanje dodatka</translation>
diff --git a/webkit/glue/resources/webkit_strings_hu.xtb b/webkit/glue/resources/webkit_strings_hu.xtb
index 848f2df..1b43f0f 100644
--- a/webkit/glue/resources/webkit_strings_hu.xtb
+++ b/webkit/glue/resources/webkit_strings_hu.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hu">
<translation id="4519964825805946997">A plug-in telepítése nem sikerült a következő helyről: <ph name="URL"/></translation>
+<translation id="9186171386827445984">Dokumentum betöltése: <ph name="NUMBER_OF_PAGES"/>/<ph name="PAGE_NUMBER"/>. oldal...</translation>
<translation id="1235745349614807883">Friss keresések törlése</translation>
<translation id="5048533449481078685">listajelölő</translation>
<translation id="372362261556059955">További plug-in szükséges</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">A plug-in telepítése sikertelen</translation>
<translation id="8141602879876242471">Ez egy kereshető index. Írjon be keresési kulcsszavakat:</translation>
<translation id="5650795167354946011">A plug-in telepítését követően kattintson ide a frissítéshez</translation>
+<translation id="370665806235115550">Betöltés…</translation>
<translation id="6845533974506654842">Gomb lenyomása</translation>
<translation id="8244226242650769279">képtérkép</translation>
<translation id="2548326553472216322">Nincsenek friss keresések</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Kérjük, erősítse meg, hogy valóban telepíteni szeretné a következő plug-int: <ph name="PLUGIN"/>. Csak azokat a plug-ineket telepítse, amelyekben megbízik.</translation>
<translation id="6663448176199120256">Friss keresések</translation>
<translation id="2597378329261239068">Ez a dokumentum jelszóval védett. Kérjük, adja meg a jelszót.</translation>
-<translation id="6807599807928161586">internetes terület</translation>
+<translation id="7740050170769002709">HTML-tartalom</translation>
<translation id="5939518447894949180">Visszaállítás</translation>
<translation id="1842960171412779397">Kiválasztás</translation>
<translation id="7638452146404718955">Ide kattintva letöltheti a plug-int</translation>
diff --git a/webkit/glue/resources/webkit_strings_id.xtb b/webkit/glue/resources/webkit_strings_id.xtb
index 6451c08..50c97a2 100644
--- a/webkit/glue/resources/webkit_strings_id.xtb
+++ b/webkit/glue/resources/webkit_strings_id.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="id">
<translation id="4519964825805946997">Gagal memasang pengaya dari <ph name="URL"/></translation>
+<translation id="9186171386827445984">Memuat dokumen: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> halaman...</translation>
<translation id="1235745349614807883">Hapus Penelusuran Barusan</translation>
<translation id="5048533449481078685">penanda daftar</translation>
<translation id="372362261556059955">Diperlukan pengaya tambahan</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Pemasangan pengaya gagal</translation>
<translation id="8141602879876242471">Terdapat indeks yang dapat dicari. Masukkan kata kunci penelusuran:</translation>
<translation id="5650795167354946011">Setelah memasang pengaya, klik di sini untuk menyegarkan</translation>
+<translation id="370665806235115550">Membuka...</translation>
<translation id="6845533974506654842">tekan</translation>
<translation id="8244226242650769279">gambar peta</translation>
<translation id="2548326553472216322">Tidak ada penelusuran terkini</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Konfirmasikan bahwa Anda ingin memasang pengaya <ph name="PLUGIN"/>. Anda harus memasang pengaya yang Anda percayai saja.</translation>
<translation id="6663448176199120256">Penelusuran Barusan</translation>
<translation id="2597378329261239068">Dokumen ini dilindungi sandi. Masukkan sandi.</translation>
-<translation id="6807599807928161586">area Web</translation>
+<translation id="7740050170769002709">Konten HTML</translation>
<translation id="5939518447894949180">Atur ulang</translation>
<translation id="1842960171412779397">pilih</translation>
<translation id="7638452146404718955">Klik di sini untuk mengunduh pengaya</translation>
diff --git a/webkit/glue/resources/webkit_strings_it.xtb b/webkit/glue/resources/webkit_strings_it.xtb
index 61c1e79..1fae27f 100644
--- a/webkit/glue/resources/webkit_strings_it.xtb
+++ b/webkit/glue/resources/webkit_strings_it.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="it">
<translation id="4519964825805946997">Installazione del plug-in da <ph name="URL"/> non riuscita</translation>
+<translation id="9186171386827445984">Caricamento del documento in corso: pagine <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Cancella ricerche recenti</translation>
<translation id="5048533449481078685">indicatore elenco</translation>
<translation id="372362261556059955">È necessario un plug-in aggiuntivo</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Installazione del plug-in non riuscita</translation>
<translation id="8141602879876242471">Questo è un indice di ricerca. Inserisci le parole chiave di ricerca:</translation>
<translation id="5650795167354946011">Dopo aver installato il plug-in, fai clic qui per aggiornare</translation>
+<translation id="370665806235115550">Caricamento in corso...</translation>
<translation id="6845533974506654842">premi</translation>
<translation id="8244226242650769279">image map</translation>
<translation id="2548326553472216322">Nessuna ricerca recente</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Conferma che desideri installare il plug-in <ph name="PLUGIN"/>. Dovresti installare soltanto plug-in attendibili.</translation>
<translation id="6663448176199120256">Ricerche recenti</translation>
<translation id="2597378329261239068">Questo documento è protetto da password. Inserisci una password.</translation>
-<translation id="6807599807928161586">area web</translation>
+<translation id="7740050170769002709">Contenuti HTML</translation>
<translation id="5939518447894949180">Ripristina</translation>
<translation id="1842960171412779397">seleziona</translation>
<translation id="7638452146404718955">Fai clic qui per scaricare il plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_iw.xtb b/webkit/glue/resources/webkit_strings_iw.xtb
index 436b298..f748311 100644
--- a/webkit/glue/resources/webkit_strings_iw.xtb
+++ b/webkit/glue/resources/webkit_strings_iw.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="iw">
<translation id="4519964825805946997">התקנת הפלאגין מתוך <ph name="URL"/> נכשלה</translation>
+<translation id="9186171386827445984">טוען מסמך: דפים <ph name="NUMBER_OF_PAGES"/>/<ph name="PAGE_NUMBER"/>...</translation>
<translation id="1235745349614807883">הסר חיפושים אחרונים</translation>
<translation id="5048533449481078685">סמן רשימה</translation>
<translation id="372362261556059955">פלאגין נוסף נחוץ</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">התקנת הפלאגין נכשלה</translation>
<translation id="8141602879876242471">זהו אינדקס שניתן לבצע בו חיפוש. הזן מילות מפתח לחיפוש:</translation>
<translation id="5650795167354946011">לאחר התקנת הפלאגין, לחץ כאן לרענון</translation>
+<translation id="370665806235115550">טוען...</translation>
<translation id="6845533974506654842">לחץ</translation>
<translation id="8244226242650769279">מפת תמונות</translation>
<translation id="2548326553472216322">אין חיפושים אחרונים</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">אשר שברצונך להתקין את הפלאגין <ph name="PLUGIN"/>. יש להתקין רכיבי פלאגין שאתה בוטח בהם בלבד.</translation>
<translation id="6663448176199120256">חיפושים אחרונים</translation>
<translation id="2597378329261239068">מסמך זה מוגן באמצעות סיסמה. הזן סיסמה.</translation>
-<translation id="6807599807928161586">אזור אינטרנט</translation>
+<translation id="7740050170769002709">תוכן HTML</translation>
<translation id="5939518447894949180">אפס</translation>
<translation id="1842960171412779397">בחר</translation>
<translation id="7638452146404718955">לחץ כאן להורדת פלאגין</translation>
diff --git a/webkit/glue/resources/webkit_strings_ja.xtb b/webkit/glue/resources/webkit_strings_ja.xtb
index 2eccba2..865979d 100644
--- a/webkit/glue/resources/webkit_strings_ja.xtb
+++ b/webkit/glue/resources/webkit_strings_ja.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ja">
<translation id="4519964825805946997"><ph name="URL"/> からプラグインをインストールできませんでした</translation>
+<translation id="9186171386827445984">ドキュメントの読み込み中: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> ページ...</translation>
<translation id="1235745349614807883">最近の検索履歴を消去</translation>
<translation id="5048533449481078685">リスト マーカー</translation>
<translation id="372362261556059955">追加のプラグインが必要です</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">プラグインをインストールできませんでした</translation>
<translation id="8141602879876242471">このインデックスは検索できます。キーワードを入力してください:</translation>
<translation id="5650795167354946011">プラグインをインストールした後は、ここをクリックして更新を行ってください</translation>
+<translation id="370665806235115550">読み込み中...</translation>
<translation id="6845533974506654842">押す</translation>
<translation id="8244226242650769279">イメージ マップ</translation>
<translation id="2548326553472216322">最近の検索はありません</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">この <ph name="PLUGIN"/> プラグインをインストールしてもよいかご確認ください。信頼できるプラグインのみをインストールする必要があります。</translation>
<translation id="6663448176199120256">最近の検索</translation>
<translation id="2597378329261239068">このドキュメントはパスワードで保護されています。パスワードを入力してください。</translation>
-<translation id="6807599807928161586">ウェブ領域</translation>
+<translation id="7740050170769002709">HTML コンテンツ</translation>
<translation id="5939518447894949180">リセット</translation>
<translation id="1842960171412779397">選択</translation>
<translation id="7638452146404718955">ここをクリックしてプラグインをダウンロード</translation>
diff --git a/webkit/glue/resources/webkit_strings_kn.xtb b/webkit/glue/resources/webkit_strings_kn.xtb
index 61dbd2c..9a8f827 100644
--- a/webkit/glue/resources/webkit_strings_kn.xtb
+++ b/webkit/glue/resources/webkit_strings_kn.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="kn">
<translation id="4519964825805946997"><ph name="URL"/> ನಿಂದ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಸ್ಥಾಪಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation>
+<translation id="9186171386827445984">ಲೋಡಿಂಗ್ ಡಾಕ್ಯುಮೆಂಟ್: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> ಪುಟಗಳು...</translation>
<translation id="1235745349614807883">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
<translation id="5048533449481078685">ಪಟ್ಟಿ ಗುರುತು</translation>
<translation id="372362261556059955">ಹೆಚ್ಚುವರಿ ಪ್ಲಗ್-ಇನ್ ಅಗತ್ಯವಿದೆ</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">ಪ್ಲಗ್-ಇನ್ ಅಳವಡಿಸುವಿಕೆಯು ವಿಫಲವಾಗಿದೆ</translation>
<translation id="8141602879876242471">ಇದು ಹುಡುಕಾಡಬಹುದಾದ ಸೂಚಿಕೆ ಹುಡುಕಾಟ ಕೀವರ್ಡ್‌ಗಳನ್ನು ನಮೂದಿಸಿ:</translation>
<translation id="5650795167354946011">ಪ್ಲಗ್-ಇನ್ ಸ್ಥಾಪನೆ ಮಾಡಿದ ನಂತರ, ರಿಫ್ರೆಶ್‌‌ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
+<translation id="370665806235115550">ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
<translation id="6845533974506654842">ಒತ್ತಿ</translation>
<translation id="8244226242650769279">ಇಮೇಜ್ ನಕ್ಷೆ</translation>
<translation id="2548326553472216322">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು ಇಲ್ಲ</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">ನೀವು <ph name="PLUGIN"/> ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಅಳವಡಿಸಲು ಬಯಸುವುದಾದಲ್ಲಿ ದಯವಿಟ್ಟು ಖಚಿತಪಡಿಸಿ. ನೀವು ನಂಬುವಂತಹ ಫ್ಲಗ್-ಇನ್‌ಗಳನ್ನು ಮಾತ್ರ ನೀವು ಅಳವಡಿಸಬೇಕು.</translation>
<translation id="6663448176199120256">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು</translation>
<translation id="2597378329261239068">ಈ ಡಾಕ್ಯುಮೆಂಟ್‌ ಅನ್ನು ಪಾಸ್‌ವರ್ಡ್‌ನಿಂದ ರಕ್ಷಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
-<translation id="6807599807928161586">ವೆಬ್ ಪ್ರದೇಶ</translation>
+<translation id="7740050170769002709">HTML ವಿಷಯ</translation>
<translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation>
<translation id="1842960171412779397">ಆಯ್ಕೆ ಮಾಡಿ</translation>
<translation id="7638452146404718955">ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
diff --git a/webkit/glue/resources/webkit_strings_ko.xtb b/webkit/glue/resources/webkit_strings_ko.xtb
index 819c8ce..f3e829e 100644
--- a/webkit/glue/resources/webkit_strings_ko.xtb
+++ b/webkit/glue/resources/webkit_strings_ko.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ko">
<translation id="4519964825805946997"><ph name="URL"/>의 플러그인 설치 실패</translation>
+<translation id="9186171386827445984">문서 로드 중: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>페이지</translation>
<translation id="1235745349614807883">최근 검색 삭제</translation>
<translation id="5048533449481078685">목록 표시기</translation>
<translation id="372362261556059955">추가 플러그인 필요</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">플러그인 설치 실패</translation>
<translation id="8141602879876242471">이것은 검색 색인합니다. 검색 키워드 입력:</translation>
<translation id="5650795167354946011">플러그인 설치 후 여기를 클릭하여 새로고침</translation>
+<translation id="370665806235115550">로드 중...</translation>
<translation id="6845533974506654842">누르기</translation>
<translation id="8244226242650769279">이미지 지도</translation>
<translation id="2548326553472216322">최근 수행된 검색 없음</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419"><ph name="PLUGIN"/> 플러그인을 설치할지 여부를 확인하시기 바랍니다. 신뢰할 수 있는 플러그인만 설치해야 합니다.</translation>
<translation id="6663448176199120256">최근 수행된 검색</translation>
<translation id="2597378329261239068">문서가 비밀번호로 보호되고 있습니다. 비밀번호를 입력하세요.</translation>
-<translation id="6807599807928161586">웹 영역</translation>
+<translation id="7740050170769002709">HTML 콘텐츠</translation>
<translation id="5939518447894949180">재설정</translation>
<translation id="1842960171412779397">선택</translation>
<translation id="7638452146404718955">여기를 클릭하여 플러그인 다운로드</translation>
diff --git a/webkit/glue/resources/webkit_strings_lt.xtb b/webkit/glue/resources/webkit_strings_lt.xtb
index 8e8a7a7..7138796 100644
--- a/webkit/glue/resources/webkit_strings_lt.xtb
+++ b/webkit/glue/resources/webkit_strings_lt.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="lt">
<translation id="4519964825805946997">Nepavyko įdiegti papildinio iš <ph name="URL"/></translation>
+<translation id="9186171386827445984">Įkeliamas dokumentas: <ph name="PAGE_NUMBER"/> / <ph name="NUMBER_OF_PAGES"/> psl...</translation>
<translation id="1235745349614807883">Išvalyti pastarąsias paieškas</translation>
<translation id="5048533449481078685">sąrašo žymeklis</translation>
<translation id="372362261556059955">Reikia papildomo papildinio</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Papildinio diegimas nepavyko</translation>
<translation id="8141602879876242471">Tai yra ieškotinas indeksas. Įveskite paieškos raktinių žodžių:</translation>
<translation id="5650795167354946011">Įdiegę papildinį spustelėkite čia, kad puslapis būtų atnaujintas</translation>
+<translation id="370665806235115550">Įkeliama...</translation>
<translation id="6845533974506654842">paspausti</translation>
<translation id="8244226242650769279">paveikslėlio žemėlapis</translation>
<translation id="2548326553472216322">Pastaruoju metu paieškų nevykdyta</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Patvirtinkite, kad norite įdiegti šį „<ph name="PLUGIN"/>“ papildinį. Turėtumėte diegti tik tuos papildinius, kurie patikimi.</translation>
<translation id="6663448176199120256">Naujausios paieškos</translation>
<translation id="2597378329261239068">Šis dokumentas apsaugotas slaptažodžiu. Įveskite slaptažodį.</translation>
-<translation id="6807599807928161586">interneto sritis</translation>
+<translation id="7740050170769002709">HTML turinys</translation>
<translation id="5939518447894949180">Nustatyti iš naujo</translation>
<translation id="1842960171412779397">pasirinkti</translation>
<translation id="7638452146404718955">Spustelėkite čia, kad atsisiųstumėte papildinį</translation>
diff --git a/webkit/glue/resources/webkit_strings_lv.xtb b/webkit/glue/resources/webkit_strings_lv.xtb
index c97eb32..f070834 100644
--- a/webkit/glue/resources/webkit_strings_lv.xtb
+++ b/webkit/glue/resources/webkit_strings_lv.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="lv">
<translation id="4519964825805946997">Neizdevās instalēt spraudni no <ph name="URL"/></translation>
+<translation id="9186171386827445984">Notiek dokumenta ielāde: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> lappuses...</translation>
<translation id="1235745349614807883">Dzēst nesenos meklējumus</translation>
<translation id="5048533449481078685">sarakstu marķieris</translation>
<translation id="372362261556059955">Nepieciešams papildu spraudnis</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Spraudņa instalēšana neizdevās</translation>
<translation id="8141602879876242471">Šis ir indekss ar meklēšanas iespējām. Ievadīt meklēšanas atslēgvārdus:</translation>
<translation id="5650795167354946011">Pēc spraudņa instalēšanas noklikšķiniet šeit, lai atsvaidzinātu</translation>
+<translation id="370665806235115550">Notiek ielāde...</translation>
<translation id="6845533974506654842">nospiest</translation>
<translation id="8244226242650769279">attēlu karte</translation>
<translation id="2548326553472216322">Nav nesenu meklējumu</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Lūdzu, apstipriniet, ka vēlaties instalēt <ph name="PLUGIN"/> spraudni. Jums ir jāinstalē tikai tie spraudņi, kuriem uzticaties.</translation>
<translation id="6663448176199120256">Neseni meklējumi</translation>
<translation id="2597378329261239068">Šis dokuments ir aizsargāts ar paroli. Lūdzu, ievadiet paroli.</translation>
-<translation id="6807599807928161586">tīmekļa apgabals</translation>
+<translation id="7740050170769002709">HTML saturs</translation>
<translation id="5939518447894949180">Atiestatīt</translation>
<translation id="1842960171412779397">Atlasiet</translation>
<translation id="7638452146404718955">Noklikšķiniet šeit, lai lejupielādētu spraudni</translation>
diff --git a/webkit/glue/resources/webkit_strings_ml.xtb b/webkit/glue/resources/webkit_strings_ml.xtb
index 437330d..fdf0843 100644
--- a/webkit/glue/resources/webkit_strings_ml.xtb
+++ b/webkit/glue/resources/webkit_strings_ml.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ml">
<translation id="4519964825805946997"><ph name="URL"/> എന്നതില്‍‌ നിന്നുള്ള പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്യുന്നതിന് പരാജയപ്പെട്ടു</translation>
+<translation id="9186171386827445984">പ്രമാണങ്ങള്‍ ലോഡുചെയ്യുന്നു: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> പേജുകള്‍...</translation>
<translation id="1235745349614807883">അടുത്തിടെയുള്ള തിരയലുകള്‍ മായ്ക്കുക</translation>
<translation id="5048533449481078685">പട്ടിക മാര്‍ക്കര്‍</translation>
<translation id="372362261556059955">കൂടുതല്‍‌ പ്ലഗ്-ഇന്‍‌ ആവശ്യമുണ്ട്‌‌</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളേഷന്‍‌ പരാജയപ്പെട്ടു</translation>
<translation id="8141602879876242471">ഇത് തിരയാവുന്ന സൂചികയാണ്. തിരയല്‍ കീവേഡുകള്‍ നല്‍കുക:</translation>
<translation id="5650795167354946011">പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്തതിനുശേഷം, പുതുക്കുന്നതിന് ഇവിടെ ക്ലിക്കുചെയ്യുക</translation>
+<translation id="370665806235115550">ലോഡ്ചെയ്യുന്നു...</translation>
<translation id="6845533974506654842">അമര്‍ത്തുക</translation>
<translation id="8244226242650769279">ഇമേജ് മാപ്പ്</translation>
<translation id="2548326553472216322">സമീപകാല തിരയലുകള്‍ ഇല്ല</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">നിങ്ങള്‍‌ ഈ <ph name="PLUGIN"/> പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്യാന്‍‌ താല്‍‌പ്പര്യപ്പെടുന്നുവെന്നത് ദയവായി സ്ഥിരീകരിക്കുക. നിങ്ങള്‍‌ വിശ്വസിക്കുന്ന പ്ലഗ്-ഇനുകള്‍‌ മാത്രമേ ഇന്‍‌സ്റ്റാള്‍‌ ചെയ്യാവൂ.</translation>
<translation id="6663448176199120256">സമീപകാല തിരയലുകള്‍</translation>
<translation id="2597378329261239068">ഈ പ്രമാണം പാസ്‌വേഡ് പരിരക്ഷിതമാണ്. ദയവായി ഒരു പാസ്‌വേഡ് നല്‍‌കുക.</translation>
-<translation id="6807599807928161586">വെബ് മേഖല</translation>
+<translation id="7740050170769002709">HTML ഉള്ളടക്കം</translation>
<translation id="5939518447894949180">വീണ്ടും സജ്ജീകരിക്കുക</translation>
<translation id="1842960171412779397">തിരഞ്ഞെടുക്കൂ</translation>
<translation id="7638452146404718955">പ്ലഗ്-ഇന്‍‌ ഡൌണ്‍‌ലോഡുചെയ്യുന്നതിന് ഇവിടെ ക്ലിക്കുചെയ്യുക</translation>
diff --git a/webkit/glue/resources/webkit_strings_mr.xtb b/webkit/glue/resources/webkit_strings_mr.xtb
index 3061c16..da03fe1 100644
--- a/webkit/glue/resources/webkit_strings_mr.xtb
+++ b/webkit/glue/resources/webkit_strings_mr.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="mr">
<translation id="4519964825805946997"><ph name="URL"/> वरून प्लग-इन स्थापित करणे अयशस्वी</translation>
+<translation id="9186171386827445984">दस्तऐवज लोड करत आहे: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> पृष्ठे...</translation>
<translation id="1235745349614807883">अलीकडील शोध साफ करा</translation>
<translation id="5048533449481078685">सूची चिन्हक</translation>
<translation id="372362261556059955">अतिरिक्त प्लग-इन आवश्यक</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">प्लग-इन स्थापना अयशस्वी</translation>
<translation id="8141602879876242471">ही शोध घेण्यायोग्य अनुक्रमणिका आहे. शोध कीवर्ड प्रविष्ट करा:</translation>
<translation id="5650795167354946011">प्लग-इन स्थापित केल्यानंतर, रीफ्रेश करण्यासाठी येथे क्लिक करा</translation>
+<translation id="370665806235115550">लोड करीत आहे...</translation>
<translation id="6845533974506654842">दाबा</translation>
<translation id="8244226242650769279">प्रतिमा नकाशा</translation>
<translation id="2548326553472216322">अलीकडील शोध नाहीत</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">कृपया आपल्याला प्लग-इन <ph name="PLUGIN"/> स्थापित करणे आवडत असल्याची पुष्टी करा. आपण आपला विश्वास असलेले प्लग-इन्स फक्त स्थापित करावे. </translation>
<translation id="6663448176199120256">अलीकडील शोध</translation>
<translation id="2597378329261239068">हा दस्तऐवज संकेतशब्द संरक्षित आहे. कृपया संकेतशब्द प्रविष्ट करा.</translation>
-<translation id="6807599807928161586">वेब क्षेत्र</translation>
+<translation id="7740050170769002709">HTML सामुग्री</translation>
<translation id="5939518447894949180">रीसेट करा</translation>
<translation id="1842960171412779397">निवडा</translation>
<translation id="7638452146404718955">प्लग-इन डाउनलोड करण्यासाठी येथे क्लिक करा</translation>
diff --git a/webkit/glue/resources/webkit_strings_nl.xtb b/webkit/glue/resources/webkit_strings_nl.xtb
index df39241..d3b90a2 100644
--- a/webkit/glue/resources/webkit_strings_nl.xtb
+++ b/webkit/glue/resources/webkit_strings_nl.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="nl">
<translation id="4519964825805946997">Het installeren van de invoegtoepassing van <ph name="URL"/> is mislukt</translation>
+<translation id="9186171386827445984">Document wordt geladen: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pagina's...</translation>
<translation id="1235745349614807883">Recente zoekopdrachten wissen</translation>
<translation id="5048533449481078685">lijstmarkering</translation>
<translation id="372362261556059955">Aanvullende invoegtoepassing vereist</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">De installatie van de invoegtoepassing is mislukt</translation>
<translation id="8141602879876242471">Dit is een doorzoekbare index. Geef zoekwoorden op:</translation>
<translation id="5650795167354946011">Klik hier na het installeren van de invoegtoepassing om te vernieuwen</translation>
+<translation id="370665806235115550">Laden...</translation>
<translation id="6845533974506654842">Indrukken</translation>
<translation id="8244226242650769279">image map</translation>
<translation id="2548326553472216322">Geen recente zoekopdrachten</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Bevestig dat u de invoegtoepassing van <ph name="PLUGIN"/> wilt installeren. U moet alleen invoegtoepassingen installeren die u vertrouwt.</translation>
<translation id="6663448176199120256">Recente zoekopdrachten</translation>
<translation id="2597378329261239068">Dit document is beveiligd met een wachtwoord. Geef een wachtwoord op.</translation>
-<translation id="6807599807928161586">webgedeelte</translation>
+<translation id="7740050170769002709">HTML-inhoud</translation>
<translation id="5939518447894949180">Herstellen</translation>
<translation id="1842960171412779397">Selecteren</translation>
<translation id="7638452146404718955">Klik hier om de invoegtoepassing te downloaden</translation>
diff --git a/webkit/glue/resources/webkit_strings_no.xtb b/webkit/glue/resources/webkit_strings_no.xtb
index c94ad8f..6346872 100644
--- a/webkit/glue/resources/webkit_strings_no.xtb
+++ b/webkit/glue/resources/webkit_strings_no.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="no">
<translation id="4519964825805946997">Kunne ikke installere programtillegget fra <ph name="URL"/></translation>
+<translation id="9186171386827445984">Laster inn dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sider</translation>
<translation id="1235745349614807883">Fjern nylige søk</translation>
<translation id="5048533449481078685">listemarkør</translation>
<translation id="372362261556059955">Ekstra programtillegg kreves</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Installering av programtillegg mislyktes</translation>
<translation id="8141602879876242471">Dette er en søkbar indeks. Angi søkeordene:</translation>
<translation id="5650795167354946011">Når programtillegget er installert, klikker du her for å oppdatere</translation>
+<translation id="370665806235115550">Laster inn...</translation>
<translation id="6845533974506654842">trykk</translation>
<translation id="8244226242650769279">bildekart</translation>
<translation id="2548326553472216322">Ingen nylige søk</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Bekreft at du ønsker å installere programtillegget <ph name="PLUGIN"/>. Du bør kun installere programtillegg du stoler på.</translation>
<translation id="6663448176199120256">Nylige søk</translation>
<translation id="2597378329261239068">Dette dokumentet er passordbeskyttet. Skriv inn et passord.</translation>
-<translation id="6807599807928161586">nettområde</translation>
+<translation id="7740050170769002709">HTML-innhold</translation>
<translation id="5939518447894949180">Tilbakestill</translation>
<translation id="1842960171412779397">velg</translation>
<translation id="7638452146404718955">Klikk her for å laste ned programtillegget</translation>
diff --git a/webkit/glue/resources/webkit_strings_pl.xtb b/webkit/glue/resources/webkit_strings_pl.xtb
index ea4f6cf..b37ec7e 100644
--- a/webkit/glue/resources/webkit_strings_pl.xtb
+++ b/webkit/glue/resources/webkit_strings_pl.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pl">
<translation id="4519964825805946997">Nie można zainstalować wtyczki dostępnej pod adresem <ph name="URL"/></translation>
+<translation id="9186171386827445984">Wczytywanie dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stron...</translation>
<translation id="1235745349614807883">Wyczyść ostatnie wyszukiwania</translation>
<translation id="5048533449481078685">znacznik listy</translation>
<translation id="372362261556059955">Potrzebna jest dodatkowa wtyczka</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Instalacja wtyczki nie powiodła się</translation>
<translation id="8141602879876242471">Ten indeks można przeszukiwać. Wprowadź wyszukiwane słowa kluczowe:</translation>
<translation id="5650795167354946011">Po zainstalowaniu wtyczki kliknij tutaj, aby odświeżyć okno</translation>
+<translation id="370665806235115550">Ładowanie...</translation>
<translation id="6845533974506654842">naciśnij</translation>
<translation id="8244226242650769279">mapa grafiki</translation>
<translation id="2548326553472216322">Brak ostatnich wyszukiwań</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Potwierdź zamiar zainstalowania wtyczki <ph name="PLUGIN"/>. Należy instalować wyłącznie zaufane wtyczki.</translation>
<translation id="6663448176199120256">Ostatnie wyszukiwania</translation>
<translation id="2597378329261239068">Ten dokument jest chroniony hasłem. Wprowadź hasło.</translation>
-<translation id="6807599807928161586">obszar sieci</translation>
+<translation id="7740050170769002709">Treść HTML</translation>
<translation id="5939518447894949180">Resetuj</translation>
<translation id="1842960171412779397">wybierz</translation>
<translation id="7638452146404718955">Kliknij tutaj, aby pobrać wtyczkę</translation>
diff --git a/webkit/glue/resources/webkit_strings_pt-BR.xtb b/webkit/glue/resources/webkit_strings_pt-BR.xtb
index b34c7cb..5233854 100644
--- a/webkit/glue/resources/webkit_strings_pt-BR.xtb
+++ b/webkit/glue/resources/webkit_strings_pt-BR.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pt-BR">
<translation id="4519964825805946997">Falha ao instalar o plug-in de <ph name="URL"/></translation>
+<translation id="9186171386827445984">Carregando documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Limpar pesquisas recentes</translation>
<translation id="5048533449481078685">marcador de lista</translation>
<translation id="372362261556059955">Plug-in adicional necessário</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Falha na instalação do plug-in</translation>
<translation id="8141602879876242471">Este é um índice pesquisável. Insira palavras-chave de pesquisa:</translation>
<translation id="5650795167354946011">Depois de instalar o plug-in, clique aqui para atualizar</translation>
+<translation id="370665806235115550">Carregando...</translation>
<translation id="6845533974506654842">pressione</translation>
<translation id="8244226242650769279">mapa de imagens</translation>
<translation id="2548326553472216322">Nenhuma pesquisa recente</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Confirme se você deseja instalar o plug-in do <ph name="PLUGIN"/>. Você deve instalar apenas plug-ins em que você confia.</translation>
<translation id="6663448176199120256">Pesquisas recentes</translation>
<translation id="2597378329261239068">Este documento está protegido por senha. Digite a senha.</translation>
-<translation id="6807599807928161586">área da web</translation>
+<translation id="7740050170769002709">Conteúdo HTML</translation>
<translation id="5939518447894949180">Redefinir</translation>
<translation id="1842960171412779397">selecione</translation>
<translation id="7638452146404718955">Clique aqui para fazer download do plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_pt-PT.xtb b/webkit/glue/resources/webkit_strings_pt-PT.xtb
index 817cdf4..a93bd4f 100644
--- a/webkit/glue/resources/webkit_strings_pt-PT.xtb
+++ b/webkit/glue/resources/webkit_strings_pt-PT.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pt-PT">
<translation id="4519964825805946997">Falha ao instalar o plug-in de <ph name="URL"/></translation>
+<translation id="9186171386827445984">A carregar o documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Limpar pesquisas recentes</translation>
<translation id="5048533449481078685">marcador de lista</translation>
<translation id="372362261556059955">Plug-in adicional requerido</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">A instalação do plug-in falhou</translation>
<translation id="8141602879876242471">Este índice é pesquisável. Introduza palavras-chave de pesquisa:</translation>
<translation id="5650795167354946011">Após instalar o plug-in, clique aqui para actualizar</translation>
+<translation id="370665806235115550">A carregar...</translation>
<translation id="6845533974506654842">premir</translation>
<translation id="8244226242650769279">mapa de imagem</translation>
<translation id="2548326553472216322">Nenhuma pesquisa recente</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Confirme se pretende instalar o plug-in do <ph name="PLUGIN"/>. Deve instalar apenas plug-ins fidedignos.</translation>
<translation id="6663448176199120256">Pesquisas recentes</translation>
<translation id="2597378329261239068">Este documento está protegido por palavra-passe. Introduza uma palavra-passe.</translation>
-<translation id="6807599807928161586">Área Web</translation>
+<translation id="7740050170769002709">Conteúdo HTML</translation>
<translation id="5939518447894949180">Repor</translation>
<translation id="1842960171412779397">seleccionar</translation>
<translation id="7638452146404718955">Clique aqui para transferir o plug-in</translation>
diff --git a/webkit/glue/resources/webkit_strings_ro.xtb b/webkit/glue/resources/webkit_strings_ro.xtb
index 2f8ec55..eeebfc3 100644
--- a/webkit/glue/resources/webkit_strings_ro.xtb
+++ b/webkit/glue/resources/webkit_strings_ro.xtb
@@ -1,44 +1,46 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ro">
-<translation id="4519964825805946997">Instalarea pluginului de la <ph name="URL"/> a eşuat</translation>
-<translation id="1235745349614807883">Ştergeţi căutările recente</translation>
+<translation id="4519964825805946997">Instalarea pluginului de la <ph name="URL"/> a eșuat</translation>
+<translation id="9186171386827445984">Se încarcă documentul: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> (de) pagini...</translation>
+<translation id="1235745349614807883">Ștergeți căutările recente</translation>
<translation id="5048533449481078685">marcator listă</translation>
<translation id="372362261556059955">Este necesar un plugin suplimentar</translation>
<translation id="4202807286478387388">Salt</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
-<translation id="7658239707568436148">Anulaţi</translation>
-<translation id="795667975304826397">Nu s-au ales fişiere</translation>
-<translation id="1416462845279468967">Instalarea pluginului a eşuat</translation>
-<translation id="8141602879876242471">Acesta este un index în care se poate căuta. Introduceţi cuvintele cheie pentru căutare:</translation>
-<translation id="5650795167354946011">După instalarea pluginului, faceţi clic aici pentru a actualiza</translation>
-<translation id="6845533974506654842">Apăsaţi</translation>
+<translation id="7658239707568436148">Anulați</translation>
+<translation id="795667975304826397">Nu s-au ales fișiere</translation>
+<translation id="1416462845279468967">Instalarea pluginului a eșuat</translation>
+<translation id="8141602879876242471">Acesta este un index în care se poate căuta. Introduceți cuvintele cheie pentru căutare:</translation>
+<translation id="5650795167354946011">După instalarea pluginului, faceți clic aici pentru a actualiza</translation>
+<translation id="370665806235115550">Se încarcă...</translation>
+<translation id="6845533974506654842">Apăsați</translation>
<translation id="8244226242650769279">hartă cu imagini</translation>
<translation id="2548326553472216322">Nicio căutare recentă</translation>
<translation id="5944544982112848342">2048 (Grad înalt)</translation>
<translation id="3040011195152428237">link</translation>
-<translation id="2745343197843472802">Descărcaţi pluginul</translation>
-<translation id="5776402066334188252">Confirmaţi că doriţi să instalaţi acest plugin. Vă recomandăm să instalaţi numai pluginuri în care aveţi încredere.</translation>
+<translation id="2745343197843472802">Descărcați pluginul</translation>
+<translation id="5776402066334188252">Confirmați că doriți să instalați acest plugin. Vă recomandăm să instalați numai pluginuri în care aveți încredere.</translation>
<translation id="4003986561708175844">Pluginul necesar nu este instalat</translation>
<translation id="3018094406922859308">Se descarcă pluginul...</translation>
-<translation id="7364796246159120393">Alegeţi fişierul</translation>
-<translation id="8964020114565522021">Trageţi fişierul aici</translation>
-<translation id="838869780401515933">Bifaţi</translation>
+<translation id="7364796246159120393">Alegeți fișierul</translation>
+<translation id="8964020114565522021">Trageți fișierul aici</translation>
+<translation id="838869780401515933">Bifați</translation>
<translation id="2846343701378493991">1024 (Grad mediu)</translation>
-<translation id="5476505524087279545">Debifaţi</translation>
-<translation id="3789841737615482174">Instalaţi</translation>
-<translation id="5253117816378681419">Confirmaţi că doriţi să instalaţi pluginul <ph name="PLUGIN"/>. Vă recomandăm să instalaţi numai pluginuri în care aveţi încredere.</translation>
+<translation id="5476505524087279545">Debifați</translation>
+<translation id="3789841737615482174">Instalați</translation>
+<translation id="5253117816378681419">Confirmați că doriți să instalați pluginul <ph name="PLUGIN"/>. Vă recomandăm să instalați numai pluginuri în care aveți încredere.</translation>
<translation id="6663448176199120256">Căutări recente</translation>
-<translation id="2597378329261239068">Acest document este protejat cu parolă. Introduceţi o parolă.</translation>
-<translation id="6807599807928161586">zona Web</translation>
-<translation id="5939518447894949180">Resetaţi</translation>
-<translation id="1842960171412779397">Selectaţi</translation>
-<translation id="7638452146404718955">Faceţi clic aici pentru a descărca pluginul</translation>
-<translation id="6119846243427417423">Activaţi</translation>
-<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fişiere</translation>
+<translation id="2597378329261239068">Acest document este protejat cu parolă. Introduceți o parolă.</translation>
+<translation id="7740050170769002709">Conținut HTML</translation>
+<translation id="5939518447894949180">Resetați</translation>
+<translation id="1842960171412779397">Selectați</translation>
+<translation id="7638452146404718955">Faceți clic aici pentru a descărca pluginul</translation>
+<translation id="6119846243427417423">Activați</translation>
+<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fișiere</translation>
<translation id="4470547978413275879">Pluginul <ph name="PLUGIN"/> nu este instalat</translation>
-<translation id="6765711848403622008">Niciun plugin disponibil pentru a afişa acest conţinut</translation>
+<translation id="6765711848403622008">Niciun plugin disponibil pentru a afișa acest conținut</translation>
<translation id="8597182159515967513">titlu</translation>
-<translation id="2653659639078652383">Trimiteţi</translation>
+<translation id="2653659639078652383">Trimiteți</translation>
<translation id="8475551193147984329">Este necesar pluginul <ph name="PLUGIN"/></translation>
</translationbundle> \ No newline at end of file
diff --git a/webkit/glue/resources/webkit_strings_ru.xtb b/webkit/glue/resources/webkit_strings_ru.xtb
index 97e2796..5ea9049 100644
--- a/webkit/glue/resources/webkit_strings_ru.xtb
+++ b/webkit/glue/resources/webkit_strings_ru.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ru">
<translation id="4519964825805946997">Не удалось установить подключаемый модуль с адреса <ph name="URL"/></translation>
+<translation id="9186171386827445984">Загрузка документа: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> стр.</translation>
<translation id="1235745349614807883">Очистить недавние поиски</translation>
<translation id="5048533449481078685">маркер списка</translation>
<translation id="372362261556059955">Необходим дополнительный подключаемый модуль</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Не удалось установить подключаемый модуль</translation>
<translation id="8141602879876242471">Это индекс с возможностью поиска. Введите ключевые слова для поиска:</translation>
<translation id="5650795167354946011">После установки подключаемого модуля нажмите здесь, чтобы обновить страницу</translation>
+<translation id="370665806235115550">Загрузка...</translation>
<translation id="6845533974506654842">нажать</translation>
<translation id="8244226242650769279">графическая карта</translation>
<translation id="2548326553472216322">Нет недавних поисков</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Подтвердите, что вы хотите установить подключаемый модуль <ph name="PLUGIN"/>. Вы доверяете ему?</translation>
<translation id="6663448176199120256">Недавние поиски</translation>
<translation id="2597378329261239068">Документ защищен паролем. Введите пароль.</translation>
-<translation id="6807599807928161586">область Интернетеа</translation>
+<translation id="7740050170769002709">HTML-содержание</translation>
<translation id="5939518447894949180">Изменить</translation>
<translation id="1842960171412779397">выбрать</translation>
<translation id="7638452146404718955">Нажмите здесь, чтобы загрузить подключаемый модуль</translation>
diff --git a/webkit/glue/resources/webkit_strings_sk.xtb b/webkit/glue/resources/webkit_strings_sk.xtb
index 71e68a9..a9b37ba 100644
--- a/webkit/glue/resources/webkit_strings_sk.xtb
+++ b/webkit/glue/resources/webkit_strings_sk.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sk">
<translation id="4519964825805946997">Inštalácia doplnku z adresy <ph name="URL"/> zlyhala</translation>
+<translation id="9186171386827445984">Prebieha načítavanie dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stránok...</translation>
<translation id="1235745349614807883">Vyčistiť posledné vyhľadávania</translation>
<translation id="5048533449481078685">ukazovateľ v zozname</translation>
<translation id="372362261556059955">Vyžaduje sa ďalší doplnok</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Inštalácia doplnku zlyhala</translation>
<translation id="8141602879876242471">Tento index sa dá prehľadávať. Zadajte kľúčové slová na vyhľadanie:</translation>
<translation id="5650795167354946011">Kliknutím sem po inštalácii doplnku obnovíte obsah</translation>
+<translation id="370665806235115550">Načítava sa...</translation>
<translation id="6845533974506654842">stlačiť</translation>
<translation id="8244226242650769279">mapa obrázka</translation>
<translation id="2548326553472216322">Žiadne posledné vyhľadávania</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Potvrďte, že chcete nainštalovať doplnok <ph name="PLUGIN"/>. Mali by ste inštalovať len doplnky, ktorým dôverujete.</translation>
<translation id="6663448176199120256">Posledné vyhľadávania</translation>
<translation id="2597378329261239068">Tento dokument je chránený heslom. Zadajte heslo.</translation>
-<translation id="6807599807928161586">webová oblasť</translation>
+<translation id="7740050170769002709">Obsah HTML</translation>
<translation id="5939518447894949180">Vynulovať</translation>
<translation id="1842960171412779397">vybrať</translation>
<translation id="7638452146404718955">Kliknutím sem prevezmete doplnok</translation>
diff --git a/webkit/glue/resources/webkit_strings_sl.xtb b/webkit/glue/resources/webkit_strings_sl.xtb
index 2ee1e5b..e3b1061 100644
--- a/webkit/glue/resources/webkit_strings_sl.xtb
+++ b/webkit/glue/resources/webkit_strings_sl.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sl">
<translation id="4519964825805946997">Namestitev vtičnika z naslova <ph name="URL"/> ni bila uspešna</translation>
+<translation id="9186171386827445984">Nalaganje dokumenta: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> strani ...</translation>
<translation id="1235745349614807883">Počisti zadnja iskanja</translation>
<translation id="5048533449481078685">označevalnik seznama</translation>
<translation id="372362261556059955">Potreben je dodaten vtičnik</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Namestitev vtičnika ni bila uspešna</translation>
<translation id="8141602879876242471">To je kazalo, ki omogoča iskanje. Vnesite ključne besede za iskanje:</translation>
<translation id="5650795167354946011">Po namestitvi vtičnika, kliknite tu, da osvežite</translation>
+<translation id="370665806235115550">Nalagam ...</translation>
<translation id="6845533974506654842">pritisni</translation>
<translation id="8244226242650769279">slikovni zemljevid</translation>
<translation id="2548326553472216322">Ni zadnjih iskanj</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Potrdite, da želite namestiti ta <ph name="PLUGIN"/> vtičnik. Nameščajte le vtičnike, ki jim zaupate.</translation>
<translation id="6663448176199120256">Zadnja iskanja</translation>
<translation id="2597378329261239068">Dokument je zaščiten z geslom. Vnesite geslo.</translation>
-<translation id="6807599807928161586">spletno področje</translation>
+<translation id="7740050170769002709">Vsebina HTML</translation>
<translation id="5939518447894949180">Ponastavi</translation>
<translation id="1842960171412779397">izberi</translation>
<translation id="7638452146404718955">Če želite prenesti vtičnik, kliknite tukaj</translation>
diff --git a/webkit/glue/resources/webkit_strings_sr.xtb b/webkit/glue/resources/webkit_strings_sr.xtb
index a54c61b..3b32e4d 100644
--- a/webkit/glue/resources/webkit_strings_sr.xtb
+++ b/webkit/glue/resources/webkit_strings_sr.xtb
@@ -2,16 +2,18 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sr">
<translation id="4519964825805946997">Инсталирање додатка са адресе <ph name="URL"/> није успело</translation>
+<translation id="9186171386827445984">Учитавање документа: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> странице(а)...</translation>
<translation id="1235745349614807883">Обриши недавне претраге</translation>
<translation id="5048533449481078685">означивач листе</translation>
<translation id="372362261556059955">Потребан је још један додатак</translation>
<translation id="4202807286478387388">прескочи</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Откажи</translation>
-<translation id="795667975304826397">Није одабрана датотека</translation>
+<translation id="795667975304826397">Није одабрано</translation>
<translation id="1416462845279468967">Инсталација додатка није успела</translation>
<translation id="8141602879876242471">Ово је индекс који може да се претражује. Унесите кључне речи за претрагу:</translation>
<translation id="5650795167354946011">Након инсталирања додатка, кликните овде да бисте освежили</translation>
+<translation id="370665806235115550">Учитавање...</translation>
<translation id="6845533974506654842">притисни</translation>
<translation id="8244226242650769279">мапа слике</translation>
<translation id="2548326553472216322">Нема недавних претрага</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Потврдите да желите да инсталирате <ph name="PLUGIN"/> додатак. Инсталирајте само додатке у које имате поверења.</translation>
<translation id="6663448176199120256">Недавне претраге</translation>
<translation id="2597378329261239068">Овај документ је заштићен лозинком. Унесите лозинку.</translation>
-<translation id="6807599807928161586">веб област</translation>
+<translation id="7740050170769002709">HTML садржај</translation>
<translation id="5939518447894949180">Ресетуј</translation>
<translation id="1842960171412779397">изабери</translation>
<translation id="7638452146404718955">Кликните овде да бисте преузели додатак</translation>
diff --git a/webkit/glue/resources/webkit_strings_sv.xtb b/webkit/glue/resources/webkit_strings_sv.xtb
index aa42d57..7cbe67d 100644
--- a/webkit/glue/resources/webkit_strings_sv.xtb
+++ b/webkit/glue/resources/webkit_strings_sv.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sv">
<translation id="4519964825805946997">Det gick inte att installera plugin-program från <ph name="URL"/></translation>
+<translation id="9186171386827445984">Läser in dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sidor...</translation>
<translation id="1235745349614807883">Rensa senaste sökningar</translation>
<translation id="5048533449481078685">listmarkör</translation>
<translation id="372362261556059955">Ett ytterligare plugin-program krävs</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Installationen av plugin-programmet misslyckades</translation>
<translation id="8141602879876242471">Det här är ett sökbart index. Skriv sökord:</translation>
<translation id="5650795167354946011">Klicka här för att uppdatera när du har installerat plugin-programmet</translation>
+<translation id="370665806235115550">Laddar...</translation>
<translation id="6845533974506654842">tryck</translation>
<translation id="8244226242650769279">bildkarta</translation>
<translation id="2548326553472216322">Inga nya sökningar</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Bekräfta att du vill installera plugin-programmet <ph name="PLUGIN"/>. Installera bara plugin-program från tillförlitliga källor.</translation>
<translation id="6663448176199120256">Senaste sökningar</translation>
<translation id="2597378329261239068">Dokumentet är lösenordsskyddat. Ange ett lösenord.</translation>
-<translation id="6807599807928161586">webbområde</translation>
+<translation id="7740050170769002709">HTML-innehåll</translation>
<translation id="5939518447894949180">Återställ</translation>
<translation id="1842960171412779397">välj</translation>
<translation id="7638452146404718955">Klicka här för att hämta plugin-programmet</translation>
diff --git a/webkit/glue/resources/webkit_strings_sw.xtb b/webkit/glue/resources/webkit_strings_sw.xtb
index e507aa6..088048a 100644
--- a/webkit/glue/resources/webkit_strings_sw.xtb
+++ b/webkit/glue/resources/webkit_strings_sw.xtb
@@ -8,6 +8,7 @@
<translation id="7658239707568436148">Ghairi</translation>
<translation id="795667975304826397">Hakuna faili lililochaguliwa</translation>
<translation id="8141602879876242471">Hii ni fahirisi inayoweza kutafutwa. Weka maneno muhimu ya utafutaji.</translation>
+<translation id="370665806235115550">Inapakia...</translation>
<translation id="6845533974506654842">bofya</translation>
<translation id="8244226242650769279">ramani ya picha</translation>
<translation id="2548326553472216322">Hakuna utafutaji wa hivi karibuni</translation>
@@ -20,7 +21,6 @@
<translation id="5476505524087279545">toa tiki</translation>
<translation id="3789841737615482174">Sakinisha</translation>
<translation id="6663448176199120256">Utafutaji wa hivi karibuni</translation>
-<translation id="6807599807928161586">eneo wavuti</translation>
<translation id="5939518447894949180">Weka upya</translation>
<translation id="1842960171412779397">chagua</translation>
<translation id="6119846243427417423">wezesha</translation>
diff --git a/webkit/glue/resources/webkit_strings_ta.xtb b/webkit/glue/resources/webkit_strings_ta.xtb
index 47d8547..f8dbf00 100644
--- a/webkit/glue/resources/webkit_strings_ta.xtb
+++ b/webkit/glue/resources/webkit_strings_ta.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ta">
<translation id="4519964825805946997"><ph name="URL"/> இலிருந்து செருகுநிரலை நிறுவுதல் தோல்வியடைந்தது</translation>
+<translation id="9186171386827445984">ஆவணத்தை ஏற்றுகிறது: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> பக்கங்கள்...</translation>
<translation id="1235745349614807883">சமீபத்திய தேடல்களை சுத்தமாக்கு</translation>
<translation id="5048533449481078685">பட்டியல் குறிப்பான்</translation>
<translation id="372362261556059955">கூடுதல் செருகுநிரல் தேவைப்படுகிறது</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">செருகுநிரலை நிறுவுதல் தோல்வியடைந்தது</translation>
<translation id="8141602879876242471">இது தேடக்கூடிய பொருளடக்கம். தேடல் சொற்களை உள்ளிடுக:</translation>
<translation id="5650795167354946011">செருகுநிரலை நிறுவிய பின்பு புதுப்பிக்க இங்கு கிளிக்செய்க</translation>
+<translation id="370665806235115550">நினைவேறுகிறது...</translation>
<translation id="6845533974506654842">அழுத்துக</translation>
<translation id="8244226242650769279">பட மேப்</translation>
<translation id="2548326553472216322">சமீபத்திய தேடல்கள் எதுவுமில்லை</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419"><ph name="PLUGIN"/> செருகுநிரலை நிறுவ நீங்கள் விரும்புகிறீர்கள் என்பதை தயவுசெய்து உறுதிசெய்க. நீங்கள் நம்பும் செருகுநிரல்களை மட்டும் நிறுவ வேண்டும்.</translation>
<translation id="6663448176199120256">சமீபத்திய தேடல்கள்</translation>
<translation id="2597378329261239068">இந்த ஆவணம் கடவுச்சொல் பாதுகாக்கப்பட்ட ஒன்று. தயவுசெய்து ஒரு கடவுச்சொல்லை உள்ளிடுக.</translation>
-<translation id="6807599807928161586">வலைப் பகுதி</translation>
+<translation id="7740050170769002709">HTML உள்ளடக்கம்</translation>
<translation id="5939518447894949180">மீட்டமை</translation>
<translation id="1842960171412779397">தேர்ந்தெடு</translation>
<translation id="7638452146404718955">செருகுநிரலைப் பதிவிறக்க இங்கே கிளிக் செய்க</translation>
diff --git a/webkit/glue/resources/webkit_strings_te.xtb b/webkit/glue/resources/webkit_strings_te.xtb
index 3c1e875..a1f9fd6 100644
--- a/webkit/glue/resources/webkit_strings_te.xtb
+++ b/webkit/glue/resources/webkit_strings_te.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="te">
<translation id="4519964825805946997"><ph name="URL"/> నుండి ప్లగ్-ఇన్‌ను వ్యవస్థాపించడానికి విఫలమైంది</translation>
+<translation id="9186171386827445984">పత్రాన్ని లోడ్ చేస్తోంది: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> పేజీలు...</translation>
<translation id="1235745349614807883">ఇటీవల శోధనలను క్లియర్ చెయ్యి</translation>
<translation id="5048533449481078685">జాబితా మార్కర్</translation>
<translation id="372362261556059955">అదనపు ప్లగ్-ఇన్ అవసరం</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">ప్లగ్-ఇన్ వ్యవస్థాపన విఫలమైంది</translation>
<translation id="8141602879876242471">ఇది ఒక శోధించగల సూచిక. శోధన కీవర్డ్‌లను ఎంటర్ చెయ్యండి:</translation>
<translation id="5650795167354946011">ప్లగ్-ఇన్‌ను వ్యవస్థాపించిన తర్వాత, రిఫ్రెష్ చెయ్యడానికి ఇక్కడ క్లిక్ చెయ్యండి.</translation>
+<translation id="370665806235115550">లోడ్ అవుతోంది...</translation>
<translation id="6845533974506654842">నొక్కండి</translation>
<translation id="8244226242650769279">చిత్రం మాప్</translation>
<translation id="2548326553472216322">ఇటీవల శోధనలు లేవు</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">దయచేసి మీరు <ph name="PLUGIN"/> ప్లగ్-ఇన్‌ను వ్యవస్థాపించాలనుకుంటున్నారని నిర్థారించండి. మీరు విశ్వసించే ప్లగ్-ఇన్‌లను మాత్రమే వ్యవస్థాపించాలి.</translation>
<translation id="6663448176199120256">ఇటీవల శోధనలు</translation>
<translation id="2597378329261239068">ఈ పత్రం అనుమతి పదంచే రక్షించబడింది. దయచేసి అనుమతి పదాన్ని నమోదు చేయండి.</translation>
-<translation id="6807599807928161586">వెబ్ ప్రాంతం</translation>
+<translation id="7740050170769002709">HTML కంటెంట్</translation>
<translation id="5939518447894949180">తిరిగి అమర్చండి</translation>
<translation id="1842960171412779397">ఎంచుకోండి</translation>
<translation id="7638452146404718955">ప్లగ్-ఇన్‌ను డౌన్‌లోడ్ చేయడానికి ఇక్కడ క్లిక్ చేయండి</translation>
diff --git a/webkit/glue/resources/webkit_strings_th.xtb b/webkit/glue/resources/webkit_strings_th.xtb
index 80dd787..a6ffcc6 100644
--- a/webkit/glue/resources/webkit_strings_th.xtb
+++ b/webkit/glue/resources/webkit_strings_th.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="th">
<translation id="4519964825805946997">การติดตั้งปลั๊กอินจาก <ph name="URL"/> ล้มเหลว</translation>
+<translation id="9186171386827445984">กำลังโหลดเอกสาร: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> หน้า...</translation>
<translation id="1235745349614807883">ลบการค้นหาล่าสุด</translation>
<translation id="5048533449481078685">ผู้สร้างรายการ</translation>
<translation id="372362261556059955">ต้องการปลั๊กอินเพิ่มเติม</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">การติดตั้งปลั๊กอินล้มเหลว</translation>
<translation id="8141602879876242471">นี่คือดัชนีที่สามารถค้นหาได้ ป้อนคำหลักในการค้นหา:</translation>
<translation id="5650795167354946011">หลังจากติดตั้งปลั๊กอิน ให้คลิกที่นี่เพื่อรีเฟรช</translation>
+<translation id="370665806235115550">กำลังโหลด...</translation>
<translation id="6845533974506654842">กด</translation>
<translation id="8244226242650769279">แผนที่รูปภาพ</translation>
<translation id="2548326553472216322">ไม่พบการค้นหาล่าสุด</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">โปรดยืนยันว่าคุณต้องการติดตั้งปลั๊กอิน <ph name="PLUGIN"/> คุณควรติดตั้งเฉพาะปลั๊กอินที่คุณไว้ใจเท่านั้น</translation>
<translation id="6663448176199120256">การค้นหาล่าสุด</translation>
<translation id="2597378329261239068">เอกสารนี้ได้รับการป้องกันด้วยรหัสผ่าน โปรดป้อนรหัสผ่าน</translation>
-<translation id="6807599807928161586">พื้นที่เว็บ</translation>
+<translation id="7740050170769002709">เนื้อหา HTML</translation>
<translation id="5939518447894949180">ตั้งค่าใหม่</translation>
<translation id="1842960171412779397">เลือก</translation>
<translation id="7638452146404718955">คลิกที่นี่เพื่อดาวน์โหลดปลั๊กอิน</translation>
diff --git a/webkit/glue/resources/webkit_strings_tr.xtb b/webkit/glue/resources/webkit_strings_tr.xtb
index a4d880d..5a24891 100644
--- a/webkit/glue/resources/webkit_strings_tr.xtb
+++ b/webkit/glue/resources/webkit_strings_tr.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="tr">
<translation id="4519964825805946997">Eklenti, <ph name="URL"/> kaynağından yüklenemedi</translation>
+<translation id="9186171386827445984">Belge yükleniyor: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sayfa...</translation>
<translation id="1235745349614807883">Son Aramaları Temizle</translation>
<translation id="5048533449481078685">liste işaretçisi</translation>
<translation id="372362261556059955">Başka eklenti gerekiyor</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Eklenti yüklenemedi</translation>
<translation id="8141602879876242471">Bu dizinde arama yapılabilir. Arama anahtar kelimeleri girin:</translation>
<translation id="5650795167354946011">Eklentiyi yükledikten sonra yenilemek için burayı tıklayın</translation>
+<translation id="370665806235115550">Yükleniyor...</translation>
<translation id="6845533974506654842">bas</translation>
<translation id="8244226242650769279">resim haritası</translation>
<translation id="2548326553472216322">Yeni arama yok</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Lütfen <ph name="PLUGIN"/> eklentisini yüklemek istediğinizi onaylayın. Yalnızca güvendiğiniz eklentileri yüklemelisiniz.</translation>
<translation id="6663448176199120256">Son Aramalar</translation>
<translation id="2597378329261239068">Doküman şifre korumalı. Lütfen şifreyi girin.</translation>
-<translation id="6807599807928161586">web alanı</translation>
+<translation id="7740050170769002709">HTML içeriği</translation>
<translation id="5939518447894949180">Sıfırla</translation>
<translation id="1842960171412779397">seç</translation>
<translation id="7638452146404718955">Eklentiyi indirmek için burayı tıklayın</translation>
diff --git a/webkit/glue/resources/webkit_strings_uk.xtb b/webkit/glue/resources/webkit_strings_uk.xtb
index a125fe2..360c85f 100644
--- a/webkit/glue/resources/webkit_strings_uk.xtb
+++ b/webkit/glue/resources/webkit_strings_uk.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="uk">
<translation id="4519964825805946997">Не вдалося встановити плагін із <ph name="URL"/></translation>
+<translation id="9186171386827445984">Завантаження документа – сторінки: <ph name="PAGE_NUMBER"/> із <ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Очистити останні пошуки</translation>
<translation id="5048533449481078685">маркер списку</translation>
<translation id="372362261556059955">Потрібен додатковий плагін.</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Помилка встановлення плагіна</translation>
<translation id="8141602879876242471">Цей доступний для пошуку індекс. Введіть ключові слова пошуку:</translation>
<translation id="5650795167354946011">Після встановлення плагіна натисніть тут, щоб оновити</translation>
+<translation id="370665806235115550">Завантаження...</translation>
<translation id="6845533974506654842">натиснути</translation>
<translation id="8244226242650769279">мапа зображення</translation>
<translation id="2548326553472216322">Немає останніх пошуків</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Підтвердьте встановлення плагіна <ph name="PLUGIN"/>. Слід установлювати лише плагіни, яким ви довіряєте.</translation>
<translation id="6663448176199120256">Останні пошуки</translation>
<translation id="2597378329261239068">Цей документ захищено паролем. Введіть пароль.</translation>
-<translation id="6807599807928161586">область Інтернету</translation>
+<translation id="7740050170769002709">Вміст HTML</translation>
<translation id="5939518447894949180">Скинути</translation>
<translation id="1842960171412779397">вибрати</translation>
<translation id="7638452146404718955">Натисніть тут, щоб завантажити плагін</translation>
diff --git a/webkit/glue/resources/webkit_strings_vi.xtb b/webkit/glue/resources/webkit_strings_vi.xtb
index 84668c5..0ee2d09 100644
--- a/webkit/glue/resources/webkit_strings_vi.xtb
+++ b/webkit/glue/resources/webkit_strings_vi.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="vi">
<translation id="4519964825805946997">Cài đặt trình cắm từ <ph name="URL"/> không thành công</translation>
+<translation id="9186171386827445984">Đang tải tài liệu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> trang...</translation>
<translation id="1235745349614807883">Xoá Tìm kiếm Gần đây</translation>
<translation id="5048533449481078685">đánh dấu danh sách</translation>
<translation id="372362261556059955">Cần trình cắm bổ sung</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">Cài đặt trình cắm không thành công</translation>
<translation id="8141602879876242471">Đây là chỉ mục có thể tìm kiếm. Nhập từ khoá tìm kiếm vào:</translation>
<translation id="5650795167354946011">Sau khi cài đặt trình cắm, hãy nhấp vào đây để làm mới</translation>
+<translation id="370665806235115550">Đang tải...</translation>
<translation id="6845533974506654842">nhấn</translation>
<translation id="8244226242650769279">bản đồ hình ảnh</translation>
<translation id="2548326553472216322">Không có tìm kiếm nào gần đây</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">Vui lòng xác nhận rằng bạn muốn cài đặt trình cắm <ph name="PLUGIN"/>. Bạn chỉ nên cài đặt những trình cắm mà bạn tin tưởng.</translation>
<translation id="6663448176199120256">Tìm kiếm Gần đây</translation>
<translation id="2597378329261239068">Tài liệu này được bảo vệ bằng mật khẩu. Vui lòng nhập mật khẩu.</translation>
-<translation id="6807599807928161586">khu vực web</translation>
+<translation id="7740050170769002709">Nội dung HTML</translation>
<translation id="5939518447894949180">Đặt lại</translation>
<translation id="1842960171412779397">chọn</translation>
<translation id="7638452146404718955">Nhấp vào đây để tải xuống trình cắm</translation>
diff --git a/webkit/glue/resources/webkit_strings_zh-CN.xtb b/webkit/glue/resources/webkit_strings_zh-CN.xtb
index f5c0644..f931c5c 100644
--- a/webkit/glue/resources/webkit_strings_zh-CN.xtb
+++ b/webkit/glue/resources/webkit_strings_zh-CN.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="zh-CN">
<translation id="4519964825805946997">无法从 <ph name="URL"/> 安装插件</translation>
+<translation id="9186171386827445984">正在载入文档:已载入 <ph name="PAGE_NUMBER"/> 页,共 <ph name="NUMBER_OF_PAGES"/> 页...</translation>
<translation id="1235745349614807883">清除最近的搜索</translation>
<translation id="5048533449481078685">列表标记</translation>
<translation id="372362261556059955">需要其他插件</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">插件安装失败</translation>
<translation id="8141602879876242471">这是一个可搜索的索引。请输入搜索关键字:</translation>
<translation id="5650795167354946011">安装插件后,点击此处可刷新</translation>
+<translation id="370665806235115550">正在载入...</translation>
<translation id="6845533974506654842">按</translation>
<translation id="8244226242650769279">图片映射</translation>
<translation id="2548326553472216322">最近未执行搜索</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">请确认您要安装 <ph name="PLUGIN"/> 插件。您应该只安装自己信任的插件。</translation>
<translation id="6663448176199120256">近期搜索</translation>
<translation id="2597378329261239068">本文档设置了密码保护,请输入密码。</translation>
-<translation id="6807599807928161586">网络区域</translation>
+<translation id="7740050170769002709">HTML 内容</translation>
<translation id="5939518447894949180">重置</translation>
<translation id="1842960171412779397">选中</translation>
<translation id="7638452146404718955">点击此处可下载插件</translation>
diff --git a/webkit/glue/resources/webkit_strings_zh-TW.xtb b/webkit/glue/resources/webkit_strings_zh-TW.xtb
index 7d7eda3..368a365 100644
--- a/webkit/glue/resources/webkit_strings_zh-TW.xtb
+++ b/webkit/glue/resources/webkit_strings_zh-TW.xtb
@@ -2,6 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="zh-TW">
<translation id="4519964825805946997">無法從 <ph name="URL"/> 安裝外掛程式</translation>
+<translation id="9186171386827445984">正在載入文件:第 <ph name="PAGE_NUMBER"/> 頁,共 <ph name="NUMBER_OF_PAGES"/> 頁...</translation>
<translation id="1235745349614807883">清除最近的搜尋記錄</translation>
<translation id="5048533449481078685">清單標記</translation>
<translation id="372362261556059955">需要其他外掛程式</translation>
@@ -12,6 +13,7 @@
<translation id="1416462845279468967">外掛程式安裝不成功</translation>
<translation id="8141602879876242471">這是可搜尋的索引,輸入搜尋關鍵字:</translation>
<translation id="5650795167354946011">安裝外掛程式後,請按一下這裡重新整理</translation>
+<translation id="370665806235115550">載入中...</translation>
<translation id="6845533974506654842">按下</translation>
<translation id="8244226242650769279">影像地圖</translation>
<translation id="2548326553472216322">沒有近期的搜尋</translation>
@@ -30,7 +32,7 @@
<translation id="5253117816378681419">請確認您要安裝 <ph name="PLUGIN"/> 外掛程式,建議您僅安裝您所信任的外掛程式。</translation>
<translation id="6663448176199120256">最近的搜尋</translation>
<translation id="2597378329261239068">此文件受到密碼保護,請輸入密碼。</translation>
-<translation id="6807599807928161586">網頁範圍</translation>
+<translation id="7740050170769002709">HTML 內容</translation>
<translation id="5939518447894949180">重設</translation>
<translation id="1842960171412779397">選取</translation>
<translation id="7638452146404718955">按一下這裡下載外掛程式</translation>