Merge from Chromium at DEPS revision 40.0.2214.10
This commit was generated by merge_to_master.py.
Change-Id: I0a543d3dd13b8f5d3ca1d0a6b04cf4d1a280b98a
diff --git a/android_webview/browser/net/aw_url_request_context_getter.cc b/android_webview/browser/net/aw_url_request_context_getter.cc
index 33f92a6..1c74bd0 100644
--- a/android_webview/browser/net/aw_url_request_context_getter.cc
+++ b/android_webview/browser/net/aw_url_request_context_getter.cc
@@ -211,6 +211,7 @@
builder.set_accept_language(net::HttpUtil::GenerateAcceptLanguageHeader(
AwContentBrowserClient::GetAcceptLangsImpl()));
builder.set_net_log(net_log_.get());
+ builder.set_channel_id_enabled(false);
ApplyCmdlineOverridesToURLRequestContextBuilder(&builder);
url_request_context_.reset(builder.Build());
diff --git a/apps/app_lifetime_monitor.cc b/apps/app_lifetime_monitor.cc
index 16323e9..3190e29 100644
--- a/apps/app_lifetime_monitor.cc
+++ b/apps/app_lifetime_monitor.cc
@@ -81,21 +81,24 @@
}
void AppLifetimeMonitor::OnAppWindowRemoved(AppWindow* app_window) {
- if (!HasVisibleAppWindows(app_window))
+ if (!HasOtherVisibleAppWindows(app_window))
NotifyAppDeactivated(app_window->extension_id());
}
void AppLifetimeMonitor::OnAppWindowHidden(AppWindow* app_window) {
- if (!HasVisibleAppWindows(app_window))
+ if (!HasOtherVisibleAppWindows(app_window))
NotifyAppDeactivated(app_window->extension_id());
}
-void AppLifetimeMonitor::OnAppWindowShown(AppWindow* app_window) {
+void AppLifetimeMonitor::OnAppWindowShown(AppWindow* app_window,
+ bool was_hidden) {
if (app_window->window_type() != AppWindow::WINDOW_TYPE_DEFAULT)
return;
- if (HasVisibleAppWindows(app_window))
+ // The app is being activated if this is the first window to become visible.
+ if (was_hidden && !HasOtherVisibleAppWindows(app_window)) {
NotifyAppActivated(app_window->extension_id());
+ }
}
void AppLifetimeMonitor::Shutdown() {
@@ -106,7 +109,8 @@
app_window_registry->RemoveObserver(this);
}
-bool AppLifetimeMonitor::HasVisibleAppWindows(AppWindow* app_window) const {
+bool AppLifetimeMonitor::HasOtherVisibleAppWindows(
+ AppWindow* app_window) const {
AppWindowRegistry::AppWindowList windows =
AppWindowRegistry::Get(app_window->browser_context())
->GetAppWindowsForApp(app_window->extension_id());
@@ -114,7 +118,7 @@
for (AppWindowRegistry::AppWindowList::const_iterator i = windows.begin();
i != windows.end();
++i) {
- if (!(*i)->is_hidden())
+ if (*i != app_window && !(*i)->is_hidden())
return true;
}
return false;
diff --git a/apps/app_lifetime_monitor.h b/apps/app_lifetime_monitor.h
index 8f079fe..90ae2a8 100644
--- a/apps/app_lifetime_monitor.h
+++ b/apps/app_lifetime_monitor.h
@@ -32,9 +32,11 @@
public:
// Called when the app starts running.
virtual void OnAppStart(Profile* profile, const std::string& app_id) {}
- // Called when the app becomes active to the user, i.e. it opens a window.
+ // Called when the app becomes active to the user, i.e. the first window
+ // becomes visible.
virtual void OnAppActivated(Profile* profile, const std::string& app_id) {}
- // Called when the app becomes inactive to the user.
+ // Called when the app becomes inactive to the user, i.e. the last window is
+ // hidden or closed.
virtual void OnAppDeactivated(Profile* profile, const std::string& app_id) {
}
// Called when the app stops running.
@@ -63,12 +65,13 @@
// extensions::AppWindowRegistry::Observer overrides:
void OnAppWindowRemoved(extensions::AppWindow* app_window) override;
void OnAppWindowHidden(extensions::AppWindow* app_window) override;
- void OnAppWindowShown(extensions::AppWindow* app_window) override;
+ void OnAppWindowShown(extensions::AppWindow* app_window,
+ bool was_hidden) override;
// KeyedService overrides:
void Shutdown() override;
- bool HasVisibleAppWindows(extensions::AppWindow* app_window) const;
+ bool HasOtherVisibleAppWindows(extensions::AppWindow* app_window) const;
void NotifyAppStart(const std::string& app_id);
void NotifyAppActivated(const std::string& app_id);
diff --git a/base/time/time.h b/base/time/time.h
index 641f465..9cb007e 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -232,6 +232,10 @@
static const int64 kNanosecondsPerSecond = kNanosecondsPerMicrosecond *
kMicrosecondsPerSecond;
+ // The representation of Jan 1, 1970 UTC in microseconds since the
+ // platform-dependent epoch.
+ static const int64 kTimeTToMicrosecondsOffset;
+
#if !defined(OS_WIN)
// On Mac & Linux, this value is the delta from the Windows epoch of 1601 to
// the Posix delta of 1970. This is used for migrating between the old
@@ -492,10 +496,6 @@
bool is_local,
Time* parsed_time);
- // The representation of Jan 1, 1970 UTC in microseconds since the
- // platform-dependent epoch.
- static const int64 kTimeTToMicrosecondsOffset;
-
// Time in microseconds in UTC.
int64 us_;
};
diff --git a/build/android/pylib/utils/isolator.py b/build/android/pylib/utils/isolator.py
index 9ee5671..afbee2a 100644
--- a/build/android/pylib/utils/isolator.py
+++ b/build/android/pylib/utils/isolator.py
@@ -32,7 +32,6 @@
'component': 'static_library',
'fastbuild': '0',
'icu_use_data_file_flag': '1',
- 'libpeer_target_type': 'static_library',
'lsan': '0',
# TODO(maruel): This may not always be true.
'target_arch': 'arm',
diff --git a/build/common.gypi b/build/common.gypi
index f792303..256515a 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -1510,9 +1510,6 @@
'ozone_platform_ozonex%': 0,
'ozone_platform_test%': 0,
- # Whether the browser is non-native (using Views Toolkit) on Mac.
- 'mac_views_browser%': 0,
-
'conditions': [
['buildtype=="Official"', {
# Continue to embed build meta data in Official builds, basically the
diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE
index 4d55954..e136404 100644
--- a/build/util/LASTCHANGE
+++ b/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=03655fd3f6d7
+LASTCHANGE=3e349d1753f4
diff --git a/build/util/LASTCHANGE.blink b/build/util/LASTCHANGE.blink
index 8ec7aff..db6b90c 100644
--- a/build/util/LASTCHANGE.blink
+++ b/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=184994
+LASTCHANGE=185475
diff --git a/chrome/VERSION b/chrome/VERSION
index 67a0cca..ab00d16 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
MAJOR=40
MINOR=0
BUILD=2214
-PATCH=0
+PATCH=10
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index baf3b58..3db4e5d 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2667,12 +2667,6 @@
<message name="IDS_CERT_ERROR_NAME_CONSTRAINT_VIOLATION_DESCRIPTION" desc="Description of the error page for a certificate that contains a name outside of its scope">
Server's certificate violates name constraints.
</message>
- <message name="IDS_CERT_ERROR_VALIDITY_TOO_LONG_DETAILS" desc="Details of the error page for a certificate whose validity period is too long">
- You attempted to reach <ph name="DOMAIN"><strong>$1<ex>paypal.com</ex></strong></ph>, but the server presented a certificate for which the period is too long.
- </message>
- <message name="IDS_CERT_ERROR_VALIDITY_TOO_LONG_DESCRIPTION" desc="Description of the error page for a certificate whose validity period is too long">
- The server certificate has a validity period that is too long.
- </message>
<message name="IDS_CERT_ERROR_UNKNOWN_ERROR_DETAILS" desc="Details of the error page for an unknown ssl error">
An unknown error has occurred.
@@ -10160,7 +10154,7 @@
Your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> will be unlocked when your Android phone is unlocked and nearby.
</message>
<message name="IDS_OPTIONS_EASY_UNLOCK_REQUIRE_PROXIMITY_LABEL" desc="The text label that describes the checkbox that controls whether the user's Android phone must be in close proximity to the Chromebook in order to unlock it..">
- Allow unlocking this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> only when the phone is within an arm's length away.
+ Only unlock this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> when your phone is within arm’s reach.
</message>
<message name="IDS_OPTIONS_EASY_UNLOCK_TURN_OFF_BUTTON" desc="The label of the button to disable Easy unlock on the settings page and the turn off Easy unlock dialog.">
Turn off
@@ -15001,11 +14995,11 @@
<message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_PHONE_UNLOCKABLE" desc="Tooltip for an icon on a user's lock screen pod shown by Easy Unlock when a phone eligible to unlock the Chromebook is detected, but it does not have lock screen enabled, in which case it is not allowed to unlock Chromebooks.">
Your Android phone must have a lock screen enabled before it can unlock this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. Otherwise, you will need to type in your password.
</message>
- <message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_RSSI_TOO_LOW" desc="Tooltip for an icon on a user's lock screen pod shown by Easy Unlock when a phone eligible to unlock the Chromebook is detected, but it's not in the Chromebook's proximity (roughly >30 meters away).">
- Bring your phone closer to your Chromebook to enter.
+ <message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_RSSI_TOO_LOW" desc="Tooltip for an icon on a user's lock screen pod shown by Easy Unlock when a phone eligible to unlock the Chromebook is detected, but it's not in the Chromebook's proximity (> 30 feet away).">
+ Your Android phone is too far away from your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. Bring it closer to enter.
</message>
- <message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_TX_POWER_TOO_HIGH" desc="Tooltip for an icon on a user's lock screen pod shown by Easy Unlock when a phone eligible to unlock the Chromebook is detected, but it's not right next to the Chromebook. This is only shown to users who turn on an advanced setting.">
- Your Android phone is too far away. Bring it right next to your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> to enter.
+ <message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_TX_POWER_TOO_HIGH" desc="Tooltip for an icon on a user's lock screen pod shown by Easy Unlock when a phone eligible to unlock the Chromebook is detected, but it's not in the Chromebook's proximity (> 1 foot away).">
+ Your Android phone is too far away from your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. Bring it closer to enter.
</message>
<message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_INITIAL_AUTHENTICATED" desc="Tooltip text shown on lock screen when a phone eligible to unlock the Chromebook via Easy Unlock is detected and authenticated for the first time.">
When your phone is unlocked and nearby, you can just click to enter. Otherwise, you'll see a locked icon and need to type your password.
diff --git a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
index 56db665..8df88e1 100644
--- a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
@@ -5,6 +5,7 @@
#import <Cocoa/Cocoa.h>
#include <vector>
+#include "apps/app_lifetime_monitor_factory.h"
#include "apps/switches.h"
#include "base/auto_reset.h"
#include "base/callback.h"
@@ -150,6 +151,37 @@
DISALLOW_COPY_AND_ASSIGN(WindowedAppShimLaunchObserver);
};
+class AppLifetimeMonitorObserver : public apps::AppLifetimeMonitor::Observer {
+ public:
+ AppLifetimeMonitorObserver(Profile* profile)
+ : profile_(profile), activated_count_(0), deactivated_count_(0) {
+ apps::AppLifetimeMonitorFactory::GetForProfile(profile_)->AddObserver(this);
+ }
+ virtual ~AppLifetimeMonitorObserver() {
+ apps::AppLifetimeMonitorFactory::GetForProfile(profile_)
+ ->RemoveObserver(this);
+ }
+
+ int activated_count() { return activated_count_; }
+ int deactivated_count() { return deactivated_count_; }
+
+ protected:
+ // AppLifetimeMonitor::Observer overrides:
+ void OnAppActivated(Profile* profile, const std::string& app_id) override {
+ ++activated_count_;
+ }
+ void OnAppDeactivated(Profile* profile, const std::string& app_id) override {
+ ++deactivated_count_;
+ }
+
+ private:
+ Profile* profile_;
+ int activated_count_;
+ int deactivated_count_;
+
+ DISALLOW_COPY_AND_ASSIGN(AppLifetimeMonitorObserver);
+};
+
NSString* GetBundleID(const base::FilePath& shim_path) {
base::FilePath plist_path = shim_path.Append("Contents").Append("Info.plist");
NSMutableDictionary* plist = [NSMutableDictionary
@@ -164,6 +196,30 @@
->FindHost(profile, app_id);
}
+base::FilePath GetAppShimPath(Profile* profile,
+ const extensions::Extension* app) {
+ // Use a WebAppShortcutCreator to get the path.
+ web_app::WebAppShortcutCreator shortcut_creator(
+ web_app::GetWebAppDataDirectory(profile->GetPath(), app->id(), GURL()),
+ web_app::ShortcutInfoForExtensionAndProfile(app, profile),
+ extensions::FileHandlersInfo());
+ return shortcut_creator.GetInternalShortcutPath();
+}
+
+void UpdateAppAndAwaitShimCreation(Profile* profile,
+ const extensions::Extension* app,
+ const base::FilePath& shim_path) {
+ // Create the internal app shim by simulating an app update. FilePathWatcher
+ // is used to wait for file operations on the shim to be finished before
+ // attempting to launch it. Since all of the file operations are done in the
+ // same event on the FILE thread, everything will be done by the time the
+ // watcher's callback is executed.
+ scoped_refptr<WindowedFilePathWatcher> file_watcher =
+ new WindowedFilePathWatcher(shim_path);
+ web_app::UpdateAllShortcuts(base::string16(), profile, app);
+ file_watcher->Wait();
+}
+
} // namespace
// Watches for NSNotifications from the shared workspace.
@@ -224,9 +280,11 @@
// Shims require static libraries http://crbug.com/386024.
#if defined(COMPONENT_BUILD)
#define MAYBE_Launch DISABLED_Launch
+#define MAYBE_ShowWindow DISABLED_ShowWindow
#define MAYBE_RebuildShim DISABLED_RebuildShim
#else
#define MAYBE_Launch Launch
+#define MAYBE_ShowWindow ShowWindow
#define MAYBE_RebuildShim RebuildShim
#endif
@@ -234,26 +292,12 @@
// These two cases are combined because the time to run the test is dominated
// by loading the extension and creating the shim.
IN_PROC_BROWSER_TEST_F(AppShimInteractiveTest, MAYBE_Launch) {
- // Install the app.
const extensions::Extension* app = InstallPlatformApp("minimal");
- // Use a WebAppShortcutCreator to get the path.
- web_app::WebAppShortcutCreator shortcut_creator(
- web_app::GetWebAppDataDirectory(profile()->GetPath(), app->id(), GURL()),
- web_app::ShortcutInfoForExtensionAndProfile(app, profile()),
- extensions::FileHandlersInfo());
- base::FilePath shim_path = shortcut_creator.GetInternalShortcutPath();
+ base::FilePath shim_path = GetAppShimPath(profile(), app);
EXPECT_FALSE(base::PathExists(shim_path));
- // Create the internal app shim by simulating an app update. FilePathWatcher
- // is used to wait for file operations on the shim to be finished before
- // attempting to launch it. Since all of the file operations are done in the
- // same event on the FILE thread, everything will be done by the time the
- // watcher's callback is executed.
- scoped_refptr<WindowedFilePathWatcher> file_watcher =
- new WindowedFilePathWatcher(shim_path);
- web_app::UpdateAllShortcuts(base::string16(), profile(), app);
- file_watcher->Wait();
+ UpdateAppAndAwaitShimCreation(profile(), app, shim_path);
ASSERT_TRUE(base::PathExists(shim_path));
NSString* bundle_id = GetBundleID(shim_path);
@@ -316,6 +360,125 @@
}
}
+// Test that the shim's lifetime depends on the visibility of windows. I.e. the
+// shim is only active when there are visible windows.
+IN_PROC_BROWSER_TEST_F(AppShimInteractiveTest, MAYBE_ShowWindow) {
+ const extensions::Extension* app = InstallPlatformApp("hidden");
+
+ base::FilePath shim_path = GetAppShimPath(profile(), app);
+ EXPECT_FALSE(base::PathExists(shim_path));
+
+ UpdateAppAndAwaitShimCreation(profile(), app, shim_path);
+ ASSERT_TRUE(base::PathExists(shim_path));
+ NSString* bundle_id = GetBundleID(shim_path);
+
+ // It's impractical to confirm that the shim did not launch by timing out, so
+ // instead we watch AppLifetimeMonitor::Observer::OnAppActivated.
+ AppLifetimeMonitorObserver lifetime_observer(profile());
+
+ // Launch the app. It should create a hidden window, but the shim should not
+ // launch.
+ {
+ ExtensionTestMessageListener launched_listener("Launched", false);
+ LaunchPlatformApp(app);
+ EXPECT_TRUE(launched_listener.WaitUntilSatisfied());
+ }
+ extensions::AppWindow* window_1 = GetFirstAppWindow();
+ ASSERT_TRUE(window_1);
+ EXPECT_TRUE(window_1->is_hidden());
+ EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
+ EXPECT_EQ(0, lifetime_observer.activated_count());
+
+ // Showing the window causes the shim to launch.
+ {
+ base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+ [[WindowedNSNotificationObserver alloc]
+ initForNotification:NSWorkspaceDidLaunchApplicationNotification
+ andBundleId:bundle_id]);
+ WindowedAppShimLaunchObserver observer(app->id());
+ window_1->Show(extensions::AppWindow::SHOW_INACTIVE);
+ [ns_observer wait];
+ observer.Wait();
+ EXPECT_EQ(1, lifetime_observer.activated_count());
+ EXPECT_TRUE(HasAppShimHost(profile(), app->id()));
+ }
+
+ // Hiding the window causes the shim to quit.
+ {
+ base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+ [[WindowedNSNotificationObserver alloc]
+ initForNotification:NSWorkspaceDidTerminateApplicationNotification
+ andBundleId:bundle_id]);
+ window_1->Hide();
+ [ns_observer wait];
+ EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
+ }
+
+ // Launch a second window. It should not launch the shim.
+ {
+ ExtensionTestMessageListener launched_listener("Launched", false);
+ LaunchPlatformApp(app);
+ EXPECT_TRUE(launched_listener.WaitUntilSatisfied());
+ }
+ const extensions::AppWindowRegistry::AppWindowList& app_windows =
+ extensions::AppWindowRegistry::Get(profile())->app_windows();
+ EXPECT_EQ(2u, app_windows.size());
+ extensions::AppWindow* window_2 = app_windows.front();
+ EXPECT_NE(window_1, window_2);
+ ASSERT_TRUE(window_2);
+ EXPECT_TRUE(window_2->is_hidden());
+ EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
+ EXPECT_EQ(1, lifetime_observer.activated_count());
+
+ // Showing one of the windows should launch the shim.
+ {
+ base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+ [[WindowedNSNotificationObserver alloc]
+ initForNotification:NSWorkspaceDidLaunchApplicationNotification
+ andBundleId:bundle_id]);
+ WindowedAppShimLaunchObserver observer(app->id());
+ window_1->Show(extensions::AppWindow::SHOW_INACTIVE);
+ [ns_observer wait];
+ observer.Wait();
+ EXPECT_EQ(2, lifetime_observer.activated_count());
+ EXPECT_TRUE(HasAppShimHost(profile(), app->id()));
+ EXPECT_TRUE(window_2->is_hidden());
+ }
+
+ // Showing the other window does nothing.
+ {
+ window_2->Show(extensions::AppWindow::SHOW_INACTIVE);
+ EXPECT_EQ(2, lifetime_observer.activated_count());
+ }
+
+ // Showing an already visible window does nothing.
+ {
+ window_1->Show(extensions::AppWindow::SHOW_INACTIVE);
+ EXPECT_EQ(2, lifetime_observer.activated_count());
+ }
+
+ // Hiding one window does nothing.
+ {
+ AppLifetimeMonitorObserver deactivate_observer(profile());
+ window_1->Hide();
+ EXPECT_EQ(0, deactivate_observer.deactivated_count());
+ }
+
+ // Hiding other window causes the shim to quit.
+ {
+ AppLifetimeMonitorObserver deactivate_observer(profile());
+ EXPECT_TRUE(HasAppShimHost(profile(), app->id()));
+ base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+ [[WindowedNSNotificationObserver alloc]
+ initForNotification:NSWorkspaceDidTerminateApplicationNotification
+ andBundleId:bundle_id]);
+ window_2->Hide();
+ [ns_observer wait];
+ EXPECT_EQ(1, deactivate_observer.deactivated_count());
+ EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
+ }
+}
+
#if defined(ARCH_CPU_64_BITS)
// Tests that a 32 bit shim attempting to launch 64 bit Chrome will eventually
diff --git a/chrome/browser/chromeos/input_method/input_method_util.cc b/chrome/browser/chromeos/input_method/input_method_util.cc
index b3dd7f6..b776986 100644
--- a/chrome/browser/chromeos/input_method/input_method_util.cc
+++ b/chrome/browser/chromeos/input_method/input_method_util.cc
@@ -58,17 +58,19 @@
// GetFirstLogingInputMethodIds may miss component extension IMEs. To enable
// component extension IME as the first loging input method, we have to prepare
// component extension IME IDs.
+// Note: empty layout means the rule applies for all layouts.
const struct {
const char* locale;
const char* layout;
const char* engine_id;
} kDefaultInputMethodRecommendation[] = {
- { "ja", "us", "nacl_mozc_us" },
{ "ja", "jp", "nacl_mozc_jp" },
- { "zh-CN", "us", "zh-t-i0-pinyin" },
- { "zh-TW", "us", "zh-hant-t-i0-und" },
- { "th", "us", "vkd_th" },
- { "vi", "us", "vkd_vi_tcvn" },
+ { "ja", "", "nacl_mozc_us" },
+ { "zh-CN", "", "zh-t-i0-pinyin" },
+ { "zh-TW", "", "zh-hant-t-i0-und" },
+ { "th", "", "vkd_th" },
+ { "vi", "", "vkd_vi_tcvn" },
+ { "ru", "", "xkb:ru::rus" },
};
// The engine ID map for migration. This migration is for input method IDs from
@@ -387,8 +389,9 @@
= current_input_method.GetPreferredKeyboardLayout();
for (size_t i = 0; i < arraysize(kDefaultInputMethodRecommendation);
++i) {
- if (kDefaultInputMethodRecommendation[i].locale == language_code &&
- kDefaultInputMethodRecommendation[i].layout == current_layout) {
+ if (kDefaultInputMethodRecommendation[i].locale == language_code && (
+ !kDefaultInputMethodRecommendation[i].layout[0] ||
+ kDefaultInputMethodRecommendation[i].layout == current_layout)) {
out_input_method_ids->push_back(
extension_ime_util::GetInputMethodIDByEngineID(
kDefaultInputMethodRecommendation[i].engine_id));
diff --git a/chrome/browser/chromeos/login/reset_browsertest.cc b/chrome/browser/chromeos/login/reset_browsertest.cc
index 79a8552..7c79a9c 100644
--- a/chrome/browser/chromeos/login/reset_browsertest.cc
+++ b/chrome/browser/chromeos/login/reset_browsertest.cc
@@ -312,4 +312,26 @@
OobeScreenWaiter(OobeDisplay::SCREEN_ERROR_MESSAGE).Wait();
}
+IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RevertAfterCancel) {
+ PrefService* prefs = g_browser_process->local_state();
+ prefs->SetBoolean(prefs::kFactoryResetRequested, true);
+ RegisterSomeUser();
+}
+
+IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RevertAfterCancel) {
+ update_engine_client_->set_can_rollback_check_result(true);
+ OobeScreenWaiter(OobeDisplay::SCREEN_OOBE_RESET).Wait();
+ EXPECT_EQ(0, power_manager_client_->num_request_restart_calls());
+ EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count());
+ EXPECT_EQ(0, update_engine_client_->rollback_call_count());
+ JSExpect("!$('reset').classList.contains('rollback-proposal-view')");
+ InvokeRollbackOption();
+ JSExpect("$('reset').classList.contains('rollback-proposal-view')");
+ CloseResetScreen();
+ InvokeResetScreen();
+ OobeScreenWaiter(OobeDisplay::SCREEN_OOBE_RESET).Wait();
+ InvokeRollbackOption();
+ JSExpect("$('reset').classList.contains('rollback-proposal-view')");
+}
+
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc
index 514f2f2..40fa984 100644
--- a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc
+++ b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc
@@ -27,6 +27,8 @@
#include "chrome/browser/supervised_user/supervised_user_sync_service.h"
#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h"
#include "chrome/grit/generated_resources.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/session_manager_client.h"
#include "chromeos/login/auth/key.h"
#include "chromeos/login/auth/user_context.h"
#include "chromeos/network/network_state.h"
@@ -202,10 +204,16 @@
}
void SupervisedUserCreationScreen::AbortFlow() {
+ DBusThreadManager::Get()
+ ->GetSessionManagerClient()
+ ->NotifySupervisedUserCreationFinished();
controller_->CancelCreation();
}
void SupervisedUserCreationScreen::FinishFlow() {
+ DBusThreadManager::Get()
+ ->GetSessionManagerClient()
+ ->NotifySupervisedUserCreationFinished();
controller_->FinishCreation();
}
@@ -358,6 +366,9 @@
void SupervisedUserCreationScreen::OnManagerFullyAuthenticated(
Profile* manager_profile) {
+ DBusThreadManager::Get()
+ ->GetSessionManagerClient()
+ ->NotifySupervisedUserCreationStarted();
manager_signin_in_progress_ = false;
DCHECK(controller_.get());
// For manager user, move desktop to locked container so that windows created
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
index f30a5fa..1912712 100644
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
@@ -157,7 +157,6 @@
profile_(profile),
waiting_for_profile_creation_(true),
waiting_for_tpm_token_(true),
- has_pending_changes_(false),
weak_factory_(this),
store_settings_factory_(this) {
if (TPMTokenLoader::IsInitialized()) {
@@ -180,8 +179,6 @@
registrar_.Add(this,
chrome::NOTIFICATION_PROFILE_CREATED,
content::Source<Profile>(profile_));
-
- UpdateFromService();
}
OwnerSettingsServiceChromeOS::~OwnerSettingsServiceChromeOS() {
@@ -215,15 +212,23 @@
if (!IsOwner() && !IsOwnerInTests(user_id_))
return false;
- UpdateDeviceSettings(setting, value, device_settings_);
+ pending_changes_.add(setting, make_scoped_ptr(value.DeepCopy()));
+
+ em::ChromeDeviceSettingsProto settings;
+ if (tentative_settings_.get()) {
+ settings = *tentative_settings_;
+ } else if (device_settings_service_->status() ==
+ DeviceSettingsService::STORE_SUCCESS &&
+ device_settings_service_->device_settings()) {
+ settings = *device_settings_service_->device_settings();
+ }
+ UpdateDeviceSettings(setting, value, settings);
em::PolicyData policy_data;
policy_data.set_username(user_id_);
- CHECK(device_settings_.SerializeToString(policy_data.mutable_policy_value()));
- FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
- observers_,
+ CHECK(settings.SerializeToString(policy_data.mutable_policy_value()));
+ FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_,
OnTentativeChangesInPolicy(policy_data));
- has_pending_changes_ = true;
- StoreDeviceSettings();
+ StorePendingChanges();
return true;
}
@@ -236,12 +241,9 @@
<< user_id_;
return false;
}
- CHECK(device_settings_.ParseFromString(policy->policy_value()));
- FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
- observers_,
- OnTentativeChangesInPolicy(*policy));
- has_pending_changes_ = true;
- StoreDeviceSettings();
+ tentative_settings_.reset(new em::ChromeDeviceSettingsProto);
+ CHECK(tentative_settings_->ParseFromString(policy->policy_value()));
+ StorePendingChanges();
return true;
}
@@ -273,12 +275,12 @@
void OwnerSettingsServiceChromeOS::OwnershipStatusChanged() {
DCHECK(thread_checker_.CalledOnValidThread());
- StoreDeviceSettings();
+ StorePendingChanges();
}
void OwnerSettingsServiceChromeOS::DeviceSettingsUpdated() {
DCHECK(thread_checker_.CalledOnValidThread());
- StoreDeviceSettings();
+ StorePendingChanges();
}
void OwnerSettingsServiceChromeOS::OnDeviceSettingsServiceShutdown() {
@@ -586,17 +588,32 @@
callback));
}
-void OwnerSettingsServiceChromeOS::StoreDeviceSettings() {
- if (!has_pending_changes_ || store_settings_factory_.HasWeakPtrs())
+void OwnerSettingsServiceChromeOS::StorePendingChanges() {
+ if (!has_pending_changes() || store_settings_factory_.HasWeakPtrs() ||
+ !device_settings_service_) {
return;
- if (!UpdateFromService())
+ }
+
+ em::ChromeDeviceSettingsProto settings;
+ if (tentative_settings_.get()) {
+ settings.Swap(tentative_settings_.get());
+ tentative_settings_.reset();
+ } else if (device_settings_service_->status() ==
+ DeviceSettingsService::STORE_SUCCESS &&
+ device_settings_service_->device_settings()) {
+ settings = *device_settings_service_->device_settings();
+ } else {
return;
+ }
+
+ for (const auto& change : pending_changes_)
+ UpdateDeviceSettings(change.first, *change.second, settings);
+ pending_changes_.clear();
+
scoped_ptr<em::PolicyData> policy = AssemblePolicy(
- user_id_, device_settings_service_->policy_data(), &device_settings_);
- has_pending_changes_ = false;
+ user_id_, device_settings_service_->policy_data(), &settings);
bool rv = AssembleAndSignPolicyAsync(
- content::BrowserThread::GetBlockingPool(),
- policy.Pass(),
+ content::BrowserThread::GetBlockingPool(), policy.Pass(),
base::Bind(&OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned,
store_settings_factory_.GetWeakPtr()));
if (!rv)
@@ -621,23 +638,7 @@
FOR_EACH_OBSERVER(OwnerSettingsService::Observer,
observers_,
OnSignedPolicyStored(success));
- StoreDeviceSettings();
- if (!success)
- has_pending_changes_ = true;
-}
-
-bool OwnerSettingsServiceChromeOS::UpdateFromService() {
- if (!device_settings_service_ ||
- device_settings_service_->status() !=
- DeviceSettingsService::STORE_SUCCESS ||
- !device_settings_service_->device_settings()) {
- return false;
- }
- enterprise_management::ChromeDeviceSettingsProto settings =
- *device_settings_service_->device_settings();
- settings.MergeFrom(device_settings_);
- device_settings_.Swap(&settings);
- return true;
+ StorePendingChanges();
}
} // namespace chromeos
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h
index 6b24bfe..1e6415f 100644
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h
@@ -9,7 +9,9 @@
#include <vector>
#include "base/callback_forward.h"
+#include "base/containers/scoped_ptr_hash_map.h"
#include "base/macros.h"
+#include "base/values.h"
#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
#include "chromeos/dbus/session_manager_client.h"
@@ -83,7 +85,9 @@
const base::Value& value,
enterprise_management::ChromeDeviceSettingsProto& settings);
- bool has_pending_changes() const { return has_pending_changes_; }
+ bool has_pending_changes() const {
+ return !pending_changes_.empty() || tentative_settings_.get();
+ }
private:
friend class OwnerSettingsServiceChromeOSFactory;
@@ -104,10 +108,8 @@
// Possibly notifies DeviceSettingsService that owner's keypair is loaded.
virtual void OnPostKeypairLoadedActions() override;
- // Tries to sign store current device settings if there're pending
- // changes in device settings and no active previous call to
- // DeviceSettingsService::Store().
- void StoreDeviceSettings();
+ // Tries to apply recent changes to device settings proto, sign it and store.
+ void StorePendingChanges();
// Called when current device settings are successfully signed.
// Sends signed settings for storage.
@@ -119,10 +121,6 @@
// settings again.
void OnSignedPolicyStored(bool success);
- // Fetches device settings from DeviceSettingsService and merges
- // them with local device settings.
- bool UpdateFromService();
-
DeviceSettingsService* device_settings_service_;
// Profile this service instance belongs to.
@@ -137,15 +135,12 @@
// Whether TPM token still needs to be initialized.
bool waiting_for_tpm_token_;
- // The device settings. This may be different from the actual
- // current device settings (which can be obtained from
- // DeviceSettingsService) in case the device does not have an owner
- // yet or there are pending changes that have not yet been written
- // to session_manager.
- enterprise_management::ChromeDeviceSettingsProto device_settings_;
+ // A set of pending changes to device settings.
+ base::ScopedPtrHashMap<std::string, base::Value> pending_changes_;
- // True if some settings were changed but not stored.
- bool has_pending_changes_;
+ // A protobuf containing pending changes to device settings.
+ scoped_ptr<enterprise_management::ChromeDeviceSettingsProto>
+ tentative_settings_;
content::NotificationRegistrar registrar_;
diff --git a/chrome/browser/chromeos/settings/device_settings_test_helper.cc b/chrome/browser/chromeos/settings/device_settings_test_helper.cc
index fed7034..537c3bf 100644
--- a/chrome/browser/chromeos/settings/device_settings_test_helper.cc
+++ b/chrome/browser/chromeos/settings/device_settings_test_helper.cc
@@ -113,6 +113,10 @@
void DeviceSettingsTestHelper::StopSession() {}
+void DeviceSettingsTestHelper::NotifySupervisedUserCreationStarted() {}
+
+void DeviceSettingsTestHelper::NotifySupervisedUserCreationFinished() {}
+
void DeviceSettingsTestHelper::StartDeviceWipe() {}
void DeviceSettingsTestHelper::RequestLockScreen() {}
diff --git a/chrome/browser/chromeos/settings/device_settings_test_helper.h b/chrome/browser/chromeos/settings/device_settings_test_helper.h
index 8100563..a3edc72 100644
--- a/chrome/browser/chromeos/settings/device_settings_test_helper.h
+++ b/chrome/browser/chromeos/settings/device_settings_test_helper.h
@@ -92,6 +92,8 @@
virtual void RestartJob(int pid, const std::string& command_line) override;
virtual void StartSession(const std::string& user_email) override;
virtual void StopSession() override;
+ virtual void NotifySupervisedUserCreationStarted() override;
+ virtual void NotifySupervisedUserCreationFinished() override;
virtual void StartDeviceWipe() override;
virtual void RequestLockScreen() override;
virtual void NotifyLockScreenShown() override;
diff --git a/chrome/browser/component_updater/recovery_component_installer.cc b/chrome/browser/component_updater/recovery_component_installer.cc
index f6b5727..897230e 100644
--- a/chrome/browser/component_updater/recovery_component_installer.cc
+++ b/chrome/browser/component_updater/recovery_component_installer.cc
@@ -120,6 +120,11 @@
base::FilePath path;
if (!PathService::Get(DIR_RECOVERY_BASE, &path))
return false;
+ if (!base::PathExists(path)) {
+ if (!base::CreateDirectory(path)) {
+ return false;
+ }
+ }
path = path.AppendASCII(version.GetString());
if (base::PathExists(path) && !base::DeleteFile(path, true))
return false;
diff --git a/chrome/browser/extensions/api/copresence/copresence_api_unittest.cc b/chrome/browser/extensions/api/copresence/copresence_api_unittest.cc
index 6463c26..4a7f536 100644
--- a/chrome/browser/extensions/api/copresence/copresence_api_unittest.cc
+++ b/chrome/browser/extensions/api/copresence/copresence_api_unittest.cc
@@ -218,6 +218,21 @@
.token_exchange_strategy().broadcast_scan_configuration());
}
+TEST_F(CopresenceApiUnittest, LowPowerStrategy) {
+ scoped_ptr<Operation> subscribe_operation(new Operation);
+ subscribe_operation->subscribe.reset(CreateSubscribe("sub"));
+ subscribe_operation->subscribe->strategies.reset(new Strategy);
+ subscribe_operation->subscribe->strategies->low_power.reset(new bool(true));
+
+ ListValue* operation_list = new ListValue;
+ operation_list->Append(subscribe_operation->ToValue().release());
+ EXPECT_TRUE(ExecuteOperations(operation_list));
+
+ EXPECT_EQ(copresence::BROADCAST_SCAN_CONFIGURATION_UNKNOWN,
+ request_sent().manage_subscriptions_request().subscription(0)
+ .token_exchange_strategy().broadcast_scan_configuration());
+}
+
TEST_F(CopresenceApiUnittest, UnPubSub) {
// First we need to create a publish and a subscribe to cancel.
scoped_ptr<Operation> publish_operation(new Operation);
diff --git a/chrome/browser/extensions/api/copresence/copresence_translations.cc b/chrome/browser/extensions/api/copresence/copresence_translations.cc
index 57395d4..d00df3f 100644
--- a/chrome/browser/extensions/api/copresence/copresence_translations.cc
+++ b/chrome/browser/extensions/api/copresence/copresence_translations.cc
@@ -34,9 +34,6 @@
}
BroadcastScanConfiguration TranslateStrategy(const Strategy& strategy) {
- if (strategy.low_power && *strategy.low_power)
- return BROADCAST_SCAN_CONFIGURATION_UNKNOWN;
-
bool only_broadcast = strategy.only_broadcast && *strategy.only_broadcast;
bool only_scan = strategy.only_scan && *strategy.only_scan;
@@ -55,10 +52,16 @@
BroadcastScanConfiguration default_config,
TokenExchangeStrategy* strategy_proto) {
if (strategy) {
- BroadcastScanConfiguration config = TranslateStrategy(*strategy);
- strategy_proto->set_broadcast_scan_configuration(
- config == BROADCAST_SCAN_CONFIGURATION_UNKNOWN ?
- default_config : config);
+ BroadcastScanConfiguration config;
+ if (strategy->low_power && *(strategy->low_power)) {
+ config = BROADCAST_SCAN_CONFIGURATION_UNKNOWN;
+ } else {
+ config = TranslateStrategy(*strategy);
+ if (config == BROADCAST_SCAN_CONFIGURATION_UNKNOWN)
+ config = default_config;
+ }
+
+ strategy_proto->set_broadcast_scan_configuration(config);
strategy_proto->set_audio_configuration(
strategy->audible && *strategy->audible ? AUDIO_CONFIGURATION_AUDIBLE
: AUDIO_CONFIGURATION_UNKNOWN);
diff --git a/chrome/browser/favicon/favicon_handler.cc b/chrome/browser/favicon/favicon_handler.cc
index acccc57..a1bbe17 100644
--- a/chrome/browser/favicon/favicon_handler.cc
+++ b/chrome/browser/favicon/favicon_handler.cc
@@ -352,7 +352,8 @@
if (PageChangedSinceFaviconWasRequested() || !current_candidate())
return;
- if (current_candidate()->icon_type == favicon_base::FAVICON) {
+ if (current_candidate()->icon_type == favicon_base::FAVICON &&
+ !download_largest_icon_) {
if (!favicon_expired_or_incomplete_ &&
driver_->GetActiveFaviconValidity() &&
DoUrlAndIconMatch(*current_candidate(),
@@ -538,7 +539,7 @@
bool has_valid_result = HasValidResult(favicon_bitmap_results);
if (has_results && icon_types_ == favicon_base::FAVICON &&
- !driver_->GetActiveFaviconValidity() &&
+ !download_largest_icon_ && !driver_->GetActiveFaviconValidity() &&
(!current_candidate() ||
DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) {
if (has_valid_result) {
@@ -546,7 +547,7 @@
// doesn't have an icon. Set the favicon now, and if the favicon turns out
// to be expired (or the wrong url) we'll fetch later on. This way the
// user doesn't see a flash of the default favicon.
- NotifyFaviconAvailable(favicon_bitmap_results, !download_largest_icon_);
+ NotifyFaviconAvailable(favicon_bitmap_results, true);
} else {
// If |favicon_bitmap_results| does not have any valid results, treat the
// favicon as if it's expired.
@@ -575,7 +576,8 @@
// else we haven't got the icon url. When we get it we'll ask the
// renderer to download the icon.
- if (has_valid_result && icon_types_ != favicon_base::FAVICON)
+ if (has_valid_result &&
+ (icon_types_ != favicon_base::FAVICON || download_largest_icon_))
NotifyFaviconAvailable(favicon_bitmap_results, false);
}
@@ -619,12 +621,13 @@
preferred_icon_size(), favicon_bitmap_results);
bool has_valid_result = HasValidResult(favicon_bitmap_results);
- if (has_results && icon_types_ == favicon_base::FAVICON) {
+ if (has_results && icon_types_ == favicon_base::FAVICON &&
+ !download_largest_icon_) {
if (has_valid_result) {
// There is a favicon, set it now. If expired we'll download the current
// one again, but at least the user will get some icon instead of the
// default and most likely the current one is fine anyway.
- NotifyFaviconAvailable(favicon_bitmap_results, !download_largest_icon_);
+ NotifyFaviconAvailable(favicon_bitmap_results, true);
}
if (has_expired_or_incomplete_result) {
// The favicon is out of date. Request the current one.
@@ -643,8 +646,10 @@
}
history_results_ = favicon_bitmap_results;
- if (has_valid_result && icon_types_ != favicon_base::FAVICON)
+ if (has_valid_result &&
+ (icon_types_ != favicon_base::FAVICON || download_largest_icon_)) {
NotifyFaviconAvailable(favicon_bitmap_results, false);
+ }
}
int FaviconHandler::ScheduleDownload(const GURL& url,
diff --git a/chrome/browser/favicon/favicon_handler_unittest.cc b/chrome/browser/favicon/favicon_handler_unittest.cc
index 266d1a8..5649f6f 100644
--- a/chrome/browser/favicon/favicon_handler_unittest.cc
+++ b/chrome/browser/favicon/favicon_handler_unittest.cc
@@ -191,6 +191,7 @@
public:
TestFaviconDriver()
: favicon_validity_(false),
+ num_active_favicon_(0),
num_favicon_available_(0),
update_active_favicon_(false) {}
@@ -224,20 +225,22 @@
void OnFaviconAvailable(const gfx::Image& image,
const GURL& icon_url,
bool update_active_favicon) override {
+ ++num_favicon_available_;
available_image_ = image;
available_icon_url_ = icon_url;
update_active_favicon_ = update_active_favicon;
if (!update_active_favicon)
return;
- ++num_favicon_available_;
+ ++num_active_favicon_;
SetActiveFaviconURL(icon_url);
SetActiveFaviconValidity(true);
SetActiveFaviconImage(image);
}
+ size_t num_active_favicon() const { return num_active_favicon_; }
size_t num_favicon_available() const { return num_favicon_available_; }
-
+ void ResetNumActiveFavicon() { num_active_favicon_ = 0; }
void ResetNumFaviconAvailable() { num_favicon_available_ = 0; }
void SetActiveURL(GURL url) { url_ = url; }
@@ -254,6 +257,9 @@
gfx::Image image_;
bool favicon_validity_;
+ // The number of times that NotifyFaviconAvailable() has been called with
+ // |is_active_favicon| is true.
+ size_t num_active_favicon_;
// The number of times that NotifyFaviconAvailable() has been called.
size_t num_favicon_available_;
gfx::Image available_image_;
@@ -443,7 +449,7 @@
download_handler->SetImageSizes(sizes);
download_handler->InvokeCallback();
- if (favicon_driver->num_favicon_available())
+ if (favicon_driver->num_active_favicon())
return;
}
}
@@ -452,7 +458,7 @@
TestFaviconHandler* favicon_handler,
const GURL& page_url,
const std::vector<FaviconURL>& candidate_icons) {
- favicon_driver->ResetNumFaviconAvailable();
+ favicon_driver->ResetNumActiveFavicon();
favicon_handler->FetchFavicon(page_url);
favicon_handler->history_handler()->InvokeCallback();
@@ -1570,4 +1576,86 @@
EXPECT_FALSE(favicon_service->WasUnableToDownloadFavicon(missing_icon_url));
}
+class FaviconHandlerActiveFaviconValidityParamTest :
+ public FaviconHandlerTest,
+ public ::testing::WithParamInterface<bool> {
+ public:
+ FaviconHandlerActiveFaviconValidityParamTest() {}
+
+ ~FaviconHandlerActiveFaviconValidityParamTest() override {}
+
+ bool GetActiveFaviconValiditySetting() {
+ return GetParam();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FaviconHandlerActiveFaviconValidityParamTest);
+};
+
+TEST_P(FaviconHandlerActiveFaviconValidityParamTest,
+ TestDownloadLargestIconDoesNotImpactActiveFaviconValidity) {
+ const GURL page_url("http://www.google.com");
+
+ std::vector<gfx::Size> one_icon;
+ one_icon.push_back(gfx::Size(15, 15));
+
+ const GURL old_favicon_url("http://www.google.com/old");
+ const GURL new_favicon_url("http://www.google.com/b");
+ const FaviconURL source_icon_urls[] = {
+ FaviconURL(new_favicon_url, favicon_base::FAVICON, one_icon)};
+ TestFaviconClient client;
+ TestFaviconDriver driver1;
+ TestFaviconHandler handler1(
+ page_url, &client, &driver1, FaviconHandler::FAVICON, true);
+ std::vector<FaviconURL> urls1(source_icon_urls,
+ source_icon_urls + arraysize(source_icon_urls));
+ UpdateFaviconURL(&driver1, &handler1, page_url, urls1);
+
+ HistoryRequestHandler* history_handler = handler1.history_handler();
+
+ // Simulate the active favicon is updated, this shouldn't happen in real
+ // use case, but we want to verify the behavior below is not impacted by
+ // accident.
+ driver1.SetActiveFaviconValidity(GetActiveFaviconValiditySetting());
+ // Simulate the get favicon from history, but favicon URL didn't match.
+ SetFaviconRawBitmapResult(old_favicon_url,
+ &history_handler->history_results_);
+ history_handler->InvokeCallback();
+ // Since we downloaded largest icon, and don't want to set active favicon
+ // NotifyFaviconAvaliable() should be called with is_active_favicon as false.
+ EXPECT_EQ(old_favicon_url, driver1.available_icon_url());
+ EXPECT_FALSE(driver1.update_active_favicon());
+ EXPECT_EQ(1u, driver1.num_favicon_available());
+
+ // We are trying to get favicon from history again.
+ history_handler = handler1.history_handler();
+ EXPECT_EQ(new_favicon_url, history_handler->icon_url_);
+ // Simulate the get expired favicon from history.
+ history_handler->history_results_.clear();
+ SetFaviconRawBitmapResult(new_favicon_url, favicon_base::FAVICON, true,
+ &history_handler->history_results_);
+ history_handler->InvokeCallback();
+ // Since we downloaded largest icon, and don't want to set active favicon
+ // NotifyFaviconAvaliable() should be called with is_active_favicon as false.
+ EXPECT_EQ(new_favicon_url, driver1.available_icon_url());
+ EXPECT_FALSE(driver1.update_active_favicon());
+ EXPECT_EQ(2u, driver1.num_favicon_available());
+
+ // We are trying to download favicon.
+ DownloadHandler* download_handler = handler1.download_handler();
+ EXPECT_TRUE(download_handler->HasDownload());
+ EXPECT_EQ(new_favicon_url, download_handler->GetImageUrl());
+ // Simulate the download succeed.
+ download_handler->InvokeCallback();
+ // Since we downloaded largest icon, and don't want to set active favicon
+ // NotifyFaviconAvaliable() should be called with is_active_favicon as false.
+ EXPECT_EQ(new_favicon_url, driver1.available_icon_url());
+ EXPECT_FALSE(driver1.update_active_favicon());
+ EXPECT_EQ(3u, driver1.num_favicon_available());
+}
+
+INSTANTIATE_TEST_CASE_P(FaviconHandlerTestActiveFaviconValidityTrueOrFalse,
+ FaviconHandlerActiveFaviconValidityParamTest,
+ ::testing::Bool());
+
} // namespace.
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 56bac85..6ea64ff 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -65,6 +65,7 @@
#include "chrome/browser/ui/browser_ui_prefs.h"
#include "chrome/browser/ui/navigation_correction_tab_observer.h"
#include "chrome/browser/ui/network_profile_bubble.h"
+#include "chrome/browser/ui/passwords/password_bubble_experiment.h"
#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
#include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
#include "chrome/browser/ui/startup/autolaunch_prompt.h"
@@ -407,6 +408,7 @@
MediaStreamDevicesController::RegisterProfilePrefs(registry);
NetPrefObserver::RegisterProfilePrefs(registry);
password_manager::PasswordManager::RegisterProfilePrefs(registry);
+ password_bubble_experiment::RegisterPrefs(registry);
PrefProxyConfigTrackerImpl::RegisterProfilePrefs(registry);
PrefsTabHelper::RegisterProfilePrefs(registry);
Profile::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/resources/chromeos/genius_app/manifest.json b/chrome/browser/resources/chromeos/genius_app/manifest.json
index 2f663e0..84f38e9 100644
--- a/chrome/browser/resources/chromeos/genius_app/manifest.json
+++ b/chrome/browser/resources/chromeos/genius_app/manifest.json
@@ -6,6 +6,7 @@
"version": "0.2",
"minimum_chrome_version": "28",
"default_locale": "en",
+ "incognito" : "split",
"icons": {
"16": "icon/16.png",
"32": "icon/32.png",
diff --git a/chrome/browser/safe_browsing/database_manager.cc b/chrome/browser/safe_browsing/database_manager.cc
index 94b2c76..e0c634b 100644
--- a/chrome/browser/safe_browsing/database_manager.cc
+++ b/chrome/browser/safe_browsing/database_manager.cc
@@ -67,26 +67,50 @@
threat_type);
}
-// Return the list id from the first result in |full_hashes| which matches
+// Return the severest list id from the results in |full_hashes| which matches
// |hash|, or INVALID if none match.
-safe_browsing_util::ListType GetHashThreatListType(
+safe_browsing_util::ListType GetHashSeverestThreatListType(
const SBFullHash& hash,
const std::vector<SBFullHashResult>& full_hashes,
size_t* index) {
+ safe_browsing_util::ListType pending_threat = safe_browsing_util::INVALID;
for (size_t i = 0; i < full_hashes.size(); ++i) {
if (SBFullHashEqual(hash, full_hashes[i].hash)) {
- if (index)
- *index = i;
- return static_cast<safe_browsing_util::ListType>(full_hashes[i].list_id);
+ const safe_browsing_util::ListType threat =
+ static_cast<safe_browsing_util::ListType>(full_hashes[i].list_id);
+ switch (threat) {
+ case safe_browsing_util::INVALID:
+ // |full_hashes| should never contain INVALID as a |list_id|.
+ NOTREACHED();
+ break;
+ case safe_browsing_util::MALWARE: // Falls through.
+ case safe_browsing_util::PHISH: // Falls through.
+ case safe_browsing_util::BINURL: // Falls through.
+ case safe_browsing_util::CSDWHITELIST: // Falls through.
+ case safe_browsing_util::DOWNLOADWHITELIST: // Falls through.
+ case safe_browsing_util::EXTENSIONBLACKLIST: // Falls through.
+ case safe_browsing_util::SIDEEFFECTFREEWHITELIST: // Falls through.
+ case safe_browsing_util::IPBLACKLIST:
+ if (index)
+ *index = i;
+ return threat;
+ case safe_browsing_util::UNWANTEDURL:
+ // UNWANTEDURL is considered less severe than other threats, keep
+ // looking.
+ pending_threat = threat;
+ if (index)
+ *index = i;
+ break;
+ }
}
}
- return safe_browsing_util::INVALID;
+ return pending_threat;
}
// Given a URL, compare all the possible host + path full hashes to the set of
-// provided full hashes. Returns the list id of the a matching result from
-// |full_hashes|, or INVALID if none match.
-safe_browsing_util::ListType GetUrlThreatListType(
+// provided full hashes. Returns the list id of the severest matching result
+// from |full_hashes|, or INVALID if none match.
+safe_browsing_util::ListType GetUrlSeverestThreatListType(
const GURL& url,
const std::vector<SBFullHashResult>& full_hashes,
size_t* index) {
@@ -96,13 +120,31 @@
std::vector<std::string> patterns;
safe_browsing_util::GeneratePatternsToCheck(url, &patterns);
+ safe_browsing_util::ListType pending_threat = safe_browsing_util::INVALID;
for (size_t i = 0; i < patterns.size(); ++i) {
- safe_browsing_util::ListType threat = GetHashThreatListType(
+ safe_browsing_util::ListType threat = GetHashSeverestThreatListType(
SBFullHashForString(patterns[i]), full_hashes, index);
- if (threat != safe_browsing_util::INVALID)
- return threat;
+ switch (threat) {
+ case safe_browsing_util::INVALID:
+ // Ignore patterns with no matching threat.
+ break;
+ case safe_browsing_util::MALWARE: // Falls through.
+ case safe_browsing_util::PHISH: // Falls through.
+ case safe_browsing_util::BINURL: // Falls through.
+ case safe_browsing_util::CSDWHITELIST: // Falls through.
+ case safe_browsing_util::DOWNLOADWHITELIST: // Falls through.
+ case safe_browsing_util::EXTENSIONBLACKLIST: // Falls through.
+ case safe_browsing_util::SIDEEFFECTFREEWHITELIST: // Falls through.
+ case safe_browsing_util::IPBLACKLIST:
+ return threat;
+ case safe_browsing_util::UNWANTEDURL:
+ // UNWANTEDURL is considered less severe than other threats, keep
+ // looking.
+ pending_threat = threat;
+ break;
+ }
}
- return safe_browsing_util::INVALID;
+ return pending_threat;
}
SBThreatType GetThreatTypeFromListType(safe_browsing_util::ListType list_type) {
@@ -111,6 +153,8 @@
return SB_THREAT_TYPE_URL_PHISHING;
case safe_browsing_util::MALWARE:
return SB_THREAT_TYPE_URL_MALWARE;
+ case safe_browsing_util::UNWANTEDURL:
+ return SB_THREAT_TYPE_URL_UNWANTED;
case safe_browsing_util::BINURL:
return SB_THREAT_TYPE_BINARY_MALWARE_URL;
case safe_browsing_util::EXTENSIONBLACKLIST:
@@ -124,20 +168,20 @@
} // namespace
// static
-SBThreatType SafeBrowsingDatabaseManager::GetHashThreatType(
+SBThreatType SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
const SBFullHash& hash,
const std::vector<SBFullHashResult>& full_hashes) {
return GetThreatTypeFromListType(
- GetHashThreatListType(hash, full_hashes, NULL));
+ GetHashSeverestThreatListType(hash, full_hashes, NULL));
}
// static
-SBThreatType SafeBrowsingDatabaseManager::GetUrlThreatType(
+SBThreatType SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
const GURL& url,
const std::vector<SBFullHashResult>& full_hashes,
size_t* index) {
return GetThreatTypeFromListType(
- GetUrlThreatListType(url, full_hashes, index));
+ GetUrlSeverestThreatListType(url, full_hashes, index));
}
SafeBrowsingDatabaseManager::SafeBrowsingCheck::SafeBrowsingCheck(
@@ -170,6 +214,7 @@
switch (check.check_type) {
case safe_browsing_util::MALWARE:
case safe_browsing_util::PHISH:
+ case safe_browsing_util::UNWANTEDURL:
DCHECK_EQ(1u, check.urls.size());
OnCheckBrowseUrlResult(
check.urls[0], check.url_results[0], check.url_metadata[0]);
@@ -216,6 +261,7 @@
enable_extension_blacklist_(false),
enable_side_effect_free_whitelist_(false),
enable_ip_blacklist_(false),
+ enable_unwanted_software_blacklist_(false),
update_in_progress_(false),
database_update_in_progress_(false),
closing_database_(false),
@@ -252,6 +298,10 @@
// phishing protection for now.
enable_ip_blacklist_ = enable_csd_whitelist_;
+ // TODO(gab): Gate this on the same experiment that will soon control the UwS
+ // URL UI.
+ enable_unwanted_software_blacklist_ = true;
+
enum SideEffectFreeWhitelistStatus {
SIDE_EFFECT_FREE_WHITELIST_ENABLED,
SIDE_EFFECT_FREE_WHITELIST_DISABLED,
@@ -408,6 +458,7 @@
std::vector<SBThreatType> expected_threats;
expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE);
expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING);
+ expected_threats.push_back(SB_THREAT_TYPE_URL_UNWANTED);
const base::TimeTicks start = base::TimeTicks::Now();
if (!MakeDatabaseAvailable()) {
@@ -420,19 +471,45 @@
return false;
}
- std::vector<SBPrefix> prefix_hits;
+ // Cache hits should, in general, be the same for both (ignoring potential
+ // cache evictions in the second call for entries that were just about to be
+ // evicted in the first call).
+ // TODO(gab): Refactor SafeBrowsingDatabase to avoid depending on this here.
std::vector<SBFullHashResult> cache_hits;
- bool prefix_match =
- database_->ContainsBrowseUrl(url, &prefix_hits, &cache_hits);
+ std::vector<SBPrefix> browse_prefix_hits;
+ bool browse_prefix_match = database_->ContainsBrowseUrl(
+ url, &browse_prefix_hits, &cache_hits);
+
+ std::vector<SBPrefix> unwanted_prefix_hits;
+ std::vector<SBFullHashResult> unused_cache_hits;
+ bool unwanted_prefix_match = database_->ContainsUnwantedSoftwareUrl(
+ url, &unwanted_prefix_hits, &unused_cache_hits);
+
+ // Merge the two pre-sorted prefix hits lists.
+ // TODO(gab): Refactor SafeBrowsingDatabase for it to return this merged list
+ // by default rather than building it here.
+ std::vector<SBPrefix> prefix_hits(browse_prefix_hits.size() +
+ unwanted_prefix_hits.size());
+ std::merge(browse_prefix_hits.begin(),
+ browse_prefix_hits.end(),
+ unwanted_prefix_hits.begin(),
+ unwanted_prefix_hits.end(),
+ prefix_hits.begin());
+ prefix_hits.erase(std::unique(prefix_hits.begin(), prefix_hits.end()),
+ prefix_hits.end());
UMA_HISTOGRAM_TIMES("SB2.FilterCheck", base::TimeTicks::Now() - start);
- if (!prefix_match)
+ if (!browse_prefix_match && !unwanted_prefix_match)
return true; // URL is okay.
// Needs to be asynchronous, since we could be in the constructor of a
// ResourceDispatcherHost event handler which can't pause there.
+ // This check will ping the Safe Browsing servers and get all lists which it
+ // matches. These lists will then be filtered against the |expected_threats|
+ // and the result callback for MALWARE (which is the same as for PHISH and
+ // UNWANTEDURL) will eventually be invoked with the final decision.
SafeBrowsingCheck* check = new SafeBrowsingCheck(std::vector<GURL>(1, url),
std::vector<SBFullHash>(),
client,
@@ -704,7 +781,8 @@
enable_download_whitelist_,
enable_extension_blacklist_,
enable_side_effect_free_whitelist_,
- enable_ip_blacklist_);
+ enable_ip_blacklist_,
+ enable_unwanted_software_blacklist_);
database->Init(SafeBrowsingService::GetBaseFilename());
{
@@ -770,10 +848,7 @@
} else {
// We may have cached results for previous GetHash queries. Since
// this data comes from cache, don't histogram hits.
- bool is_threat = HandleOneCheck(check, check->cache_hits);
- // cache_hits should only contain hits for a fullhash we searched for, so if
- // we got to this point it should always result in a threat match.
- DCHECK(is_threat);
+ HandleOneCheck(check, check->cache_hits);
}
}
@@ -939,21 +1014,26 @@
bool is_threat = false;
- // TODO(shess): GetHashThreadListType() contains a loop,
- // GetUrlThreatListType() a loop around that loop. Having another loop out
- // here concerns me. It is likely that SAFE is an expected outcome, which
- // means all of those loops run to completion. Refactoring this to generate a
- // set of sorted items to compare in sequence would probably improve things.
+ // TODO(shess): GetHashSeverestThreadListType() contains a loop,
+ // GetUrlSeverestThreatListType() a loop around that loop. Having another
+ // loop out here concerns me. It is likely that SAFE is an expected outcome,
+ // which means all of those loops run to completion. Refactoring this to
+ // generate a set of sorted items to compare in sequence would probably
+ // improve things.
//
// Additionally, the set of patterns generated from the urls is very similar
// to the patterns generated in ContainsBrowseUrl() and other database checks,
// which are called from this code. Refactoring that across the checks could
// interact well with batching the checks here.
+ // TODO(gab): Fix the fact that Get(Url|Hash)SeverestThreatType() may return a
+ // threat for which IsExpectedThreat() returns false even if |full_hashes|
+ // actually contains an expected threat.
+
for (size_t i = 0; i < check->urls.size(); ++i) {
size_t threat_index;
SBThreatType threat =
- GetUrlThreatType(check->urls[i], full_hashes, &threat_index);
+ GetUrlSeverestThreatType(check->urls[i], full_hashes, &threat_index);
if (threat != SB_THREAT_TYPE_SAFE &&
IsExpectedThreat(threat, check->expected_threats)) {
check->url_results[i] = threat;
@@ -963,7 +1043,8 @@
}
for (size_t i = 0; i < check->full_hashes.size(); ++i) {
- SBThreatType threat = GetHashThreatType(check->full_hashes[i], full_hashes);
+ SBThreatType threat =
+ GetHashSeverestThreatType(check->full_hashes[i], full_hashes);
if (threat != SB_THREAT_TYPE_SAFE &&
IsExpectedThreat(threat, check->expected_threats)) {
check->full_hash_results[i] = threat;
diff --git a/chrome/browser/safe_browsing/database_manager.h b/chrome/browser/safe_browsing/database_manager.h
index e001a35..a3e0117 100644
--- a/chrome/browser/safe_browsing/database_manager.h
+++ b/chrome/browser/safe_browsing/database_manager.h
@@ -216,7 +216,8 @@
friend class SafeBrowsingServiceTest;
friend class SafeBrowsingServiceTestHelper;
friend class SafeBrowsingDatabaseManagerTest;
- FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest, GetUrlThreatType);
+ FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest,
+ GetUrlSeverestThreatType);
typedef std::set<SafeBrowsingCheck*> CurrentChecks;
typedef std::vector<SafeBrowsingCheck*> GetHashRequestors;
@@ -237,16 +238,16 @@
base::TimeTicks start; // When check was queued.
};
- // Return the threat type from the first result in |full_hashes| which matches
+ // Return the threat type of the severest entry in |full_hashes| which matches
// |hash|, or SAFE if none match.
- static SBThreatType GetHashThreatType(
+ static SBThreatType GetHashSeverestThreatType(
const SBFullHash& hash,
const std::vector<SBFullHashResult>& full_hashes);
// Given a URL, compare all the possible host + path full hashes to the set of
- // provided full hashes. Returns the threat type of the matching result from
- // |full_hashes|, or SAFE if none match.
- static SBThreatType GetUrlThreatType(
+ // provided full hashes. Returns the threat type of the severest matching
+ // result from |full_hashes|, or SAFE if none match.
+ static SBThreatType GetUrlSeverestThreatType(
const GURL& url,
const std::vector<SBFullHashResult>& full_hashes,
size_t* index);
@@ -389,6 +390,9 @@
// Indicate if the csd malware IP blacklist should be enabled.
bool enable_ip_blacklist_;
+ // Indicate if the unwanted software blacklist should be enabled.
+ bool enable_unwanted_software_blacklist_;
+
// The SafeBrowsing thread that runs database operations.
//
// Note: Functions that run on this thread should run synchronously and return
diff --git a/chrome/browser/safe_browsing/database_manager_unittest.cc b/chrome/browser/safe_browsing/database_manager_unittest.cc
index 915790f..0c8c3a2 100644
--- a/chrome/browser/safe_browsing/database_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/database_manager_unittest.cc
@@ -79,15 +79,21 @@
safe_browsing_util::kMalwareList));
}
-TEST_F(SafeBrowsingDatabaseManagerTest, GetUrlThreatType) {
+TEST_F(SafeBrowsingDatabaseManagerTest, GetUrlSeverestThreatType) {
std::vector<SBFullHashResult> full_hashes;
const GURL kMalwareUrl("http://www.malware.com/page.html");
const GURL kPhishingUrl("http://www.phishing.com/page.html");
+ const GURL kUnwantedUrl("http://www.unwanted.com/page.html");
+ const GURL kUnwantedAndMalwareUrl(
+ "http://www.unwantedandmalware.com/page.html");
const GURL kSafeUrl("http://www.safe.com/page.html");
const SBFullHash kMalwareHostHash = SBFullHashForString("malware.com/");
const SBFullHash kPhishingHostHash = SBFullHashForString("phishing.com/");
+ const SBFullHash kUnwantedHostHash = SBFullHashForString("unwanted.com/");
+ const SBFullHash kUnwantedAndMalwareHostHash =
+ SBFullHashForString("unwantedandmalware.com/");
const SBFullHash kSafeHostHash = SBFullHashForString("www.safe.com/");
{
@@ -104,32 +110,73 @@
full_hashes.push_back(full_hash);
}
+ {
+ SBFullHashResult full_hash;
+ full_hash.hash = kUnwantedHostHash;
+ full_hash.list_id = static_cast<int>(safe_browsing_util::UNWANTEDURL);
+ full_hashes.push_back(full_hash);
+ }
+
+ {
+ // Add both MALWARE and UNWANTEDURL list IDs for
+ // kUnwantedAndMalwareHostHash.
+ SBFullHashResult full_hash_malware;
+ full_hash_malware.hash = kUnwantedAndMalwareHostHash;
+ full_hash_malware.list_id = static_cast<int>(safe_browsing_util::MALWARE);
+ full_hashes.push_back(full_hash_malware);
+
+ SBFullHashResult full_hash_unwanted;
+ full_hash_unwanted.hash = kUnwantedAndMalwareHostHash;
+ full_hash_unwanted.list_id =
+ static_cast<int>(safe_browsing_util::UNWANTEDURL);
+ full_hashes.push_back(full_hash_unwanted);
+ }
+
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE,
- SafeBrowsingDatabaseManager::GetHashThreatType(
+ SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
kMalwareHostHash, full_hashes));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING,
- SafeBrowsingDatabaseManager::GetHashThreatType(
+ SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
kPhishingHostHash, full_hashes));
+ EXPECT_EQ(SB_THREAT_TYPE_URL_UNWANTED,
+ SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
+ kUnwantedHostHash, full_hashes));
+
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE,
+ SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
+ kUnwantedAndMalwareHostHash, full_hashes));
+
EXPECT_EQ(SB_THREAT_TYPE_SAFE,
- SafeBrowsingDatabaseManager::GetHashThreatType(
+ SafeBrowsingDatabaseManager::GetHashSeverestThreatType(
kSafeHostHash, full_hashes));
- size_t index = 100;
+ const size_t kArbitraryValue = 123456U;
+ size_t index = kArbitraryValue;
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE,
- SafeBrowsingDatabaseManager::GetUrlThreatType(
+ SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
kMalwareUrl, full_hashes, &index));
EXPECT_EQ(0U, index);
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING,
- SafeBrowsingDatabaseManager::GetUrlThreatType(
+ SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
kPhishingUrl, full_hashes, &index));
EXPECT_EQ(1U, index);
- index = 100;
+ EXPECT_EQ(SB_THREAT_TYPE_URL_UNWANTED,
+ SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
+ kUnwantedUrl, full_hashes, &index));
+ EXPECT_EQ(2U, index);
+
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE,
+ SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
+ kUnwantedAndMalwareUrl, full_hashes, &index));
+ EXPECT_EQ(3U, index);
+
+ index = kArbitraryValue;
EXPECT_EQ(SB_THREAT_TYPE_SAFE,
- SafeBrowsingDatabaseManager::GetUrlThreatType(
+ SafeBrowsingDatabaseManager::GetUrlSeverestThreatType(
kSafeUrl, full_hashes, &index));
- EXPECT_EQ(100U, index);
+ EXPECT_EQ(kArbitraryValue, index);
}
diff --git a/chrome/browser/safe_browsing/ping_manager.cc b/chrome/browser/safe_browsing/ping_manager.cc
index 92b0329..0478341 100644
--- a/chrome/browser/safe_browsing/ping_manager.cc
+++ b/chrome/browser/safe_browsing/ping_manager.cc
@@ -101,6 +101,7 @@
SBThreatType threat_type) const {
DCHECK(threat_type == SB_THREAT_TYPE_URL_MALWARE ||
threat_type == SB_THREAT_TYPE_URL_PHISHING ||
+ threat_type == SB_THREAT_TYPE_URL_UNWANTED ||
threat_type == SB_THREAT_TYPE_BINARY_MALWARE_URL ||
threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL ||
threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL);
@@ -114,6 +115,9 @@
case SB_THREAT_TYPE_URL_PHISHING:
threat_list = "phishblhit";
break;
+ case SB_THREAT_TYPE_URL_UNWANTED:
+ threat_list = "uwsblhit";
+ break;
case SB_THREAT_TYPE_BINARY_MALWARE_URL:
threat_list = "binurlhit";
break;
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
index 1c47c2c..9c3ca1e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
@@ -173,7 +173,7 @@
if (threat_type == SB_THREAT_TYPE_URL_MALWARE ||
threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) {
malware = true;
- } else if (threat_type == SB_THREAT_TYPE_URL_HARMFUL) {
+ } else if (threat_type == SB_THREAT_TYPE_URL_UNWANTED) {
harmful = true;
} else {
DCHECK(threat_type == SB_THREAT_TYPE_URL_PHISHING ||
@@ -378,9 +378,11 @@
diagnostic_url = google_util::AppendGoogleLocaleParam(
diagnostic_url, g_browser_process->GetApplicationLocale());
DCHECK(unsafe_resources_[element_index].threat_type ==
- SB_THREAT_TYPE_URL_MALWARE ||
+ SB_THREAT_TYPE_URL_MALWARE ||
unsafe_resources_[element_index].threat_type ==
- SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL);
+ SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL ||
+ unsafe_resources_[element_index].threat_type ==
+ SB_THREAT_TYPE_URL_UNWANTED);
OpenURLParams params(
diagnostic_url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_LINK,
false);
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 07c0265..42d0d69 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -634,7 +634,7 @@
return;
#endif
- SetupWarningAndNavigate(SB_THREAT_TYPE_URL_HARMFUL);
+ SetupWarningAndNavigate(SB_THREAT_TYPE_URL_UNWANTED);
EXPECT_EQ(VISIBLE, GetVisibility("primary-button"));
EXPECT_EQ(HIDDEN, GetVisibility("details"));
@@ -661,7 +661,7 @@
}
IN_PROC_BROWSER_TEST_F(SafeBrowsingBlockingPageBrowserTest, HarmfulProceed) {
- GURL url = SetupWarningAndNavigate(SB_THREAT_TYPE_URL_HARMFUL);
+ GURL url = SetupWarningAndNavigate(SB_THREAT_TYPE_URL_UNWANTED);
EXPECT_TRUE(ClickAndWaitForDetach("proceed-link"));
AssertNoInterstitial(true); // Assert the interstitial is gone.
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
index dea4b3c..11b16f3 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -57,6 +57,9 @@
// Filename suffix for the csd malware IP blacklist store.
const base::FilePath::CharType kIPBlacklistDBFile[] =
FILE_PATH_LITERAL(" IP Blacklist");
+// Filename suffix for the unwanted software blacklist store.
+const base::FilePath::CharType kUnwantedSoftwareDBFile[] =
+ FILE_PATH_LITERAL(" UwS List");
// Filename suffix for browse store.
// TODO(shess): "Safe Browsing Bloom Prefix Set" is full of win.
@@ -122,9 +125,9 @@
// does an early exit on match. Since match should be the infrequent
// case (phishing or malware found), consider combining this function
// with that one.
-void BrowseFullHashesToCheck(const GURL& url,
- bool include_whitelist_hashes,
- std::vector<SBFullHash>* full_hashes) {
+void UrlToFullHashes(const GURL& url,
+ bool include_whitelist_hashes,
+ std::vector<SBFullHash>* full_hashes) {
std::vector<std::string> hosts;
if (url.HostIsIPAddress()) {
hosts.push_back(url.host());
@@ -158,7 +161,7 @@
std::vector<SBPrefix>* prefixes) {
std::vector<SBFullHash> full_hashes;
for (size_t i = 0; i < urls.size(); ++i)
- BrowseFullHashesToCheck(urls[i], false, &full_hashes);
+ UrlToFullHashes(urls[i], false, &full_hashes);
for (size_t i = 0; i < full_hashes.size(); ++i)
prefixes->push_back(full_hashes[i].prefix);
@@ -277,7 +280,7 @@
return size_64;
}
-// Helper for ContainsBrowseUrlHashes(). Returns true if an un-expired match
+// Helper for PrefixSetContainsUrlHashes(). Returns true if an un-expired match
// for |full_hash| is found in |cache|, with any matches appended to |results|
// (true can be returned with zero matches). |expire_base| is used to check the
// cache lifetime of matches, expired matches will be discarded from |cache|.
@@ -319,7 +322,8 @@
bool enable_download_whitelist,
bool enable_extension_blacklist,
bool enable_side_effect_free_whitelist,
- bool enable_ip_blacklist) override {
+ bool enable_ip_blacklist,
+ bool enable_unwanted_software_list) override {
return new SafeBrowsingDatabaseNew(
new SafeBrowsingStoreFile,
enable_download_protection ? new SafeBrowsingStoreFile : NULL,
@@ -327,7 +331,8 @@
enable_download_whitelist ? new SafeBrowsingStoreFile : NULL,
enable_extension_blacklist ? new SafeBrowsingStoreFile : NULL,
enable_side_effect_free_whitelist ? new SafeBrowsingStoreFile : NULL,
- enable_ip_blacklist ? new SafeBrowsingStoreFile : NULL);
+ enable_ip_blacklist ? new SafeBrowsingStoreFile : NULL,
+ enable_unwanted_software_list ? new SafeBrowsingStoreFile : NULL);
}
SafeBrowsingDatabaseFactoryImpl() { }
@@ -350,16 +355,17 @@
bool enable_download_whitelist,
bool enable_extension_blacklist,
bool enable_side_effect_free_whitelist,
- bool enable_ip_blacklist) {
+ bool enable_ip_blacklist,
+ bool enable_unwanted_software_list) {
if (!factory_)
factory_ = new SafeBrowsingDatabaseFactoryImpl();
- return factory_->CreateSafeBrowsingDatabase(
- enable_download_protection,
- enable_client_side_whitelist,
- enable_download_whitelist,
- enable_extension_blacklist,
- enable_side_effect_free_whitelist,
- enable_ip_blacklist);
+ return factory_->CreateSafeBrowsingDatabase(enable_download_protection,
+ enable_client_side_whitelist,
+ enable_download_whitelist,
+ enable_extension_blacklist,
+ enable_side_effect_free_whitelist,
+ enable_ip_blacklist,
+ enable_unwanted_software_list);
}
SafeBrowsingDatabase::~SafeBrowsingDatabase() {
@@ -419,6 +425,12 @@
return base::FilePath(db_filename.value() + kIPBlacklistDBFile);
}
+// static
+base::FilePath SafeBrowsingDatabase::UnwantedSoftwareDBFilename(
+ const base::FilePath& db_filename) {
+ return base::FilePath(db_filename.value() + kUnwantedSoftwareDBFile);
+}
+
SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) {
if (list_id == safe_browsing_util::PHISH ||
list_id == safe_browsing_util::MALWARE) {
@@ -435,6 +447,8 @@
return side_effect_free_whitelist_store_.get();
} else if (list_id == safe_browsing_util::IPBLACKLIST) {
return ip_blacklist_store_.get();
+ } else if (list_id == safe_browsing_util::UNWANTEDURL) {
+ return unwanted_software_store_.get();
}
return NULL;
}
@@ -458,6 +472,7 @@
DCHECK(!extension_blacklist_store_.get());
DCHECK(!side_effect_free_whitelist_store_.get());
DCHECK(!ip_blacklist_store_.get());
+ DCHECK(!unwanted_software_store_.get());
}
SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
@@ -467,7 +482,8 @@
SafeBrowsingStore* download_whitelist_store,
SafeBrowsingStore* extension_blacklist_store,
SafeBrowsingStore* side_effect_free_whitelist_store,
- SafeBrowsingStore* ip_blacklist_store)
+ SafeBrowsingStore* ip_blacklist_store,
+ SafeBrowsingStore* unwanted_software_store)
: creation_loop_(base::MessageLoop::current()),
browse_store_(browse_store),
download_store_(download_store),
@@ -476,6 +492,7 @@
extension_blacklist_store_(extension_blacklist_store),
side_effect_free_whitelist_store_(side_effect_free_whitelist_store),
ip_blacklist_store_(ip_blacklist_store),
+ unwanted_software_store_(unwanted_software_store),
corruption_detected_(false),
reset_factory_(this) {
DCHECK(browse_store_.get());
@@ -495,7 +512,8 @@
filename_base_ = filename_base;
// TODO(shess): The various stores are really only necessary while doing
- // updates, or when querying a store directly (see |ContainsDownloadUrl()|).
+ // updates (see |UpdateFinished()|) or when querying a store directly (see
+ // |ContainsDownloadUrl()|).
// The store variables are also tested to see if a list is enabled. Perhaps
// the stores could be refactored into an update object so that they are only
// live in memory while being actively used. The sense of enabled probably
@@ -506,14 +524,28 @@
base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
base::Unretained(this)));
+ if (unwanted_software_store_.get()) {
+ unwanted_software_store_->Init(
+ UnwantedSoftwareDBFilename(filename_base_),
+ base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
+ base::Unretained(this)));
+ }
+
{
// NOTE: There is no need to grab the lock in this function, since
// until it returns, there are no pointers to this class on other
// threads. Then again, that means there is no possibility of
// contention on the lock...
base::AutoLock locked(lookup_lock_);
- browse_gethash_cache_.clear();
- LoadPrefixSet();
+ prefix_gethash_cache_.clear();
+ LoadPrefixSet(BrowseDBFilename(filename_base_),
+ &browse_prefix_set_,
+ FAILURE_BROWSE_PREFIX_SET_READ);
+ if (unwanted_software_store_.get()) {
+ LoadPrefixSet(UnwantedSoftwareDBFilename(filename_base_),
+ &unwanted_software_prefix_set_,
+ FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_READ);
+ }
}
if (download_store_.get()) {
@@ -620,10 +652,11 @@
// Reset objects in memory.
{
base::AutoLock locked(lookup_lock_);
- browse_gethash_cache_.clear();
+ prefix_gethash_cache_.clear();
browse_prefix_set_.reset();
side_effect_free_whitelist_prefix_set_.reset();
ip_blacklist_.clear();
+ unwanted_software_prefix_set_.reset();
}
// Wants to acquire the lock itself.
WhitelistEverything(&csd_whitelist_);
@@ -635,22 +668,49 @@
const GURL& url,
std::vector<SBPrefix>* prefix_hits,
std::vector<SBFullHashResult>* cache_hits) {
+ return PrefixSetContainsUrl(
+ url, &browse_prefix_set_, prefix_hits, cache_hits);
+}
+
+bool SafeBrowsingDatabaseNew::ContainsUnwantedSoftwareUrl(
+ const GURL& url,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) {
+ return PrefixSetContainsUrl(
+ url, &unwanted_software_prefix_set_, prefix_hits, cache_hits);
+}
+
+bool SafeBrowsingDatabaseNew::PrefixSetContainsUrl(
+ const GURL& url,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) {
// Clear the results first.
prefix_hits->clear();
cache_hits->clear();
std::vector<SBFullHash> full_hashes;
- BrowseFullHashesToCheck(url, false, &full_hashes);
+ UrlToFullHashes(url, false, &full_hashes);
if (full_hashes.empty())
return false;
- return ContainsBrowseUrlHashes(full_hashes, prefix_hits, cache_hits);
+ return PrefixSetContainsUrlHashes(
+ full_hashes, prefix_set_getter, prefix_hits, cache_hits);
}
-bool SafeBrowsingDatabaseNew::ContainsBrowseUrlHashes(
+bool SafeBrowsingDatabaseNew::ContainsBrowseUrlHashesForTesting(
const std::vector<SBFullHash>& full_hashes,
std::vector<SBPrefix>* prefix_hits,
std::vector<SBFullHashResult>* cache_hits) {
+ return PrefixSetContainsUrlHashes(
+ full_hashes, &browse_prefix_set_, prefix_hits, cache_hits);
+}
+
+bool SafeBrowsingDatabaseNew::PrefixSetContainsUrlHashes(
+ const std::vector<SBFullHash>& full_hashes,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) {
// Used to determine cache expiration.
const base::Time now = base::Time::Now();
@@ -658,19 +718,20 @@
// filter and caches.
base::AutoLock locked(lookup_lock_);
- // |browse_prefix_set_| is empty until it is either read from disk, or the
- // first update populates it. Bail out without a hit if not yet
- // available.
- if (!browse_prefix_set_.get())
+ // |prefix_set| is empty until it is either read from disk, or the first
+ // update populates it. Bail out without a hit if not yet available.
+ // |prefix_set_getter| can only be accessed while holding |lookup_lock_| hence
+ // why it is passed as a parameter rather than passing the |prefix_set|
+ // directly.
+ safe_browsing::PrefixSet* prefix_set = prefix_set_getter->get();
+ if (!prefix_set)
return false;
for (size_t i = 0; i < full_hashes.size(); ++i) {
- if (!GetCachedFullHash(&browse_gethash_cache_,
- full_hashes[i],
- now,
- cache_hits)) {
+ if (!GetCachedFullHash(
+ &prefix_gethash_cache_, full_hashes[i], now, cache_hits)) {
// No valid cached result, check the database.
- if (browse_prefix_set_->Exists(full_hashes[i]))
+ if (prefix_set->Exists(full_hashes[i]))
prefix_hits->push_back(full_hashes[i].prefix);
}
}
@@ -705,13 +766,13 @@
// originate from the IO thread.
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
std::vector<SBFullHash> full_hashes;
- BrowseFullHashesToCheck(url, true, &full_hashes);
+ UrlToFullHashes(url, true, &full_hashes);
return ContainsWhitelistedHashes(csd_whitelist_, full_hashes);
}
bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedUrl(const GURL& url) {
std::vector<SBFullHash> full_hashes;
- BrowseFullHashesToCheck(url, true, &full_hashes);
+ UrlToFullHashes(url, true, &full_hashes);
return ContainsWhitelistedHashes(download_whitelist_, full_hashes);
}
@@ -951,14 +1012,14 @@
// Create or reset all cached results for these prefixes.
for (size_t i = 0; i < prefixes.size(); ++i) {
- browse_gethash_cache_[prefixes[i]] = SBCachedFullHashResult(expire_after);
+ prefix_gethash_cache_[prefixes[i]] = SBCachedFullHashResult(expire_after);
}
// Insert any fullhash hits. Note that there may be one, multiple, or no
// fullhashes for any given entry in |prefixes|.
for (size_t i = 0; i < full_hits.size(); ++i) {
const SBPrefix prefix = full_hits[i].hash.prefix;
- browse_gethash_cache_[prefix].full_hashes.push_back(full_hits[i]);
+ prefix_gethash_cache_[prefix].full_hashes.push_back(full_hits[i]);
}
}
@@ -1013,11 +1074,17 @@
return false;
}
+ if (unwanted_software_store_ && !unwanted_software_store_->BeginUpdate()) {
+ RecordFailure(FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_BEGIN);
+ HandleCorruptDatabase();
+ return false;
+ }
+
{
base::AutoLock locked(lookup_lock_);
// Cached fullhash results must be cleared on every database update (whether
// successful or not.)
- browse_gethash_cache_.clear();
+ prefix_gethash_cache_.clear();
}
UpdateChunkRangesForLists(browse_store_.get(),
@@ -1047,6 +1114,10 @@
UpdateChunkRangesForList(ip_blacklist_store_.get(),
safe_browsing_util::kIPBlacklist, lists);
+ UpdateChunkRangesForList(unwanted_software_store_.get(),
+ safe_browsing_util::kUnwantedUrlList,
+ lists);
+
corruption_detected_ = false;
change_detected_ = false;
return true;
@@ -1090,6 +1161,11 @@
if (ip_blacklist_store_ && !ip_blacklist_store_->CheckValidity()) {
DLOG(ERROR) << "Safe-browsing IP blacklist database corrupt.";
}
+
+ if (unwanted_software_store_ &&
+ !unwanted_software_store_->CheckValidity()) {
+ DLOG(ERROR) << "Unwanted software url list database corrupt.";
+ }
}
if (corruption_detected_)
@@ -1115,6 +1191,8 @@
side_effect_free_whitelist_store_->CancelUpdate();
if (ip_blacklist_store_)
ip_blacklist_store_->CancelUpdate();
+ if (unwanted_software_store_)
+ unwanted_software_store_->CancelUpdate();
return;
}
@@ -1127,7 +1205,12 @@
static_cast<int>(size_bytes / 1024));
}
- UpdateBrowseStore();
+ UpdatePrefixSetUrlStore(BrowseDBFilename(filename_base_),
+ browse_store_.get(),
+ &browse_prefix_set_,
+ FAILURE_BROWSE_DATABASE_UPDATE_FINISH,
+ FAILURE_BROWSE_PREFIX_SET_WRITE);
+
UpdateWhitelistStore(CsdWhitelistDBFilename(filename_base_),
csd_whitelist_store_.get(),
&csd_whitelist_);
@@ -1149,6 +1232,14 @@
if (ip_blacklist_store_)
UpdateIpBlacklistStore();
+
+ if (unwanted_software_store_) {
+ UpdatePrefixSetUrlStore(UnwantedSoftwareDBFilename(filename_base_),
+ unwanted_software_store_.get(),
+ &unwanted_software_prefix_set_,
+ FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_FINISH,
+ FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_WRITE);
+ }
}
void SafeBrowsingDatabaseNew::UpdateWhitelistStore(
@@ -1194,7 +1285,12 @@
return GetFileSizeOrZero(store_filename);
}
-void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
+void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore(
+ const base::FilePath& db_filename,
+ SafeBrowsingStore* url_store,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
+ FailureType finish_failure_type,
+ FailureType write_failure_type) {
// Measure the amount of IO during the filter build.
base::IoCounters io_before, io_after;
base::ProcessHandle handle = base::GetCurrentProcessHandle();
@@ -1219,8 +1315,8 @@
// the SBFullHash portion. It would need an accessor on PrefixSet.
safe_browsing::PrefixSetBuilder builder;
std::vector<SBAddFullHash> add_full_hashes;
- if (!browse_store_->FinishUpdate(&builder, &add_full_hashes)) {
- RecordFailure(FAILURE_BROWSE_DATABASE_UPDATE_FINISH);
+ if (!url_store->FinishUpdate(&builder, &add_full_hashes)) {
+ RecordFailure(finish_failure_type);
return;
}
@@ -1229,20 +1325,22 @@
full_hash_results.push_back(add_full_hashes[i].full_hash);
}
- scoped_ptr<safe_browsing::PrefixSet>
- prefix_set(builder.GetPrefixSet(full_hash_results));
+ scoped_ptr<safe_browsing::PrefixSet> new_prefix_set(
+ builder.GetPrefixSet(full_hash_results));
// Swap in the newly built filter.
{
base::AutoLock locked(lookup_lock_);
- browse_prefix_set_.swap(prefix_set);
+ prefix_set->swap(new_prefix_set);
}
UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before);
- // Persist the prefix set to disk. Since only this thread changes
- // |browse_prefix_set_|, there is no need to lock.
- WritePrefixSet();
+ // Persist the prefix set to disk. Note: there is no need to lock since the
+ // only write to |*prefix_set| is on this thread (in the swap() above).
+ // TODO(gab): Strengthen this requirement by design (const pointers) rather
+ // than assumptions.
+ WritePrefixSet(db_filename, prefix_set->get(), write_failure_type);
// Gather statistics.
if (got_counters && metric->GetIOCounters(&io_after)) {
@@ -1260,13 +1358,12 @@
io_before.WriteOperationCount));
}
- const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
- const int64 file_size = GetFileSizeOrZero(browse_filename);
+ const int64 file_size = GetFileSizeOrZero(db_filename);
UMA_HISTOGRAM_COUNTS("SB2.BrowseDatabaseKilobytes",
static_cast<int>(file_size / 1024));
#if defined(OS_MACOSX)
- base::mac::SetFileBackupExclusion(browse_filename);
+ base::mac::SetFileBackupExclusion(db_filename);
#endif
}
@@ -1360,31 +1457,34 @@
// TODO(shess): I'm not clear why this code doesn't have any
// real error-handling.
-void SafeBrowsingDatabaseNew::LoadPrefixSet() {
+void SafeBrowsingDatabaseNew::LoadPrefixSet(
+ const base::FilePath& db_filename,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
+ FailureType read_failure_type) {
+ if (!prefix_set)
+ return;
+
DCHECK_EQ(creation_loop_, base::MessageLoop::current());
DCHECK(!filename_base_.empty());
- const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
- const base::FilePath browse_prefix_set_filename =
- PrefixSetForFilename(browse_filename);
+ const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename);
// Only use the prefix set if database is present and non-empty.
- if (!GetFileSizeOrZero(browse_filename))
+ if (!GetFileSizeOrZero(db_filename))
return;
// Cleanup any stale bloom filter (no longer used).
// TODO(shess): Track existence to drive removal of this code?
const base::FilePath bloom_filter_filename =
- BloomFilterForFilename(browse_filename);
+ BloomFilterForFilename(db_filename);
base::DeleteFile(bloom_filter_filename, false);
const base::TimeTicks before = base::TimeTicks::Now();
- browse_prefix_set_ = safe_browsing::PrefixSet::LoadFile(
- browse_prefix_set_filename);
+ *prefix_set = safe_browsing::PrefixSet::LoadFile(prefix_set_filename);
UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before);
- if (!browse_prefix_set_.get())
- RecordFailure(FAILURE_BROWSE_PREFIX_SET_READ);
+ if (!prefix_set->get())
+ RecordFailure(read_failure_type);
}
bool SafeBrowsingDatabaseNew::Delete() {
@@ -1459,33 +1559,38 @@
if (!r10)
RecordFailure(FAILURE_IP_BLACKLIST_DELETE);
- return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10;
+ const bool r11 =
+ base::DeleteFile(UnwantedSoftwareDBFilename(filename_base_), false);
+ if (!r11)
+ RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE);
+
+ return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11;
}
-void SafeBrowsingDatabaseNew::WritePrefixSet() {
+void SafeBrowsingDatabaseNew::WritePrefixSet(
+ const base::FilePath& db_filename,
+ safe_browsing::PrefixSet* prefix_set,
+ FailureType write_failure_type) {
DCHECK_EQ(creation_loop_, base::MessageLoop::current());
- if (!browse_prefix_set_.get())
+ if (!prefix_set)
return;
- const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
- const base::FilePath browse_prefix_set_filename =
- PrefixSetForFilename(browse_filename);
+ const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename);
const base::TimeTicks before = base::TimeTicks::Now();
- const bool write_ok = browse_prefix_set_->WriteFile(
- browse_prefix_set_filename);
+ const bool write_ok = prefix_set->WriteFile(prefix_set_filename);
UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before);
- const int64 file_size = GetFileSizeOrZero(browse_prefix_set_filename);
+ const int64 file_size = GetFileSizeOrZero(prefix_set_filename);
UMA_HISTOGRAM_COUNTS("SB2.PrefixSetKilobytes",
static_cast<int>(file_size / 1024));
if (!write_ok)
- RecordFailure(FAILURE_BROWSE_PREFIX_SET_WRITE);
+ RecordFailure(write_failure_type);
#if defined(OS_MACOSX)
- base::mac::SetFileBackupExclusion(browse_prefix_set_filename);
+ base::mac::SetFileBackupExclusion(prefix_set_filename);
#endif
}
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.h b/chrome/browser/safe_browsing/safe_browsing_database.h
index 3e2ca8d..c011b9b 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.h
+++ b/chrome/browser/safe_browsing/safe_browsing_database.h
@@ -42,7 +42,9 @@
bool enable_download_whitelist,
bool enable_extension_blacklist,
bool enable_side_effect_free_whitelist,
- bool enable_ip_blacklist) = 0;
+ bool enable_ip_blacklist,
+ bool enable_unwanted_software_list) = 0;
+
private:
DISALLOW_COPY_AND_ASSIGN(SafeBrowsingDatabaseFactory);
};
@@ -71,12 +73,15 @@
// database feature.
// |enable_ip_blacklist| is used to control the csd malware IP blacklist
// database feature.
+ // |enable_unwanted_software_list| is used to control the unwanted software
+ // list database feature.
static SafeBrowsingDatabase* Create(bool enable_download_protection,
bool enable_client_side_whitelist,
bool enable_download_whitelist,
bool enable_extension_blacklist,
bool side_effect_free_whitelist,
- bool enable_ip_blacklist);
+ bool enable_ip_blacklist,
+ bool enable_unwanted_software_list);
// Makes the passed |factory| the factory used to instantiate
// a SafeBrowsingDatabase. This is used for tests.
@@ -93,14 +98,26 @@
virtual bool ResetDatabase() = 0;
// Returns false if |url| is not in the browse database or already was cached
- // as a miss. If it returns true, |prefix_hits| contains matching hash
- // prefixes which had no cached results and |cache_hits| contains any matching
- // cached gethash results. This function is safe to call from any thread.
+ // as a miss. If it returns true, |prefix_hits| contains sorted unique
+ // matching hash prefixes which had no cached results and |cache_hits|
+ // contains any matching cached gethash results. This function is safe to
+ // call from any thread.
virtual bool ContainsBrowseUrl(
const GURL& url,
std::vector<SBPrefix>* prefix_hits,
std::vector<SBFullHashResult>* cache_hits) = 0;
+ // Returns true iff the given url is on the unwanted software blacklist.
+ // Returns false if |url| is not in the browse database or already was cached
+ // as a miss. If it returns true, |prefix_hits| contains sorted unique
+ // matching hash prefixes which had no cached results and |cache_hits|
+ // contains any matching cached gethash results. This function is safe to
+ // call from any thread.
+ virtual bool ContainsUnwantedSoftwareUrl(
+ const GURL& url,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) = 0;
+
// Returns false if none of |urls| are in Download database. If it returns
// true, |prefix_hits| should contain the prefixes for the URLs that were in
// the database. This function could ONLY be accessed from creation thread.
@@ -218,6 +235,10 @@
static base::FilePath IpBlacklistDBFilename(
const base::FilePath& ip_blacklist_base_filename);
+ // Filename for the unwanted software blacklist database.
+ static base::FilePath UnwantedSoftwareDBFilename(
+ const base::FilePath& db_filename);
+
// Enumerate failures for histogramming purposes. DO NOT CHANGE THE
// ORDERING OF THESE VALUES.
enum FailureType {
@@ -235,7 +256,6 @@
FAILURE_DOWNLOAD_DATABASE_UPDATE_FINISH,
FAILURE_WHITELIST_DATABASE_UPDATE_BEGIN,
FAILURE_WHITELIST_DATABASE_UPDATE_FINISH,
- FAILURE_BROWSE_PREFIX_SET_MISSING,
FAILURE_BROWSE_PREFIX_SET_READ,
FAILURE_BROWSE_PREFIX_SET_WRITE,
FAILURE_BROWSE_PREFIX_SET_DELETE,
@@ -252,6 +272,11 @@
FAILURE_IP_BLACKLIST_UPDATE_FINISH,
FAILURE_IP_BLACKLIST_UPDATE_INVALID,
FAILURE_IP_BLACKLIST_DELETE,
+ FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_BEGIN,
+ FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_FINISH,
+ FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_READ,
+ FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_WRITE,
+ FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE,
// Memory space for histograms is determined by the max. ALWAYS
// ADD NEW VALUES BEFORE THIS ONE.
@@ -281,7 +306,8 @@
SafeBrowsingStore* download_whitelist_store,
SafeBrowsingStore* extension_blacklist_store,
SafeBrowsingStore* side_effect_free_whitelist_store,
- SafeBrowsingStore* ip_blacklist_store);
+ SafeBrowsingStore* ip_blacklist_store,
+ SafeBrowsingStore* unwanted_software_store);
// Create a database with a browse store. This is a legacy interface that
// useds Sqlite.
@@ -295,6 +321,10 @@
bool ContainsBrowseUrl(const GURL& url,
std::vector<SBPrefix>* prefix_hits,
std::vector<SBFullHashResult>* cache_hits) override;
+ bool ContainsUnwantedSoftwareUrl(
+ const GURL& url,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) override;
bool ContainsDownloadUrl(const std::vector<GURL>& urls,
std::vector<SBPrefix>* prefix_hits) override;
bool ContainsCsdWhitelistedUrl(const GURL& url) override;
@@ -338,10 +368,24 @@
// IPv6 IP prefix using SHA-1.
typedef std::map<std::string, base::hash_set<std::string> > IPBlacklist;
- // Helper for ContainsBrowseUrl, exposed for testing.
- bool ContainsBrowseUrlHashes(const std::vector<SBFullHash>& full_hashes,
- std::vector<SBPrefix>* prefix_hits,
- std::vector<SBFullHashResult>* cache_hits);
+ bool PrefixSetContainsUrl(
+ const GURL& url,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits);
+
+ // Exposed for testing of PrefixSetContainsUrlHashes() on the
+ // PrefixSet backing kMalwareList.
+ bool ContainsBrowseUrlHashesForTesting(
+ const std::vector<SBFullHash>& full_hashes,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits);
+
+ bool PrefixSetContainsUrlHashes(
+ const std::vector<SBFullHash>& full_hashes,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits);
// Returns true if the whitelist is disabled or if any of the given hashes
// matches the whitelist.
@@ -355,11 +399,19 @@
// Deletes the files on disk.
bool Delete();
- // Load the prefix set off disk, if available.
- void LoadPrefixSet();
+ // Load the prefix set in "|db_filename| Prefix Set" off disk, if available,
+ // and stores it in |prefix_set|. |read_failure_type| provides a
+ // caller-specific error code to be used on failure.
+ void LoadPrefixSet(const base::FilePath& db_filename,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
+ FailureType read_failure_type);
- // Writes the current prefix set to disk.
- void WritePrefixSet();
+ // Writes the current prefix set "|db_filename| Prefix Set" on disk.
+ // |write_failure_type| provides a caller-specific error code to be used on
+ // failure.
+ void WritePrefixSet(const base::FilePath& db_filename,
+ safe_browsing::PrefixSet* prefix_set,
+ FailureType write_failure_type);
// Loads the given full-length hashes to the given whitelist. If the number
// of hashes is too large or if the kill switch URL is on the whitelist
@@ -396,7 +448,20 @@
int64 UpdateHashPrefixStore(const base::FilePath& store_filename,
SafeBrowsingStore* store,
FailureType failure_type);
- void UpdateBrowseStore();
+
+ // Updates a PrefixStore store for URLs (|url_store|) which is backed on disk
+ // by a "|db_filename| Prefix Set" file. Specific failure types are provided
+ // to highlight the specific store who made the initial request on failure.
+ void UpdatePrefixSetUrlStore(const base::FilePath& db_filename,
+ SafeBrowsingStore* url_store,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
+ FailureType finish_failure_type,
+ FailureType write_failure_type);
+
+ void UpdateUrlStore(SafeBrowsingStore* url_store,
+ scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
+ FailureType failure_type);
+
void UpdateSideEffectFreeWhitelistStore();
void UpdateWhitelistStore(const base::FilePath& store_filename,
SafeBrowsingStore* store,
@@ -407,10 +472,6 @@
// object was created on.
base::MessageLoop* creation_loop_;
- // Lock for protecting access to variables that may be used on the IO thread.
- // This includes |prefix_set_|, |browse_gethash_cache_|, |csd_whitelist_|.
- base::Lock lookup_lock_;
-
// The base filename passed to Init(), used to generate the store and prefix
// set filenames used to store data on disk.
base::FilePath filename_base_;
@@ -439,6 +500,14 @@
// For IP blacklist.
scoped_ptr<SafeBrowsingStore> ip_blacklist_store_;
+ // For unwanted software list.
+ scoped_ptr<SafeBrowsingStore> unwanted_software_store_;
+
+ // Lock for protecting access to variables that may be used on the IO thread.
+ // This includes |(browse|unwanted_software)_prefix_set_|,
+ // |prefix_gethash_cache_|, |csd_whitelist_|.
+ base::Lock lookup_lock_;
+
SBWhitelist csd_whitelist_;
SBWhitelist download_whitelist_;
SBWhitelist extension_blacklist_;
@@ -446,10 +515,10 @@
// The IP blacklist should be small. At most a couple hundred IPs.
IPBlacklist ip_blacklist_;
- // Cache of gethash results for browse store. Entries should not be used if
+ // Cache of gethash results for prefix stores. Entries should not be used if
// they are older than their expire_after field. Cached misses will have
// empty full_hashes field. Cleared on each update.
- std::map<SBPrefix, SBCachedFullHashResult> browse_gethash_cache_;
+ std::map<SBPrefix, SBCachedFullHashResult> prefix_gethash_cache_;
// Set if corruption is detected during the course of an update.
// Causes the update functions to fail with no side effects, until
@@ -463,9 +532,12 @@
// Used to check if a prefix was in the browse database.
scoped_ptr<safe_browsing::PrefixSet> browse_prefix_set_;
- // Used to check if a prefix was in the browse database.
+ // Used to check if a prefix was in the side-effect free whitelist database.
scoped_ptr<safe_browsing::PrefixSet> side_effect_free_whitelist_prefix_set_;
+ // Used to check if a prexfix was in the unwanted software database.
+ scoped_ptr<safe_browsing::PrefixSet> unwanted_software_prefix_set_;
+
// Used to schedule resetting the database because of corruption.
base::WeakPtrFactory<SafeBrowsingDatabaseNew> reset_factory_;
};
diff --git a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
index c09e53c..db83263 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
@@ -81,7 +81,7 @@
}
// Create add chunk with a single prefix.
-SBChunkData* AddChunkPrefix(int chunk_number, SBPrefix prefix) {
+SBChunkData* AddChunkPrefix(int chunk_number, SBPrefix prefix) {
return BuildChunk(chunk_number, safe_browsing::ChunkData::ADD,
safe_browsing::ChunkData::PREFIX_4B,
&prefix, sizeof(prefix),
@@ -259,10 +259,10 @@
// Setup a database in a temporary directory.
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- database_.reset(new SafeBrowsingDatabaseNew);
database_filename_ =
temp_dir_.path().AppendASCII("SafeBrowsingTestDatabase");
- database_->Init(database_filename_);
+
+ ResetAndReloadFullDatabase();
}
void TearDown() override {
@@ -271,6 +271,33 @@
PlatformTest::TearDown();
}
+ // Reloads the |database_| in a new SafeBrowsingDatabaseNew object with all
+ // stores enabled.
+ void ResetAndReloadFullDatabase() {
+ SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* download_whitelist_store =
+ new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* extension_blacklist_store =
+ new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* side_effect_free_whitelist_store =
+ new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile();
+ SafeBrowsingStoreFile* unwanted_software_store =
+ new SafeBrowsingStoreFile();
+ database_.reset(
+ new SafeBrowsingDatabaseNew(browse_store,
+ download_store,
+ csd_whitelist_store,
+ download_whitelist_store,
+ extension_blacklist_store,
+ side_effect_free_whitelist_store,
+ ip_blacklist_store,
+ unwanted_software_store));
+ database_->Init(database_filename_);
+ }
+
void GetListsInfo(std::vector<SBListChunkRanges>* lists) {
lists->clear();
ASSERT_TRUE(database_->UpdateStarted(lists));
@@ -360,7 +387,7 @@
database_->UpdateFinished(true);
GetListsInfo(&lists);
- ASSERT_EQ(2U, lists.size());
+ ASSERT_LE(2U, lists.size());
EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
EXPECT_EQ("1-3", lists[0].adds);
EXPECT_EQ("7", lists[0].subs);
@@ -370,24 +397,6 @@
}
TEST_F(SafeBrowsingDatabaseTest, ListNameForBrowseAndDownload) {
- database_.reset();
- base::MessageLoop loop;
- SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* download_whitelist_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* extension_blacklist_store =
- new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile();
- database_.reset(new SafeBrowsingDatabaseNew(browse_store,
- download_store,
- csd_whitelist_store,
- download_whitelist_store,
- extension_blacklist_store,
- NULL,
- ip_blacklist_store));
- database_->Init(database_filename_);
-
ScopedVector<SBChunkData> chunks;
std::vector<SBListChunkRanges> lists;
@@ -424,10 +433,14 @@
chunks.push_back(AddChunkHashedIpValue(9, "::ffff:192.168.1.0", 120));
database_->InsertChunks(safe_browsing_util::kIPBlacklist, chunks.get());
+ chunks.clear();
+ chunks.push_back(AddChunkPrefixValue(10, "www.unwanted.com/software.html"));
+ database_->InsertChunks(safe_browsing_util::kUnwantedUrlList, chunks.get());
+
database_->UpdateFinished(true);
GetListsInfo(&lists);
- ASSERT_EQ(7U, lists.size());
+ ASSERT_EQ(9U, lists.size());
EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
EXPECT_EQ("1", lists[0].adds);
EXPECT_TRUE(lists[0].subs.empty());
@@ -446,240 +459,272 @@
EXPECT_EQ(safe_browsing_util::kExtensionBlacklist, lists[5].name);
EXPECT_EQ("8", lists[5].adds);
EXPECT_TRUE(lists[5].subs.empty());
- EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[6].name);
- EXPECT_EQ("9", lists[6].adds);
- EXPECT_TRUE(lists[6].subs.empty());
+ EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[7].name);
+ EXPECT_EQ("9", lists[7].adds);
+ EXPECT_TRUE(lists[7].subs.empty());
+ EXPECT_EQ(safe_browsing_util::kUnwantedUrlList, lists[8].name);
+ EXPECT_EQ("10", lists[8].adds);
+ EXPECT_TRUE(lists[8].subs.empty());
database_.reset();
}
-// Checks database reading and writing for browse.
-TEST_F(SafeBrowsingDatabaseTest, BrowseDatabase) {
- std::vector<SBListChunkRanges> lists;
- ScopedVector<SBChunkData> chunks;
+// Checks database reading and writing for browse and unwanted PrefixSets.
+TEST_F(SafeBrowsingDatabaseTest, BrowseAndUnwantedDatabasesAndPrefixSets) {
+ struct TestCase {
+ using TestListContainsBadUrl = bool (SafeBrowsingDatabase::*)(
+ const GURL& url,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits);
- chunks.push_back(AddChunkPrefix2Value(1,
- "www.evil.com/phishing.html",
- "www.evil.com/malware.html"));
- chunks.push_back(AddChunkPrefix4Value(2,
- "www.evil.com/notevil1.html",
- "www.evil.com/notevil2.html",
- "www.good.com/good1.html",
- "www.good.com/good2.html"));
- chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html"));
- chunks.push_back(AddChunkFullHashValue(7, "www.evil.com/evil.html"));
+ const char* test_list_name;
+ size_t expected_list_index;
+ TestListContainsBadUrl test_list_contains_bad_url;
+ } const kTestCases[] {
+ { safe_browsing_util::kMalwareList, 0U,
+ &SafeBrowsingDatabase::ContainsBrowseUrl },
+ { safe_browsing_util::kPhishingList, 1U,
+ &SafeBrowsingDatabase::ContainsBrowseUrl },
+ { safe_browsing_util::kUnwantedUrlList, 8U,
+ &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl },
+ };
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ for (const auto& test_case : kTestCases) {
+ SCOPED_TRACE(std::string("Tested list at fault => ") +
+ test_case.test_list_name);
- // Make sure they were added correctly.
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1-3,7", lists[0].adds);
- EXPECT_TRUE(lists[0].subs.empty());
+ std::vector<SBListChunkRanges> lists;
+ ScopedVector<SBChunkData> chunks;
- std::vector<SBPrefix> prefix_hits;
- std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
- ASSERT_EQ(1U, prefix_hits.size());
- EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
- EXPECT_TRUE(cache_hits.empty());
+ chunks.push_back(AddChunkPrefix2Value(1,
+ "www.evil.com/phishing.html",
+ "www.evil.com/malware.html"));
+ chunks.push_back(AddChunkPrefix4Value(2,
+ "www.evil.com/notevil1.html",
+ "www.evil.com/notevil2.html",
+ "www.good.com/good1.html",
+ "www.good.com/good2.html"));
+ chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html"));
+ chunks.push_back(AddChunkFullHashValue(7, "www.evil.com/evil.html"));
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits));
+ // Make sure they were added correctly.
+ GetListsInfo(&lists);
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty());
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
+ std::vector<SBPrefix> prefix_hits;
+ std::vector<SBFullHashResult> cache_hits;
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
+ ASSERT_EQ(1U, prefix_hits.size());
+ EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
+ EXPECT_TRUE(cache_hits.empty());
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://192.168.0.1/malware.html"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits));
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(prefix_hits.empty());
- EXPECT_TRUE(cache_hits.empty());
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/robots.txt"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits));
- ASSERT_EQ(1U, prefix_hits.size());
- EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]);
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
- // Attempt to re-add the first chunk (should be a no-op).
- // see bug: http://code.google.com/p/chromium/issues/detail?id=4522
- chunks.clear();
- chunks.push_back(AddChunkPrefix2Value(1,
- "www.evil.com/phishing.html",
- "www.evil.com/malware.html"));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://192.168.0.1/malware.html"), &prefix_hits, &cache_hits));
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1-3,7", lists[0].adds);
- EXPECT_TRUE(lists[0].subs.empty());
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE(prefix_hits.empty());
+ EXPECT_TRUE(cache_hits.empty());
- // Test removing a single prefix from the add chunk.
- chunks.clear();
- chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/robots.txt"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
- ASSERT_EQ(1U, prefix_hits.size());
- EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
- EXPECT_TRUE(cache_hits.empty());
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits));
+ ASSERT_EQ(1U, prefix_hits.size());
+ EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]);
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(prefix_hits.empty());
- EXPECT_TRUE(cache_hits.empty());
+ // Attempt to re-add the first chunk (should be a no-op).
+ // see bug: http://code.google.com/p/chromium/issues/detail?id=4522
+ chunks.clear();
+ chunks.push_back(AddChunkPrefix2Value(1,
+ "www.evil.com/phishing.html",
+ "www.evil.com/malware.html"));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
+ GetListsInfo(&lists);
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty());
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
+ // Test removing a single prefix from the add chunk.
+ chunks.clear();
+ chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
+ ASSERT_EQ(1U, prefix_hits.size());
+ EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
+ EXPECT_TRUE(cache_hits.empty());
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1-3,7", lists[0].adds);
- EXPECT_EQ("4", lists[0].subs);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits));
+ EXPECT_TRUE(prefix_hits.empty());
+ EXPECT_TRUE(cache_hits.empty());
- // Test the same sub chunk again. This should be a no-op.
- // see bug: http://code.google.com/p/chromium/issues/detail?id=4522
- chunks.clear();
- chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2));
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1-3,7", lists[0].adds);
- EXPECT_EQ("4", lists[0].subs);
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
- // Test removing all the prefixes from an add chunk.
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- AddDelChunk(safe_browsing_util::kMalwareList, 2);
- database_->UpdateFinished(true);
+ GetListsInfo(&lists);
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_EQ("4", lists[test_case.expected_list_index].subs);
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
+ // Test the same sub chunk again. This should be a no-op.
+ // see bug: http://code.google.com/p/chromium/issues/detail?id=4522
+ chunks.clear();
+ chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2));
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
+ GetListsInfo(&lists);
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_EQ("4", lists[test_case.expected_list_index].subs);
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1,3,7", lists[0].adds);
- EXPECT_EQ("4", lists[0].subs);
+ // Test removing all the prefixes from an add chunk.
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ AddDelChunk(test_case.test_list_name, 2);
+ database_->UpdateFinished(true);
- // The adddel command exposed a bug in the transaction code where any
- // transaction after it would fail. Add a dummy entry and remove it to
- // make sure the transcation works fine.
- chunks.clear();
- chunks.push_back(AddChunkPrefixValue(44, "www.redherring.com/index.html"));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits));
- // Now remove the dummy entry. If there are any problems with the
- // transactions, asserts will fire.
- AddDelChunk(safe_browsing_util::kMalwareList, 44);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits));
- // Test the subdel command.
- SubDelChunk(safe_browsing_util::kMalwareList, 4);
- database_->UpdateFinished(true);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits));
- GetListsInfo(&lists);
- ASSERT_LE(1U, lists.size());
- EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
- EXPECT_EQ("1,3,7", lists[0].adds);
- EXPECT_TRUE(lists[0].subs.empty());
+ GetListsInfo(&lists);
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1,3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_EQ("4", lists[test_case.expected_list_index].subs);
- // Test a sub command coming in before the add.
- chunks.clear();
- chunks.push_back(SubChunkPrefix2Value(5,
- "www.notevilanymore.com/index.html",
- 10,
- "www.notevilanymore.com/good.html",
- 10));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ // The adddel command exposed a bug in the transaction code where any
+ // transaction after it would fail. Add a dummy entry and remove it to
+ // make sure the transcation works fine.
+ chunks.clear();
+ chunks.push_back(AddChunkPrefixValue(44, "www.redherring.com/index.html"));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.notevilanymore.com/index.html"),
- &prefix_hits,
- &cache_hits));
+ // Now remove the dummy entry. If there are any problems with the
+ // transactions, asserts will fire.
+ AddDelChunk(test_case.test_list_name, 44);
- // Now insert the tardy add chunk and we don't expect them to appear
- // in database because of the previous sub chunk.
- chunks.clear();
- chunks.push_back(AddChunkPrefix2Value(10,
- "www.notevilanymore.com/index.html",
- "www.notevilanymore.com/good.html"));
- ASSERT_TRUE(database_->UpdateStarted(&lists));
- database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get());
- database_->UpdateFinished(true);
+ // Test the subdel command.
+ SubDelChunk(test_case.test_list_name, 4);
+ database_->UpdateFinished(true);
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.notevilanymore.com/index.html"),
- &prefix_hits,
- &cache_hits));
+ GetListsInfo(&lists);
+ ASSERT_LE(1U, lists.size());
+ EXPECT_EQ(test_case.test_list_name,
+ lists[test_case.expected_list_index].name);
+ EXPECT_EQ("1,3,7", lists[test_case.expected_list_index].adds);
+ EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty());
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.notevilanymore.com/good.html"),
- &prefix_hits,
- &cache_hits));
+ // Test a sub command coming in before the add.
+ chunks.clear();
+ chunks.push_back(SubChunkPrefix2Value(5,
+ "www.notevilanymore.com/index.html",
+ 10,
+ "www.notevilanymore.com/good.html",
+ 10));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- // Reset and reload the database. The database will rely on the prefix set.
- database_.reset(new SafeBrowsingDatabaseNew);
- database_->Init(database_filename_);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.notevilanymore.com/index.html"),
+ &prefix_hits,
+ &cache_hits));
- // Check that a prefix still hits.
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
- ASSERT_EQ(1U, prefix_hits.size());
- EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
+ // Now insert the tardy add chunk and we don't expect them to appear
+ // in database because of the previous sub chunk.
+ chunks.clear();
+ chunks.push_back(AddChunkPrefix2Value(10,
+ "www.notevilanymore.com/index.html",
+ "www.notevilanymore.com/good.html"));
+ ASSERT_TRUE(database_->UpdateStarted(&lists));
+ database_->InsertChunks(test_case.test_list_name, chunks.get());
+ database_->UpdateFinished(true);
- // Also check that it's not just always returning true in this case.
- EXPECT_FALSE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/"), &prefix_hits, &cache_hits));
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.notevilanymore.com/index.html"),
+ &prefix_hits,
+ &cache_hits));
- // Check that the full hash is still present.
- EXPECT_TRUE(database_->ContainsBrowseUrl(
- GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits));
- ASSERT_EQ(1U, prefix_hits.size());
- EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]);
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.notevilanymore.com/good.html"),
+ &prefix_hits,
+ &cache_hits));
+
+ // Reset and reload the database. The database will rely on the prefix set.
+ ResetAndReloadFullDatabase();
+
+ // Check that a prefix still hits.
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits));
+ ASSERT_EQ(1U, prefix_hits.size());
+ EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]);
+
+ // Also check that it's not just always returning true in this case.
+ EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/"), &prefix_hits, &cache_hits));
+
+ // Check that the full hash is still present.
+ EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)(
+ GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits));
+ ASSERT_EQ(1U, prefix_hits.size());
+ EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]);
+ }
}
// Test adding zero length chunks to the database.
@@ -786,7 +831,7 @@
database_->UpdateFinished(true);
// Cache should be cleared after updating.
- EXPECT_TRUE(database_->browse_gethash_cache_.empty());
+ EXPECT_TRUE(database_->prefix_gethash_cache_.empty());
SBFullHashResult full_hash;
full_hash.list_id = safe_browsing_util::MALWARE;
@@ -810,7 +855,7 @@
PopulateDatabaseForCacheTest();
// We should have both full hashes in the cache.
- EXPECT_EQ(2U, database_->browse_gethash_cache_.size());
+ EXPECT_EQ(2U, database_->prefix_gethash_cache_.size());
// Test the cache lookup for the first prefix.
std::vector<SBPrefix> prefix_hits;
@@ -866,7 +911,7 @@
database_->UpdateFinished(true);
EXPECT_FALSE(database_->ContainsBrowseUrl(
GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits));
- EXPECT_TRUE(database_->browse_gethash_cache_.empty());
+ EXPECT_TRUE(database_->prefix_gethash_cache_.empty());
prefix_hits.clear();
cache_hits.clear();
@@ -876,7 +921,7 @@
PopulateDatabaseForCacheTest();
std::map<SBPrefix, SBCachedFullHashResult>* hash_cache =
- &database_->browse_gethash_cache_;
+ &database_->prefix_gethash_cache_;
EXPECT_EQ(2U, hash_cache->size());
// Now adjust one of the entries times to be in the past.
@@ -1051,7 +1096,7 @@
base::MessageLoop loop;
SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile();
database_.reset(new SafeBrowsingDatabaseNew(store, NULL, NULL, NULL, NULL,
- NULL, NULL));
+ NULL, NULL, NULL));
database_->Init(database_filename_);
// This will cause an empty database to be created.
@@ -1106,20 +1151,6 @@
// Checks database reading and writing.
TEST_F(SafeBrowsingDatabaseTest, ContainsDownloadUrl) {
- database_.reset();
- base::MessageLoop loop;
- SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile();
- database_.reset(new SafeBrowsingDatabaseNew(browse_store,
- download_store,
- csd_whitelist_store,
- NULL,
- NULL,
- NULL,
- NULL));
- database_->Init(database_filename_);
-
const char kEvil1Url1[] = "www.evil1.com/download1/";
const char kEvil1Url2[] = "www.evil1.com/download2.html";
@@ -1217,7 +1248,7 @@
// If the whitelist is disabled everything should match the whitelist.
database_.reset(new SafeBrowsingDatabaseNew(new SafeBrowsingStoreFile(),
NULL, NULL, NULL, NULL, NULL,
- NULL));
+ NULL, NULL));
database_->Init(database_filename_);
EXPECT_TRUE(database_->ContainsDownloadWhitelistedUrl(
GURL(std::string("http://www.phishing.com/"))));
@@ -1225,17 +1256,7 @@
GURL(std::string("http://www.phishing.com/"))));
EXPECT_TRUE(database_->ContainsDownloadWhitelistedString("asdf"));
- SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* download_whitelist_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* extension_blacklist_store =
- new SafeBrowsingStoreFile();
- database_.reset(new SafeBrowsingDatabaseNew(browse_store, NULL,
- csd_whitelist_store,
- download_whitelist_store,
- extension_blacklist_store,
- NULL, NULL));
- database_->Init(database_filename_);
+ ResetAndReloadFullDatabase();
const char kGood1Host[] = "www.good1.com/";
const char kGood1Url1[] = "www.good1.com/a/b.html";
@@ -1435,7 +1456,7 @@
database_->UpdateFinished(true);
GetListsInfo(&lists);
- ASSERT_EQ(2U, lists.size());
+ ASSERT_LE(2U, lists.size());
EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name);
EXPECT_EQ("1", lists[0].adds);
EXPECT_TRUE(lists[0].subs.empty());
@@ -1563,8 +1584,7 @@
// After re-creating the database, it should have a filter read from
// a file, so it should find the same results.
ASSERT_TRUE(base::PathExists(filter_file));
- database_.reset(new SafeBrowsingDatabaseNew);
- database_->Init(database_filename_);
+ ResetAndReloadFullDatabase();
EXPECT_TRUE(database_->ContainsBrowseUrl(
GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits));
EXPECT_FALSE(database_->ContainsBrowseUrl(
@@ -1573,8 +1593,7 @@
// If there is no filter file, the database cannot find malware urls.
base::DeleteFile(filter_file, false);
ASSERT_FALSE(base::PathExists(filter_file));
- database_.reset(new SafeBrowsingDatabaseNew);
- database_->Init(database_filename_);
+ ResetAndReloadFullDatabase();
EXPECT_FALSE(database_->ContainsBrowseUrl(
GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits));
EXPECT_FALSE(database_->ContainsBrowseUrl(
@@ -1613,14 +1632,14 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_1);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// kFullHash2_1 gets a hit from the prefix in the database.
full_hashes.push_back(kFullHash2_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix2, prefix_hits[0]);
@@ -1661,7 +1680,7 @@
full_hashes.push_back(kFullHash1_1);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1671,7 +1690,7 @@
full_hashes.push_back(kFullHash2_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(2U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1682,7 +1701,7 @@
full_hashes.push_back(kFullHash3_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(2U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1712,7 +1731,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_1);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
EXPECT_TRUE(prefix_hits.empty());
ASSERT_EQ(1U, cache_hits.size());
@@ -1723,7 +1742,7 @@
full_hashes.push_back(kFullHash2_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix2, prefix_hits[0]);
@@ -1734,7 +1753,7 @@
full_hashes.push_back(kFullHash1_3);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix2, prefix_hits[0]);
@@ -1748,7 +1767,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_3);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
EXPECT_TRUE(prefix_hits.empty());
ASSERT_EQ(1U, cache_hits.size());
@@ -1761,14 +1780,14 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_2);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// Other prefix hits possible when kFullHash1_2 hits nothing.
full_hashes.push_back(kFullHash2_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix2, prefix_hits[0]);
@@ -1800,14 +1819,14 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_3);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// Also one which is present, should have a prefix hit.
full_hashes.push_back(kFullHash1_1);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1817,7 +1836,7 @@
full_hashes.push_back(kFullHash1_2);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1842,7 +1861,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_3);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// kFullHash1_1 is also not in the cached result, which takes
@@ -1850,14 +1869,14 @@
prefix_hits.clear();
full_hashes.push_back(kFullHash1_1);
cache_hits.clear();
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// kFullHash1_2 is in the cached result.
full_hashes.push_back(kFullHash1_2);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
EXPECT_TRUE(prefix_hits.empty());
ASSERT_EQ(1U, cache_hits.size());
@@ -1873,28 +1892,28 @@
database_->UpdateFinished(true);
// Cache should be cleared after updating.
- EXPECT_TRUE(database_->browse_gethash_cache_.empty());
+ EXPECT_TRUE(database_->prefix_gethash_cache_.empty());
{
// Now the database doesn't contain kFullHash1_1.
std::vector<SBFullHash> full_hashes(1, kFullHash1_1);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// Nor kFullHash1_3.
full_hashes.push_back(kFullHash1_3);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
// Still has kFullHash1_2.
full_hashes.push_back(kFullHash1_2);
prefix_hits.clear();
cache_hits.clear();
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1910,7 +1929,7 @@
database_->UpdateFinished(true);
// Cache should be cleared after updating.
- EXPECT_TRUE(database_->browse_gethash_cache_.empty());
+ EXPECT_TRUE(database_->prefix_gethash_cache_.empty());
{
// None are present.
@@ -1920,7 +1939,7 @@
full_hashes.push_back(kFullHash1_1);
full_hashes.push_back(kFullHash1_2);
full_hashes.push_back(kFullHash1_3);
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
}
}
@@ -1945,7 +1964,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_2);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_FALSE(database_->ContainsBrowseUrlHashes(
+ EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
}
@@ -1962,7 +1981,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_2);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1982,7 +2001,7 @@
std::vector<SBFullHash> full_hashes(1, kFullHash1_2);
std::vector<SBPrefix> prefix_hits;
std::vector<SBFullHashResult> cache_hits;
- EXPECT_TRUE(database_->ContainsBrowseUrlHashes(
+ EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting(
full_hashes, &prefix_hits, &cache_hits));
ASSERT_EQ(1U, prefix_hits.size());
EXPECT_EQ(kPrefix1, prefix_hits[0]);
@@ -1991,17 +2010,6 @@
}
TEST_F(SafeBrowsingDatabaseTest, MalwareIpBlacklist) {
- database_.reset();
- SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile();
- SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile();
- database_.reset(new SafeBrowsingDatabaseNew(browse_store,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- ip_blacklist_store));
- database_->Init(database_filename_);
std::vector<SBListChunkRanges> lists;
ASSERT_TRUE(database_->UpdateStarted(&lists));
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index 3137d06..87f739e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -134,6 +134,16 @@
std::vector<GURL>(1, url),
prefix_hits);
}
+ bool ContainsUnwantedSoftwareUrl(
+ const GURL& url,
+ std::vector<SBPrefix>* prefix_hits,
+ std::vector<SBFullHashResult>* cache_hits) override {
+ cache_hits->clear();
+ return ContainsUrl(safe_browsing_util::UNWANTEDURL,
+ safe_browsing_util::UNWANTEDURL,
+ std::vector<GURL>(1, url),
+ prefix_hits);
+ }
bool ContainsDownloadUrl(const std::vector<GURL>& urls,
std::vector<SBPrefix>* prefix_hits) override {
bool found = ContainsUrl(safe_browsing_util::BINURL,
@@ -186,8 +196,11 @@
void AddUrl(const GURL& url,
int list_id,
const std::vector<SBPrefix>& prefix_hits) {
- badurls_[url.spec()].list_id = list_id;
- badurls_[url.spec()].prefix_hits = prefix_hits;
+ Hits* hits_for_url = &badurls_[url.spec()];
+ hits_for_url->list_ids.push_back(list_id);
+ hits_for_url->prefix_hits.insert(hits_for_url->prefix_hits.end(),
+ prefix_hits.begin(),
+ prefix_hits.end());
}
// Fill up the database with test hash digest.
@@ -196,8 +209,9 @@
}
private:
+ // Stores |list_ids| of safe browsing lists that match some |prefix_hits|.
struct Hits {
- int list_id;
+ std::vector<int> list_ids;
std::vector<SBPrefix> prefix_hits;
};
@@ -214,8 +228,11 @@
if (badurls_it == badurls_.end())
continue;
- if (badurls_it->second.list_id == list_id0 ||
- badurls_it->second.list_id == list_id1) {
+ std::vector<int> list_ids_for_url = badurls_it->second.list_ids;
+ if (std::find(list_ids_for_url.begin(), list_ids_for_url.end(), list_id0)
+ != list_ids_for_url.end() ||
+ std::find(list_ids_for_url.begin(), list_ids_for_url.end(), list_id1)
+ != list_ids_for_url.end()) {
prefix_hits->insert(prefix_hits->end(),
badurls_it->second.prefix_hits.begin(),
badurls_it->second.prefix_hits.end());
@@ -241,7 +258,8 @@
bool enable_download_whitelist,
bool enable_extension_blacklist,
bool enable_side_effect_free_whitelist,
- bool enable_ip_blacklist) override {
+ bool enable_ip_blacklist,
+ bool enabled_unwanted_software_list) override {
db_ = new TestSafeBrowsingDatabase();
return db_;
}
@@ -281,8 +299,7 @@
}
// Prepare the GetFullHash results for the next request.
- void SetGetFullHashResponse(const SBFullHashResult& full_hash_result) {
- full_hashes_.clear();
+ void AddGetFullHashResponse(const SBFullHashResult& full_hash_result) {
full_hashes_.push_back(full_hash_result);
}
@@ -403,7 +420,8 @@
}
// This will setup the "url" prefix in database and prepare protocol manager
- // to response with |full_hash| for get full hash request.
+ // to respond with |full_hash|, as well as other |full_hash|es previously set
+ // via this call, on GetFullHash requests.
void SetupResponseForUrl(const GURL& url, const SBFullHashResult& full_hash) {
std::vector<SBPrefix> prefix_hits;
prefix_hits.push_back(full_hash.hash.prefix);
@@ -414,7 +432,7 @@
db->AddUrl(url, full_hash.list_id, prefix_hits);
TestProtocolManager* pm = pm_factory_.GetProtocolManager();
- pm->SetGetFullHashResponse(full_hash);
+ pm->AddGetFullHashResponse(full_hash);
}
bool ShowingInterstitialPage() {
@@ -724,24 +742,58 @@
content::RunMessageLoop(); // Will stop in OnCheckDownloadUrlResult.
}
+ void CheckBrowseUrl(const GURL& url) {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&TestSBClient::CheckBrowseUrlOnIOThread, this, url));
+ content::RunMessageLoop(); // Will stop in OnCheckBrowseUrlResult.
+ }
+
private:
friend class base::RefCountedThreadSafe<TestSBClient>;
~TestSBClient() override {}
void CheckDownloadUrlOnIOThread(const std::vector<GURL>& url_chain) {
- safe_browsing_service_->database_manager()->
- CheckDownloadUrl(url_chain, this);
+ bool synchronous_safe_signal =
+ safe_browsing_service_->database_manager()->CheckDownloadUrl(url_chain,
+ this);
+ if (synchronous_safe_signal) {
+ threat_type_ = SB_THREAT_TYPE_SAFE;
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&TestSBClient::CheckDone, this));
+ }
+ }
+
+ void CheckBrowseUrlOnIOThread(const GURL& url) {
+ // The async CheckDone() hook will not be called when we have a synchronous
+ // safe signal, handle it right away.
+ bool synchronous_safe_signal =
+ safe_browsing_service_->database_manager()->CheckBrowseUrl(url, this);
+ if (synchronous_safe_signal) {
+ threat_type_ = SB_THREAT_TYPE_SAFE;
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&TestSBClient::CheckDone, this));
+ }
}
// Called when the result of checking a download URL is known.
- void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain,
+ void OnCheckDownloadUrlResult(const std::vector<GURL>& /* url_chain */,
SBThreatType threat_type) override {
threat_type_ = threat_type;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&TestSBClient::DownloadCheckDone, this));
+ base::Bind(&TestSBClient::CheckDone, this));
}
- void DownloadCheckDone() {
+ // Called when the result of checking a browse URL is known.
+ void OnCheckBrowseUrlResult(const GURL& /* url */,
+ SBThreatType threat_type,
+ const std::string& /* metadata */) override {
+ threat_type_ = threat_type;
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&TestSBClient::CheckDone, this));
+ }
+
+ void CheckDone() {
base::MessageLoopForUI::current()->Quit();
}
@@ -776,6 +828,91 @@
EXPECT_EQ(SB_THREAT_TYPE_BINARY_MALWARE_URL, client->GetThreatType());
}
+IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, CheckUnwantedSoftwareUrl) {
+ const GURL bad_url = test_server()->GetURL(kMalwareFile);
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+
+ // Since bad_url is not in database, it is considered to be
+ // safe.
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_SAFE, client->GetThreatType());
+
+ SBFullHashResult full_hash_result;
+ GenUrlFullhashResult(
+ bad_url, safe_browsing_util::UNWANTEDURL, &full_hash_result);
+ SetupResponseForUrl(bad_url, full_hash_result);
+
+ // Now, the bad_url is not safe since it is added to download
+ // database.
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_UNWANTED, client->GetThreatType());
+ }
+
+ // The unwantedness should survive across multiple clients.
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_UNWANTED, client->GetThreatType());
+ }
+
+ // An unwanted URL also marked as malware should be flagged as malware.
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+
+ SBFullHashResult full_hash_result;
+ GenUrlFullhashResult(
+ bad_url, safe_browsing_util::MALWARE, &full_hash_result);
+ SetupResponseForUrl(bad_url, full_hash_result);
+
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, client->GetThreatType());
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, CheckBrowseUrl) {
+ const GURL bad_url = test_server()->GetURL(kMalwareFile);
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+
+ // Since bad_url is not in database, it is considered to be
+ // safe.
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_SAFE, client->GetThreatType());
+
+ SBFullHashResult full_hash_result;
+ GenUrlFullhashResult(
+ bad_url, safe_browsing_util::MALWARE, &full_hash_result);
+ SetupResponseForUrl(bad_url, full_hash_result);
+
+ // Now, the bad_url is not safe since it is added to download
+ // database.
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, client->GetThreatType());
+ }
+
+ // The unwantedness should survive across multiple clients.
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, client->GetThreatType());
+ }
+
+ // Adding the unwanted state to an existing malware URL should have no impact
+ // (i.e. a malware hit should still prevail).
+ {
+ scoped_refptr<TestSBClient> client(new TestSBClient);
+
+ SBFullHashResult full_hash_result;
+ GenUrlFullhashResult(
+ bad_url, safe_browsing_util::UNWANTEDURL, &full_hash_result);
+ SetupResponseForUrl(bad_url, full_hash_result);
+
+ client->CheckBrowseUrl(bad_url);
+ EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, client->GetThreatType());
+ }
+}
+
IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, CheckDownloadUrlRedirects) {
GURL original_url = test_server()->GetURL(kEmptyPage);
GURL badbin_url = test_server()->GetURL(kMalwareFile);
diff --git a/chrome/browser/safe_browsing/safe_browsing_store_file.cc b/chrome/browser/safe_browsing/safe_browsing_store_file.cc
index ff6448e..298d42d 100644
--- a/chrome/browser/safe_browsing/safe_browsing_store_file.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_store_file.cc
@@ -618,10 +618,8 @@
return true;
}
-void SafeBrowsingStoreFile::Init(
- const base::FilePath& filename,
- const base::Closure& corruption_callback
-) {
+void SafeBrowsingStoreFile::Init(const base::FilePath& filename,
+ const base::Closure& corruption_callback) {
filename_ = filename;
corruption_callback_ = corruption_callback;
}
diff --git a/chrome/browser/safe_browsing/safe_browsing_util.cc b/chrome/browser/safe_browsing/safe_browsing_util.cc
index bb2edf9..b8f86d2 100644
--- a/chrome/browser/safe_browsing/safe_browsing_util.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_util.cc
@@ -189,16 +189,18 @@
const char kExtensionBlacklist[] = "goog-badcrxids-digestvar";
const char kSideEffectFreeWhitelist[] = "goog-sideeffectfree-shavar";
const char kIPBlacklist[] = "goog-badip-digest256";
+const char kUnwantedUrlList[] = "goog-unwanted-shavar";
-const char* kAllLists[8] = {
- kMalwareList,
- kPhishingList,
- kBinUrlList,
- kCsdWhiteList,
- kDownloadWhiteList,
- kExtensionBlacklist,
- kSideEffectFreeWhitelist,
- kIPBlacklist,
+const char* kAllLists[9] = {
+ kMalwareList,
+ kPhishingList,
+ kBinUrlList,
+ kCsdWhiteList,
+ kDownloadWhiteList,
+ kExtensionBlacklist,
+ kSideEffectFreeWhitelist,
+ kIPBlacklist,
+ kUnwantedUrlList,
};
ListType GetListId(const base::StringPiece& name) {
@@ -219,6 +221,8 @@
id = SIDEEFFECTFREEWHITELIST;
} else if (name == safe_browsing_util::kIPBlacklist) {
id = IPBLACKLIST;
+ } else if (name == safe_browsing_util::kUnwantedUrlList) {
+ id = UNWANTEDURL;
} else {
id = INVALID;
}
@@ -251,6 +255,9 @@
case IPBLACKLIST:
*list = safe_browsing_util::kIPBlacklist;
break;
+ case UNWANTEDURL:
+ *list = safe_browsing_util::kUnwantedUrlList;
+ break;
default:
return false;
}
diff --git a/chrome/browser/safe_browsing/safe_browsing_util.h b/chrome/browser/safe_browsing/safe_browsing_util.h
index b6ee9d0..de877b0 100644
--- a/chrome/browser/safe_browsing/safe_browsing_util.h
+++ b/chrome/browser/safe_browsing/safe_browsing_util.h
@@ -133,8 +133,8 @@
// The URL hosts malware.
SB_THREAT_TYPE_URL_MALWARE,
- // The URL hosts harmful programs.
- SB_THREAT_TYPE_URL_HARMFUL,
+ // The URL hosts unwanted programs.
+ SB_THREAT_TYPE_URL_UNWANTED,
// The download URL is malware.
SB_THREAT_TYPE_BINARY_MALWARE_URL,
@@ -170,9 +170,11 @@
extern const char kSideEffectFreeWhitelist[];
// SafeBrowsing csd malware IP blacklist name.
extern const char kIPBlacklist[];
+// SafeBrowsing unwanted URL list.
+extern const char kUnwantedUrlList[];
// This array must contain all Safe Browsing lists.
-extern const char* kAllLists[8];
+extern const char* kAllLists[9];
enum ListType {
INVALID = -1,
@@ -192,6 +194,8 @@
// See above comment. Leave 11 available.
IPBLACKLIST = 12,
// See above comment. Leave 13 available.
+ UNWANTEDURL = 14,
+ // See above comment. Leave 15 available.
};
// Maps a list name to ListType.
diff --git a/chrome/browser/services/gcm/gcm_account_tracker.cc b/chrome/browser/services/gcm/gcm_account_tracker.cc
index 0521688..a2cdba0 100644
--- a/chrome/browser/services/gcm/gcm_account_tracker.cc
+++ b/chrome/browser/services/gcm/gcm_account_tracker.cc
@@ -15,18 +15,11 @@
namespace gcm {
namespace {
-
-// Scopes needed by the OAuth2 access tokens.
const char kGCMGroupServerScope[] = "https://www.googleapis.com/auth/gcm";
const char kGCMCheckinServerScope[] =
"https://www.googleapis.com/auth/android_checkin";
-// Name of the GCM account tracker for the OAuth2TokenService.
const char kGCMAccountTrackerName[] = "gcm_account_tracker";
-// Minimum token validity when sending to GCM groups server.
const int64 kMinimumTokenValidityMs = 500;
-// Token reporting interval, when no account changes are detected.
-const int64 kTokenReportingIntervalMs = 12 * 60 * 60 * 1000; // 12 hours in ms.
-
} // namespace
GCMAccountTracker::AccountInfo::AccountInfo(const std::string& email,
@@ -43,8 +36,7 @@
: OAuth2TokenService::Consumer(kGCMAccountTrackerName),
account_tracker_(account_tracker.release()),
driver_(driver),
- shutdown_called_(false),
- reporting_weak_ptr_factory_(this) {
+ shutdown_called_(false) {
}
GCMAccountTracker::~GCMAccountTracker() {
@@ -64,6 +56,11 @@
driver_->AddConnectionObserver(this);
std::vector<gaia::AccountIds> accounts = account_tracker_->GetAccounts();
+ if (accounts.empty()) {
+ CompleteCollectingTokens();
+ return;
+ }
+
for (std::vector<gaia::AccountIds>::const_iterator iter = accounts.begin();
iter != accounts.end();
++iter) {
@@ -73,22 +70,7 @@
}
}
- if (IsTokenReportingRequired())
- ReportTokens();
- else
- ScheduleReportTokens();
-}
-
-void GCMAccountTracker::ScheduleReportTokens() {
- DVLOG(1) << "Deferring the token reporting for: "
- << GetTimeToNextTokenReporting().InSeconds() << " seconds.";
-
- reporting_weak_ptr_factory_.InvalidateWeakPtrs();
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::Bind(&GCMAccountTracker::ReportTokens,
- reporting_weak_ptr_factory_.GetWeakPtr()),
- GetTimeToNextTokenReporting());
+ GetAllNeededTokens();
}
void GCMAccountTracker::OnAccountAdded(const gaia::AccountIds& ids) {
@@ -133,7 +115,7 @@
}
DeleteTokenRequest(request);
- ReportTokens();
+ CompleteCollectingTokens();
}
void GCMAccountTracker::OnGetTokenFailure(
@@ -155,22 +137,21 @@
}
DeleteTokenRequest(request);
- ReportTokens();
+ CompleteCollectingTokens();
}
void GCMAccountTracker::OnConnected(const net::IPEndPoint& ip_endpoint) {
- if (IsTokenReportingRequired())
- ReportTokens();
+ if (SanitizeTokens())
+ GetAllNeededTokens();
}
void GCMAccountTracker::OnDisconnected() {
// We are disconnected, so no point in trying to work with tokens.
}
-void GCMAccountTracker::ReportTokens() {
- SanitizeTokens();
+void GCMAccountTracker::CompleteCollectingTokens() {
// Make sure all tokens are valid.
- if (IsTokenFetchingRequired()) {
+ if (SanitizeTokens()) {
GetAllNeededTokens();
return;
}
@@ -217,14 +198,13 @@
if (!account_tokens.empty() || account_removed) {
DVLOG(1) << "Reporting the tokens to driver: " << account_tokens.size();
driver_->SetAccountTokens(account_tokens);
- driver_->SetLastTokenFetchTime(base::Time::Now());
- ScheduleReportTokens();
} else {
DVLOG(1) << "No tokens and nothing removed. Skipping callback.";
}
}
-void GCMAccountTracker::SanitizeTokens() {
+bool GCMAccountTracker::SanitizeTokens() {
+ bool tokens_needed = false;
for (AccountInfos::iterator iter = account_infos_.begin();
iter != account_infos_.end();
++iter) {
@@ -236,43 +216,12 @@
iter->second.state = TOKEN_NEEDED;
iter->second.expiration_time = base::Time();
}
- }
-}
-bool GCMAccountTracker::IsTokenReportingRequired() const {
- if (GetTimeToNextTokenReporting() == base::TimeDelta())
- return true;
-
- bool reporting_required = false;
- for (AccountInfos::const_iterator iter = account_infos_.begin();
- iter != account_infos_.end();
- ++iter) {
- if (iter->second.state == ACCOUNT_REMOVED)
- reporting_required = true;
- }
-
- return reporting_required;
-}
-
-bool GCMAccountTracker::IsTokenFetchingRequired() const {
- bool token_needed = false;
- for (AccountInfos::const_iterator iter = account_infos_.begin();
- iter != account_infos_.end();
- ++iter) {
if (iter->second.state == TOKEN_NEEDED)
- token_needed = true;
+ tokens_needed = true;
}
- return token_needed;
-}
-
-base::TimeDelta GCMAccountTracker::GetTimeToNextTokenReporting() const {
- base::TimeDelta time_till_next_reporting =
- driver_->GetLastTokenFetchTime() +
- base::TimeDelta::FromMilliseconds(kTokenReportingIntervalMs) -
- base::Time::Now();
- return time_till_next_reporting < base::TimeDelta() ?
- base::TimeDelta() : time_till_next_reporting;
+ return tokens_needed;
}
void GCMAccountTracker::DeleteTokenRequest(
@@ -286,9 +235,6 @@
void GCMAccountTracker::GetAllNeededTokens() {
// Only start fetching tokens if driver is running, they have a limited
// validity time and GCM connection is a good indication of network running.
- // If the GetAllNeededTokens was called as part of periodic schedule, it may
- // not have network. In that case the next network change will trigger token
- // fetching.
if (!driver_->IsConnected())
return;
@@ -336,7 +282,7 @@
iter->second.access_token.clear();
iter->second.state = ACCOUNT_REMOVED;
- ReportTokens();
+ CompleteCollectingTokens();
}
OAuth2TokenService* GCMAccountTracker::GetTokenService() {
diff --git a/chrome/browser/services/gcm/gcm_account_tracker.h b/chrome/browser/services/gcm/gcm_account_tracker.h
index 39f357e..0b1c5e8 100644
--- a/chrome/browser/services/gcm/gcm_account_tracker.h
+++ b/chrome/browser/services/gcm/gcm_account_tracker.h
@@ -14,21 +14,12 @@
#include "google_apis/gaia/account_tracker.h"
#include "google_apis/gaia/oauth2_token_service.h"
-namespace base {
-class Time;
-}
-
namespace gcm {
class GCMDriver;
// Class for reporting back which accounts are signed into. It is only meant to
// be used when the user is signed into sync.
-//
-// This class makes a check for tokens periodically, to make sure the user is
-// still logged into the profile, so that in the case that the user is not, we
-// can immediately report that to the GCM and stop messages addressed to that
-// user from ever reaching Chrome.
class GCMAccountTracker : public gaia::AccountTracker::Observer,
public OAuth2TokenService::Consumer,
public GCMConnectionObserver {
@@ -85,8 +76,6 @@
}
private:
- friend class GCMAccountTrackerTest;
-
// Maps account keys to account states. Keyed by account_ids as used by
// OAuth2TokenService.
typedef std::map<std::string, AccountInfo> AccountInfos;
@@ -108,22 +97,13 @@
void OnConnected(const net::IPEndPoint& ip_endpoint) override;
void OnDisconnected() override;
- // Schedules token reporting.
- void ScheduleReportTokens();
// Report the list of accounts with OAuth2 tokens back using the |callback_|
// function. If there are token requests in progress, do nothing.
- void ReportTokens();
+ void CompleteCollectingTokens();
// Verify that all of the tokens are ready to be passed down to the GCM
// Driver, e.g. none of them has expired or is missing. Returns true if not
// all tokens are valid and a fetching yet more tokens is required.
- void SanitizeTokens();
- // Indicates whether token reporting is required, either because it is due, or
- // some of the accounts were removed.
- bool IsTokenReportingRequired() const;
- // Indicates whether there are tokens that still need fetching.
- bool IsTokenFetchingRequired() const;
- // Gets the time until next token reporting.
- base::TimeDelta GetTimeToNextTokenReporting() const;
+ bool SanitizeTokens();
// Deletes a token request. Should be called from OnGetTokenSuccess(..) or
// OnGetTokenFailure(..).
void DeleteTokenRequest(const OAuth2TokenService::Request* request);
@@ -153,10 +133,6 @@
ScopedVector<OAuth2TokenService::Request> pending_token_requests_;
- // Creates weak pointers used to postpone reporting tokens. See
- // ScheduleReportTokens.
- base::WeakPtrFactory<GCMAccountTracker> reporting_weak_ptr_factory_;
-
DISALLOW_COPY_AND_ASSIGN(GCMAccountTracker);
};
diff --git a/chrome/browser/services/gcm/gcm_account_tracker_unittest.cc b/chrome/browser/services/gcm/gcm_account_tracker_unittest.cc
index eb8030a..2211d76 100644
--- a/chrome/browser/services/gcm/gcm_account_tracker_unittest.cc
+++ b/chrome/browser/services/gcm/gcm_account_tracker_unittest.cc
@@ -8,6 +8,8 @@
#include <string>
#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
#include "components/gcm_driver/fake_gcm_driver.h"
#include "google_apis/gaia/fake_identity_provider.h"
#include "google_apis/gaia/fake_oauth2_token_service.h"
@@ -74,8 +76,6 @@
void AddConnectionObserver(GCMConnectionObserver* observer) override;
void RemoveConnectionObserver(GCMConnectionObserver* observer) override;
bool IsConnected() const override { return connected_; }
- base::Time GetLastTokenFetchTime() override;
- void SetLastTokenFetchTime(const base::Time& time) override;
// Test results and helpers.
void SetConnected(bool connected);
@@ -98,7 +98,6 @@
GCMConnectionObserver* last_connection_observer_;
GCMConnectionObserver* removed_connection_observer_;
net::IPEndPoint ip_endpoint_;
- base::Time last_token_fetch_time_;
DISALLOW_COPY_AND_ASSIGN(CustomFakeGCMDriver);
};
@@ -142,15 +141,6 @@
removed_connection_observer_ = NULL;
}
-
-base::Time CustomFakeGCMDriver::GetLastTokenFetchTime() {
- return last_token_fetch_time_;
-}
-
-void CustomFakeGCMDriver::SetLastTokenFetchTime(const base::Time& time) {
- last_token_fetch_time_ = time;
-}
-
} // namespace
class GCMAccountTrackerTest : public testing::Test {
@@ -175,11 +165,6 @@
GCMAccountTracker* tracker() { return tracker_.get(); }
CustomFakeGCMDriver* driver() { return &driver_; }
- // Accessors to private methods of account tracker.
- bool IsFetchingRequired() const;
- bool IsTokenReportingRequired() const;
- base::TimeDelta GetTimeToNextTokenReporting() const;
-
private:
CustomFakeGCMDriver driver_;
@@ -252,18 +237,6 @@
GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
}
-bool GCMAccountTrackerTest::IsFetchingRequired() const {
- return tracker_->IsTokenFetchingRequired();
-}
-
-bool GCMAccountTrackerTest::IsTokenReportingRequired() const {
- return tracker_->IsTokenReportingRequired();
-}
-
-base::TimeDelta GCMAccountTrackerTest::GetTimeToNextTokenReporting() const {
- return tracker_->GetTimeToNextTokenReporting();
-}
-
TEST_F(GCMAccountTrackerTest, NoAccounts) {
EXPECT_FALSE(driver()->update_accounts_called());
tracker()->Start();
@@ -430,7 +403,7 @@
EXPECT_EQ(1UL, tracker()->get_pending_token_request_count());
}
-TEST_F(GCMAccountTrackerTest, InvalidateExpiredTokens) {
+TEST_F(GCMAccountTrackerTest, IvalidateExpiredTokens) {
StartAccountSignIn(kAccountId1);
StartAccountSignIn(kAccountId2);
tracker()->Start();
@@ -448,63 +421,6 @@
EXPECT_EQ(1UL, tracker()->get_pending_token_request_count());
}
-// Testing for whether there are still more tokens to be fetched. Typically the
-// need for token fetching triggers immediate request, unless there is no
-// connection, that is why connection is set on and off in this test.
-TEST_F(GCMAccountTrackerTest, IsTokenFetchingRequired) {
- tracker()->Start();
- driver()->SetConnected(false);
- EXPECT_FALSE(IsFetchingRequired());
- StartAccountSignIn(kAccountId1);
- FinishAccountSignIn(kAccountId1);
- EXPECT_TRUE(IsFetchingRequired());
-
- driver()->SetConnected(true);
- EXPECT_FALSE(IsFetchingRequired()); // Indicates that fetching has started.
- IssueAccessToken(kAccountId1);
- EXPECT_FALSE(IsFetchingRequired());
-
- driver()->SetConnected(false);
- StartAccountSignIn(kAccountId2);
- FinishAccountSignIn(kAccountId2);
- EXPECT_TRUE(IsFetchingRequired());
-
- IssueExpiredAccessToken(kAccountId2);
- // Make sure that if the token was expired it is still needed.
- EXPECT_TRUE(IsFetchingRequired());
-}
-
-// Tests what is the expected time to the next token fetching.
-TEST_F(GCMAccountTrackerTest, GetTimeToNextTokenReporting) {
- tracker()->Start();
- // At this point the last token fetch time is never.
- EXPECT_EQ(base::TimeDelta(), GetTimeToNextTokenReporting());
-
- driver()->SetLastTokenFetchTime(base::Time::Now());
- EXPECT_TRUE(GetTimeToNextTokenReporting() <=
- base::TimeDelta::FromSeconds(12 * 60 * 60));
-}
-
-// Tests conditions when token reporting is required.
-TEST_F(GCMAccountTrackerTest, IsTokenReportingRequired) {
- tracker()->Start();
- // Required because it is overdue.
- EXPECT_TRUE(IsTokenReportingRequired());
-
- // Not required because it just happened.
- driver()->SetLastTokenFetchTime(base::Time::Now());
- EXPECT_FALSE(IsTokenReportingRequired());
-
- SignInAccount(kAccountId1);
- IssueAccessToken(kAccountId1);
- driver()->ResetResults();
- // Reporting was triggered, which means testing for required will give false,
- // but we have the update call.
- SignOutAccount(kAccountId1);
- EXPECT_TRUE(driver()->update_accounts_called());
- EXPECT_FALSE(IsTokenReportingRequired());
-}
-
// TODO(fgorski): Add test for adding account after removal >> make sure it does
// not mark removal.
diff --git a/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc b/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc
index 656e88d..cc0ff76 100644
--- a/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc
+++ b/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc
@@ -69,6 +69,7 @@
state == EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE ||
state == EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH ||
state == EasyUnlockScreenlockStateHandler::STATE_PHONE_UNSUPPORTED ||
+ state == EasyUnlockScreenlockStateHandler::STATE_RSSI_TOO_LOW ||
state == EasyUnlockScreenlockStateHandler::STATE_TX_POWER_TOO_HIGH;
}
@@ -211,8 +212,13 @@
if (!screenlock_bridge_->IsLocked())
return;
- if (screenlock_bridge_->lock_handler()->GetAuthType(user_email_) !=
- ScreenlockBridge::LockHandler::OFFLINE_PASSWORD) {
+ // Do not override online signin.
+ const ScreenlockBridge::LockHandler::AuthType existing_auth_type =
+ screenlock_bridge_->lock_handler()->GetAuthType(user_email_);
+ if (existing_auth_type == ScreenlockBridge::LockHandler::ONLINE_SIGN_IN)
+ return;
+
+ if (existing_auth_type != ScreenlockBridge::LockHandler::OFFLINE_PASSWORD) {
screenlock_bridge_->lock_handler()->SetAuthType(
user_email_,
ScreenlockBridge::LockHandler::OFFLINE_PASSWORD,
@@ -231,6 +237,10 @@
ScreenlockBridge::UserPodCustomIconOptions icon_options;
if (hardlock_state_ == LOGIN_FAILED) {
icon_options.SetIcon(ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED);
+ } else if (hardlock_state_ == PAIRING_CHANGED ||
+ hardlock_state_ == PAIRING_ADDED) {
+ icon_options.SetIcon(
+ ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED_TO_BE_ACTIVATED);
} else {
icon_options.SetIcon(ScreenlockBridge::USER_POD_CUSTOM_ICON_HARDLOCKED);
}
@@ -300,17 +310,22 @@
if (!is_trial_run_ && hardlock_state_ != NO_HARDLOCK)
return;
+ // Do not override online signin.
+ const ScreenlockBridge::LockHandler::AuthType existing_auth_type =
+ screenlock_bridge_->lock_handler()->GetAuthType(user_email_);
+ if (existing_auth_type == ScreenlockBridge::LockHandler::ONLINE_SIGN_IN)
+ return;
+
if (state_ == STATE_AUTHENTICATED) {
- if (screenlock_bridge_->lock_handler()->GetAuthType(user_email_) !=
- ScreenlockBridge::LockHandler::USER_CLICK) {
+ if (existing_auth_type != ScreenlockBridge::LockHandler::USER_CLICK) {
screenlock_bridge_->lock_handler()->SetAuthType(
user_email_,
ScreenlockBridge::LockHandler::USER_CLICK,
l10n_util::GetStringUTF16(
IDS_EASY_UNLOCK_SCREENLOCK_USER_POD_AUTH_VALUE));
}
- } else if (screenlock_bridge_->lock_handler()->GetAuthType(user_email_) !=
- ScreenlockBridge::LockHandler::OFFLINE_PASSWORD) {
+ } else if (existing_auth_type !=
+ ScreenlockBridge::LockHandler::OFFLINE_PASSWORD) {
screenlock_bridge_->lock_handler()->SetAuthType(
user_email_,
ScreenlockBridge::LockHandler::OFFLINE_PASSWORD,
diff --git a/chrome/browser/signin/easy_unlock_screenlock_state_handler_unittest.cc b/chrome/browser/signin/easy_unlock_screenlock_state_handler_unittest.cc
index 4c0e89b..0b020f9 100644
--- a/chrome/browser/signin/easy_unlock_screenlock_state_handler_unittest.cc
+++ b/chrome/browser/signin/easy_unlock_screenlock_state_handler_unittest.cc
@@ -20,6 +20,7 @@
// Icons used by EasyUnlockScreenlockStateHandler. The icon id values are the
// same as the ones set by ScreenlockBridge.
const char kLockedIconId[] = "locked";
+const char kLockedToBeActivatedIconId[] = "locked-to-be-activated";
const char kUnlockedIconId[] = "unlocked";
const char kSpinnerIconId[] = "spinner";
const char kHardlockedIconId[] = "hardlocked";
@@ -565,14 +566,14 @@
EXPECT_EQ(1u, lock_handler_->GetAndResetShowIconCount());
ASSERT_TRUE(lock_handler_->HasCustomIcon());
- EXPECT_EQ(kHardlockedIconId, lock_handler_->GetCustomIconId());
+ EXPECT_EQ(kLockedToBeActivatedIconId, lock_handler_->GetCustomIconId());
state_handler_->ChangeState(
EasyUnlockScreenlockStateHandler::STATE_AUTHENTICATED);
EXPECT_EQ(0u, lock_handler_->GetAndResetShowIconCount());
ASSERT_TRUE(lock_handler_->HasCustomIcon());
- EXPECT_EQ(kHardlockedIconId, lock_handler_->GetCustomIconId());
+ EXPECT_EQ(kLockedToBeActivatedIconId, lock_handler_->GetCustomIconId());
}
TEST_F(EasyUnlockScreenlockStateHandlerTest,
@@ -744,4 +745,44 @@
lock_handler_->GetAuthType(user_email_));
}
+TEST_F(EasyUnlockScreenlockStateHandlerTest, NoOverrideOnlineSignin) {
+ lock_handler_->SetAuthType(user_email_,
+ ScreenlockBridge::LockHandler::ONLINE_SIGN_IN,
+ base::string16());
+
+ std::vector<EasyUnlockScreenlockStateHandler::State> states;
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_NO_PHONE);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_PHONE_UNSUPPORTED);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE);
+ states.push_back(
+ EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_AUTHENTICATED);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_PHONE_LOCKED);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_PHONE_UNSUPPORTED);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_RSSI_TOO_LOW);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_TX_POWER_TOO_HIGH);
+ states.push_back(EasyUnlockScreenlockStateHandler::STATE_AUTHENTICATED);
+
+ for (size_t i = 0; i < states.size(); ++i) {
+ state_handler_->ChangeState(states[i]);
+ EXPECT_EQ(ScreenlockBridge::LockHandler::ONLINE_SIGN_IN,
+ lock_handler_->GetAuthType(user_email_));
+ }
+
+ std::vector<EasyUnlockScreenlockStateHandler::HardlockState> hardlock_states;
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::NO_HARDLOCK);
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::USER_HARDLOCK);
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::PAIRING_CHANGED);
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::PAIRING_ADDED);
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::NO_PAIRING);
+ hardlock_states.push_back(EasyUnlockScreenlockStateHandler::LOGIN_FAILED);
+
+ for (size_t i = 0; i < hardlock_states.size(); ++i) {
+ state_handler_->SetHardlockState(hardlock_states[i]);
+ EXPECT_EQ(ScreenlockBridge::LockHandler::ONLINE_SIGN_IN,
+ lock_handler_->GetAuthType(user_email_));
+ }
+}
+
} // namespace
diff --git a/chrome/browser/signin/easy_unlock_service.cc b/chrome/browser/signin/easy_unlock_service.cc
index 794941e..9281513 100644
--- a/chrome/browser/signin/easy_unlock_service.cc
+++ b/chrome/browser/signin/easy_unlock_service.cc
@@ -301,13 +301,14 @@
}
void EasyUnlockService::ShowInitialUserState() {
+ if (!GetScreenlockStateHandler())
+ return;
+
EasyUnlockScreenlockStateHandler::HardlockState state;
bool has_persisted_state = GetPersistedHardlockState(&state);
if (!has_persisted_state)
return;
- GetScreenlockStateHandler();
-
if (state == EasyUnlockScreenlockStateHandler::NO_HARDLOCK) {
// Show connecting icon early when there is a persisted non hardlock state.
UpdateScreenlockState(
diff --git a/chrome/browser/signin/screenlock_bridge.cc b/chrome/browser/signin/screenlock_bridge.cc
index b11b51e..1883814 100644
--- a/chrome/browser/signin/screenlock_bridge.cc
+++ b/chrome/browser/signin/screenlock_bridge.cc
@@ -24,6 +24,7 @@
// account picker as user pod custom icons.
// The id's should be kept in sync with values used by user_pod_row.js.
const char kLockedUserPodCustomIconId[] = "locked";
+const char kLockedToBeActivatedUserPodCustomIconId[] = "locked-to-be-activated";
const char kLockedWithProximityHintUserPodCustomIconId[] =
"locked-with-proximity-hint";
const char kUnlockedUserPodCustomIconId[] = "unlocked";
@@ -35,6 +36,8 @@
switch (icon) {
case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED:
return kLockedUserPodCustomIconId;
+ case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED_TO_BE_ACTIVATED:
+ return kLockedToBeActivatedUserPodCustomIconId;
case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED_WITH_PROXIMITY_HINT:
return kLockedWithProximityHintUserPodCustomIconId;
case ScreenlockBridge::USER_POD_CUSTOM_ICON_UNLOCKED:
diff --git a/chrome/browser/signin/screenlock_bridge.h b/chrome/browser/signin/screenlock_bridge.h
index bf77832..1cfba53 100644
--- a/chrome/browser/signin/screenlock_bridge.h
+++ b/chrome/browser/signin/screenlock_bridge.h
@@ -42,6 +42,7 @@
USER_POD_CUSTOM_ICON_NONE,
USER_POD_CUSTOM_ICON_HARDLOCKED,
USER_POD_CUSTOM_ICON_LOCKED,
+ USER_POD_CUSTOM_ICON_LOCKED_TO_BE_ACTIVATED,
// TODO(isherman): The "locked with proximity hint" icon is currently the
// same as the "locked" icon. It's treated as a separate case to allow an
// easy asset swap without changing the code, in case we decide to use a
diff --git a/chrome/browser/ssl/ssl_error_info.cc b/chrome/browser/ssl/ssl_error_info.cc
index 80aaf9b..9737bdf 100644
--- a/chrome/browser/ssl/ssl_error_info.cc
+++ b/chrome/browser/ssl/ssl_error_info.cc
@@ -145,13 +145,6 @@
short_description = l10n_util::GetStringUTF16(
IDS_CERT_ERROR_NAME_CONSTRAINT_VIOLATION_DESCRIPTION);
break;
- case CERT_VALIDITY_TOO_LONG:
- details =
- l10n_util::GetStringFUTF16(IDS_CERT_ERROR_VALIDITY_TOO_LONG_DETAILS,
- UTF8ToUTF16(request_url.host()));
- short_description = l10n_util::GetStringUTF16(
- IDS_CERT_ERROR_VALIDITY_TOO_LONG_DESCRIPTION);
- break;
case CERT_PINNED_KEY_MISSING:
details = l10n_util::GetStringUTF16(
IDS_ERRORPAGES_SUMMARY_PINNING_FAILURE);
@@ -198,8 +191,6 @@
return CERT_WEAK_KEY;
case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION:
return CERT_NAME_CONSTRAINT_VIOLATION;
- case net::ERR_CERT_VALIDITY_TOO_LONG:
- return CERT_VALIDITY_TOO_LONG;
case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
return CERT_WEAK_KEY_DH;
case net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN:
@@ -216,31 +207,29 @@
const GURL& url,
std::vector<SSLErrorInfo>* errors) {
const net::CertStatus kErrorFlags[] = {
- net::CERT_STATUS_COMMON_NAME_INVALID,
- net::CERT_STATUS_DATE_INVALID,
- net::CERT_STATUS_AUTHORITY_INVALID,
- net::CERT_STATUS_NO_REVOCATION_MECHANISM,
- net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
- net::CERT_STATUS_REVOKED,
- net::CERT_STATUS_INVALID,
- net::CERT_STATUS_WEAK_SIGNATURE_ALGORITHM,
- net::CERT_STATUS_WEAK_KEY,
- net::CERT_STATUS_NAME_CONSTRAINT_VIOLATION,
- net::CERT_STATUS_VALIDITY_TOO_LONG,
+ net::CERT_STATUS_COMMON_NAME_INVALID,
+ net::CERT_STATUS_DATE_INVALID,
+ net::CERT_STATUS_AUTHORITY_INVALID,
+ net::CERT_STATUS_NO_REVOCATION_MECHANISM,
+ net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
+ net::CERT_STATUS_REVOKED,
+ net::CERT_STATUS_INVALID,
+ net::CERT_STATUS_WEAK_SIGNATURE_ALGORITHM,
+ net::CERT_STATUS_WEAK_KEY,
+ net::CERT_STATUS_NAME_CONSTRAINT_VIOLATION,
};
const ErrorType kErrorTypes[] = {
- CERT_COMMON_NAME_INVALID,
- CERT_DATE_INVALID,
- CERT_AUTHORITY_INVALID,
- CERT_NO_REVOCATION_MECHANISM,
- CERT_UNABLE_TO_CHECK_REVOCATION,
- CERT_REVOKED,
- CERT_INVALID,
- CERT_WEAK_SIGNATURE_ALGORITHM,
- CERT_WEAK_KEY,
- CERT_NAME_CONSTRAINT_VIOLATION,
- CERT_VALIDITY_TOO_LONG,
+ CERT_COMMON_NAME_INVALID,
+ CERT_DATE_INVALID,
+ CERT_AUTHORITY_INVALID,
+ CERT_NO_REVOCATION_MECHANISM,
+ CERT_UNABLE_TO_CHECK_REVOCATION,
+ CERT_REVOKED,
+ CERT_INVALID,
+ CERT_WEAK_SIGNATURE_ALGORITHM,
+ CERT_WEAK_KEY,
+ CERT_NAME_CONSTRAINT_VIOLATION,
};
DCHECK(arraysize(kErrorFlags) == arraysize(kErrorTypes));
@@ -254,10 +243,9 @@
cert_id, &cert);
DCHECK(r);
}
- if (errors) {
+ if (errors)
errors->push_back(
SSLErrorInfo::CreateError(kErrorTypes[i], cert.get(), url));
- }
}
}
return count;
diff --git a/chrome/browser/ssl/ssl_error_info.h b/chrome/browser/ssl/ssl_error_info.h
index 2980305..bcc169a 100644
--- a/chrome/browser/ssl/ssl_error_info.h
+++ b/chrome/browser/ssl/ssl_error_info.h
@@ -33,7 +33,6 @@
CERT_WEAK_SIGNATURE_ALGORITHM,
CERT_WEAK_KEY,
CERT_NAME_CONSTRAINT_VIOLATION,
- CERT_VALIDITY_TOO_LONG,
UNKNOWN,
CERT_WEAK_KEY_DH,
CERT_PINNED_KEY_MISSING,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index dcc96d7..f08a99f 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -224,13 +224,7 @@
gypi_values.chrome_browser_ui_views_non_chromeos_sources,
".", "//chrome")
}
- if (is_mac) {
- if (mac_views_browser) {
- sources -= [ "cocoa/browser_window_factory_cocoa.mm" ]
- } else {
- sources -= [ "views/frame/browser_window_factory.cc" ]
- }
- } else {
+ if (!is_mac) {
sources += rebase_path(
gypi_values.chrome_browser_ui_views_non_mac_sources,
".", "//chrome")
diff --git a/chrome/browser/ui/android/tab_model/tab_model.h b/chrome/browser/ui/android/tab_model/tab_model.h
index f6678d5..0125f97 100644
--- a/chrome/browser/ui/android/tab_model/tab_model.h
+++ b/chrome/browser/ui/android/tab_model/tab_model.h
@@ -38,6 +38,7 @@
virtual int GetTabCount() const = 0;
virtual int GetActiveIndex() const = 0;
virtual content::WebContents* GetWebContentsAt(int index) const = 0;
+ // This will return NULL if the tab has not yet been initialized.
virtual TabAndroid* GetTabAt(int index) const = 0;
virtual void SetActiveIndex(int index) = 0;
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list.cc b/chrome/browser/ui/android/tab_model/tab_model_list.cc
index 42e24ec..04985b7 100644
--- a/chrome/browser/ui/android/tab_model/tab_model_list.cc
+++ b/chrome/browser/ui/android/tab_model/tab_model_list.cc
@@ -52,8 +52,7 @@
i != TabModelList::end(); ++i) {
TabModel* model = *i;
for (int index = 0; index < model->GetTabCount(); index++) {
- TabAndroid* tab = model->GetTabAt(index);
- if (web_contents == tab->web_contents())
+ if (web_contents == model->GetWebContentsAt(index))
return model;
}
}
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list_unittest.cc b/chrome/browser/ui/android/tab_model/tab_model_list_unittest.cc
new file mode 100644
index 0000000..1fb6b4b
--- /dev/null
+++ b/chrome/browser/ui/android/tab_model/tab_model_list_unittest.cc
@@ -0,0 +1,56 @@
+// Copyright 2014 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/ui/android/tab_model/tab_model.h"
+#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/web_contents.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+class TabModelListTest : public ChromeRenderViewHostTestHarness {};
+} // namespace
+
+class TestTabModel : public TabModel {
+ public:
+ explicit TestTabModel(Profile* profile) : TabModel(profile), tab_count_(0) {}
+
+ virtual int GetTabCount() const override { return tab_count_; }
+ virtual int GetActiveIndex() const override { return 0; }
+ virtual content::WebContents* GetWebContentsAt(int index) const override {
+ return nullptr;
+ }
+ virtual void CreateTab(content::WebContents* web_contents,
+ int parent_tab_id) override {}
+ virtual content::WebContents* CreateNewTabForDevTools(
+ const GURL& url) override {
+ return nullptr;
+ }
+ virtual bool IsSessionRestoreInProgress() const override { return false; }
+ virtual TabAndroid* GetTabAt(int index) const override { return nullptr; }
+ virtual void SetActiveIndex(int index) override {}
+ virtual void CloseTabAt(int index) override {}
+
+ // A fake value for the current number of tabs.
+ int tab_count_;
+};
+
+// Regression test for http://crbug.com/432685.
+TEST_F(TabModelListTest, TestGetTabModelForWebContents) {
+ TestTabModel tab_model(profile());
+ TabModelList::AddTabModel(&tab_model);
+
+ scoped_ptr<content::WebContents> contents(CreateTestWebContents());
+
+ // Should not crash when there are no tabs.
+ EXPECT_EQ(NULL, TabModelList::GetTabModelForWebContents(contents.get()));
+
+ // Should not crash when there is an uninitialized tab, i.e. when
+ // TabModel::GetTabAt returns NULL.
+ tab_model.tab_count_ = 1;
+ EXPECT_EQ(NULL, TabModelList::GetTabModelForWebContents(contents.get()));
+
+ TabModelList::RemoveTabModel(&tab_model);
+}
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc
index 9113e3b..f07f122 100644
--- a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc
@@ -99,7 +99,8 @@
app_window->app_icon().AsImageSkia());
}
-void AppWindowLauncherController::OnAppWindowShown(AppWindow* app_window) {
+void AppWindowLauncherController::OnAppWindowShown(AppWindow* app_window,
+ bool was_hidden) {
aura::Window* window = app_window->GetNativeWindow();
if (!ControlsWindow(window))
return;
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.h
index 8f2ca87..4ff452e 100644
--- a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.h
@@ -51,7 +51,8 @@
// Overridden from AppWindowRegistry::Observer:
void OnAppWindowIconChanged(extensions::AppWindow* app_window) override;
- void OnAppWindowShown(extensions::AppWindow* app_window) override;
+ void OnAppWindowShown(extensions::AppWindow* app_window,
+ bool was_hidden) override;
void OnAppWindowHidden(extensions::AppWindow* app_window) override;
// Overriden from aura::WindowObserver:
diff --git a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
index 95c6f41..00e8c73 100644
--- a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
@@ -91,7 +91,8 @@
}
void MultiProfileAppWindowLauncherController::OnAppWindowShown(
- extensions::AppWindow* app_window) {
+ extensions::AppWindow* app_window,
+ bool was_hidden) {
if (!ControlsWindow(app_window->GetNativeWindow()))
return;
diff --git a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.h
index 9e30906..d998ab6 100644
--- a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.h
@@ -23,7 +23,8 @@
// Overridden from AppWindowRegistry::Observer:
void OnAppWindowAdded(extensions::AppWindow* app_window) override;
void OnAppWindowRemoved(extensions::AppWindow* app_window) override;
- void OnAppWindowShown(extensions::AppWindow* app_window) override;
+ void OnAppWindowShown(extensions::AppWindow* app_window,
+ bool was_hidden) override;
void OnAppWindowHidden(extensions::AppWindow* app_window) override;
private:
diff --git a/chrome/browser/ui/cocoa/browser_window_factory_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_factory.mm
similarity index 100%
rename from chrome/browser/ui/cocoa/browser_window_factory_cocoa.mm
rename to chrome/browser/ui/cocoa/browser_window_factory.mm
diff --git a/chrome/browser/ui/passwords/manage_passwords_bubble_model.cc b/chrome/browser/ui/passwords/manage_passwords_bubble_model.cc
index 1e1b433..dd59671 100644
--- a/chrome/browser/ui/passwords/manage_passwords_bubble_model.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_bubble_model.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
+#include "chrome/browser/ui/passwords/password_bubble_experiment.h"
#include "chrome/grit/generated_resources.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/core/common/password_manager_ui.h"
@@ -33,6 +34,15 @@
: kPasswordFieldSize);
}
+void RecordExperimentStatistics(content::WebContents* web_contents,
+ metrics_util::UIDismissalReason reason) {
+ if (!web_contents)
+ return;
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents->GetBrowserContext());
+ password_bubble_experiment::RecordBubbleClosed(profile->GetPrefs(), reason);
+}
+
} // namespace
ManagePasswordsBubbleModel::ManagePasswordsBubbleModel(
@@ -109,15 +119,20 @@
return;
metrics_util::LogUIDismissalReason(dismissal_reason_);
+ // Other use cases have been reported in the callbacks like OnSaveClicked().
+ if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION)
+ RecordExperimentStatistics(web_contents(), dismissal_reason_);
}
void ManagePasswordsBubbleModel::OnNopeClicked() {
dismissal_reason_ = metrics_util::CLICKED_NOPE;
+ RecordExperimentStatistics(web_contents(), dismissal_reason_);
state_ = password_manager::ui::PENDING_PASSWORD_STATE;
}
void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() {
dismissal_reason_ = metrics_util::CLICKED_NEVER;
+ RecordExperimentStatistics(web_contents(), dismissal_reason_);
ManagePasswordsUIController* manage_passwords_ui_controller =
ManagePasswordsUIController::FromWebContents(web_contents());
manage_passwords_ui_controller->NeverSavePassword();
@@ -134,6 +149,7 @@
void ManagePasswordsBubbleModel::OnSaveClicked() {
dismissal_reason_ = metrics_util::CLICKED_SAVE;
+ RecordExperimentStatistics(web_contents(), dismissal_reason_);
ManagePasswordsUIController* manage_passwords_ui_controller =
ManagePasswordsUIController::FromWebContents(web_contents());
manage_passwords_ui_controller->SavePassword();
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
index 039f589..4afd320 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/location_bar/location_bar.h"
#include "chrome/browser/ui/passwords/manage_passwords_icon.h"
+#include "chrome/browser/ui/passwords/password_bubble_experiment.h"
#include "chrome/common/url_constants.h"
#include "components/password_manager/core/browser/password_store.h"
#include "content/public/browser/notification_service.h"
@@ -268,6 +269,10 @@
Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
if (!browser || browser->toolbar_model()->input_in_progress())
return;
+ if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE &&
+ !password_bubble_experiment::ShouldShowBubble(
+ browser->profile()->GetPrefs()))
+ return;
CommandUpdater* updater = browser->command_controller()->command_updater();
updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE);
#endif
diff --git a/chrome/browser/ui/passwords/password_bubble_experiment.cc b/chrome/browser/ui/passwords/password_bubble_experiment.cc
new file mode 100644
index 0000000..276a038
--- /dev/null
+++ b/chrome/browser/ui/passwords/password_bubble_experiment.cc
@@ -0,0 +1,205 @@
+// Copyright 2014 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/ui/passwords/password_bubble_experiment.h"
+
+#include "base/metrics/field_trial.h"
+#include "base/prefs/pref_service.h"
+#include "base/rand_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
+#include "chrome/common/pref_names.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/variations/variations_associated_data.h"
+
+namespace password_bubble_experiment {
+namespace {
+
+bool IsNegativeEvent(password_manager::metrics_util::UIDismissalReason reason) {
+ return (reason == password_manager::metrics_util::NO_DIRECT_INTERACTION ||
+ reason == password_manager::metrics_util::CLICKED_NOPE ||
+ reason == password_manager::metrics_util::CLICKED_NEVER);
+}
+
+// "TimeSpan" experiment -----------------------------------------------------
+
+bool ExtractTimeSpanParams(base::TimeDelta* time_delta, int* nopes_limit) {
+ std::map<std::string, std::string> params;
+ bool retrieved = variations::GetVariationParams(kExperimentName, ¶ms);
+ if (!retrieved)
+ return false;
+ int days = 0;
+ if (!base::StringToInt(params[kParamTimeSpan], &days) ||
+ !base::StringToInt(params[kParamTimeSpanNopeThreshold], nopes_limit))
+ return false;
+ *time_delta = base::TimeDelta::FromDays(days);
+ return true;
+}
+
+bool OverwriteTimeSpanPrefsIfNeeded(PrefService* prefs,
+ base::TimeDelta time_span) {
+ base::Time beginning = base::Time::FromInternalValue(
+ prefs->GetInt64(prefs::kPasswordBubbleTimeStamp));
+ base::Time now = base::Time::Now();
+ if (beginning + time_span < now) {
+ prefs->SetInt64(prefs::kPasswordBubbleTimeStamp, now.ToInternalValue());
+ prefs->SetInteger(prefs::kPasswordBubbleNopesCount, 0);
+ return true;
+ }
+ return false;
+}
+
+// If user dismisses the bubble >= kParamTimeSpanNopeThreshold times during
+// kParamTimeSpan days then the bubble isn't shown until the end of this time
+// span.
+bool ShouldShowBubbleTimeSpanExperiment(PrefService* prefs) {
+ base::TimeDelta time_span;
+ int nopes_limit = 0;
+ if (!ExtractTimeSpanParams(&time_span, &nopes_limit)) {
+ VLOG(2) << "Can't read parameters for "
+ << kExperimentName << " experiment";
+ return true;
+ }
+ // Check if the new time span has started.
+ if (OverwriteTimeSpanPrefsIfNeeded(prefs, time_span))
+ return true;
+ int current_nopes = prefs->GetInteger(prefs::kPasswordBubbleNopesCount);
+ return current_nopes < nopes_limit;
+}
+
+// Increase the "Nope" counter in prefs and start a new time span if needed.
+void UpdateTimeSpanPrefs(
+ PrefService* prefs,
+ password_manager::metrics_util::UIDismissalReason reason) {
+ if (!IsNegativeEvent(reason))
+ return;
+ base::TimeDelta time_span;
+ int nopes_limit = 0;
+ if (!ExtractTimeSpanParams(&time_span, &nopes_limit)) {
+ VLOG(2) << "Can't read parameters for "
+ << kExperimentName << " experiment";
+ return;
+ }
+ OverwriteTimeSpanPrefsIfNeeded(prefs, time_span);
+ int current_nopes = prefs->GetInteger(prefs::kPasswordBubbleNopesCount);
+ prefs->SetInteger(prefs::kPasswordBubbleNopesCount, current_nopes + 1);
+}
+
+// "Probability" experiment --------------------------------------------------
+
+bool ExtractProbabilityParams(unsigned* history_length, unsigned* saves) {
+ std::map<std::string, std::string> params;
+ bool retrieved = variations::GetVariationParams(kExperimentName, ¶ms);
+ if (!retrieved)
+ return false;
+ return base::StringToUint(params[kParamProbabilityInteractionsCount],
+ history_length) &&
+ base::StringToUint(params[kParamProbabilityFakeSaves], saves);
+}
+
+std::vector<int> ReadInteractionHistory(PrefService* prefs) {
+ std::vector<int> interactions;
+ const base::ListValue* list =
+ prefs->GetList(prefs::kPasswordBubbleLastInteractions);
+ if (!list)
+ return interactions;
+ for (const base::Value* value : *list) {
+ int out_value;
+ if (value->GetAsInteger(&out_value))
+ interactions.push_back(out_value);
+ }
+ return interactions;
+}
+
+// We keep the history of last kParamProbabilityInteractionsCount interactions
+// with the bubble. We implicitly add kParamProbabilityFakeSaves "Save" clicks.
+// If there are x "Save" clicks among those kParamProbabilityInteractionsCount
+// then the bubble is shown with probability (x + kParamProbabilityFakeSaves)/
+// (kParamProbabilityInteractionsCount + kParamProbabilityFakeSaves).
+bool ShouldShowBubbleProbabilityExperiment(PrefService* prefs) {
+ unsigned history_length = 0, fake_saves = 0;
+ if (!ExtractProbabilityParams(&history_length, &fake_saves)) {
+ VLOG(2) << "Can't read parameters for "
+ << kExperimentName << " experiment";
+ return true;
+ }
+ std::vector<int> interactions = ReadInteractionHistory(prefs);
+ unsigned real_saves =
+ std::count(interactions.begin(), interactions.end(),
+ password_manager::metrics_util::CLICKED_SAVE);
+ return (interactions.size() + fake_saves) * base::RandDouble() <=
+ real_saves + fake_saves;
+}
+
+void UpdateProbabilityPrefs(
+ PrefService* prefs,
+ password_manager::metrics_util::UIDismissalReason reason) {
+ if (!IsNegativeEvent(reason) &&
+ reason != password_manager::metrics_util::CLICKED_SAVE)
+ return;
+ unsigned history_length = 0, fake_saves = 0;
+ if (!ExtractProbabilityParams(&history_length, &fake_saves)) {
+ VLOG(2) << "Can't read parameters for "
+ << kExperimentName << " experiment";
+ return;
+ }
+ std::vector<int> interactions = ReadInteractionHistory(prefs);
+ interactions.push_back(reason);
+ size_t history_beginning = interactions.size() > history_length ?
+ interactions.size() - history_length : 0;
+ base::ListValue value;
+ for (size_t i = history_beginning; i < interactions.size(); ++i)
+ value.AppendInteger(interactions[i]);
+ prefs->Set(prefs::kPasswordBubbleLastInteractions, value);
+}
+
+} // namespace
+
+const char kExperimentName[] = "PasswordBubbleAlgorithm";
+const char kGroupTimeSpanBased[] = "TimeSpan";
+const char kGroupProbabilityBased[] = "Probability";
+const char kParamProbabilityFakeSaves[] = "saves_count";
+const char kParamProbabilityInteractionsCount[] = "last_interactions_count";
+const char kParamTimeSpan[] = "time_span";
+const char kParamTimeSpanNopeThreshold[] = "nope_threshold";
+
+void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry) {
+ registry->RegisterInt64Pref(
+ prefs::kPasswordBubbleTimeStamp,
+ 0,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterIntegerPref(
+ prefs::kPasswordBubbleNopesCount,
+ 0,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterListPref(
+ prefs::kPasswordBubbleLastInteractions,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+}
+
+bool ShouldShowBubble(PrefService* prefs) {
+ if (!base::FieldTrialList::TrialExists(kExperimentName))
+ return true;
+ std::string group_name =
+ base::FieldTrialList::FindFullName(kExperimentName);
+
+ if (group_name == kGroupTimeSpanBased) {
+ return ShouldShowBubbleTimeSpanExperiment(prefs);
+ }
+ if (group_name == kGroupProbabilityBased) {
+ return ShouldShowBubbleProbabilityExperiment(prefs);
+ }
+
+ // The "Show Always" should be the default case.
+ return true;
+}
+
+void RecordBubbleClosed(
+ PrefService* prefs,
+ password_manager::metrics_util::UIDismissalReason reason) {
+ UpdateTimeSpanPrefs(prefs, reason);
+ UpdateProbabilityPrefs(prefs, reason);
+}
+
+} // namespace password_bubble_experiment
diff --git a/chrome/browser/ui/passwords/password_bubble_experiment.h b/chrome/browser/ui/passwords/password_bubble_experiment.h
new file mode 100644
index 0000000..9c4d302
--- /dev/null
+++ b/chrome/browser/ui/passwords/password_bubble_experiment.h
@@ -0,0 +1,57 @@
+// Copyright 2014 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_UI_PASSWORDS_PASSWORD_BUBBLE_EXPERIMENT_H_
+#define CHROME_BROWSER_UI_PASSWORDS_PASSWORD_BUBBLE_EXPERIMENT_H_
+
+#include "base/macros.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+class PrefService;
+
+// These functions handle the algorithms according to which the "Save password?"
+// bubble is shown to user.
+namespace password_bubble_experiment {
+
+void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry);
+
+// The decision is made based on the "PasswordBubbleAlgorithm" finch experiment.
+// The default value is true.
+// It should be called before showing the "Save Password?" dialog.
+bool ShouldShowBubble(PrefService* prefs);
+
+// Should be called when user dismisses the "Save Password?" dialog. It stores
+// the statistics about interactions with the bubble.
+void RecordBubbleClosed(
+ PrefService* prefs,
+ password_manager::metrics_util::UIDismissalReason reason);
+
+// The name of the finch experiment controlling the algorithm.
+extern const char kExperimentName[];
+
+// The group name for the time based algorithm.
+extern const char kGroupTimeSpanBased[];
+
+// The group name for the probability algorithm.
+extern const char kGroupProbabilityBased[];
+
+// For "Probability" group. The additional "Saves" to be added to the model.
+extern const char kParamProbabilityFakeSaves[];
+
+// For "Probability" group. The interaction history length.
+extern const char kParamProbabilityInteractionsCount[];
+
+// For "TimeSpan" group. The time span until the nope counter is zeroed.
+extern const char kParamTimeSpan[];
+
+// For "TimeSpan" group. The nopes threshold.
+extern const char kParamTimeSpanNopeThreshold[];
+
+} // namespace password_bubble_experiment
+
+#endif // CHROME_BROWSER_UI_PASSWORDS_PASSWORD_BUBBLE_EXPERIMENT_H_
diff --git a/chrome/browser/ui/passwords/password_bubble_experiment_unittest.cc b/chrome/browser/ui/passwords/password_bubble_experiment_unittest.cc
new file mode 100644
index 0000000..96265b5
--- /dev/null
+++ b/chrome/browser/ui/passwords/password_bubble_experiment_unittest.cc
@@ -0,0 +1,139 @@
+// Copyright 2014 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/ui/passwords/password_bubble_experiment.h"
+
+#include "base/files/scoped_temp_dir.h"
+#include "base/metrics/field_trial.h"
+#include "base/prefs/pref_service.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/variations/entropy_provider.h"
+#include "components/variations/variations_associated_data.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+const int kTimeSpanDays = 2;
+const int kTimeSpanThreshold = 3;
+const int kProbabilityFakeSaves = 0;
+const int kProbabilityHistory = 10;
+
+void SetupTimeSpanExperiment() {
+ ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
+ password_bubble_experiment::kExperimentName,
+ password_bubble_experiment::kGroupTimeSpanBased));
+ std::map<std::string, std::string> params;
+ params[password_bubble_experiment::kParamTimeSpan] =
+ base::IntToString(kTimeSpanDays);
+ params[password_bubble_experiment::kParamTimeSpanNopeThreshold] =
+ base::IntToString(kTimeSpanThreshold);
+ ASSERT_TRUE(variations::AssociateVariationParams(
+ password_bubble_experiment::kExperimentName,
+ password_bubble_experiment::kGroupTimeSpanBased,
+ params));
+}
+
+void SetupProbabilityExperiment() {
+ ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
+ password_bubble_experiment::kExperimentName,
+ password_bubble_experiment::kGroupProbabilityBased));
+ std::map<std::string, std::string> params;
+ params[password_bubble_experiment::kParamProbabilityFakeSaves] =
+ base::IntToString(kProbabilityFakeSaves);
+ params[password_bubble_experiment::kParamProbabilityInteractionsCount] =
+ base::IntToString(kProbabilityHistory);
+ ASSERT_TRUE(variations::AssociateVariationParams(
+ password_bubble_experiment::kExperimentName,
+ password_bubble_experiment::kGroupProbabilityBased,
+ params));
+}
+
+} // namespace
+
+class PasswordBubbleExperimentTest : public testing::Test {
+ public:
+ void SetUp() override {
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ profile_.reset(new TestingProfile(temp_dir_.path()));
+
+ field_trial_list_.reset(new base::FieldTrialList(
+ new metrics::SHA1EntropyProvider("foo")));
+ variations::testing::ClearAllVariationParams();
+ }
+
+ PrefService* prefs() { return profile_->GetPrefs(); }
+
+ private:
+ base::ScopedTempDir temp_dir_;
+ scoped_ptr<TestingProfile> profile_;
+ scoped_ptr<base::FieldTrialList> field_trial_list_;
+};
+
+TEST_F(PasswordBubbleExperimentTest, TimeSpan) {
+ SetupTimeSpanExperiment();
+
+ EXPECT_TRUE(password_bubble_experiment::ShouldShowBubble(prefs()));
+ // Don't save password enough times.
+ for (int i = 0; i < kTimeSpanThreshold; ++i) {
+ password_manager::metrics_util::UIDismissalReason reason = i % 2 ?
+ password_manager::metrics_util::NO_DIRECT_INTERACTION :
+ password_manager::metrics_util::CLICKED_NOPE;
+ password_bubble_experiment::RecordBubbleClosed(prefs(), reason);
+ }
+ EXPECT_FALSE(password_bubble_experiment::ShouldShowBubble(prefs()));
+
+ // Save password many times. It doesn't bring the bubble back while the time
+ // span isn't over.
+ for (int i = 0; i < 2*kTimeSpanThreshold; ++i) {
+ password_bubble_experiment::RecordBubbleClosed(
+ prefs(),
+ password_manager::metrics_util::CLICKED_SAVE);
+ }
+ EXPECT_FALSE(password_bubble_experiment::ShouldShowBubble(prefs()));
+}
+
+TEST_F(PasswordBubbleExperimentTest, TimeSpanOver) {
+ SetupTimeSpanExperiment();
+
+ base::Time past_interval =
+ base::Time::Now() - base::TimeDelta::FromDays(kTimeSpanDays + 1);
+ prefs()->SetInt64(prefs::kPasswordBubbleTimeStamp,
+ past_interval.ToInternalValue());
+ prefs()->SetInteger(prefs::kPasswordBubbleNopesCount, kTimeSpanThreshold);
+ // The time span is over. The bubble should be shown.
+ EXPECT_TRUE(password_bubble_experiment::ShouldShowBubble(prefs()));
+ EXPECT_EQ(0, prefs()->GetInteger(prefs::kPasswordBubbleNopesCount));
+
+ // Set the old time span again and record "Nope". The counter restarts from 0.
+ prefs()->SetInt64(prefs::kPasswordBubbleTimeStamp,
+ past_interval.ToInternalValue());
+ password_bubble_experiment::RecordBubbleClosed(
+ prefs(), password_manager::metrics_util::CLICKED_NOPE);
+ EXPECT_TRUE(password_bubble_experiment::ShouldShowBubble(prefs()));
+ EXPECT_EQ(1, prefs()->GetInteger(prefs::kPasswordBubbleNopesCount));
+}
+
+TEST_F(PasswordBubbleExperimentTest, Probability) {
+ SetupProbabilityExperiment();
+
+ EXPECT_TRUE(password_bubble_experiment::ShouldShowBubble(prefs()));
+ // Don't save password enough times.
+ for (int i = 0; i < kProbabilityHistory; ++i) {
+ password_manager::metrics_util::UIDismissalReason reason = i % 2 ?
+ password_manager::metrics_util::NO_DIRECT_INTERACTION :
+ password_manager::metrics_util::CLICKED_NOPE;
+ password_bubble_experiment::RecordBubbleClosed(prefs(), reason);
+ }
+ EXPECT_FALSE(password_bubble_experiment::ShouldShowBubble(prefs()));
+
+ // Save password enough times.
+ for (int i = 0; i < kProbabilityHistory; ++i) {
+ password_bubble_experiment::RecordBubbleClosed(
+ prefs(),
+ password_manager::metrics_util::CLICKED_SAVE);
+ }
+ EXPECT_TRUE(password_bubble_experiment::ShouldShowBubble(prefs()));
+}
diff --git a/chrome/browser/ui/views/frame/browser_command_handler_x11.cc b/chrome/browser/ui/views/frame/browser_command_handler_x11.cc
index 4afe77a..ce37fcc 100644
--- a/chrome/browser/ui/views/frame/browser_command_handler_x11.cc
+++ b/chrome/browser/ui/views/frame/browser_command_handler_x11.cc
@@ -8,26 +8,15 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/web_contents.h"
-#include "ui/aura/window.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
-BrowserCommandHandlerX11::BrowserCommandHandlerX11(BrowserView* browser_view)
- : browser_view_(browser_view) {
- aura::Window* window = browser_view_->frame()->GetNativeWindow();
- DCHECK(window);
- if (window)
- window->AddPreTargetHandler(this);
-}
+BrowserCommandHandlerX11::BrowserCommandHandlerX11(Browser* browser)
+ : browser_(browser) {}
-BrowserCommandHandlerX11::~BrowserCommandHandlerX11() {
- aura::Window* window = browser_view_->frame()->GetNativeWindow();
- if (window)
- window->RemovePreTargetHandler(this);
-}
+BrowserCommandHandlerX11::~BrowserCommandHandlerX11() {}
void BrowserCommandHandlerX11::OnMouseEvent(ui::MouseEvent* event) {
if (event->type() != ui::ET_MOUSE_PRESSED)
@@ -43,7 +32,7 @@
const int kForwardMouseButton = 9;
if (button == kBackMouseButton || button == kForwardMouseButton) {
content::WebContents* contents =
- browser_view_->browser()->tab_strip_model()->GetActiveWebContents();
+ browser_->tab_strip_model()->GetActiveWebContents();
if (!contents)
return;
content::NavigationController& controller = contents->GetController();
diff --git a/chrome/browser/ui/views/frame/browser_command_handler_x11.h b/chrome/browser/ui/views/frame/browser_command_handler_x11.h
index fdc9294..0542401 100644
--- a/chrome/browser/ui/views/frame/browser_command_handler_x11.h
+++ b/chrome/browser/ui/views/frame/browser_command_handler_x11.h
@@ -6,20 +6,19 @@
#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_COMMAND_HANDLER_X11_H_
#include "ui/events/event_handler.h"
-#include "ui/gfx/native_widget_types.h"
-class BrowserView;
+class Browser;
class BrowserCommandHandlerX11 : public ui::EventHandler {
public:
- explicit BrowserCommandHandlerX11(BrowserView* browser_view);
+ explicit BrowserCommandHandlerX11(Browser* browser);
~BrowserCommandHandlerX11() override;
private:
// ui::EventHandler:
void OnMouseEvent(ui::MouseEvent* event) override;
- BrowserView* browser_view_;
+ Browser* browser_;
DISALLOW_COPY_AND_ASSIGN(BrowserCommandHandlerX11);
};
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index a4e9535..890d1de 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -4,11 +4,14 @@
#include "chrome/browser/ui/views/frame/browser_frame.h"
+#include "ash/shell.h"
+#include "base/command_line.h"
#include "base/debug/leak_annotations.h"
#include "base/i18n/rtl.h"
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
+#include "chrome/browser/ui/ash/ash_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window_state.h"
@@ -20,7 +23,11 @@
#include "chrome/browser/ui/views/frame/native_browser_frame_factory.h"
#include "chrome/browser/ui/views/frame/system_menu_model_builder.h"
#include "chrome/browser/ui/views/frame/top_container_view.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_event_dispatcher.h"
#include "ui/base/hit_test.h"
#include "ui/base/theme_provider.h"
#include "ui/events/event_handler.h"
@@ -29,9 +36,12 @@
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/widget/native_widget.h"
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+#include "chrome/browser/shell_integration_linux.h"
+#endif
+
#if defined(OS_CHROMEOS)
#include "ash/session/session_state_delegate.h"
-#include "ash/shell.h"
#endif
#if defined(USE_X11)
@@ -52,9 +62,16 @@
set_is_secondary_widget(false);
// Don't focus anything on creation, selecting a tab will set the focus.
set_focus_on_creation(false);
+
+#if defined(USE_X11)
+ browser_command_handler_.reset(
+ new BrowserCommandHandlerX11(browser_view_->browser()));
+#endif
}
BrowserFrame::~BrowserFrame() {
+ if (browser_command_handler_ && GetNativeView())
+ GetNativeView()->RemovePreTargetHandler(browser_command_handler_.get());
}
// static
@@ -73,8 +90,9 @@
native_browser_frame_ =
NativeBrowserFrameFactory::CreateNativeBrowserFrame(this, browser_view_);
- views::Widget::InitParams params = native_browser_frame_->GetWidgetParams();
+ views::Widget::InitParams params;
params.delegate = browser_view_;
+ params.native_widget = native_browser_frame_->AsNativeWidget();
if (browser_view_->browser()->is_type_tabbed()) {
// Typed panel/popup can only return a size once the widget has been
// created.
@@ -82,9 +100,46 @@
¶ms.bounds,
¶ms.show_state);
}
+
+ if (browser_view_->browser()->host_desktop_type() ==
+ chrome::HOST_DESKTOP_TYPE_ASH || chrome::ShouldOpenAshOnStartup()) {
+ params.context = ash::Shell::GetPrimaryRootWindow();
+#if defined(OS_WIN)
+ // If this window is under ASH on Windows, we need it to be translucent.
+ params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+#endif
+ }
+
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // Set up a custom WM_CLASS for some sorts of window types. This allows
+ // task switchers in X11 environments to distinguish between main browser
+ // windows and e.g app windows.
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ const Browser& browser = *browser_view_->browser();
+ params.wm_class_class = shell_integration_linux::GetProgramClassName();
+ params.wm_class_name = params.wm_class_class;
+ if (browser.is_app() && !browser.is_devtools()) {
+ // This window is a hosted app or v1 packaged app.
+ // NOTE: v2 packaged app windows are created by ChromeNativeAppWindowViews.
+ params.wm_class_name = web_app::GetWMClassFromAppName(browser.app_name());
+ } else if (command_line.HasSwitch(switches::kUserDataDir)) {
+ // Set the class name to e.g. "Chrome (/tmp/my-user-data)". The
+ // class name will show up in the alt-tab list in gnome-shell if
+ // you're running a binary that doesn't have a matching .desktop
+ // file.
+ const std::string user_data_dir =
+ command_line.GetSwitchValueNative(switches::kUserDataDir);
+ params.wm_class_name += " (" + user_data_dir + ")";
+ }
+ const char kX11WindowRoleBrowser[] = "browser";
+ const char kX11WindowRolePopup[] = "pop-up";
+ params.wm_role_name = browser_view_->browser()->is_type_tabbed() ?
+ std::string(kX11WindowRoleBrowser) : std::string(kX11WindowRolePopup);
+
params.remove_standard_frame = UseCustomFrame();
set_frame_type(UseCustomFrame() ? Widget::FRAME_TYPE_FORCE_CUSTOM
: Widget::FRAME_TYPE_FORCE_NATIVE);
+#endif // defined(OS_LINUX)
Init(params);
@@ -93,9 +148,8 @@
non_client_view()->set_context_menu_controller(this);
}
-#if defined(USE_X11)
- browser_command_handler_.reset(new BrowserCommandHandlerX11(browser_view_));
-#endif
+ if (browser_command_handler_)
+ GetNativeWindow()->AddPreTargetHandler(browser_command_handler_.get());
}
void BrowserFrame::SetThemeProvider(scoped_ptr<ui::ThemeProvider> provider) {
diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.cc b/chrome/browser/ui/views/frame/browser_frame_ash.cc
index 563f309..9f576dc 100644
--- a/chrome/browser/ui/views/frame/browser_frame_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_ash.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/views/frame/browser_frame_ash.h"
-#include "ash/shell.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/window_state.h"
#include "ash/wm/window_state_delegate.h"
@@ -18,6 +17,8 @@
#include "ui/aura/window_observer.h"
#include "ui/views/view.h"
+using aura::Window;
+
namespace {
// BrowserWindowStateDelegate class handles a user's fullscreen
@@ -126,17 +127,12 @@
////////////////////////////////////////////////////////////////////////////////
// BrowserFrameAsh, NativeBrowserFrame implementation:
-views::Widget::InitParams BrowserFrameAsh::GetWidgetParams() {
- views::Widget::InitParams params;
- params.native_widget = this;
+views::NativeWidget* BrowserFrameAsh::AsNativeWidget() {
+ return this;
+}
- params.context = ash::Shell::GetPrimaryRootWindow();
-#if defined(OS_WIN)
- // If this window is under ASH on Windows, we need it to be translucent.
- params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
-#endif
-
- return params;
+const views::NativeWidget* BrowserFrameAsh::AsNativeWidget() const {
+ return this;
}
bool BrowserFrameAsh::UsesNativeSystemMenu() const {
diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.h b/chrome/browser/ui/views/frame/browser_frame_ash.h
index 55c82be..bd827c6 100644
--- a/chrome/browser/ui/views/frame/browser_frame_ash.h
+++ b/chrome/browser/ui/views/frame/browser_frame_ash.h
@@ -34,7 +34,8 @@
void OnWindowTargetVisibilityChanged(bool visible) override;
// Overridden from NativeBrowserFrame:
- views::Widget::InitParams GetWidgetParams() override;
+ views::NativeWidget* AsNativeWidget() override;
+ const views::NativeWidget* AsNativeWidget() const override;
bool UsesNativeSystemMenu() const override;
int GetMinimizeButtonOffset() const override;
bool ShouldSaveWindowPlacement() const override;
diff --git a/chrome/browser/ui/views/frame/browser_frame_mac.h b/chrome/browser/ui/views/frame/browser_frame_mac.h
deleted file mode 100644
index 86f7445..0000000
--- a/chrome/browser/ui/views/frame/browser_frame_mac.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 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_UI_VIEWS_FRAME_BROWSER_FRAME_MAC_H_
-#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_MAC_H_
-
-#include "chrome/browser/ui/views/frame/native_browser_frame.h"
-#include "ui/views/widget/native_widget_mac.h"
-
-class BrowserFrame;
-class BrowserView;
-
-////////////////////////////////////////////////////////////////////////////////
-// BrowserFrameMac is a NativeWidgetMac subclass that provides
-// the window frame for the Chrome browser window.
-//
-class BrowserFrameMac : public views::NativeWidgetMac,
- public NativeBrowserFrame {
- public:
- BrowserFrameMac(BrowserFrame* browser_frame, BrowserView* browser_view);
-
- // Overridden from NativeBrowserFrame:
- views::Widget::InitParams GetWidgetParams() override;
- bool UsesNativeSystemMenu() const override;
- bool ShouldSaveWindowPlacement() const override;
- void GetWindowPlacement(gfx::Rect* bounds,
- ui::WindowShowState* show_state) const override;
-
- protected:
- ~BrowserFrameMac() override;
-
- // Overridden from NativeBrowserFrame:
- int GetMinimizeButtonOffset() const override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(BrowserFrameMac);
-};
-
-#endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_MAC_H_
diff --git a/chrome/browser/ui/views/frame/browser_frame_mac.mm b/chrome/browser/ui/views/frame/browser_frame_mac.mm
deleted file mode 100644
index ee6c55c..0000000
--- a/chrome/browser/ui/views/frame/browser_frame_mac.mm
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 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/ui/views/frame/browser_frame_mac.h"
-
-#include "chrome/browser/ui/views/frame/browser_frame.h"
-
-BrowserFrameMac::BrowserFrameMac(BrowserFrame* browser_frame,
- BrowserView* browser_view)
- : views::NativeWidgetMac(browser_frame) {
-}
-
-BrowserFrameMac::~BrowserFrameMac() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// BrowserFrameMac, NativeBrowserFrame implementation:
-
-views::Widget::InitParams BrowserFrameMac::GetWidgetParams() {
- views::Widget::InitParams params;
- params.native_widget = this;
- return params;
-}
-
-bool BrowserFrameMac::UsesNativeSystemMenu() const {
- return true;
-}
-
-bool BrowserFrameMac::ShouldSaveWindowPlacement() const {
- return true;
-}
-
-void BrowserFrameMac::GetWindowPlacement(
- gfx::Rect* bounds,
- ui::WindowShowState* show_state) const {
- return NativeWidgetMac::GetWindowPlacement(bounds, show_state);
-}
-
-int BrowserFrameMac::GetMinimizeButtonOffset() const {
- NOTIMPLEMENTED();
- return 0;
-}
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 0720573..258cbd1 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -68,6 +68,7 @@
#include "chrome/browser/ui/views/frame/browser_view_layout_delegate.h"
#include "chrome/browser/ui/views/frame/contents_layout_manager.h"
#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
+#include "chrome/browser/ui/views/frame/native_browser_frame_factory.h"
#include "chrome/browser/ui/views/frame/top_container_view.h"
#include "chrome/browser/ui/views/frame/web_contents_close_handler.h"
#include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h"
@@ -107,12 +108,14 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "grit/theme_resources.h"
#include "ui/accessibility/ax_view_state.h"
+#include "ui/aura/client/window_tree_client.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/hit_test.h"
#include "ui/base/l10n/l10n_util.h"
@@ -135,12 +138,6 @@
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_delegate.h"
-#if defined(USE_AURA)
-#include "ui/aura/client/window_tree_client.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#endif
-
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#include "chrome/browser/jumplist_win.h"
@@ -1419,7 +1416,6 @@
void BrowserView::TabInsertedAt(WebContents* contents,
int index,
bool foreground) {
-#if defined(USE_AURA)
// WebContents inserted in tabs might not have been added to the root
// window yet. Per http://crbug/342672 add them now since drawing the
// WebContents requires root window specific data - information about
@@ -1431,7 +1427,6 @@
window, root_window, root_window->GetBoundsInScreen());
DCHECK(contents->GetNativeView()->GetRootWindow());
}
-#endif
web_contents_close_handler_->TabInserted();
if (foreground)
@@ -2371,6 +2366,24 @@
#endif
}
+// static
+BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) {
+ // Create the view and the frame. The frame will attach itself via the view
+ // so we don't need to do anything with the pointer.
+ BrowserView* view = new BrowserView();
+ view->Init(browser);
+ (new BrowserFrame(view))->InitBrowserFrame();
+ view->GetWidget()->non_client_view()->SetAccessibleName(
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
+ return view;
+}
+
+// static
+chrome::HostDesktopType BrowserWindow::AdjustHostDesktopType(
+ chrome::HostDesktopType desktop_type) {
+ return NativeBrowserFrameFactory::AdjustHostDesktopType(desktop_type);
+}
+
void BrowserView::ShowAvatarBubble(WebContents* web_contents,
const gfx::Rect& rect) {
gfx::Point origin(rect.origin());
@@ -2464,7 +2477,10 @@
bool BrowserView::DoCutCopyPasteForWebContents(
WebContents* contents,
void (WebContents::*method)()) {
- if (contents->GetRenderWidgetHostView()->HasFocus()) {
+ gfx::NativeView native_view = contents->GetContentNativeView();
+ if (!native_view)
+ return false;
+ if (native_view->HasFocus()) {
(contents->*method)();
return true;
}
diff --git a/chrome/browser/ui/views/frame/browser_window_factory.cc b/chrome/browser/ui/views/frame/browser_window_factory.cc
deleted file mode 100644
index 7db63a8..0000000
--- a/chrome/browser/ui/views/frame/browser_window_factory.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 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/ui/views/frame/browser_frame.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/frame/native_browser_frame_factory.h"
-#include "chrome/grit/chromium_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/views/widget/widget.h"
-
-// static
-BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) {
- // Create the view and the frame. The frame will attach itself via the view
- // so we don't need to do anything with the pointer.
- BrowserView* view = new BrowserView();
- view->Init(browser);
- (new BrowserFrame(view))->InitBrowserFrame();
- view->GetWidget()->non_client_view()->SetAccessibleName(
- l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
- return view;
-}
-
-// static
-chrome::HostDesktopType BrowserWindow::AdjustHostDesktopType(
- chrome::HostDesktopType desktop_type) {
- return NativeBrowserFrameFactory::AdjustHostDesktopType(desktop_type);
-}
diff --git a/chrome/browser/ui/views/frame/contents_web_view.cc b/chrome/browser/ui/views/frame/contents_web_view.cc
index 68f0243..a86e39c 100644
--- a/chrome/browser/ui/views/frame/contents_web_view.cc
+++ b/chrome/browser/ui/views/frame/contents_web_view.cc
@@ -7,14 +7,11 @@
#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/views/status_bubble_views.h"
#include "content/public/browser/web_contents.h"
+#include "ui/aura/window.h"
#include "ui/base/theme_provider.h"
#include "ui/compositor/layer_tree_owner.h"
#include "ui/views/background.h"
-
-#if defined(USE_AURA)
-#include "ui/aura/window.h"
#include "ui/wm/core/window_util.h"
-#endif
ContentsWebView::ContentsWebView(content::BrowserContext* browser_context)
: views::WebView(browser_context),
@@ -86,11 +83,7 @@
void ContentsWebView::CloneWebContentsLayer() {
if (!web_contents())
return;
-#if defined(USE_AURA)
- // We don't need to clone the layers on non-Aura (Mac), because closing an
- // NSWindow does not animate.
cloned_layer_tree_ = wm::RecreateLayers(web_contents()->GetNativeView());
-#endif
if (!cloned_layer_tree_ || !cloned_layer_tree_->root()) {
cloned_layer_tree_.reset();
return;
diff --git a/chrome/browser/ui/views/frame/desktop_browser_frame_aura.cc b/chrome/browser/ui/views/frame/desktop_browser_frame_aura.cc
index 6063c76..d251f4f 100644
--- a/chrome/browser/ui/views/frame/desktop_browser_frame_aura.cc
+++ b/chrome/browser/ui/views/frame/desktop_browser_frame_aura.cc
@@ -4,13 +4,10 @@
#include "chrome/browser/ui/views/frame/desktop_browser_frame_aura.h"
-#include "base/command_line.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h"
#include "chrome/browser/ui/views/frame/browser_shutdown.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/web_applications/web_app.h"
-#include "chrome/common/chrome_switches.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
@@ -21,10 +18,6 @@
#include "ui/views/view.h"
#include "ui/wm/core/visibility_controller.h"
-#if defined(OS_LINUX)
-#include "chrome/browser/shell_integration_linux.h"
-#endif
-
using aura::Window;
///////////////////////////////////////////////////////////////////////////////
@@ -81,39 +74,12 @@
////////////////////////////////////////////////////////////////////////////////
// DesktopBrowserFrameAura, NativeBrowserFrame implementation:
-views::Widget::InitParams DesktopBrowserFrameAura::GetWidgetParams() {
- views::Widget::InitParams params;
- params.native_widget = this;
+views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() {
+ return this;
+}
-#if defined(OS_LINUX)
- // Set up a custom WM_CLASS for some sorts of window types. This allows
- // task switchers in X11 environments to distinguish between main browser
- // windows and e.g app windows.
- const base::CommandLine& command_line =
- *base::CommandLine::ForCurrentProcess();
- const Browser& browser = *browser_view_->browser();
- params.wm_class_class = shell_integration_linux::GetProgramClassName();
- params.wm_class_name = params.wm_class_class;
- if (browser.is_app() && !browser.is_devtools()) {
- // This window is a hosted app or v1 packaged app.
- // NOTE: v2 packaged app windows are created by ChromeNativeAppWindowViews.
- params.wm_class_name = web_app::GetWMClassFromAppName(browser.app_name());
- } else if (command_line.HasSwitch(switches::kUserDataDir)) {
- // Set the class name to e.g. "Chrome (/tmp/my-user-data)". The
- // class name will show up in the alt-tab list in gnome-shell if
- // you're running a binary that doesn't have a matching .desktop
- // file.
- const std::string user_data_dir =
- command_line.GetSwitchValueNative(switches::kUserDataDir);
- params.wm_class_name += " (" + user_data_dir + ")";
- }
- const char kX11WindowRoleBrowser[] = "browser";
- const char kX11WindowRolePopup[] = "pop-up";
- params.wm_role_name = browser_view_->browser()->is_type_tabbed() ?
- std::string(kX11WindowRoleBrowser) : std::string(kX11WindowRolePopup);
-#endif // defined(OS_LINUX)
-
- return params;
+const views::NativeWidget* DesktopBrowserFrameAura::AsNativeWidget() const {
+ return this;
}
bool DesktopBrowserFrameAura::UsesNativeSystemMenu() const {
diff --git a/chrome/browser/ui/views/frame/desktop_browser_frame_aura.h b/chrome/browser/ui/views/frame/desktop_browser_frame_aura.h
index cd86478..901fa3e 100644
--- a/chrome/browser/ui/views/frame/desktop_browser_frame_aura.h
+++ b/chrome/browser/ui/views/frame/desktop_browser_frame_aura.h
@@ -41,7 +41,8 @@
void InitNativeWidget(const views::Widget::InitParams& params) override;
// Overridden from NativeBrowserFrame:
- views::Widget::InitParams GetWidgetParams() override;
+ views::NativeWidget* AsNativeWidget() override;
+ const views::NativeWidget* AsNativeWidget() const override;
bool UsesNativeSystemMenu() const override;
int GetMinimizeButtonOffset() const override;
bool ShouldSaveWindowPlacement() const override;
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller.h b/chrome/browser/ui/views/frame/immersive_mode_controller.h
index 2e059f3..6f24ddd 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller.h
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller.h
@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_H_
+#include "ash/wm/immersive_revealed_lock.h"
#include "base/compiler_specific.h"
#include "base/observer_list.h"
#include "chrome/browser/ui/host_desktop.h"
@@ -16,16 +17,7 @@
class Size;
}
-// A lock which will keep the top-of-window views revealed for its
-// lifetime.
-// See ImmersiveModeController::GetRevealedLock for details.
-class ImmersiveRevealedLock {
- public:
- virtual ~ImmersiveRevealedLock() {}
-
- protected:
- ImmersiveRevealedLock() {}
-};
+typedef ash::ImmersiveRevealedLock ImmersiveRevealedLock;
// Controller for an "immersive mode" similar to MacOS presentation mode where
// the top-of-window views are hidden until the mouse hits the top of the
@@ -90,7 +82,6 @@
// If acquiring the lock causes a reveal, the top-of-window views will animate
// according to |animate_reveal|.
// The caller takes ownership of the returned lock.
- // This is currently only supported on Ash.
virtual ImmersiveRevealedLock* GetRevealedLock(
AnimateReveal animate_reveal) WARN_UNUSED_RESULT = 0;
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
index 17928ea..d7f12d2 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
#include "ash/shell.h"
-#include "ash/wm/immersive_revealed_lock.h"
#include "ash/wm/window_state.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
@@ -41,17 +40,6 @@
return ash::ImmersiveFullscreenController::ANIMATE_REVEAL_NO;
}
-class ImmersiveRevealedLockAsh : public ImmersiveRevealedLock {
- public:
- explicit ImmersiveRevealedLockAsh(ash::ImmersiveRevealedLock* lock)
- : lock_(lock) {}
-
- private:
- scoped_ptr<ash::ImmersiveRevealedLock> lock_;
-
- DISALLOW_COPY_AND_ASSIGN(ImmersiveRevealedLockAsh);
-};
-
} // namespace
ImmersiveModeControllerAsh::ImmersiveModeControllerAsh()
@@ -120,8 +108,8 @@
ImmersiveRevealedLock* ImmersiveModeControllerAsh::GetRevealedLock(
AnimateReveal animate_reveal) {
- return new ImmersiveRevealedLockAsh(controller_->GetRevealedLock(
- ToImmersiveFullscreenControllerAnimateReveal(animate_reveal)));
+ return controller_->GetRevealedLock(
+ ToImmersiveFullscreenControllerAnimateReveal(animate_reveal));
}
void ImmersiveModeControllerAsh::OnFindBarVisibleBoundsChanged(
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_factory_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_factory.cc
similarity index 99%
rename from chrome/browser/ui/views/frame/immersive_mode_controller_factory_ash.cc
rename to chrome/browser/ui/views/frame/immersive_mode_controller_factory.cc
index 1d8848a..7edd140 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_factory_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_factory.cc
@@ -3,8 +3,8 @@
// found in the LICENSE file.
#include "chrome/browser/ui/host_desktop.h"
-#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
#include "chrome/browser/ui/views/frame/immersive_mode_controller_stub.h"
+#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
namespace chrome {
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_factory_mac.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_factory_mac.cc
deleted file mode 100644
index 9a0849f..0000000
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_factory_mac.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 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/ui/views/frame/immersive_mode_controller_stub.h"
-
-namespace chrome {
-
-ImmersiveModeController* CreateImmersiveModeController(
- chrome::HostDesktopType host_desktop_type) {
- return new ImmersiveModeControllerStub();
-}
-
-} // namespace chrome
diff --git a/chrome/browser/ui/views/frame/native_browser_frame.h b/chrome/browser/ui/views/frame/native_browser_frame.h
index f1d2f38..846d9e7 100644
--- a/chrome/browser/ui/views/frame/native_browser_frame.h
+++ b/chrome/browser/ui/views/frame/native_browser_frame.h
@@ -7,7 +7,6 @@
#include "ui/base/ui_base_types.h"
#include "ui/gfx/rect.h"
-#include "ui/views/widget/widget.h"
class BrowserFrame;
class BrowserView;
@@ -20,8 +19,8 @@
public:
virtual ~NativeBrowserFrame() {}
- // Returns the platform specific InitParams for initializing our widget.
- virtual views::Widget::InitParams GetWidgetParams() = 0;
+ virtual views::NativeWidget* AsNativeWidget() = 0;
+ virtual const views::NativeWidget* AsNativeWidget() const = 0;
// Returns true if the OS takes care of showing the system menu. Returning
// false means BrowserFrame handles showing the system menu.
diff --git a/chrome/browser/ui/views/frame/native_browser_frame_factory_mac.cc b/chrome/browser/ui/views/frame/native_browser_frame_factory_mac.cc
deleted file mode 100644
index 27ca192..0000000
--- a/chrome/browser/ui/views/frame/native_browser_frame_factory_mac.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 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/ui/views/frame/native_browser_frame_factory.h"
-
-#include "chrome/browser/ui/views/frame/browser_frame_mac.h"
-
-NativeBrowserFrame* NativeBrowserFrameFactory::Create(
- BrowserFrame* browser_frame,
- BrowserView* browser_view) {
- return new BrowserFrameMac(browser_frame, browser_view);
-}
diff --git a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
index 7c1ede9..40c5167 100644
--- a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
+++ b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
@@ -138,8 +138,7 @@
const std::string& additional_message) {
// Spawn a dialog to open a file. The dialog will signal that it is ready
// via chrome.test.sendMessage() in the extension JavaScript.
- ExtensionTestMessageListener init_listener("worker-initialized",
- false /* will_reply */);
+ ExtensionTestMessageListener init_listener("ready", false /* will_reply */);
scoped_ptr<ExtensionTestMessageListener> additional_listener;
if (!additional_message.empty()) {
@@ -278,8 +277,6 @@
// Spawn a dialog to open a file. Provide the path to the file so the dialog
// will automatically select it. Ensure that the OK button is enabled by
// waiting for chrome.test.sendMessage('selection-change-complete').
- // The extension starts a Web Worker to read file metadata, so it may send
- // 'selection-change-complete' before 'worker-initialized'. This is OK.
ASSERT_NO_FATAL_FAILURE(OpenDialog(ui::SelectFileDialog::SELECT_OPEN_FILE,
test_file, owning_window,
"selection-change-complete"));
@@ -306,8 +303,6 @@
// Spawn a dialog to save a file, providing a suggested path.
// Ensure "Save" button is enabled by waiting for notification from
// chrome.test.sendMessage().
- // The extension starts a Web Worker to read file metadata, so it may send
- // 'directory-change-complete' before 'worker-initialized'. This is OK.
ASSERT_NO_FATAL_FAILURE(OpenDialog(ui::SelectFileDialog::SELECT_SAVEAS_FILE,
test_file, owning_window,
"directory-change-complete"));
diff --git a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
index f616b60..4971756 100644
--- a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
@@ -97,7 +97,6 @@
switches::kFirstExecAfterBoot);
reboot_was_requested_ = false;
- rollback_available_ = false;
preparing_for_rollback_ = false;
if (!restart_required_) // First exec after boot.
reboot_was_requested_ = prefs->GetBoolean(prefs::kFactoryResetRequested);
@@ -106,19 +105,17 @@
switches::kDisableRollbackOption)) {
rollback_available_ = false;
ShowWithParams();
- } else if (!restart_required_ && reboot_was_requested_) {
- // First exec after boot.
+ } else if (restart_required_) {
+ // Will require restart.
+ ShowWithParams();
+ } else {
chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
CanRollbackCheck(base::Bind(&ResetScreenHandler::OnRollbackCheck,
weak_ptr_factory_.GetWeakPtr()));
- } else {
- // Will require restart.
- ShowWithParams();
}
}
void ResetScreenHandler::Hide() {
- DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
}
void ResetScreenHandler::SetDelegate(Delegate* delegate) {
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index 58b1acc..81c6d34 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -301,7 +301,7 @@
'browser/ui/cocoa/browser_window_layout.mm',
'browser/ui/cocoa/browser_window_controller_private.h',
'browser/ui/cocoa/browser_window_controller_private.mm',
- 'browser/ui/cocoa/browser_window_factory_cocoa.mm',
+ 'browser/ui/cocoa/browser_window_factory.mm',
'browser/ui/cocoa/browser_window_utils.h',
'browser/ui/cocoa/browser_window_utils.mm',
'browser/ui/cocoa/bubble_combobox.h',
@@ -804,6 +804,8 @@
'browser/ui/passwords/manage_passwords_icon.h',
'browser/ui/passwords/manage_passwords_ui_controller.cc',
'browser/ui/passwords/manage_passwords_ui_controller.h',
+ 'browser/ui/passwords/password_bubble_experiment.cc',
+ 'browser/ui/passwords/password_bubble_experiment.h',
'browser/ui/passwords/password_manager_presenter.cc',
'browser/ui/passwords/password_manager_presenter.h',
'browser/ui/passwords/password_ui_view.h',
@@ -2006,11 +2008,9 @@
'browser/ui/views/first_run_bubble.cc',
'browser/ui/views/first_run_bubble.h',
'browser/ui/views/frame/browser_frame.cc',
- 'browser/ui/views/frame/browser_frame.h',
'browser/ui/views/frame/browser_frame_common_win.cc',
'browser/ui/views/frame/browser_frame_common_win.h',
- 'browser/ui/views/frame/browser_frame_mac.h',
- 'browser/ui/views/frame/browser_frame_mac.mm',
+ 'browser/ui/views/frame/browser_frame.h',
'browser/ui/views/frame/browser_non_client_frame_view.cc',
'browser/ui/views/frame/browser_non_client_frame_view_factory_aura.cc',
'browser/ui/views/frame/browser_non_client_frame_view.h',
@@ -2023,7 +2023,6 @@
'browser/ui/views/frame/browser_view_layout.cc',
'browser/ui/views/frame/browser_view_layout_delegate.h',
'browser/ui/views/frame/browser_view_layout.h',
- 'browser/ui/views/frame/browser_window_factory.cc',
'browser/ui/views/frame/browser_window_property_manager_win.cc',
'browser/ui/views/frame/browser_window_property_manager_win.h',
'browser/ui/views/frame/contents_layout_manager.cc',
@@ -2031,8 +2030,7 @@
'browser/ui/views/frame/contents_web_view.cc',
'browser/ui/views/frame/contents_web_view.h',
'browser/ui/views/frame/immersive_mode_controller.cc',
- 'browser/ui/views/frame/immersive_mode_controller_factory_ash.cc',
- 'browser/ui/views/frame/immersive_mode_controller_factory_mac.cc',
+ 'browser/ui/views/frame/immersive_mode_controller_factory.cc',
'browser/ui/views/frame/immersive_mode_controller.h',
'browser/ui/views/frame/immersive_mode_controller_stub.cc',
'browser/ui/views/frame/immersive_mode_controller_stub.h',
@@ -2041,7 +2039,6 @@
'browser/ui/views/frame/native_browser_frame_factory.cc',
'browser/ui/views/frame/native_browser_frame_factory.h',
'browser/ui/views/frame/native_browser_frame_factory_chromeos.cc',
- 'browser/ui/views/frame/native_browser_frame_factory_mac.cc',
'browser/ui/views/frame/native_browser_frame.h',
'browser/ui/views/frame/opaque_browser_frame_view_layout.cc',
'browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h',
@@ -2803,15 +2800,7 @@
['use_ash == 1', {
'sources': [ '<@(chrome_browser_ui_ash_views_sources)' ],
}],
- ['OS=="mac"', {
- 'conditions': [
- ['mac_views_browser==1', {
- 'sources!': [ 'browser/ui/cocoa/browser_window_factory_cocoa.mm', ],
- }, {
- 'sources!': [ 'browser/ui/views/frame/browser_window_factory.cc', ],
- }],
- ],
- }, {
+ ['OS!="mac"', {
'sources': [ '<@(chrome_browser_ui_views_non_mac_sources)' ],
'dependencies': [
'<(DEPTH)/extensions/components/extensions_components.gyp:native_app_window',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index f774021..0440fad 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -875,6 +875,7 @@
'browser/thumbnails/thumbnail_service_unittest.cc',
'browser/translate/translate_manager_render_view_host_unittest.cc',
'browser/translate/translate_service_unittest.cc',
+ 'browser/ui/android/tab_model/tab_model_list_unittest.cc',
'browser/ui/android/tab_model/tab_model_unittest.cc',
'browser/ui/app_list/app_list_positioner_unittest.cc',
'browser/ui/app_list/app_list_service_mac_unittest.mm',
@@ -1145,6 +1146,7 @@
'browser/ui/passwords/manage_passwords_bubble_model_unittest.cc',
'browser/ui/passwords/manage_passwords_icon_mock.cc',
'browser/ui/passwords/manage_passwords_ui_controller_unittest.cc',
+ 'browser/ui/passwords/password_bubble_experiment_unittest.cc',
'browser/ui/passwords/password_manager_presenter_unittest.cc',
'browser/ui/search/instant_page_unittest.cc',
'browser/ui/search/instant_search_prerenderer_unittest.cc',
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 1f4a968..f17470e 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -269,7 +269,8 @@
"BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/407693
"4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/407693
"81986D4F846CEDDDB962643FA501D1780DD441BB", // http://crbug.com/407693
- "FF78670081967CE21DB86A04AD94A0498F01E20A" // http://crbug.com/409192
+ "FF78670081967CE21DB86A04AD94A0498F01E20A", // http://crbug.com/409192
+ "05EBA3051DFCA6AF17070AEE5FE8C66322FF4738" // http://crbug.com/431978
]
}
],
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 2c2d7d4..fef4477 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2279,4 +2279,14 @@
// A dictionary that maps user id to hardlock state.
const char kEasyUnlockHardlockState[] = "easy_unlock.hardlock_state";
+// The beginning of time span when we count user's "Nope" for the password
+// bubble.
+const char kPasswordBubbleTimeStamp[] = "password_bubble.timestamp";
+
+// The count of user's "Nope" for the password bubble.
+const char kPasswordBubbleNopesCount[] = "password_bubble.nopes";
+
+// Last user's interaction with the password bubble.
+const char kPasswordBubbleLastInteractions[] = "password_bubble.interactions";
+
} // namespace prefs
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 01a0089..214a3b5 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -805,6 +805,10 @@
extern const char kEasyUnlockHardlockState[];
+extern const char kPasswordBubbleTimeStamp[];
+extern const char kPasswordBubbleNopesCount[];
+extern const char kPasswordBubbleLastInteractions[];
+
} // namespace prefs
#endif // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp
index 98ddfc3..c7d613a 100644
--- a/chromeos/chromeos.gyp
+++ b/chromeos/chromeos.gyp
@@ -275,6 +275,8 @@
'login/user_names.h',
'login_event_recorder.cc',
'login_event_recorder.h',
+ 'network/auto_connect_handler.cc',
+ 'network/auto_connect_handler.h',
'network/certificate_pattern.cc',
'network/certificate_pattern.h',
'network/client_cert_resolver.cc',
@@ -423,6 +425,7 @@
'ime/input_method_whitelist_unittest.cc',
'login/auth/key_unittest.cc',
'login/login_state_unittest.cc',
+ 'network/auto_connect_handler_unittest.cc',
'network/client_cert_resolver_unittest.cc',
'network/geolocation_handler_unittest.cc',
'network/host_resolver_impl_chromeos_unittest.cc',
diff --git a/chromeos/dbus/fake_session_manager_client.cc b/chromeos/dbus/fake_session_manager_client.cc
index c5fe549..b6d2d8e 100644
--- a/chromeos/dbus/fake_session_manager_client.cc
+++ b/chromeos/dbus/fake_session_manager_client.cc
@@ -56,6 +56,12 @@
void FakeSessionManagerClient::StopSession() {
}
+void FakeSessionManagerClient::NotifySupervisedUserCreationStarted() {
+}
+
+void FakeSessionManagerClient::NotifySupervisedUserCreationFinished() {
+}
+
void FakeSessionManagerClient::StartDeviceWipe() {
start_device_wipe_call_count_++;
}
diff --git a/chromeos/dbus/fake_session_manager_client.h b/chromeos/dbus/fake_session_manager_client.h
index f69e262..367f2d7 100644
--- a/chromeos/dbus/fake_session_manager_client.h
+++ b/chromeos/dbus/fake_session_manager_client.h
@@ -33,6 +33,8 @@
virtual void RestartJob(int pid, const std::string& command_line) override;
virtual void StartSession(const std::string& user_email) override;
virtual void StopSession() override;
+ virtual void NotifySupervisedUserCreationStarted() override;
+ virtual void NotifySupervisedUserCreationFinished() override;
virtual void StartDeviceWipe() override;
virtual void RequestLockScreen() override;
virtual void NotifyLockScreenShown() override;
diff --git a/chromeos/dbus/mock_session_manager_client.h b/chromeos/dbus/mock_session_manager_client.h
index c0e4531..4e1ffbc 100644
--- a/chromeos/dbus/mock_session_manager_client.h
+++ b/chromeos/dbus/mock_session_manager_client.h
@@ -26,6 +26,8 @@
MOCK_METHOD2(RestartJob, void(int, const std::string&));
MOCK_METHOD1(StartSession, void(const std::string&));
MOCK_METHOD0(StopSession, void(void));
+ MOCK_METHOD0(NotifySupervisedUserCreationStarted, void(void));
+ MOCK_METHOD0(NotifySupervisedUserCreationFinished, void(void));
MOCK_METHOD0(StartDeviceWipe, void(void));
MOCK_METHOD0(RequestLockScreen, void(void));
MOCK_METHOD0(NotifyLockScreenShown, void(void));
diff --git a/chromeos/dbus/session_manager_client.cc b/chromeos/dbus/session_manager_client.cc
index 5a67ee8..af81816 100644
--- a/chromeos/dbus/session_manager_client.cc
+++ b/chromeos/dbus/session_manager_client.cc
@@ -156,6 +156,16 @@
login_manager::kSessionManagerHandleLockScreenDismissed);
}
+ virtual void NotifySupervisedUserCreationStarted() override {
+ SimpleMethodCallToSessionManager(
+ login_manager::kSessionManagerHandleSupervisedUserCreationStarting);
+ }
+
+ virtual void NotifySupervisedUserCreationFinished() override {
+ SimpleMethodCallToSessionManager(
+ login_manager::kSessionManagerHandleSupervisedUserCreationFinished);
+ }
+
virtual void RetrieveActiveSessions(
const ActiveSessionsCallback& callback) override {
dbus::MethodCall method_call(
@@ -590,6 +600,8 @@
virtual void RestartJob(int pid, const std::string& command_line) override {}
virtual void StartSession(const std::string& user_email) override {}
virtual void StopSession() override {}
+ virtual void NotifySupervisedUserCreationStarted() override {}
+ virtual void NotifySupervisedUserCreationFinished() override {}
virtual void StartDeviceWipe() override {}
virtual void RequestLockScreen() override {
if (delegate_)
diff --git a/chromeos/dbus/session_manager_client.h b/chromeos/dbus/session_manager_client.h
index d4c0706..75d7277 100644
--- a/chromeos/dbus/session_manager_client.h
+++ b/chromeos/dbus/session_manager_client.h
@@ -89,6 +89,12 @@
// Notifies that the lock screen is dismissed.
virtual void NotifyLockScreenDismissed() = 0;
+ // Notifies that supervised user creation have started.
+ virtual void NotifySupervisedUserCreationStarted() = 0;
+
+ // Notifies that supervised user creation have finished.
+ virtual void NotifySupervisedUserCreationFinished() = 0;
+
// Map that is used to describe the set of active user sessions where |key|
// is user_id and |value| is user_id_hash.
typedef std::map<std::string, std::string> ActiveSessionsMap;
diff --git a/chromeos/ime/component_extension_ime_manager.cc b/chromeos/ime/component_extension_ime_manager.cc
index 9a8cce1..6c7f068 100644
--- a/chromeos/ime/component_extension_ime_manager.cc
+++ b/chromeos/ime/component_extension_ime_manager.cc
@@ -59,6 +59,27 @@
"us(intl)"
};
+// Gets the input method category according to the given input method id.
+// This is used for sorting a list of input methods.
+int GetInputMethodCategory(const std::string& id) {
+ const std::string engine_id =
+ chromeos::extension_ime_util::GetComponentIDByInputMethodID(id);
+ if (StartsWithASCII(engine_id, "xkb:", true))
+ return 0;
+ if (StartsWithASCII(engine_id, "vkd_", true))
+ return 1;
+ if (engine_id.find("-t-i0-") != std::string::npos &&
+ !StartsWithASCII(engine_id, "zh-", true)) {
+ return 2;
+ }
+ return 3;
+}
+
+bool InputMethodCompare(const input_method::InputMethodDescriptor& im1,
+ const input_method::InputMethodDescriptor& im2) {
+ return GetInputMethodCategory(im1.id()) < GetInputMethodCategory(im2.id());
+}
+
} // namespace
ComponentExtensionEngine::ComponentExtensionEngine() {
@@ -173,6 +194,7 @@
ime.input_view_url));
}
}
+ std::stable_sort(result.begin(), result.end(), InputMethodCompare);
return result;
}
diff --git a/chromeos/ime/component_extension_ime_manager_unittest.cc b/chromeos/ime/component_extension_ime_manager_unittest.cc
index 9e8bdb3..840f3c4 100644
--- a/chromeos/ime/component_extension_ime_manager_unittest.cc
+++ b/chromeos/ime/component_extension_ime_manager_unittest.cc
@@ -28,24 +28,24 @@
ext1.path = base::FilePath("ext1_file_path");
ComponentExtensionEngine ext1_engine1;
- ext1_engine1.engine_id = "ext1_engine1_engine_id";
+ ext1_engine1.engine_id = "zh-t-i0-pinyin";
ext1_engine1.display_name = "ext1_engine_1_display_name";
- ext1_engine1.language_codes.push_back("en");
+ ext1_engine1.language_codes.push_back("zh-CN");
ext1_engine1.layouts.push_back("us");
ext1.engines.push_back(ext1_engine1);
ComponentExtensionEngine ext1_engine2;
- ext1_engine2.engine_id = "ext1_engine2_engine_id";
+ ext1_engine2.engine_id = "mozc_us";
ext1_engine2.display_name = "ext1_engine2_display_name";
- ext1_engine2.language_codes.push_back("en");
+ ext1_engine2.language_codes.push_back("jp");
ext1_engine2.layouts.push_back("us");
ext1.engines.push_back(ext1_engine2);
ComponentExtensionEngine ext1_engine3;
- ext1_engine3.engine_id = "ext1_engine3_engine_id";
+ ext1_engine3.engine_id = "xkb:ru::rus";
ext1_engine3.display_name = "ext1_engine3_display_name";
- ext1_engine3.language_codes.push_back("ja");
- ext1_engine3.layouts.push_back("us");
+ ext1_engine3.language_codes.push_back("ru");
+ ext1_engine3.layouts.push_back("ru");
ext1.engines.push_back(ext1_engine3);
ime_list_.push_back(ext1);
@@ -56,24 +56,24 @@
ext2.path = base::FilePath("ext2_file_path");
ComponentExtensionEngine ext2_engine1;
- ext2_engine1.engine_id = "ext2_engine1_engine_id";
+ ext2_engine1.engine_id = "vkd_ru_phone_aatseel";
ext2_engine1.display_name = "ext2_engine_1_display_name";
- ext2_engine1.language_codes.push_back("en");
+ ext2_engine1.language_codes.push_back("ru");
ext2_engine1.layouts.push_back("us");
ext2.engines.push_back(ext2_engine1);
ComponentExtensionEngine ext2_engine2;
- ext2_engine2.engine_id = "ext2_engine2_engine_id";
+ ext2_engine2.engine_id = "vkd_vi_telex";
ext2_engine2.display_name = "ext2_engine2_display_name";
ext2_engine2.language_codes.push_back("hi");
ext2_engine2.layouts.push_back("us");
ext2.engines.push_back(ext2_engine2);
ComponentExtensionEngine ext2_engine3;
- ext2_engine3.engine_id = "ext2_engine3_engine_id";
+ ext2_engine3.engine_id = "xkb:us::eng";
ext2_engine3.display_name = "ext2_engine3_display_name";
- ext2_engine3.language_codes.push_back("ja");
- ext2_engine3.layouts.push_back("jp");
+ ext2_engine3.language_codes.push_back("us");
+ ext2_engine3.layouts.push_back("us");
ext2.engines.push_back(ext2_engine3);
ime_list_.push_back(ext2);
@@ -191,6 +191,16 @@
total_ime_size += ime_list_[i].engines.size();
}
EXPECT_EQ(total_ime_size, descriptors.size());
+
+ // Verify order
+ for (size_t i = 0; i < descriptors.size(); ++i) {
+ const input_method::InputMethodDescriptor& d = descriptors[i];
+ if (i < 2) {
+ EXPECT_TRUE(d.id().find("xkb:") != std::string::npos);
+ } else if (i >= 2 && i < 4) {
+ EXPECT_TRUE(d.id().find("vkd_") != std::string::npos);
+ }
+ }
}
} // namespace
diff --git a/chromeos/network/auto_connect_handler.cc b/chromeos/network/auto_connect_handler.cc
new file mode 100644
index 0000000..37f0344
--- /dev/null
+++ b/chromeos/network/auto_connect_handler.cc
@@ -0,0 +1,214 @@
+// Copyright 2014 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 "chromeos/network/auto_connect_handler.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/values.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_service_client.h"
+#include "chromeos/network/managed_network_configuration_handler.h"
+#include "chromeos/network/network_event_log.h"
+#include "chromeos/network/network_state.h"
+#include "dbus/object_path.h"
+
+namespace chromeos {
+
+AutoConnectHandler::AutoConnectHandler()
+ : client_cert_resolver_(nullptr),
+ request_best_connection_pending_(false),
+ device_policy_applied_(false),
+ user_policy_applied_(false),
+ client_certs_resolved_(false),
+ applied_autoconnect_policy_(false) {
+}
+
+AutoConnectHandler::~AutoConnectHandler() {
+ if (client_cert_resolver_)
+ client_cert_resolver_->RemoveObserver(this);
+ if (LoginState::IsInitialized())
+ LoginState::Get()->RemoveObserver(this);
+ if (managed_configuration_handler_)
+ managed_configuration_handler_->RemoveObserver(this);
+}
+
+void AutoConnectHandler::Init(
+ ClientCertResolver* client_cert_resolver,
+ NetworkConnectionHandler* network_connection_handler,
+ NetworkStateHandler* network_state_handler,
+ ManagedNetworkConfigurationHandler* managed_network_configuration_handler) {
+ if (LoginState::IsInitialized())
+ LoginState::Get()->AddObserver(this);
+
+ client_cert_resolver_ = client_cert_resolver;
+ if (client_cert_resolver_)
+ client_cert_resolver_->AddObserver(this);
+
+ network_connection_handler_ = network_connection_handler;
+ if (network_connection_handler_)
+ network_connection_handler_->AddObserver(this);
+
+ network_state_handler_ = network_state_handler;
+
+ if (managed_network_configuration_handler) {
+ managed_configuration_handler_ = managed_network_configuration_handler;
+ managed_configuration_handler_->AddObserver(this);
+ }
+
+ if (LoginState::IsInitialized())
+ LoggedInStateChanged();
+}
+
+void AutoConnectHandler::LoggedInStateChanged() {
+ if (!LoginState::Get()->IsUserLoggedIn())
+ return;
+
+ // Disconnect before connecting, to ensure that we do not disconnect a network
+ // that we just connected.
+ DisconnectIfPolicyRequires();
+ NET_LOG_DEBUG("RequestBestConnection", "User logged in");
+ RequestBestConnection();
+}
+
+void AutoConnectHandler::ConnectToNetworkRequested(
+ const std::string& /*service_path*/) {
+ // Stop any pending request to connect to the best newtork.
+ request_best_connection_pending_ = false;
+}
+
+void AutoConnectHandler::PoliciesChanged(const std::string& userhash) {
+ // Ignore user policies.
+ if (!userhash.empty())
+ return;
+ DisconnectIfPolicyRequires();
+}
+
+void AutoConnectHandler::PoliciesApplied(const std::string& userhash) {
+ if (userhash.empty())
+ device_policy_applied_ = true;
+ else
+ user_policy_applied_ = true;
+
+ // Request to connect to the best network only if there is at least one
+ // managed network. Otherwise only process existing requests.
+ const ManagedNetworkConfigurationHandler::GuidToPolicyMap* managed_networks =
+ managed_configuration_handler_->GetNetworkConfigsFromPolicy(userhash);
+ DCHECK(managed_networks);
+ if (!managed_networks->empty()) {
+ NET_LOG_DEBUG("RequestBestConnection", "Policy applied");
+ RequestBestConnection();
+ } else {
+ CheckBestConnection();
+ }
+}
+
+void AutoConnectHandler::ResolveRequestCompleted(
+ bool network_properties_changed) {
+ client_certs_resolved_ = true;
+
+ // Only request to connect to the best network if network properties were
+ // actually changed. Otherwise only process existing requests.
+ if (network_properties_changed) {
+ NET_LOG_DEBUG("RequestBestConnection",
+ "Client certificate patterns resolved");
+ RequestBestConnection();
+ } else {
+ CheckBestConnection();
+ }
+}
+
+void AutoConnectHandler::RequestBestConnection() {
+ request_best_connection_pending_ = true;
+ CheckBestConnection();
+}
+
+void AutoConnectHandler::CheckBestConnection() {
+ // Return immediately if there is currently no request pending to change to
+ // the best network.
+ if (!request_best_connection_pending_)
+ return;
+
+ bool policy_application_running =
+ managed_configuration_handler_->IsAnyPolicyApplicationRunning();
+ bool client_cert_resolve_task_running =
+ client_cert_resolver_->IsAnyResolveTaskRunning();
+ VLOG(2) << "device policy applied: " << device_policy_applied_
+ << "\nuser policy applied: " << user_policy_applied_
+ << "\npolicy application running: " << policy_application_running
+ << "\nclient cert patterns resolved: " << client_certs_resolved_
+ << "\nclient cert resolve task running: "
+ << client_cert_resolve_task_running;
+ if (!device_policy_applied_ || policy_application_running ||
+ client_cert_resolve_task_running) {
+ return;
+ }
+
+ if (LoginState::Get()->IsUserLoggedIn()) {
+ // Before changing connection after login, we wait at least for:
+ // - user policy applied at least once
+ // - client certificate patterns resolved
+ if (!user_policy_applied_ || !client_certs_resolved_)
+ return;
+ }
+
+ request_best_connection_pending_ = false;
+ NET_LOG_EVENT("ConnectToBestWifiNetwork", "");
+ network_state_handler_->ConnectToBestWifiNetwork();
+}
+
+void AutoConnectHandler::DisconnectIfPolicyRequires() {
+ if (applied_autoconnect_policy_ || !LoginState::Get()->IsUserLoggedIn())
+ return;
+
+ const base::DictionaryValue* global_network_config =
+ managed_configuration_handler_->GetGlobalConfigFromPolicy(
+ std::string() /* no username hash, device policy */);
+
+ if (!global_network_config)
+ return; // Device policy is not set, yet.
+
+ applied_autoconnect_policy_ = true;
+
+ bool only_policy_autoconnect = false;
+ global_network_config->GetBooleanWithoutPathExpansion(
+ ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
+ &only_policy_autoconnect);
+
+ if (only_policy_autoconnect)
+ DisconnectFromUnmanagedSharedWiFiNetworks();
+}
+
+void AutoConnectHandler::DisconnectFromUnmanagedSharedWiFiNetworks() {
+ NET_LOG_DEBUG("DisconnectFromUnmanagedSharedWiFiNetworks", "");
+
+ NetworkStateHandler::NetworkStateList networks;
+ network_state_handler_->GetVisibleNetworkListByType(
+ NetworkTypePattern::Wireless(), &networks);
+ for (const NetworkState* network : networks) {
+ if (!(network->IsConnectingState() || network->IsConnectedState()))
+ break; // Connected and connecting networks are listed first.
+
+ if (network->IsPrivate())
+ continue;
+
+ const bool network_is_policy_managed =
+ !network->profile_path().empty() && !network->guid().empty() &&
+ managed_configuration_handler_->FindPolicyByGuidAndProfile(
+ network->guid(), network->profile_path());
+ if (network_is_policy_managed)
+ continue;
+
+ NET_LOG_EVENT("Disconnect Forced by Policy", network->path());
+ DBusThreadManager::Get()->GetShillServiceClient()->Disconnect(
+ dbus::ObjectPath(network->path()), base::Bind(&base::DoNothing),
+ base::Bind(&network_handler::ShillErrorCallbackFunction,
+ "AutoConnectHandler.Disconnect failed", network->path(),
+ network_handler::ErrorCallback()));
+ }
+}
+
+} // namespace chromeos
diff --git a/chromeos/network/auto_connect_handler.h b/chromeos/network/auto_connect_handler.h
new file mode 100644
index 0000000..3d0eb54
--- /dev/null
+++ b/chromeos/network/auto_connect_handler.h
@@ -0,0 +1,108 @@
+// Copyright 2014 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 CHROMEOS_NETWORK_AUTO_CONNECT_HANDLER_H_
+#define CHROMEOS_NETWORK_AUTO_CONNECT_HANDLER_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "chromeos/chromeos_export.h"
+#include "chromeos/login/login_state.h"
+#include "chromeos/network/client_cert_resolver.h"
+#include "chromeos/network/network_connection_handler.h"
+#include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_policy_observer.h"
+
+namespace chromeos {
+
+class CHROMEOS_EXPORT AutoConnectHandler
+ : public LoginState::Observer,
+ public NetworkPolicyObserver,
+ public NetworkConnectionHandler::Observer,
+ public ClientCertResolver::Observer {
+ public:
+ ~AutoConnectHandler() override;
+
+ // LoginState::Observer
+ void LoggedInStateChanged() override;
+
+ // NetworkConnectionHandler::Observer
+ void ConnectToNetworkRequested(const std::string& service_path) override;
+
+ // NetworkPolicyObserver
+ void PoliciesChanged(const std::string& userhash) override;
+ void PoliciesApplied(const std::string& userhash) override;
+
+ // ClientCertResolver::Observer
+ void ResolveRequestCompleted(bool network_properties_changed) override;
+
+ private:
+ friend class NetworkHandler;
+ friend class AutoConnectHandlerTest;
+
+ AutoConnectHandler();
+
+ void Init(ClientCertResolver* client_cert_resolver,
+ NetworkConnectionHandler* network_connection_handler,
+ NetworkStateHandler* network_state_handler,
+ ManagedNetworkConfigurationHandler*
+ managed_network_configuration_handler);
+
+ // If the user logged in already and the policy to prevent unmanaged & shared
+ // networks to autoconnect is enabled, then disconnects all such networks
+ // except wired networks. It will do this only once after the user logged in
+ // and the device policy was available.
+ // This is enforced once after a user logs in 1) to allow mananged networks to
+ // autoconnect and 2) to prevent a previous user from foisting a network on
+ // the new user. Therefore, this function is called at login and when the
+ // device policy is changed.
+ void DisconnectIfPolicyRequires();
+
+ // Disconnects from all unmanaged and shared WiFi networks that are currently
+ // connected or connecting.
+ void DisconnectFromUnmanagedSharedWiFiNetworks();
+
+ // Requests and if possible connects to the 'best' available network, see
+ // CheckBestConnection().
+ void RequestBestConnection();
+
+ // If a request to connect to the best network is pending and all requirements
+ // are fulfilled (like policy loaded, certificate patterns being resolved),
+ // then this will call ConnectToBestWifiNetwork of |network_state_handler_|.
+ void CheckBestConnection();
+
+ // Local references to the associated handler instances.
+ ClientCertResolver* client_cert_resolver_;
+ NetworkConnectionHandler* network_connection_handler_;
+ NetworkStateHandler* network_state_handler_;
+ ManagedNetworkConfigurationHandler* managed_configuration_handler_;
+
+ // Whether a request to connect to the best network is pending. If true, once
+ // all requirements are met (like policy loaded, certificate patterns being
+ // resolved), the request is forwarded to the |network_state_handler_|.
+ bool request_best_connection_pending_;
+
+ // Whether the device policy, which might be empty, is already applied.
+ bool device_policy_applied_;
+
+ // Whether the user policy of the first user who logged in is already applied.
+ // The policy might be empty.
+ bool user_policy_applied_;
+
+ // Whether at least once client certificate patterns were checked and if any
+ // existed resolved. Even if there are no certificate patterns, this will be
+ // eventually true.
+ bool client_certs_resolved_;
+
+ // Whether the autoconnect policy was applied already, see
+ // DisconnectIfPolicyRequires().
+ bool applied_autoconnect_policy_;
+
+ DISALLOW_COPY_AND_ASSIGN(AutoConnectHandler);
+};
+
+} // namespace chromeos
+
+#endif // CHROMEOS_NETWORK_AUTO_CONNECT_HANDLER_H_
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc
new file mode 100644
index 0000000..dda7ecc
--- /dev/null
+++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -0,0 +1,475 @@
+// Copyright 2014 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 "chromeos/network/auto_connect_handler.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/files/file_util.h"
+#include "base/json/json_reader.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "chromeos/cert_loader.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_device_client.h"
+#include "chromeos/dbus/shill_manager_client.h"
+#include "chromeos/dbus/shill_profile_client.h"
+#include "chromeos/dbus/shill_service_client.h"
+#include "chromeos/network/client_cert_resolver.h"
+#include "chromeos/network/managed_network_configuration_handler_impl.h"
+#include "chromeos/network/network_configuration_handler.h"
+#include "chromeos/network/network_profile_handler.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/onc/onc_utils.h"
+#include "components/onc/onc_constants.h"
+#include "crypto/scoped_nss_types.h"
+#include "crypto/scoped_test_nss_db.h"
+#include "net/base/net_errors.h"
+#include "net/base/test_data_directory.h"
+#include "net/cert/nss_cert_database_chromeos.h"
+#include "net/cert/x509_certificate.h"
+#include "net/test/cert_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+// http://crbug.com/418369
+#ifdef NDEBUG
+
+namespace chromeos {
+
+namespace {
+
+const char* kUserHash = "user_hash";
+
+void ConfigureCallback(const dbus::ObjectPath& result) {
+}
+
+void FailErrorCallback(const std::string& error_name,
+ const std::string& error_message) {
+ // This function is not expected to be called.
+ EXPECT_TRUE(false);
+}
+
+class TestCertResolveObserver : public ClientCertResolver::Observer {
+ public:
+ explicit TestCertResolveObserver(ClientCertResolver* cert_resolver)
+ : changed_network_properties_(false), cert_resolver_(cert_resolver) {
+ cert_resolver_->AddObserver(this);
+ }
+
+ void ResolveRequestCompleted(bool changed_network_properties) override {
+ cert_resolver_->RemoveObserver(this);
+ changed_network_properties_ = changed_network_properties;
+ }
+
+ bool DidNetworkPropertiesChange() { return changed_network_properties_; }
+
+ private:
+ bool changed_network_properties_;
+ ClientCertResolver* cert_resolver_;
+};
+
+} // namespace
+
+class AutoConnectHandlerTest : public testing::Test {
+ public:
+ AutoConnectHandlerTest()
+ : test_manager_client_(nullptr), test_service_client_(nullptr) {}
+
+ void SetUp() override {
+ ASSERT_TRUE(test_nssdb_.is_open());
+
+ // Use the same DB for public and private slot.
+ test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS(
+ crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())),
+ crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot()))));
+ test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner());
+
+ CertLoader::Initialize();
+ CertLoader::ForceHardwareBackedForTesting();
+
+ DBusThreadManager::Initialize();
+ DBusThreadManager* dbus_manager = DBusThreadManager::Get();
+ test_manager_client_ =
+ dbus_manager->GetShillManagerClient()->GetTestInterface();
+ test_service_client_ =
+ dbus_manager->GetShillServiceClient()->GetTestInterface();
+
+ test_manager_client_->AddTechnology(shill::kTypeWifi, true /* enabled */);
+ dbus_manager->GetShillDeviceClient()->GetTestInterface()->AddDevice(
+ "/device/wifi1", shill::kTypeWifi, "wifi_device1");
+ test_manager_client_->AddTechnology(shill::kTypeCellular,
+ true /* enabled */);
+ dbus_manager->GetShillProfileClient()->GetTestInterface()->AddProfile(
+ "shared_profile_path", std::string() /* shared profile */);
+ dbus_manager->GetShillProfileClient()->GetTestInterface()->AddProfile(
+ "user_profile_path", kUserHash);
+
+ base::RunLoop().RunUntilIdle();
+ LoginState::Initialize();
+ network_state_handler_.reset(NetworkStateHandler::InitializeForTest());
+ network_config_handler_.reset(
+ NetworkConfigurationHandler::InitializeForTest(
+ network_state_handler_.get()));
+
+ network_profile_handler_.reset(new NetworkProfileHandler());
+ network_profile_handler_->Init();
+
+ managed_config_handler_.reset(new ManagedNetworkConfigurationHandlerImpl());
+ managed_config_handler_->Init(
+ network_state_handler_.get(), network_profile_handler_.get(),
+ network_config_handler_.get(), nullptr /* network_device_handler */);
+
+ client_cert_resolver_.reset(new ClientCertResolver());
+ client_cert_resolver_->Init(network_state_handler_.get(),
+ managed_config_handler_.get());
+ client_cert_resolver_->SetSlowTaskRunnerForTest(
+ message_loop_.task_runner());
+
+ auto_connect_handler_.reset(new AutoConnectHandler());
+ auto_connect_handler_->Init(client_cert_resolver_.get(),
+ nullptr, // no connection handler
+ network_state_handler_.get(),
+ managed_config_handler_.get());
+
+ base::RunLoop().RunUntilIdle();
+ }
+
+ void TearDown() override {
+ auto_connect_handler_.reset();
+ client_cert_resolver_.reset();
+ managed_config_handler_.reset();
+ network_profile_handler_.reset();
+ network_config_handler_.reset();
+ network_state_handler_.reset();
+ CertLoader::Shutdown();
+ LoginState::Shutdown();
+ DBusThreadManager::Shutdown();
+ }
+
+ protected:
+ bool Configure(const std::string& json_string) {
+ scoped_ptr<base::DictionaryValue> json_dict =
+ onc::ReadDictionaryFromJson(json_string);
+ if (!json_dict) {
+ LOG(ERROR) << "Error parsing json: " << json_string;
+ return false;
+ }
+ DBusThreadManager::Get()->GetShillManagerClient()->ConfigureService(
+ *json_dict, base::Bind(&ConfigureCallback),
+ base::Bind(&FailErrorCallback));
+ base::RunLoop().RunUntilIdle();
+ return true;
+ }
+
+ std::string GetServiceState(const std::string& service_path) {
+ const base::DictionaryValue* properties =
+ test_service_client_->GetServiceProperties(service_path);
+ std::string result;
+ if (properties)
+ properties->GetStringWithoutPathExpansion(shill::kStateProperty, &result);
+ return result;
+ }
+
+ void StartCertLoader() {
+ CertLoader::Get()->StartWithNSSDB(test_nsscertdb_.get());
+ base::RunLoop().RunUntilIdle();
+ }
+
+ void LoginToRegularUser() {
+ LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_ACTIVE,
+ LoginState::LOGGED_IN_USER_REGULAR);
+ base::RunLoop().RunUntilIdle();
+ }
+
+ scoped_refptr<net::X509Certificate> ImportTestClientCert() {
+ net::CertificateList ca_cert_list = net::CreateCertificateListFromFile(
+ net::GetTestCertsDirectory(), "client_1_ca.pem",
+ net::X509Certificate::FORMAT_AUTO);
+ if (ca_cert_list.empty()) {
+ LOG(ERROR) << "No CA cert loaded.";
+ return nullptr;
+ }
+ net::NSSCertDatabase::ImportCertFailureList failures;
+ EXPECT_TRUE(test_nsscertdb_->ImportCACerts(
+ ca_cert_list, net::NSSCertDatabase::TRUST_DEFAULT, &failures));
+ if (!failures.empty()) {
+ LOG(ERROR) << net::ErrorToString(failures[0].net_error);
+ return nullptr;
+ }
+
+ // Import a client cert signed by that CA.
+ scoped_refptr<net::X509Certificate> client_cert(
+ net::ImportClientCertAndKeyFromFile(net::GetTestCertsDirectory(),
+ "client_1.pem", "client_1.pk8",
+ test_nssdb_.slot()));
+ return client_cert;
+ }
+
+ void SetupPolicy(const std::string& network_configs_json,
+ const base::DictionaryValue& global_config,
+ bool user_policy) {
+ scoped_ptr<base::ListValue> network_configs(new base::ListValue);
+ if (!network_configs_json.empty()) {
+ std::string error;
+ base::Value* network_configs_value = base::JSONReader::ReadAndReturnError(
+ network_configs_json, base::JSON_ALLOW_TRAILING_COMMAS, nullptr,
+ &error);
+ ASSERT_TRUE(network_configs_value) << error;
+ base::ListValue* network_configs_list = nullptr;
+ ASSERT_TRUE(network_configs_value->GetAsList(&network_configs_list));
+ network_configs.reset(network_configs_list);
+ }
+
+ if (user_policy) {
+ managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_USER_POLICY,
+ kUserHash, *network_configs,
+ global_config);
+ } else {
+ managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY,
+ std::string(), // no username hash
+ *network_configs, global_config);
+ }
+ base::RunLoop().RunUntilIdle();
+ }
+
+ scoped_ptr<AutoConnectHandler> auto_connect_handler_;
+ scoped_ptr<ClientCertResolver> client_cert_resolver_;
+ scoped_ptr<NetworkStateHandler> network_state_handler_;
+ scoped_ptr<NetworkConfigurationHandler> network_config_handler_;
+ scoped_ptr<ManagedNetworkConfigurationHandlerImpl> managed_config_handler_;
+ scoped_ptr<NetworkProfileHandler> network_profile_handler_;
+ ShillManagerClient::TestInterface* test_manager_client_;
+ ShillServiceClient::TestInterface* test_service_client_;
+ crypto::ScopedTestNSSDB test_nssdb_;
+ scoped_ptr<net::NSSCertDatabaseChromeOS> test_nsscertdb_;
+ base::MessageLoopForUI message_loop_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AutoConnectHandlerTest);
+};
+
+namespace {
+
+const char* kConfigUnmanagedSharedConnected =
+ "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"online\", "
+ " \"Security\": \"wpa\" }";
+const char* kConfigManagedSharedConnectable =
+ "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"idle\", "
+ " \"Connectable\": true, \"Security\": \"wpa\" }";
+
+const char* kPolicy =
+ "[ { \"GUID\": \"wifi1\","
+ " \"Name\": \"wifi1\","
+ " \"Type\": \"WiFi\","
+ " \"WiFi\": {"
+ " \"Security\": \"WPA-PSK\","
+ " \"SSID\": \"wifi1\","
+ " \"Passphrase\": \"passphrase\""
+ " }"
+ "} ]";
+
+const char* kPolicyCertPattern =
+ "[ { \"GUID\": \"wifi1\","
+ " \"Name\": \"wifi1\","
+ " \"Type\": \"WiFi\","
+ " \"WiFi\": {"
+ " \"Security\": \"WPA-EAP\","
+ " \"SSID\": \"wifi1\","
+ " \"EAP\": {"
+ " \"Outer\": \"EAP-TLS\","
+ " \"ClientCertType\": \"Pattern\","
+ " \"ClientCertPattern\": {"
+ " \"Issuer\": {"
+ " \"CommonName\": \"B CA\""
+ " }"
+ " }"
+ " }"
+ " }"
+ "} ]";
+} // namespace
+
+TEST_F(AutoConnectHandlerTest, ReconnectOnCertLoading) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+ test_manager_client_->SetBestServiceToConnect("wifi1");
+
+ // User login shouldn't trigger any change until the certificates and policy
+ // are loaded.
+ LoginToRegularUser();
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ // Applying the policy which restricts autoconnect should disconnect from the
+ // shared, unmanaged network.
+ base::DictionaryValue global_config;
+ global_config.SetBooleanWithoutPathExpansion(
+ ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
+ true);
+
+ SetupPolicy(std::string(), // no network configs
+ base::DictionaryValue(), // no global config
+ true); // load as user policy
+ SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ // Certificate loading should trigger connecting to the 'best' network.
+ StartCertLoader();
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1"));
+}
+
+TEST_F(AutoConnectHandlerTest, ReconnectOnCertPatternResolved) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+ test_manager_client_->SetBestServiceToConnect("wifi0");
+
+ SetupPolicy(std::string(), // no device policy
+ base::DictionaryValue(), // no global config
+ false); // load as device policy
+ LoginToRegularUser();
+ StartCertLoader();
+ SetupPolicy(kPolicyCertPattern,
+ base::DictionaryValue(), // no global config
+ true); // load as user policy
+
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ test_manager_client_->SetBestServiceToConnect("wifi1");
+ TestCertResolveObserver observer(client_cert_resolver_.get());
+
+ scoped_refptr<net::X509Certificate> cert = ImportTestClientCert();
+ ASSERT_TRUE(cert.get());
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(observer.DidNetworkPropertiesChange());
+
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1"));
+}
+
+// Ensure that resolving of certificate patterns only triggers a reconnect if at
+// least one pattern was resolved.
+TEST_F(AutoConnectHandlerTest, NoReconnectIfNoCertResolved) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+ test_manager_client_->SetBestServiceToConnect("wifi0");
+
+ SetupPolicy(std::string(), // no device policy
+ base::DictionaryValue(), // no global config
+ false); // load as device policy
+ LoginToRegularUser();
+ StartCertLoader();
+ SetupPolicy(kPolicy,
+ base::DictionaryValue(), // no global config
+ true); // load as user policy
+
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ test_manager_client_->SetBestServiceToConnect("wifi1");
+ TestCertResolveObserver observer(client_cert_resolver_.get());
+ scoped_refptr<net::X509Certificate> cert = ImportTestClientCert();
+ ASSERT_TRUE(cert.get());
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(observer.DidNetworkPropertiesChange());
+
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+}
+
+TEST_F(AutoConnectHandlerTest, DisconnectOnPolicyLoading) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+
+ // User login and certificate loading shouldn't trigger any change until the
+ // policy is loaded.
+ LoginToRegularUser();
+ StartCertLoader();
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ base::DictionaryValue global_config;
+ global_config.SetBooleanWithoutPathExpansion(
+ ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
+ true);
+
+ // Applying the policy which restricts autoconnect should disconnect from the
+ // shared, unmanaged network.
+ // Because no best service is set, the fake implementation of
+ // ConnectToBestServices will be a no-op.
+ SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+}
+
+// After login a reconnect is triggered even if there is no managed network.
+TEST_F(AutoConnectHandlerTest, ReconnectAfterLogin) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+ test_manager_client_->SetBestServiceToConnect("wifi1");
+
+ // User login and certificate loading shouldn't trigger any change until the
+ // policy is loaded.
+ LoginToRegularUser();
+ StartCertLoader();
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ // Applying an empty device policy will not trigger anything yet, until also
+ // the user policy is applied.
+ SetupPolicy(std::string(), // no network configs
+ base::DictionaryValue(), // no global config
+ false); // load as device policy
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ // Applying also an empty user policy should trigger connecting to the 'best'
+ // network.
+ SetupPolicy(std::string(), // no network configs
+ base::DictionaryValue(), // no global config
+ true); // load as user policy
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1"));
+}
+
+TEST_F(AutoConnectHandlerTest, ManualConnectAbortsReconnectAfterLogin) {
+ EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
+ EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
+ test_manager_client_->SetBestServiceToConnect("wifi1");
+
+ // User login and certificate loading shouldn't trigger any change until the
+ // policy is loaded.
+ LoginToRegularUser();
+ StartCertLoader();
+ SetupPolicy(std::string(), // no network configs
+ base::DictionaryValue(), // no global config
+ false); // load as device policy
+
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+ // A manual connect request should prevent a reconnect after login.
+ auto_connect_handler_->ConnectToNetworkRequested(
+ std::string() /* service_path */);
+
+ // Applying the user policy after login would usually trigger connecting to
+ // the 'best' network. But the manual connect prevents this.
+ SetupPolicy(std::string(), // no network configs
+ base::DictionaryValue(), // no global config
+ true); // load as user policy
+ EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+}
+
+} // namespace chromeos
+
+#endif
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index 527dd5a..ebe5d54 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -404,7 +404,8 @@
STLDeleteValues(&old_per_network_config);
ApplyOrQueuePolicies(userhash, &modified_policies);
- FOR_EACH_OBSERVER(NetworkPolicyObserver, observers_, PolicyChanged(userhash));
+ FOR_EACH_OBSERVER(NetworkPolicyObserver, observers_,
+ PoliciesChanged(userhash));
}
bool ManagedNetworkConfigurationHandlerImpl::IsAnyPolicyApplicationRunning()
diff --git a/chromeos/network/managed_network_configuration_handler_impl.h b/chromeos/network/managed_network_configuration_handler_impl.h
index d9a89bd..433987c 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.h
+++ b/chromeos/network/managed_network_configuration_handler_impl.h
@@ -106,6 +106,7 @@
void OnPoliciesApplied(const NetworkProfile& profile) override;
private:
+ friend class AutoConnectHandlerTest;
friend class ClientCertResolverTest;
friend class ManagedNetworkConfigurationHandlerTest;
friend class NetworkConnectionHandlerTest;
diff --git a/chromeos/network/network_connection_handler.cc b/chromeos/network/network_connection_handler.cc
index 018d924..79e4ea2 100644
--- a/chromeos/network/network_connection_handler.cc
+++ b/chromeos/network/network_connection_handler.cc
@@ -152,9 +152,7 @@
network_state_handler_(NULL),
configuration_handler_(NULL),
logged_in_(false),
- certificates_loaded_(false),
- applied_autoconnect_policy_(false),
- requested_connect_to_best_network_(false) {
+ certificates_loaded_(false) {
}
NetworkConnectionHandler::~NetworkConnectionHandler() {
@@ -191,11 +189,7 @@
network_state_handler_->AddObserver(this, FROM_HERE);
}
configuration_handler_ = network_configuration_handler;
-
- if (managed_network_configuration_handler) {
- managed_configuration_handler_ = managed_network_configuration_handler;
- managed_configuration_handler_->AddObserver(this);
- }
+ managed_configuration_handler_ = managed_network_configuration_handler;
// After this point, the NetworkConnectionHandler is fully initialized (all
// handler references set, observers registered, ...).
@@ -204,6 +198,14 @@
LoggedInStateChanged();
}
+void NetworkConnectionHandler::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void NetworkConnectionHandler::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
void NetworkConnectionHandler::LoggedInStateChanged() {
LoginState* login_state = LoginState::Get();
if (logged_in_ || !login_state->IsUserLoggedIn())
@@ -212,8 +214,6 @@
NET_LOG_EVENT("Logged In", "");
logged_in_ = true;
logged_in_time_ = base::TimeTicks::Now();
-
- DisconnectIfPolicyRequires();
}
void NetworkConnectionHandler::OnCertificatesLoaded(
@@ -221,20 +221,8 @@
bool initial_load) {
certificates_loaded_ = true;
NET_LOG_EVENT("Certificates Loaded", "");
- if (queued_connect_) {
+ if (queued_connect_)
ConnectToQueuedNetwork();
- } else if (initial_load) {
- // Connecting to the "best" available network requires certificates to be
- // loaded. Try to connect now.
- ConnectToBestNetworkAfterLogin();
- }
-}
-
-void NetworkConnectionHandler::PolicyChanged(const std::string& userhash) {
- // Ignore user policies.
- if (!userhash.empty())
- return;
- DisconnectIfPolicyRequires();
}
void NetworkConnectionHandler::ConnectToNetwork(
@@ -243,6 +231,9 @@
const network_handler::ErrorCallback& error_callback,
bool check_error_state) {
NET_LOG_USER("ConnectToNetwork", service_path);
+ FOR_EACH_OBSERVER(Observer, observers_,
+ ConnectToNetworkRequested(service_path));
+
// Clear any existing queued connect request.
queued_connect_.reset();
if (HasConnectingNetwork(service_path)) {
@@ -761,66 +752,4 @@
success_callback.Run();
}
-void NetworkConnectionHandler::ConnectToBestNetworkAfterLogin() {
- if (requested_connect_to_best_network_ || !applied_autoconnect_policy_ ||
- !certificates_loaded_) {
- return;
- }
-
- requested_connect_to_best_network_ = true;
- network_state_handler_->ConnectToBestWifiNetwork();
-}
-
-void NetworkConnectionHandler::DisconnectIfPolicyRequires() {
- if (applied_autoconnect_policy_ || !LoginState::Get()->IsUserLoggedIn())
- return;
-
- const base::DictionaryValue* global_network_config =
- managed_configuration_handler_->GetGlobalConfigFromPolicy(std::string());
- if (!global_network_config)
- return;
-
- applied_autoconnect_policy_ = true;
-
- bool only_policy_autoconnect = false;
- global_network_config->GetBooleanWithoutPathExpansion(
- ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
- &only_policy_autoconnect);
-
- if (only_policy_autoconnect)
- DisconnectFromUnmanagedSharedWiFiNetworks();
-
- ConnectToBestNetworkAfterLogin();
-}
-
-void NetworkConnectionHandler::DisconnectFromUnmanagedSharedWiFiNetworks() {
- NET_LOG_DEBUG("DisconnectFromUnmanagedSharedWiFiNetworks", "");
-
- NetworkStateHandler::NetworkStateList networks;
- network_state_handler_->GetVisibleNetworkListByType(
- NetworkTypePattern::Wireless(), &networks);
- for (NetworkStateHandler::NetworkStateList::const_iterator it =
- networks.begin();
- it != networks.end();
- ++it) {
- const NetworkState* network = *it;
- if (!(network->IsConnectingState() || network->IsConnectedState()))
- break; // Connected and connecting networks are listed first.
-
- if (network->IsPrivate())
- continue;
-
- const bool network_is_policy_managed =
- !network->profile_path().empty() && !network->guid().empty() &&
- managed_configuration_handler_->FindPolicyByGuidAndProfile(
- network->guid(), network->profile_path());
- if (network_is_policy_managed)
- continue;
-
- NET_LOG_EVENT("Disconnect Forced by Policy", network->path());
- CallShillDisconnect(
- network->path(), base::Closure(), network_handler::ErrorCallback());
- }
-}
-
} // namespace chromeos
diff --git a/chromeos/network/network_connection_handler.h b/chromeos/network/network_connection_handler.h
index 73ecd66..bdcf89d 100644
--- a/chromeos/network/network_connection_handler.h
+++ b/chromeos/network/network_connection_handler.h
@@ -5,12 +5,14 @@
#ifndef CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_
#define CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_
+#include <map>
#include <set>
#include <string>
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chromeos/cert_loader.h"
@@ -19,7 +21,6 @@
#include "chromeos/login/login_state.h"
#include "chromeos/network/network_handler.h"
#include "chromeos/network/network_handler_callbacks.h"
-#include "chromeos/network/network_policy_observer.h"
#include "chromeos/network/network_state_handler_observer.h"
namespace chromeos {
@@ -46,9 +47,21 @@
: public LoginState::Observer,
public CertLoader::Observer,
public NetworkStateHandlerObserver,
- public NetworkPolicyObserver,
public base::SupportsWeakPtr<NetworkConnectionHandler> {
public:
+ class Observer {
+ public:
+ // Called if a connection to network |service_path| was requested, by
+ // calling ConnectToNetwork.
+ virtual void ConnectToNetworkRequested(const std::string& service_path) = 0;
+
+ protected:
+ virtual ~Observer() {}
+
+ private:
+ DISALLOW_ASSIGN(Observer);
+ };
+
// Constants for |error_name| from |error_callback| for Connect.
// No network matching |service_path| is found (hidden networks must be
@@ -93,6 +106,9 @@
virtual ~NetworkConnectionHandler();
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
+
// ConnectToNetwork() will start an asynchronous connection attempt.
// On success, |success_callback| will be called.
// On failure, |error_callback| will be called with |error_name| one of the
@@ -137,9 +153,6 @@
virtual void OnCertificatesLoaded(const net::CertificateList& cert_list,
bool initial_load) override;
- // NetworkPolicyObserver
- virtual void PolicyChanged(const std::string& userhash) override;
-
private:
friend class NetworkHandler;
friend class NetworkConnectionHandlerTest;
@@ -206,26 +219,7 @@
void HandleShillDisconnectSuccess(const std::string& service_path,
const base::Closure& success_callback);
- // If the policy to prevent unmanaged & shared networks to autoconnect is
- // enabled, then disconnect all such networks except wired networks. Does
- // nothing on consecutive calls.
- // This is enforced once after a user logs in 1) to allow mananged networks to
- // autoconnect and 2) to prevent a previous user from foisting a network on
- // the new user. Therefore, this function is called on startup, at login and
- // when the device policy is changed.
- void DisconnectIfPolicyRequires();
-
- // Disconnects from all unmanaged and shared WiFi networks that are currently
- // connected or connecting.
- void DisconnectFromUnmanagedSharedWiFiNetworks();
-
- // Requests a connect to the 'best' available network once after login and
- // after any disconnect required by policy is executed (see
- // DisconnectIfPolicyRequires()). To include networks with client
- // certificates, no request is sent until certificates are loaded. Therefore,
- // this function is called on the initial certificate load and by
- // DisconnectIfPolicyRequires().
- void ConnectToBestNetworkAfterLogin();
+ ObserverList<Observer> observers_;
// Local references to the associated handler instances.
CertLoader* cert_loader_;
@@ -243,14 +237,6 @@
bool certificates_loaded_;
base::TimeTicks logged_in_time_;
- // Whether the autoconnect policy was applied already, see
- // DisconnectIfPolicyRequires().
- bool applied_autoconnect_policy_;
-
- // Whether the handler already requested a 'ConnectToBestNetwork' after login,
- // see ConnectToBestNetworkAfterLogin().
- bool requested_connect_to_best_network_;
-
DISALLOW_COPY_AND_ASSIGN(NetworkConnectionHandler);
};
diff --git a/chromeos/network/network_connection_handler_unittest.cc b/chromeos/network/network_connection_handler_unittest.cc
index b2c61ac..31b04c2 100644
--- a/chromeos/network/network_connection_handler_unittest.cc
+++ b/chromeos/network/network_connection_handler_unittest.cc
@@ -426,114 +426,6 @@
EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset());
}
-namespace {
-
-const char* kConfigUnmanagedSharedConnected =
- "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"online\", "
- " \"Security\": \"wpa\" }";
-const char* kConfigManagedSharedConnectable =
- "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"idle\", "
- " \"Connectable\": true, \"Security\": \"wpa\" }";
-
-const char* kPolicy =
- "[ { \"GUID\": \"wifi1\","
- " \"Name\": \"wifi1\","
- " \"Type\": \"WiFi\","
- " \"WiFi\": {"
- " \"Security\": \"WPA-PSK\","
- " \"SSID\": \"wifi1\","
- " \"Passphrase\": \"passphrase\""
- " }"
- "} ]";
-
-} // namespace
-
-TEST_F(NetworkConnectionHandlerTest, ReconnectOnCertLoading) {
- EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
- EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
- test_manager_client_->SetBestServiceToConnect("wifi1");
-
- // User login shouldn't trigger any change until the certificates and policy
- // are loaded.
- LoginToRegularUser();
- EXPECT_EQ(shill::kStateOnline,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-
- // Applying the policy which restricts autoconnect should disconnect from the
- // shared, unmanaged network.
- base::DictionaryValue global_config;
- global_config.SetBooleanWithoutPathExpansion(
- ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
- true);
-
- SetupPolicy(kPolicy, global_config, false /* load as device policy */);
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-
- // Certificate loading should trigger connecting to the 'best' network.
- StartCertLoader();
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateOnline,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-}
-
-TEST_F(NetworkConnectionHandlerTest, DisconnectOnPolicyLoading) {
- EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
- EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
-
- // User login and certificate loading shouldn't trigger any change until the
- // policy is loaded.
- LoginToRegularUser();
- StartCertLoader();
- EXPECT_EQ(shill::kStateOnline,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-
- base::DictionaryValue global_config;
- global_config.SetBooleanWithoutPathExpansion(
- ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
- true);
-
- // Applying the policy which restricts autoconnect should disconnect from the
- // shared, unmanaged network.
- // Because no best service is set, the fake implementation of
- // ConnectToBestServices will be a no-op.
- SetupPolicy(kPolicy, global_config, false /* load as device policy */);
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-}
-
-TEST_F(NetworkConnectionHandlerTest, ReconnectOnEmptyPolicyLoading) {
- EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
- EXPECT_TRUE(Configure(kConfigManagedSharedConnectable));
- test_manager_client_->SetBestServiceToConnect("wifi1");
-
- // User login and certificate loading shouldn't trigger any change until the
- // policy is loaded.
- LoginToRegularUser();
- StartCertLoader();
- EXPECT_EQ(shill::kStateOnline,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-
- // Apply an empty policy should trigger connecting to the 'best' network.
- base::DictionaryValue global_config;
- SetupPolicy(kPolicy, global_config, false /* load as device policy */);
- EXPECT_EQ(shill::kStateIdle,
- GetServiceStringProperty("wifi0", shill::kStateProperty));
- EXPECT_EQ(shill::kStateOnline,
- GetServiceStringProperty("wifi1", shill::kStateProperty));
-}
-
} // namespace chromeos
#endif
diff --git a/chromeos/network/network_handler.cc b/chromeos/network/network_handler.cc
index ae26710..e54c935 100644
--- a/chromeos/network/network_handler.cc
+++ b/chromeos/network/network_handler.cc
@@ -6,6 +6,7 @@
#include "base/threading/worker_pool.h"
#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/network/auto_connect_handler.h"
#include "chromeos/network/client_cert_resolver.h"
#include "chromeos/network/geolocation_handler.h"
#include "chromeos/network/managed_network_configuration_handler_impl.h"
@@ -38,6 +39,7 @@
managed_network_configuration_handler_.reset(
new ManagedNetworkConfigurationHandlerImpl());
if (CertLoader::IsInitialized()) {
+ auto_connect_handler_.reset(new AutoConnectHandler());
network_cert_migrator_.reset(new NetworkCertMigrator());
client_cert_resolver_.reset(new ClientCertResolver());
}
@@ -71,6 +73,12 @@
client_cert_resolver_->Init(network_state_handler_.get(),
managed_network_configuration_handler_.get());
}
+ if (auto_connect_handler_) {
+ auto_connect_handler_->Init(client_cert_resolver_.get(),
+ network_connection_handler_.get(),
+ network_state_handler_.get(),
+ managed_network_configuration_handler_.get());
+ }
network_sms_handler_->Init();
geolocation_handler_->Init();
}
diff --git a/chromeos/network/network_handler.h b/chromeos/network/network_handler.h
index 6949d70..d5dc403 100644
--- a/chromeos/network/network_handler.h
+++ b/chromeos/network/network_handler.h
@@ -13,6 +13,7 @@
namespace chromeos {
+class AutoConnectHandler;
class ClientCertResolver;
class GeolocationHandler;
class ManagedNetworkConfigurationHandler;
@@ -79,6 +80,7 @@
scoped_ptr<ClientCertResolver> client_cert_resolver_;
scoped_ptr<NetworkActivationHandler> network_activation_handler_;
scoped_ptr<NetworkConnectionHandler> network_connection_handler_;
+ scoped_ptr<AutoConnectHandler> auto_connect_handler_;
scoped_ptr<NetworkSmsHandler> network_sms_handler_;
scoped_ptr<GeolocationHandler> geolocation_handler_;
diff --git a/chromeos/network/network_policy_observer.h b/chromeos/network/network_policy_observer.h
index c7af61e..924a036 100644
--- a/chromeos/network/network_policy_observer.h
+++ b/chromeos/network/network_policy_observer.h
@@ -13,10 +13,11 @@
class NetworkPolicyObserver {
public:
- // Called when the policy for |userhash| was set (also when it was updated).
- // Note that the policy might not have been applied yet at that time.
- // An empty |userhash| designates the device policy.
- virtual void PolicyChanged(const std::string& userhash) {}
+ // Called when the policies for |userhash| were set (also when they were
+ // updated). An empty |userhash| designates the device policy.
+ // Note that the policies might be empty and might not have been applied yet
+ // at that time.
+ virtual void PoliciesChanged(const std::string& userhash) {}
// Called every time a policy application for |userhash| finished. This is
// only called once no more policies are pending for |userhash|.
diff --git a/chromeos/network/network_profile_handler.h b/chromeos/network/network_profile_handler.h
index f3970ad..4d088bd 100644
--- a/chromeos/network/network_profile_handler.h
+++ b/chromeos/network/network_profile_handler.h
@@ -61,6 +61,7 @@
static std::string GetSharedProfilePath();
protected:
+ friend class AutoConnectHandlerTest;
friend class ClientCertResolverTest;
friend class NetworkConnectionHandlerTest;
friend class NetworkHandler;
diff --git a/components/components_tests.gyp b/components/components_tests.gyp
index 76b656a..bfd0b92 100644
--- a/components/components_tests.gyp
+++ b/components/components_tests.gyp
@@ -284,6 +284,7 @@
# TODO(blundell): Eliminate the need for this dependency in code
# that iOS shares. crbug.com/325243
'../content/content_shell_and_tests.gyp:test_support_content',
+ '../sql/sql.gyp:test_support_sql',
'../sync/sync.gyp:sync',
'../sync/sync.gyp:test_support_sync_api',
'../testing/gmock.gyp:gmock',
diff --git a/components/copresence/handlers/directive_handler.cc b/components/copresence/handlers/directive_handler.cc
index c2f3b8a..22138ac 100644
--- a/components/copresence/handlers/directive_handler.cc
+++ b/components/copresence/handlers/directive_handler.cc
@@ -5,11 +5,18 @@
#include "components/copresence/handlers/directive_handler.h"
#include "base/bind.h"
+#include "base/guid.h"
#include "base/logging.h"
#include "base/time/time.h"
#include "components/copresence/handlers/audio/audio_directive_handler_impl.h"
#include "components/copresence/proto/data.pb.h"
+namespace {
+
+const int kMaxUnlabeledDirectiveTtl = 60000; // 1 minute
+
+} // namespace
+
namespace copresence {
// Public functions
@@ -24,6 +31,7 @@
void DirectiveHandler::Start(WhispernetClient* whispernet_client,
const TokensCallback& tokens_cb) {
audio_handler_->Initialize(whispernet_client, tokens_cb);
+ DVLOG(2) << "Directive handler starting";
is_started_ = true;
@@ -35,7 +43,10 @@
pending_directives_.clear();
}
-void DirectiveHandler::AddDirective(const Directive& directive) {
+void DirectiveHandler::AddDirective(const Directive& original_directive) {
+ // We may need to modify the directive's TTL.
+ Directive directive(original_directive);
+
// We only handle transmit and receive directives.
// WiFi and BLE scans aren't implemented.
DCHECK_EQ(directive.instruction_type(), TOKEN);
@@ -43,9 +54,20 @@
std::string op_id = directive.published_message_id();
if (op_id.empty())
op_id = directive.subscription_id();
+
+ // GCM directives will not have a publish or subscribe ID populated.
if (op_id.empty()) {
- NOTREACHED() << "No operation associated with directive!";
- return;
+ op_id = base::GenerateGUID();
+ DVLOG(3) << "No operation associated with directive. Setting op id to "
+ << op_id;
+
+ // The app can't cancel these directives, so make sure they're not too long.
+ if (directive.ttl_millis() > kMaxUnlabeledDirectiveTtl) {
+ DVLOG(2) << "Cutting TTL of unlabeled directive from "
+ << directive.ttl_millis() << " down to "
+ << kMaxUnlabeledDirectiveTtl << " milliseconds";
+ directive.set_ttl_millis(kMaxUnlabeledDirectiveTtl);
+ }
}
if (!is_started_) {
diff --git a/components/copresence/handlers/directive_handler_unittest.cc b/components/copresence/handlers/directive_handler_unittest.cc
index 30a0a96..c388b72 100644
--- a/components/copresence/handlers/directive_handler_unittest.cc
+++ b/components/copresence/handlers/directive_handler_unittest.cc
@@ -13,15 +13,25 @@
using testing::ElementsAre;
using testing::IsEmpty;
+namespace {
+
+const int64 kMaxUnlabeledTtl = 60000; // 1 minute
+const int64 kExcessiveUnlabeledTtl = 120000; // 2 minutes
+const int64 kDefaultTtl = 600000; // 10 minutes
+
+} // namespace
+
namespace copresence {
Directive CreateDirective(const std::string& publish_id,
const std::string& subscribe_id,
- const std::string& token) {
+ const std::string& token,
+ int64 ttl_ms) {
Directive directive;
directive.set_instruction_type(TOKEN);
directive.set_published_message_id(publish_id);
directive.set_subscription_id(subscribe_id);
+ directive.set_ttl_millis(ttl_ms);
TokenInstruction* instruction = new TokenInstruction;
instruction->set_token_id(token);
@@ -31,6 +41,12 @@
return directive;
}
+Directive CreateDirective(const std::string& publish_id,
+ const std::string& subscribe_id,
+ const std::string& token) {
+ return CreateDirective(publish_id, subscribe_id, token, kDefaultTtl);
+}
+
class FakeAudioDirectiveHandler final : public AudioDirectiveHandler {
public:
FakeAudioDirectiveHandler() {}
@@ -40,8 +56,9 @@
void AddInstruction(const TokenInstruction& instruction,
const std::string& /* op_id */,
- base::TimeDelta /* ttl_ms */) override {
+ base::TimeDelta ttl) override {
added_tokens_.push_back(instruction.token_id());
+ added_ttls_.push_back(ttl.InMilliseconds());
}
void RemoveInstructions(const std::string& op_id) override {
@@ -62,12 +79,17 @@
return added_tokens_;
}
+ const std::vector<int64>& added_ttls() const {
+ return added_ttls_;
+ }
+
const std::vector<std::string>& removed_operations() const {
return removed_operations_;
}
private:
std::vector<std::string> added_tokens_;
+ std::vector<int64> added_ttls_;
std::vector<std::string> removed_operations_;
};
@@ -80,11 +102,25 @@
make_scoped_ptr<AudioDirectiveHandler>(audio_handler_)) {}
protected:
+ void StartDirectiveHandler() {
+ directive_handler_.Start(whispernet_client_.get(), TokensCallback());
+ }
+
scoped_ptr<WhispernetClient> whispernet_client_;
FakeAudioDirectiveHandler* audio_handler_;
DirectiveHandler directive_handler_;
};
+TEST_F(DirectiveHandlerTest, DirectiveTtl) {
+ StartDirectiveHandler();
+ directive_handler_.AddDirective(
+ CreateDirective("", "", "token 1", kMaxUnlabeledTtl));
+ directive_handler_.AddDirective(
+ CreateDirective("", "", "token 2", kExcessiveUnlabeledTtl));
+ EXPECT_THAT(audio_handler_->added_ttls(),
+ ElementsAre(kMaxUnlabeledTtl, kMaxUnlabeledTtl));
+}
+
TEST_F(DirectiveHandlerTest, Queuing) {
directive_handler_.AddDirective(CreateDirective("id 1", "", "token 1"));
directive_handler_.AddDirective(CreateDirective("", "id 1", "token 2"));
@@ -94,10 +130,11 @@
EXPECT_THAT(audio_handler_->added_tokens(), IsEmpty());
EXPECT_THAT(audio_handler_->removed_operations(), IsEmpty());
- directive_handler_.Start(whispernet_client_.get(), TokensCallback());
+ StartDirectiveHandler();
directive_handler_.RemoveDirectives("id 3");
EXPECT_THAT(audio_handler_->added_tokens(), ElementsAre("token 3"));
+ EXPECT_THAT(audio_handler_->added_ttls(), ElementsAre(kDefaultTtl));
EXPECT_THAT(audio_handler_->removed_operations(), ElementsAre("id 3"));
}
diff --git a/components/data_reduction_proxy_version_header.target.darwin-arm.mk b/components/data_reduction_proxy_version_header.target.darwin-arm.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-arm.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-arm.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.darwin-arm64.mk b/components/data_reduction_proxy_version_header.target.darwin-arm64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-arm64.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-arm64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.darwin-mips.mk b/components/data_reduction_proxy_version_header.target.darwin-mips.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-mips.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-mips.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.darwin-mips64.mk b/components/data_reduction_proxy_version_header.target.darwin-mips64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-mips64.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-mips64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.darwin-x86.mk b/components/data_reduction_proxy_version_header.target.darwin-x86.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-x86.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-x86.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.darwin-x86_64.mk b/components/data_reduction_proxy_version_header.target.darwin-x86_64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.darwin-x86_64.mk
+++ b/components/data_reduction_proxy_version_header.target.darwin-x86_64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-arm.mk b/components/data_reduction_proxy_version_header.target.linux-arm.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-arm.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-arm.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-arm64.mk b/components/data_reduction_proxy_version_header.target.linux-arm64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-arm64.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-arm64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-mips.mk b/components/data_reduction_proxy_version_header.target.linux-mips.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-mips.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-mips.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-mips64.mk b/components/data_reduction_proxy_version_header.target.linux-mips64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-mips64.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-mips64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-x86.mk b/components/data_reduction_proxy_version_header.target.linux-x86.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-x86.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-x86.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/data_reduction_proxy_version_header.target.linux-x86_64.mk b/components/data_reduction_proxy_version_header.target.linux-x86_64.mk
index b0dad4b..8a56cd5 100644
--- a/components/data_reduction_proxy_version_header.target.linux-x86_64.mk
+++ b/components/data_reduction_proxy_version_header.target.linux-x86_64.mk
@@ -22,7 +22,7 @@
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h: $(LOCAL_PATH)/chrome/VERSION $(LOCAL_PATH)/components/data_reduction_proxy/core/common/version.h.in $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating version header file: "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h" ($@)"
- $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.0\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
+ $(hide)cd $(gyp_local_path)/components; mkdir -p $(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common; python ../build/util/version.py -e "VERSION_FULL=\"40.0.2214.10\"" data_reduction_proxy/core/common/version.h.in "$(gyp_shared_intermediate_dir)/components/data_reduction_proxy/core/common/version.h"
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc
index 4a68dc0..8fe3df7 100644
--- a/components/gcm_driver/gcm_client_impl.cc
+++ b/components/gcm_driver/gcm_client_impl.cc
@@ -474,7 +474,7 @@
void GCMClientImpl::SetLastTokenFetchTime(const base::Time& time) {
gcm_store_->SetLastTokenFetchTime(
time,
- base::Bind(&GCMClientImpl::IgnoreWriteResultCallback,
+ base::Bind(&GCMClientImpl::DefaultStoreCallback,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -597,11 +597,6 @@
DCHECK(success);
}
-void GCMClientImpl::IgnoreWriteResultCallback(bool success) {
- // TODO(fgorski): Ignoring the write result for now to make sure
- // sync_intergration_tests are not broken.
-}
-
void GCMClientImpl::Stop() {
DVLOG(1) << "Stopping the GCM Client";
weak_ptr_factory_.InvalidateWeakPtrs();
diff --git a/components/gcm_driver/gcm_client_impl.h b/components/gcm_driver/gcm_client_impl.h
index c27bb7b..b6a1ab5 100644
--- a/components/gcm_driver/gcm_client_impl.h
+++ b/components/gcm_driver/gcm_client_impl.h
@@ -230,9 +230,6 @@
// |gcm_store_| fails.
void DefaultStoreCallback(bool success);
- // Callback for store operation where result does not matter.
- void IgnoreWriteResultCallback(bool success);
-
// Completes the registration request.
void OnRegisterCompleted(const std::string& app_id,
const std::vector<std::string>& sender_ids,
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc
index 352007a..6902efb 100644
--- a/components/gcm_driver/gcm_driver_desktop.cc
+++ b/components/gcm_driver/gcm_driver_desktop.cc
@@ -363,10 +363,6 @@
gcm_enabled_(true),
connected_(false),
account_mapper_(new GCMAccountMapper(this)),
- // Setting to max, to make sure it does not prompt for token reporting
- // Before reading a reasonable value from the DB, which might be never,
- // in which case the fetching will be triggered.
- last_token_fetch_time_(base::Time::Max()),
ui_thread_(ui_thread),
io_thread_(io_thread),
weak_ptr_factory_(this) {
@@ -776,10 +772,9 @@
const base::Time& last_token_fetch_time) {
DCHECK(ui_thread_->RunsTasksOnCurrentThread());
- last_token_fetch_time_ = last_token_fetch_time;
-
GCMDriver::AddAppHandler(kGCMAccountMapperAppId, account_mapper_.get());
account_mapper_->Initialize(account_mappings);
+ last_token_fetch_time_ = last_token_fetch_time;
delayed_task_controller_->SetReady();
}
diff --git a/components/ownership/owner_settings_service.h b/components/ownership/owner_settings_service.h
index a1d7c52..9be4a0a 100644
--- a/components/ownership/owner_settings_service.h
+++ b/components/ownership/owner_settings_service.h
@@ -41,8 +41,8 @@
// policy storage..
virtual void OnSignedPolicyStored(bool success) {}
- // Called when tentative changes were made to policy, but the policy still
- // not signed and stored.
+ // Called when tentative changes were made to policy, but the
+ // policy is not signed and stored yet.
//
// TODO (ygorshenin@, crbug.com/230018): get rid of the method
// since it creates DeviceSettingsService's dependency on
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
index e1cf8a2..f2ab2e4 100644
--- a/components/password_manager/core/browser/login_database.cc
+++ b/components/password_manager/core/browser/login_database.cc
@@ -27,7 +27,7 @@
namespace password_manager {
-static const int kCurrentVersionNumber = 8;
+static const int kCurrentVersionNumber = 9;
static const int kCompatibleVersionNumber = 1;
Pickle SerializeVector(const std::vector<base::string16>& vec) {
@@ -91,7 +91,7 @@
s->BindString(COLUMN_SIGNON_REALM, form.signon_realm);
s->BindInt(COLUMN_SSL_VALID, form.ssl_valid);
s->BindInt(COLUMN_PREFERRED, form.preferred);
- s->BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT());
+ s->BindInt64(COLUMN_DATE_CREATED, form.date_created.ToInternalValue());
s->BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user);
s->BindInt(COLUMN_SCHEME, form.scheme);
s->BindInt(COLUMN_PASSWORD_TYPE, form.type);
@@ -257,6 +257,19 @@
// Fall through.
// TODO(gcasto): Remove use_additional_auth by copying table.
// https://www.sqlite.org/lang_altertable.html
+ case 8: {
+ sql::Statement s;
+ s.Assign(db_.GetCachedStatement(SQL_FROM_HERE,
+ "UPDATE logins SET "
+ "date_created = "
+ "(date_created * ?) + ?"));
+ s.BindInt64(0, base::Time::kMicrosecondsPerSecond);
+ s.BindInt64(1, base::Time::kTimeTToMicrosecondsOffset);
+ if (!s.Run())
+ return false;
+ meta_table_.SetVersionNumber(9);
+ // Fall through.
+ }
case kCurrentVersionNumber:
// Already up to date
return true;
@@ -476,7 +489,7 @@
s.BindInt(5, form.times_used);
s.BindString16(6, form.submit_element);
s.BindInt64(7, form.date_synced.ToInternalValue());
- s.BindInt64(8, form.date_created.ToTimeT());
+ s.BindInt64(8, form.date_created.ToInternalValue());
s.BindInt(9, form.blacklisted_by_user);
s.BindInt(10, form.scheme);
s.BindInt(11, form.type);
@@ -527,9 +540,9 @@
sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
"DELETE FROM logins WHERE "
"date_created >= ? AND date_created < ?"));
- s.BindInt64(0, delete_begin.ToTimeT());
+ s.BindInt64(0, delete_begin.ToInternalValue());
s.BindInt64(1, delete_end.is_null() ? std::numeric_limits<int64>::max()
- : delete_end.ToTimeT());
+ : delete_end.ToInternalValue());
return s.Run();
}
@@ -571,8 +584,8 @@
form->signon_realm = tmp;
form->ssl_valid = (s.ColumnInt(COLUMN_SSL_VALID) > 0);
form->preferred = (s.ColumnInt(COLUMN_PREFERRED) > 0);
- form->date_created = base::Time::FromTimeT(
- s.ColumnInt64(COLUMN_DATE_CREATED));
+ form->date_created =
+ base::Time::FromInternalValue(s.ColumnInt64(COLUMN_DATE_CREATED));
form->blacklisted_by_user = (s.ColumnInt(COLUMN_BLACKLISTED_BY_USER) > 0);
int scheme_int = s.ColumnInt(COLUMN_SCHEME);
DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER));
@@ -711,9 +724,9 @@
"federation_url, is_zero_click FROM logins "
"WHERE date_created >= ? AND date_created < ?"
"ORDER BY origin_url"));
- s.BindInt64(0, begin.ToTimeT());
+ s.BindInt64(0, begin.ToInternalValue());
s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max()
- : end.ToTimeT());
+ : end.ToInternalValue());
while (s.Step()) {
scoped_ptr<PasswordForm> new_form(new PasswordForm());
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index d738ab4..4faaa8c 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -8,11 +8,15 @@
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/scoped_vector.h"
+#include "base/path_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/browser/psl_matching_helper.h"
+#include "sql/connection.h"
+#include "sql/statement.h"
+#include "sql/test/test_helpers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -927,8 +931,6 @@
form.submit_element = ASCIIToUTF16("submit_element");
form.date_synced = base::Time::Now();
form.date_created = base::Time::Now() - base::TimeDelta::FromDays(1);
- // Remove this line after crbug/374132 is fixed.
- form.date_created = base::Time::FromTimeT(form.date_created.ToTimeT());
form.blacklisted_by_user = true;
form.scheme = PasswordForm::SCHEME_BASIC;
form.type = PasswordForm::TYPE_GENERATED;
@@ -962,4 +964,82 @@
}
#endif // defined(OS_POSIX)
+class LoginDatabaseMigrationTest : public testing::Test {
+ protected:
+ void SetUp() override {
+ PathService::Get(base::DIR_SOURCE_ROOT, &database_dump_);
+ database_dump_ = database_dump_.AppendASCII("components")
+ .AppendASCII("test")
+ .AppendASCII("data")
+ .AppendASCII("password_manager")
+ .AppendASCII("login_db_v8.sql");
+
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ database_path_ = temp_dir_.path().AppendASCII("test.db");
+ ASSERT_TRUE(
+ sql::test::CreateDatabaseFromSQL(database_path_, database_dump_));
+ }
+
+ void TearDown() override {
+ if (!database_path_.empty())
+ base::DeleteFile(database_path_, false);
+ }
+
+ // Returns an empty vector on failure. Otherwise returns the values of the
+ // date_created field from the logins table. The order of the returned rows
+ // is well-defined.
+ std::vector<int64_t> GetDateCreated(const base::FilePath& db_path) {
+ sql::Connection db;
+ std::vector<int64_t> results;
+ if (!db.Open(db_path))
+ return results;
+
+ sql::Statement s(db.GetCachedStatement(
+ SQL_FROM_HERE,
+ "SELECT date_created from logins order by username_value"));
+ if (!s.is_valid()) {
+ db.Close();
+ return results;
+ }
+
+ while (s.Step())
+ results.push_back(s.ColumnInt64(0));
+
+ s.Clear();
+ db.Close();
+ return results;
+ }
+
+ base::FilePath database_path_;
+
+ private:
+ base::FilePath database_dump_;
+ base::ScopedTempDir temp_dir_;
+};
+
+// Tests the migration of the login database from version 8 to version 9.
+TEST_F(LoginDatabaseMigrationTest, MigrationV8ToV9) {
+ // Original date, in seconds since UTC epoch.
+ std::vector<int64_t> date_created(GetDateCreated(database_path_));
+ ASSERT_EQ(1402955745, date_created[0]);
+ ASSERT_EQ(1402950000, date_created[1]);
+
+ // Assert that the database was successfully opened and migrated.
+ {
+ LoginDatabase db;
+ ASSERT_TRUE(db.Init(database_path_));
+ }
+
+ // New date, in microseconds since platform independent epoch.
+ std::vector<int64_t> new_date_created(GetDateCreated(database_path_));
+ ASSERT_EQ(13047429345000000, new_date_created[0]);
+ ASSERT_EQ(13047423600000000, new_date_created[1]);
+
+ // Check that the two dates match up.
+ for (size_t i = 0; i < date_created.size(); ++i) {
+ EXPECT_EQ(base::Time::FromInternalValue(new_date_created[i]),
+ base::Time::FromTimeT(date_created[i]));
+ }
+}
+
} // namespace password_manager
diff --git a/components/rappor/rappor_service.cc b/components/rappor/rappor_service.cc
index de814c4..e6879d2 100644
--- a/components/rappor/rappor_service.cc
+++ b/components/rappor/rappor_service.cc
@@ -108,7 +108,7 @@
return;
DVLOG(1) << "RapporService started. Reporting to " << server_url.spec();
DCHECK(!uploader_);
- Initialize(LoadCohort(), LoadSecret(), reporting_level_);
+ Initialize(LoadCohort(), LoadSecret(), reporting_level);
uploader_.reset(new LogUploader(server_url, kMimeType, request_context));
log_rotation_timer_.Start(
FROM_HERE,
@@ -192,8 +192,10 @@
}
bool RapporService::ExportMetrics(RapporReports* reports) {
- if (metrics_map_.empty())
+ if (metrics_map_.empty()) {
+ DVLOG(2) << "metrics_map_ is empty.";
return false;
+ }
DCHECK_GE(cohort_, 0);
reports->set_cohort(cohort_);
@@ -236,8 +238,11 @@
DCHECK(IsInitialized());
// Skip this metric if it's reporting level is less than the enabled
// reporting level.
- if (reporting_level_ < parameters.reporting_level)
+ if (reporting_level_ < parameters.reporting_level) {
+ DVLOG(2) << "Metric not logged due to reporting_level "
+ << reporting_level_ << " < " << parameters.reporting_level;
return;
+ }
RapporMetric* metric = LookUpMetric(metric_name, parameters);
metric->AddSample(sample);
}
diff --git a/components/test/data/password_manager/login_db_v8.sql b/components/test/data/password_manager/login_db_v8.sql
new file mode 100644
index 0000000..57b4db6
--- /dev/null
+++ b/components/test/data/password_manager/login_db_v8.sql
@@ -0,0 +1,11 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
+INSERT INTO "meta" VALUES('last_compatible_version','1');
+INSERT INTO "meta" VALUES('version','8');
+CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR, username_element VARCHAR, username_value VARCHAR, password_element VARCHAR, password_value BLOB, submit_element VARCHAR, signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,password_type INTEGER,possible_usernames BLOB,times_used INTEGER,form_data BLOB,use_additional_auth INTEGER,date_synced INTEGER, display_name VARCHAR, avatar_url VARCHAR, federation_url VARCHAR, is_zero_click INTEGER,UNIQUE (origin_url, username_element, username_value, password_element, submit_element, signon_realm));
+INSERT INTO "logins" VALUES('https://accounts.google.com/ServiceLogin','https://accounts.google.com/ServiceLoginAuth','Email','theerikchen','Passwd',X'','','https://accounts.google.com/',1,1,1402955745,0,0,0,X'00000000',1,X'18000000020000000000000000000000000000000000000000000000',NULL,0,'','','',0);
+INSERT INTO "logins" VALUES('https://accounts.google.com/ServiceLogin','https://accounts.google.com/ServiceLoginAuth','Email','theerikchen2','Passwd',X'','','https://accounts.google.com/',1,1,1402950000,0,0,0,X'00000000',1,X'18000000020000000000000000000000000000000000000000000000',NULL,0,'','','',0);
+CREATE INDEX logins_signon ON logins (signon_realm);
+COMMIT;
+
diff --git a/content/app/resources/content_resources.grd b/content/app/resources/content_resources.grd
index 0c189f3..9c4373b 100644
--- a/content/app/resources/content_resources.grd
+++ b/content/app/resources/content_resources.grd
@@ -47,6 +47,7 @@
<structure type="chrome_scaled_image" name="IDR_MEDIAPLAYER_FULLSCREEN_BUTTON_DISABLED" file="mediaplayer_fullscreen_disabled.png" />
<structure type="chrome_scaled_image" name="IDR_MEDIAPLAYER_CAST_BUTTON_OFF" file="mediaplayer_cast_off.png" />
<structure type="chrome_scaled_image" name="IDR_MEDIAPLAYER_CAST_BUTTON_ON" file="mediaplayer_cast_on.png" />
+ <structure type="chrome_scaled_image" name="IDR_MEDIAPLAYER_OVERLAY_CAST_BUTTON_OFF" file="mediaplayer_overlay_cast_off.png" />
<structure type="chrome_scaled_image" name="IDR_MEDIAPLAYER_OVERLAY_PLAY_BUTTON" file="mediaplayer_overlay_play.png" />
<if expr="is_macosx">
<structure type="chrome_scaled_image" name="IDR_OVERHANG_PATTERN" file="overhang_pattern.png" />
diff --git a/content/app/resources/content_resources.target.darwin-arm.mk b/content/app/resources/content_resources.target.darwin-arm.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-arm.mk
+++ b/content/app/resources/content_resources.target.darwin-arm.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.darwin-arm64.mk b/content/app/resources/content_resources.target.darwin-arm64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-arm64.mk
+++ b/content/app/resources/content_resources.target.darwin-arm64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.darwin-mips.mk b/content/app/resources/content_resources.target.darwin-mips.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-mips.mk
+++ b/content/app/resources/content_resources.target.darwin-mips.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.darwin-mips64.mk b/content/app/resources/content_resources.target.darwin-mips64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-mips64.mk
+++ b/content/app/resources/content_resources.target.darwin-mips64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.darwin-x86.mk b/content/app/resources/content_resources.target.darwin-x86.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-x86.mk
+++ b/content/app/resources/content_resources.target.darwin-x86.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.darwin-x86_64.mk b/content/app/resources/content_resources.target.darwin-x86_64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.darwin-x86_64.mk
+++ b/content/app/resources/content_resources.target.darwin-x86_64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-arm.mk b/content/app/resources/content_resources.target.linux-arm.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-arm.mk
+++ b/content/app/resources/content_resources.target.linux-arm.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-arm64.mk b/content/app/resources/content_resources.target.linux-arm64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-arm64.mk
+++ b/content/app/resources/content_resources.target.linux-arm64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-mips.mk b/content/app/resources/content_resources.target.linux-mips.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-mips.mk
+++ b/content/app/resources/content_resources.target.linux-mips.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-mips64.mk b/content/app/resources/content_resources.target.linux-mips64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-mips64.mk
+++ b/content/app/resources/content_resources.target.linux-mips64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-x86.mk b/content/app/resources/content_resources.target.linux-x86.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-x86.mk
+++ b/content/app/resources/content_resources.target.linux-x86.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/content_resources.target.linux-x86_64.mk b/content/app/resources/content_resources.target.linux-x86_64.mk
index 07859bd..68634ed 100644
--- a/content/app/resources/content_resources.target.linux-x86_64.mk
+++ b/content/app/resources/content_resources.target.linux-x86_64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/content/app/resources/grit/content_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/content/app/resources/content_resources.grd $(LOCAL_PATH)/content/app/resources/default_100_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_cast_on.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_closedcaption_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_fullscreen_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_overlay_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_pause_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_play_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level0_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level1_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level2_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_sound_level3_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_disabled.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_down.png $(LOCAL_PATH)/content/app/resources/default_100_percent/mediaplayer_volume_slider_thumb_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation.png $(LOCAL_PATH)/content/app/resources/default_100_percent/password_generation_hover.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_cancel_pressed.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier.png $(LOCAL_PATH)/content/app/resources/default_100_percent/search_magnifier_results.png $(LOCAL_PATH)/content/app/resources/default_100_percent/textarea_resize_corner.png $(LOCAL_PATH)/content/app/resources/default_200_percent/broken_image.png $(LOCAL_PATH)/content/app/resources/default_200_percent/pan_icon.png $(LOCAL_PATH)/content/app/resources/default_200_percent/textarea_resize_corner.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from content_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/content/app/resources; mkdir -p $(gyp_shared_intermediate_dir)/content/app/resources/grit $(gyp_shared_intermediate_dir)/content/app/resources; python ../../../tools/grit/grit.py -i content_resources.grd build -f ../../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/content/app/resources/" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/content/app/resources/default_100_percent/mediaplayer_cast_off.png b/content/app/resources/default_100_percent/mediaplayer_cast_off.png
index e16f58e..050022d 100644
--- a/content/app/resources/default_100_percent/mediaplayer_cast_off.png
+++ b/content/app/resources/default_100_percent/mediaplayer_cast_off.png
Binary files differ
diff --git a/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png b/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png
new file mode 100644
index 0000000..e16f58e
--- /dev/null
+++ b/content/app/resources/default_100_percent/mediaplayer_overlay_cast_off.png
Binary files differ
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index 45c5026..7dbc149 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -261,10 +261,13 @@
Java_BrowserAccessibilityManager_setAccessibilityNodeInfoClassName(
env, obj, info,
base::android::ConvertUTF8ToJavaString(env, node->GetClassName()).obj());
- Java_BrowserAccessibilityManager_setAccessibilityNodeInfoContentDescription(
- env, obj, info,
- base::android::ConvertUTF16ToJavaString(env, node->GetText()).obj(),
- node->IsLink());
+ if (!node->IsPassword() ||
+ Java_BrowserAccessibilityManager_shouldExposePasswordText(env, obj)) {
+ Java_BrowserAccessibilityManager_setAccessibilityNodeInfoContentDescription(
+ env, obj, info,
+ base::android::ConvertUTF16ToJavaString(env, node->GetText()).obj(),
+ node->IsLink());
+ }
gfx::Rect absolute_rect = node->GetLocalBoundsRect();
gfx::Rect parent_relative_rect = absolute_rect;
@@ -346,24 +349,37 @@
node->GetMaxScrollY());
switch (event_type) {
- case ANDROID_ACCESSIBILITY_EVENT_TEXT_CHANGED:
+ case ANDROID_ACCESSIBILITY_EVENT_TEXT_CHANGED: {
+ base::string16 before_text, text;
+ if (!node->IsPassword() ||
+ Java_BrowserAccessibilityManager_shouldExposePasswordText(env, obj)) {
+ before_text = node->GetTextChangeBeforeText();
+ text = node->GetText();
+ }
Java_BrowserAccessibilityManager_setAccessibilityEventTextChangedAttrs(
env, obj, event,
node->GetTextChangeFromIndex(),
node->GetTextChangeAddedCount(),
node->GetTextChangeRemovedCount(),
base::android::ConvertUTF16ToJavaString(
- env, node->GetTextChangeBeforeText()).obj(),
- base::android::ConvertUTF16ToJavaString(env, node->GetText()).obj());
+ env, before_text).obj(),
+ base::android::ConvertUTF16ToJavaString(env, text).obj());
break;
- case ANDROID_ACCESSIBILITY_EVENT_TEXT_SELECTION_CHANGED:
+ }
+ case ANDROID_ACCESSIBILITY_EVENT_TEXT_SELECTION_CHANGED: {
+ base::string16 text;
+ if (!node->IsPassword() ||
+ Java_BrowserAccessibilityManager_shouldExposePasswordText(env, obj)) {
+ text = node->GetText();
+ }
Java_BrowserAccessibilityManager_setAccessibilityEventSelectionAttrs(
env, obj, event,
node->GetSelectionStart(),
node->GetSelectionEnd(),
node->GetEditableTextLength(),
- base::android::ConvertUTF16ToJavaString(env, node->GetText()).obj());
+ base::android::ConvertUTF16ToJavaString(env, text).obj());
break;
+ }
default:
break;
}
@@ -541,9 +557,14 @@
int end_index = -1;
if (NextAtGranularity(granularity, cursor_index, node,
&start_index, &end_index)) {
+ base::string16 text;
+ if (!node->IsPassword() ||
+ Java_BrowserAccessibilityManager_shouldExposePasswordText(env, obj)) {
+ text = node->GetText();
+ }
Java_BrowserAccessibilityManager_finishGranularityMove(
env, obj, base::android::ConvertUTF16ToJavaString(
- env, node->GetText()).obj(),
+ env, text).obj(),
extend_selection, start_index, end_index, true);
return true;
}
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc
index 9aa69cd..12117bf 100644
--- a/content/browser/android/content_view_core_impl.cc
+++ b/content/browser/android/content_view_core_impl.cc
@@ -1086,15 +1086,23 @@
void ContentViewCoreImpl::MoveCaret(JNIEnv* env, jobject obj,
jfloat x, jfloat y) {
- if (GetRenderWidgetHostViewAndroid()) {
- GetRenderWidgetHostViewAndroid()->MoveCaret(
- gfx::Point(x / dpi_scale_, y / dpi_scale_));
- }
+ RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
+ if (rwhv)
+ rwhv->MoveCaret(gfx::Point(x / dpi_scale_, y / dpi_scale_));
}
-void ContentViewCoreImpl::HideTextHandles(JNIEnv* env, jobject obj) {
- if (GetRenderWidgetHostViewAndroid())
- GetRenderWidgetHostViewAndroid()->HideTextHandles();
+void ContentViewCoreImpl::DismissTextHandles(JNIEnv* env, jobject obj) {
+ RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
+ if (rwhv)
+ rwhv->DismissTextHandles();
+}
+
+void ContentViewCoreImpl::SetTextHandlesTemporarilyHidden(JNIEnv* env,
+ jobject obj,
+ jboolean hidden) {
+ RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
+ if (rwhv)
+ rwhv->SetTextHandlesTemporarilyHidden(hidden);
}
void ContentViewCoreImpl::ResetGestureDetection(JNIEnv* env, jobject obj) {
diff --git a/content/browser/android/content_view_core_impl.h b/content/browser/android/content_view_core_impl.h
index 6e90696..8a823ee 100644
--- a/content/browser/android/content_view_core_impl.h
+++ b/content/browser/android/content_view_core_impl.h
@@ -143,7 +143,10 @@
jfloat x1, jfloat y1,
jfloat x2, jfloat y2);
void MoveCaret(JNIEnv* env, jobject obj, jfloat x, jfloat y);
- void HideTextHandles(JNIEnv* env, jobject obj);
+ void DismissTextHandles(JNIEnv* env, jobject obj);
+ void SetTextHandlesTemporarilyHidden(JNIEnv* env,
+ jobject obj,
+ jboolean hidden);
void ResetGestureDetection(JNIEnv* env, jobject obj);
void SetDoubleTapSupportEnabled(JNIEnv* env, jobject obj, jboolean enabled);
diff --git a/content/browser/android/popup_touch_handle_drawable.cc b/content/browser/android/popup_touch_handle_drawable.cc
index ac2f57b..8a7cf84 100644
--- a/content/browser/android/popup_touch_handle_drawable.cc
+++ b/content/browser/android/popup_touch_handle_drawable.cc
@@ -16,6 +16,9 @@
}
PopupTouchHandleDrawable::~PopupTouchHandleDrawable() {
+ // Explicitly disabling ensures that any external references to the Java
+ // object are cleared, allowing it to be GC'ed in a timely fashion.
+ SetEnabled(false);
}
void PopupTouchHandleDrawable::SetEnabled(bool enabled) {
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index f66fad6..a589114 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1035,10 +1035,9 @@
}
void RenderFrameHostImpl::OnCancelDesktopNotification(int notification_id) {
- if (!cancel_notification_callbacks_.count(notification_id)) {
- NOTREACHED();
+ if (!cancel_notification_callbacks_.count(notification_id))
return;
- }
+
cancel_notification_callbacks_[notification_id].Run();
cancel_notification_callbacks_.erase(notification_id);
}
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index 176e80e..49b6638 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -200,7 +200,7 @@
KEY_NOTIFY) == ERROR_SUCCESS) {
base::win::RegKey::ChangeCallback callback =
base::Bind(&PluginServiceImpl::OnKeyChanged, base::Unretained(this),
- base::Unretained(&hkcu_key_));
+ base::Unretained(&hklm_key_));
hklm_key_.StartWatching(callback);
}
#endif
@@ -630,7 +630,7 @@
void PluginServiceImpl::OnKeyChanged(base::win::RegKey* key) {
key->StartWatching(base::Bind(&PluginServiceImpl::OnKeyChanged,
base::Unretained(this),
- base::Unretained(&hkcu_key_)));
+ base::Unretained(key)));
PluginList::Singleton()->RefreshPlugins();
PurgePluginListCache(NULL, false);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 3a2dc88..e8a4f55 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -477,8 +477,6 @@
host_->SetInputMethodActive(true);
if (overscroll_effect_)
overscroll_effect_->Enable();
- if (selection_controller_)
- selection_controller_->SetTemporarilyHidden(false);
}
void RenderWidgetHostViewAndroid::Blur() {
@@ -486,8 +484,6 @@
host_->Blur();
if (overscroll_effect_)
overscroll_effect_->Disable();
- if (selection_controller_)
- selection_controller_->SetTemporarilyHidden(true);
}
bool RenderWidgetHostViewAndroid::HasFocus() const {
@@ -1517,11 +1513,16 @@
host_->MoveCaret(point);
}
-void RenderWidgetHostViewAndroid::HideTextHandles() {
+void RenderWidgetHostViewAndroid::DismissTextHandles() {
if (selection_controller_)
selection_controller_->HideAndDisallowShowingAutomatically();
}
+void RenderWidgetHostViewAndroid::SetTextHandlesTemporarilyHidden(bool hidden) {
+ if (selection_controller_)
+ selection_controller_->SetTemporarilyHidden(hidden);
+}
+
void RenderWidgetHostViewAndroid::OnShowingPastePopup(
const gfx::PointF& point) {
if (!selection_controller_)
@@ -1536,7 +1537,7 @@
insertion_bound.visible = true;
insertion_bound.edge_top = point;
insertion_bound.edge_bottom = point;
- HideTextHandles();
+ DismissTextHandles();
ShowSelectionHandlesAutomatically();
selection_controller_->OnSelectionEditable(true);
selection_controller_->OnSelectionEmpty(true);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 063a515..129b773 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -250,7 +250,8 @@
bool HasValidFrame() const;
void MoveCaret(const gfx::Point& point);
- void HideTextHandles();
+ void DismissTextHandles();
+ void SetTextHandlesTemporarilyHidden(bool hidden);
void OnShowingPastePopup(const gfx::PointF& point);
void SynchronousFrameMetadata(
diff --git a/content/browser/service_worker/service_worker_cache_listener.cc b/content/browser/service_worker/service_worker_cache_listener.cc
index 911517a..e52c940 100644
--- a/content/browser/service_worker/service_worker_cache_listener.cc
+++ b/content/browser/service_worker/service_worker_cache_listener.cc
@@ -417,7 +417,8 @@
return;
}
- StoreBlobDataHandle(blob_data_handle.Pass());
+ if (blob_data_handle)
+ StoreBlobDataHandle(blob_data_handle.Pass());
std::vector<ServiceWorkerResponse> responses;
responses.push_back(*response);
@@ -438,6 +439,7 @@
void ServiceWorkerCacheListener::StoreBlobDataHandle(
scoped_ptr<storage::BlobDataHandle> blob_data_handle) {
+ DCHECK(blob_data_handle);
std::pair<UUIDToBlobDataHandleList::iterator, bool> rv =
blob_handle_store_.insert(std::make_pair(
blob_data_handle->uuid(), std::list<storage::BlobDataHandle>()));
diff --git a/content/browser/ssl/ssl_policy.cc b/content/browser/ssl/ssl_policy.cc
index 610f741..51ae7b2 100644
--- a/content/browser/ssl/ssl_policy.cc
+++ b/content/browser/ssl/ssl_policy.cc
@@ -56,7 +56,6 @@
case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
case net::ERR_CERT_WEAK_KEY:
case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION:
- case net::ERR_CERT_VALIDITY_TOO_LONG:
if (!handler->fatal())
options_mask |= OVERRIDABLE;
else
diff --git a/content/browser/web_contents/web_contents_view_mac.mm b/content/browser/web_contents/web_contents_view_mac.mm
index 20c97b8..3c99ac3 100644
--- a/content/browser/web_contents/web_contents_view_mac.mm
+++ b/content/browser/web_contents/web_contents_view_mac.mm
@@ -605,6 +605,12 @@
// Occlusion notification APIs are new in Mavericks.
bool supportsOcclusionAPIs = base::mac::IsOSMavericksOrLater();
+ // Use of occlusion APIs is causing bugs:
+ // http://crbug.com/430968: focus set incorrectly.
+ // http://crbug.com/431272: flashes of incorrect content.
+ // http://crbug.com/310374: white flashes (comment 22).
+ supportsOcclusionAPIs = false;
+
if (supportsOcclusionAPIs) {
if (oldWindow) {
[notificationCenter
diff --git a/content/child/blink_platform_impl.cc b/content/child/blink_platform_impl.cc
index 79f72ad..144a983 100644
--- a/content/child/blink_platform_impl.cc
+++ b/content/child/blink_platform_impl.cc
@@ -786,6 +786,8 @@
IDR_MEDIAPLAYER_CAST_BUTTON_ON, ui::SCALE_FACTOR_100P },
{ "mediaplayerFullscreenDisabled",
IDR_MEDIAPLAYER_FULLSCREEN_BUTTON_DISABLED, ui::SCALE_FACTOR_100P },
+ { "mediaplayerOverlayCastOff",
+ IDR_MEDIAPLAYER_OVERLAY_CAST_BUTTON_OFF, ui::SCALE_FACTOR_100P },
{ "mediaplayerOverlayPlay",
IDR_MEDIAPLAYER_OVERLAY_PLAY_BUTTON, ui::SCALE_FACTOR_100P },
#if defined(OS_MACOSX)
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 1651927..891e22b 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -114,6 +114,9 @@
if (!command_line.HasSwitch(switches::kEnableSpeechRecognition))
WebRuntimeFeatures::enableScriptedSpeech(false);
+ if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
+ WebRuntimeFeatures::enableNotifications(true);
+
// WebAudio is enabled by default on ARM and X86, if the MediaCodec
// API is available.
WebRuntimeFeatures::enableWebAudio(
diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc
index 7249d16..b51d799 100644
--- a/content/child/web_url_loader_impl.cc
+++ b/content/child/web_url_loader_impl.cc
@@ -551,6 +551,9 @@
new_request.setDownloadToFile(request_.downloadToFile());
new_request.setRequestContext(request_.requestContext());
new_request.setFrameType(request_.frameType());
+ new_request.setSkipServiceWorker(request_.skipServiceWorker());
+ new_request.setFetchRequestMode(request_.fetchRequestMode());
+ new_request.setFetchCredentialsMode(request_.fetchCredentialsMode());
new_request.setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer),
referrer_policy_);
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator.cc b/content/common/gpu/media/dxva_video_decode_accelerator.cc
index c5cc291..530358e 100644
--- a/content/common/gpu/media/dxva_video_decode_accelerator.cc
+++ b/content/common/gpu/media/dxva_video_decode_accelerator.cc
@@ -323,7 +323,7 @@
glBindTexture(GL_TEXTURE_2D, picture_buffer_.texture_id());
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
base::win::ScopedComPtr<IDirect3DSurface9> d3d_surface;
hr = decoding_texture_->GetSurfaceLevel(0, d3d_surface.Receive());
@@ -362,7 +362,7 @@
egl_display,
decoding_surface_,
EGL_BACK_BUFFER);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, current_texture);
return true;
}
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index d48ac71..ceb8a35 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -854,21 +854,6 @@
'../third_party/webrtc/modules/modules.gyp:desktop_capture',
],
}],
- ['enable_webrtc==1 and OS=="mac"', {
- 'variables': {
- 'libpeer_target_type%': 'static_library',
- },
- 'conditions': [
- ['libpeer_target_type!="static_library"', {
- 'copies': [{
- 'destination': '<(PRODUCT_DIR)/Libraries',
- 'files': [
- '<(PRODUCT_DIR)/libpeerconnection.so',
- ],
- }],
- }],
- ],
- }],
['enable_webrtc==1 and chromeos==1', {
'sources': [
'browser/media/capture/desktop_capture_device_aura_unittest.cc',
diff --git a/content/content_unittests.isolate b/content/content_unittests.isolate
index 72d8d3d..bc982e2 100644
--- a/content/content_unittests.isolate
+++ b/content/content_unittests.isolate
@@ -58,13 +58,6 @@
],
},
}],
- ['OS=="linux" and libpeer_target_type=="loadable_module"', {
- 'variables': {
- 'files': [
- '<(PRODUCT_DIR)/lib/libpeerconnection.so',
- ],
- },
- }],
['OS=="mac"', {
'variables': {
'command': [
@@ -104,13 +97,6 @@
],
},
}],
- ['OS=="win" and libpeer_target_type=="loadable_module"', {
- 'variables': {
- 'files': [
- '<(PRODUCT_DIR)/libpeerconnection.dll',
- ],
- },
- }],
],
'includes': [
'../base/base.isolate',
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index 7d34565..effba1e 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -618,7 +618,7 @@
public void onImeEvent() {
mPopupZoomer.hide(true);
getContentViewClient().onImeEvent();
- if (mFocusedNodeEditable) hideTextHandles();
+ if (mFocusedNodeEditable) dismissTextHandles();
}
@Override
@@ -1319,6 +1319,10 @@
private void hidePopupsAndClearSelection() {
mUnselectAllOnActionModeDismiss = true;
hidePopups();
+ // Clear the selection. The selection is cleared on destroying IME
+ // and also here since we may receive destroy first, for example
+ // when focus is lost in webview.
+ clearUserSelection();
}
private void hidePopupsAndPreserveSelection() {
@@ -1326,12 +1330,23 @@
hidePopups();
}
+ private void clearUserSelection() {
+ if (isSelectionEditable()) {
+ if (mInputConnection != null) {
+ int selectionEnd = Selection.getSelectionEnd(mEditable);
+ mInputConnection.setSelection(selectionEnd, selectionEnd);
+ }
+ } else if (mImeAdapter != null) {
+ mImeAdapter.unselect();
+ }
+ }
+
private void hidePopups() {
hideSelectActionBar();
hidePastePopup();
hideSelectPopup();
mPopupZoomer.hide(false);
- if (mUnselectAllOnActionModeDismiss) hideTextHandles();
+ if (mUnselectAllOnActionModeDismiss) dismissTextHandles();
}
private void restoreSelectionPopupsIfNecessary() {
@@ -1360,6 +1375,7 @@
@SuppressWarnings("javadoc")
public void onAttachedToWindow() {
setAccessibilityState(mAccessibilityManager.isEnabled());
+ setTextHandlesTemporarilyHidden(false);
restoreSelectionPopupsIfNecessary();
ScreenOrientationListener.getInstance().addObserver(this, mContext);
GamepadList.onAttachedToWindow(mContext);
@@ -1372,12 +1388,19 @@
@SuppressLint("MissingSuperCall")
public void onDetachedFromWindow() {
setInjectedAccessibility(false);
- hidePopupsAndPreserveSelection();
mZoomControlsDelegate.dismissZoomPicker();
unregisterAccessibilityContentObserver();
ScreenOrientationListener.getInstance().removeObserver(this);
GamepadList.onDetachedFromWindow();
+
+ // WebView uses PopupWindows for handle rendering, which may remain
+ // unintentionally visible even after the WebView has been detached.
+ // Override the handle visibility explicitly to address this, but
+ // preserve the underlying selection for detachment cases like screen
+ // locking and app switching.
+ setTextHandlesTemporarilyHidden(true);
+ hidePopupsAndPreserveSelection();
}
/**
@@ -1930,13 +1953,8 @@
public void onDestroyActionMode() {
mActionMode = null;
if (mUnselectAllOnActionModeDismiss) {
- hideTextHandles();
- if (isSelectionEditable()) {
- int selectionEnd = Selection.getSelectionEnd(mEditable);
- mInputConnection.setSelection(selectionEnd, selectionEnd);
- } else {
- mImeAdapter.unselect();
- }
+ dismissTextHandles();
+ clearUserSelection();
}
getContentViewClient().onContextualActionBarHidden();
}
@@ -2074,10 +2092,15 @@
getContentViewClient().onSelectionEvent(eventType, posXDip * scale, posYDip * scale);
}
- private void hideTextHandles() {
+ private void dismissTextHandles() {
mHasSelection = false;
mHasInsertion = false;
- if (mNativeContentViewCore != 0) nativeHideTextHandles(mNativeContentViewCore);
+ if (mNativeContentViewCore != 0) nativeDismissTextHandles(mNativeContentViewCore);
+ }
+
+ private void setTextHandlesTemporarilyHidden(boolean hide) {
+ if (mNativeContentViewCore == 0) return;
+ nativeSetTextHandlesTemporarilyHidden(mNativeContentViewCore, hide);
}
/**
@@ -2327,7 +2350,7 @@
@Override
public void paste() {
mImeAdapter.paste();
- hideTextHandles();
+ dismissTextHandles();
}
});
}
@@ -3001,7 +3024,9 @@
private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x, float y);
- private native void nativeHideTextHandles(long nativeContentViewCoreImpl);
+ private native void nativeDismissTextHandles(long nativeContentViewCoreImpl);
+ private native void nativeSetTextHandlesTemporarilyHidden(
+ long nativeContentViewCoreImpl, boolean hidden);
private native void nativeResetGestureDetection(long nativeContentViewCoreImpl);
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
index 81cf595..f349a0a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
@@ -8,6 +8,7 @@
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
+import android.provider.Settings;
import android.text.SpannableString;
import android.text.style.URLSpan;
import android.view.MotionEvent;
@@ -821,9 +822,9 @@
@CalledByNative
private void setAccessibilityEventSelectionAttrs(AccessibilityEvent event,
- int fromIndex, int addedCount, int itemCount, String text) {
+ int fromIndex, int toIndex, int itemCount, String text) {
event.setFromIndex(fromIndex);
- event.setAddedCount(addedCount);
+ event.setToIndex(toIndex);
event.setItemCount(itemCount);
event.getText().add(text);
}
@@ -886,6 +887,13 @@
bundle.putFloat("AccessibilityNodeInfo.RangeInfo.current", current);
}
+ @CalledByNative
+ boolean shouldExposePasswordText() {
+ return (Settings.Secure.getInt(
+ mContentViewCore.getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0) == 1);
+ }
+
private native int nativeGetRootId(long nativeBrowserAccessibilityManagerAndroid);
private native boolean nativeIsNodeValid(long nativeBrowserAccessibilityManagerAndroid, int id);
private native boolean nativeIsEditableText(
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java b/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
index b9542e9..03cc014 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
@@ -224,6 +224,7 @@
}
private void doInvalidate() {
+ if (!mContainer.isShowing()) return;
updatePosition();
updateVisibility();
invalidate();
diff --git a/content/renderer/accessibility/renderer_accessibility.cc b/content/renderer/accessibility/renderer_accessibility.cc
index 707f193..3f580f1 100644
--- a/content/renderer/accessibility/renderer_accessibility.cc
+++ b/content/renderer/accessibility/renderer_accessibility.cc
@@ -47,6 +47,10 @@
// moving by granularities.
settings->setInlineTextBoxAccessibilityEnabled(true);
+#if defined(OS_ANDROID)
+ settings->setAccessibilityPasswordValuesEnabled(true);
+#endif
+
const WebDocument& document = GetMainDocument();
if (!document.isNull()) {
// It's possible that the webview has already loaded a webpage without
diff --git a/content/renderer/media/media_stream_audio_processor.cc b/content/renderer/media/media_stream_audio_processor.cc
index 68d69c7..548e74f 100644
--- a/content/renderer/media/media_stream_audio_processor.cc
+++ b/content/renderer/media/media_stream_audio_processor.cc
@@ -19,7 +19,6 @@
#include "media/base/audio_fifo.h"
#include "media/base/channel_layout.h"
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
-#include "third_party/libjingle/overrides/init_webrtc.h"
#include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface.h"
#include "third_party/webrtc/modules/audio_processing/typing_detection.h"
@@ -455,7 +454,7 @@
#endif
// Create and configure the webrtc::AudioProcessing.
- audio_processing_.reset(CreateWebRtcAudioProcessing(config));
+ audio_processing_.reset(webrtc::AudioProcessing::Create(config));
// Enable the audio processing components.
if (echo_cancellation) {
diff --git a/content/renderer/media/media_stream_audio_processor_options.cc b/content/renderer/media/media_stream_audio_processor_options.cc
index d7e773d..537ef90 100644
--- a/content/renderer/media/media_stream_audio_processor_options.cc
+++ b/content/renderer/media/media_stream_audio_processor_options.cc
@@ -326,10 +326,15 @@
void StartEchoCancellationDump(AudioProcessing* audio_processing,
base::File aec_dump_file) {
DCHECK(aec_dump_file.IsValid());
- if (audio_processing->StartDebugRecordingForPlatformFile(
- aec_dump_file.TakePlatformFile())) {
- DLOG(ERROR) << "Fail to start AEC debug recording";
+
+ FILE* stream = base::FileToFILE(aec_dump_file.Pass(), "w");
+ if (!stream) {
+ LOG(ERROR) << "Failed to open AEC dump file";
+ return;
}
+
+ if (audio_processing->StartDebugRecording(stream))
+ DLOG(ERROR) << "Fail to start AEC debug recording";
}
void StopEchoCancellationDump(AudioProcessing* audio_processing) {
diff --git a/content/renderer/media/webrtc_audio_capturer.cc b/content/renderer/media/webrtc_audio_capturer.cc
index 3299987..45034e8 100644
--- a/content/renderer/media/webrtc_audio_capturer.cc
+++ b/content/renderer/media/webrtc_audio_capturer.cc
@@ -579,10 +579,13 @@
// Use the native hardware buffer size in non peer connection mode when the
// platform is using a native buffer size smaller than the PeerConnection
- // buffer size.
+ // buffer size and audio processing is off.
int hardware_buffer_size = device_info_.device.input.frames_per_buffer;
if (!peer_connection_mode_ && hardware_buffer_size &&
- hardware_buffer_size <= peer_connection_buffer_size) {
+ hardware_buffer_size <= peer_connection_buffer_size &&
+ !audio_processor_->has_audio_processing()) {
+ DVLOG(1) << "WebRtcAudioCapturer is using hardware buffer size "
+ << hardware_buffer_size;
return hardware_buffer_size;
}
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 4efdbb6..5886cf1 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -12,6 +12,7 @@
#include "base/memory/linked_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h"
+#include "base/metrics/sparse_histogram.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_offset_string_conversions.h"
@@ -186,6 +187,13 @@
namespace {
+static const int kInfiniteRatio = 99999;
+
+#define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \
+ UMA_HISTOGRAM_SPARSE_SLOWLY( \
+ name, \
+ (height) ? ((width) * 100) / (height) : kInfiniteRatio);
+
// Check PP_TextInput_Type and ui::TextInputType are kept in sync.
COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NONE) == int(PP_TEXTINPUT_TYPE_NONE),
mismatching_enums);
@@ -391,6 +399,15 @@
}
}
+// Histogram tracking prevalence of tiny Flash instances. Units in pixels.
+enum PluginFlashTinyContentSize {
+ TINY_CONTENT_SIZE_1_1 = 0,
+ TINY_CONTENT_SIZE_5_5 = 1,
+ TINY_CONTENT_SIZE_10_10 = 2,
+ TINY_CONTENT_SIZE_LARGE = 3,
+ TINY_CONTENT_SIZE_NUM_ITEMS
+};
+
// How the throttled power saver is unthrottled, if ever.
// These numeric values are used in UMA logs; do not change them.
enum PowerSaverUnthrottleMethod {
@@ -400,7 +417,49 @@
UNTHROTTLE_METHOD_NUM_ITEMS
};
-const char kPowerSaverUnthrottleHistogram[] = "Plugin.PowerSaverUnthrottle";
+const char kFlashClickSizeAspectRatioHistogram[] =
+ "Plugin.Flash.ClickSize.AspectRatio";
+const char kFlashClickSizeHeightHistogram[] = "Plugin.Flash.ClickSize.Height";
+const char kFlashClickSizeWidthHistogram[] = "Plugin.Flash.ClickSize.Width";
+const char kFlashTinyContentSizeHistogram[] = "Plugin.Flash.TinyContentSize";
+const char kPowerSaverUnthrottleHistogram[] = "Plugin.PowerSaver.Unthrottle";
+
+// Record size metrics for all Flash instances.
+void RecordFlashSizeMetric(int width, int height) {
+ PluginFlashTinyContentSize size = TINY_CONTENT_SIZE_LARGE;
+
+ if (width <= 1 && height <= 1)
+ size = TINY_CONTENT_SIZE_1_1;
+ else if (width <= 5 && height <= 5)
+ size = TINY_CONTENT_SIZE_5_5;
+ else if (width <= 10 && height <= 10)
+ size = TINY_CONTENT_SIZE_10_10;
+
+ UMA_HISTOGRAM_ENUMERATION(kFlashTinyContentSizeHistogram, size,
+ TINY_CONTENT_SIZE_NUM_ITEMS);
+}
+
+// Records size metrics for Flash instances that are clicked.
+void RecordFlashClickSizeMetric(int width, int height) {
+ base::HistogramBase* width_histogram = base::LinearHistogram::FactoryGet(
+ kFlashClickSizeWidthHistogram,
+ 0, // minimum width
+ 500, // maximum width
+ 100, // number of buckets.
+ base::HistogramBase::kUmaTargetedHistogramFlag);
+ width_histogram->Add(width);
+
+ base::HistogramBase* height_histogram = base::LinearHistogram::FactoryGet(
+ kFlashClickSizeHeightHistogram,
+ 0, // minimum height
+ 400, // maximum height
+ 100, // number of buckets.
+ base::HistogramBase::kUmaTargetedHistogramFlag);
+ height_histogram->Add(height);
+
+ UMA_HISTOGRAM_ASPECT_RATIO(kFlashClickSizeAspectRatioHistogram, width,
+ height);
+}
void RecordUnthrottleMethodMetric(PowerSaverUnthrottleMethod method) {
UMA_HISTOGRAM_ENUMERATION(kPowerSaverUnthrottleHistogram, method,
@@ -511,6 +570,7 @@
layer_bound_to_fullscreen_(false),
layer_is_hardware_(false),
plugin_url_(plugin_url),
+ has_been_clicked_(false),
power_saver_enabled_(false),
is_peripheral_content_(false),
plugin_throttled_(false),
@@ -606,11 +666,6 @@
if (GetContentClient()->renderer() && // NULL in unit tests.
GetContentClient()->renderer()->IsExternalPepperPlugin(module->name()))
external_document_load_ = true;
-
- if (IsFlashPlugin(module_.get())) {
- RenderThread::Get()->RecordAction(
- base::UserMetricsAction("Flash.PluginInstanceCreated"));
- }
}
PepperPluginInstanceImpl::~PepperPluginInstanceImpl() {
@@ -871,10 +926,16 @@
if (!render_frame_)
return false;
+ blink::WebRect bounds = container_->element().boundsInViewportSpace();
+ if (IsFlashPlugin(module_.get())) {
+ RenderThread::Get()->RecordAction(
+ base::UserMetricsAction("Flash.PluginInstanceCreated"));
+ RecordFlashSizeMetric(bounds.width, bounds.height);
+ }
+
PluginPowerSaverHelper* power_saver_helper =
render_frame_->plugin_power_saver_helper();
GURL content_origin = plugin_url_.GetOrigin();
- blink::WebRect bounds = container_->element().boundsInViewportSpace();
bool cross_origin = false;
is_peripheral_content_ =
@@ -1158,6 +1219,13 @@
WebCursorInfo* cursor_info) {
TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent");
+ if (event.type == blink::WebInputEvent::MouseDown && !has_been_clicked_ &&
+ IsFlashPlugin(module_.get())) {
+ has_been_clicked_ = true;
+ blink::WebRect bounds = container_->element().boundsInViewportSpace();
+ RecordFlashClickSizeMetric(bounds.width, bounds.height);
+ }
+
if (event.type == blink::WebInputEvent::MouseUp && is_peripheral_content_) {
is_peripheral_content_ = false;
power_saver_enabled_ = false;
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
index 9f55084..c056a93 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -713,6 +713,9 @@
// Plugin URL.
GURL plugin_url_;
+ // Set to true first time plugin is clicked. Used to collect metrics.
+ bool has_been_clicked_;
+
// Indicates whether this plugin may be throttled to reduce power consumption.
// |power_saver_enabled_| implies |is_peripheral_content_|.
bool power_saver_enabled_;
diff --git a/content/renderer/pepper/plugin_power_saver_helper.cc b/content/renderer/pepper/plugin_power_saver_helper.cc
index 365789c..3c60c16 100644
--- a/content/renderer/pepper/plugin_power_saver_helper.cc
+++ b/content/renderer/pepper/plugin_power_saver_helper.cc
@@ -28,7 +28,7 @@
};
const char kPeripheralHeuristicHistogram[] =
- "Plugin.PowerSaverPeripheralHeuristic";
+ "Plugin.PowerSaver.PeripheralHeuristic";
// Maximum dimensions plug-in content may have while still being considered
// peripheral content. These match the sizes used by Safari.
diff --git a/extensions/browser/api/device_permissions_manager.cc b/extensions/browser/api/device_permissions_manager.cc
index 2c43a86..43c2b7a 100644
--- a/extensions/browser/api/device_permissions_manager.cc
+++ b/extensions/browser/api/device_permissions_manager.cc
@@ -324,11 +324,13 @@
DCHECK(CalledOnValidThread());
ClearDevicePermissionEntries(ExtensionPrefs::Get(context_), extension_id);
- std::map<std::string, DevicePermissions*>::iterator it =
- extension_id_to_device_permissions_.find(extension_id);
- if (it != extension_id_to_device_permissions_.end()) {
- delete it->second;
- extension_id_to_device_permissions_.erase(it);
+ DevicePermissions* device_permissions = Get(extension_id);
+ if (device_permissions) {
+ for (const auto& device_entry : device_permissions->ephemeral_devices_) {
+ device_entry->RemoveObserver(this);
+ }
+ extension_id_to_device_permissions_.erase(extension_id);
+ delete device_permissions;
}
}
@@ -340,7 +342,11 @@
DevicePermissionsManager::~DevicePermissionsManager() {
for (const auto& map_entry : extension_id_to_device_permissions_) {
- delete map_entry.second;
+ DevicePermissions* device_permissions = map_entry.second;
+ for (const auto& device_entry : device_permissions->ephemeral_devices_) {
+ device_entry->RemoveObserver(this);
+ }
+ delete device_permissions;
}
}
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc
index c7990e1..8ce9cf6 100644
--- a/extensions/browser/app_window/app_window.cc
+++ b/extensions/browser/app_window/app_window.cc
@@ -656,6 +656,7 @@
}
void AppWindow::Show(ShowType show_type) {
+ bool was_hidden = is_hidden_ || !has_been_shown_;
is_hidden_ = false;
if (CommandLine::ForCurrentProcess()->HasSwitch(
@@ -676,7 +677,7 @@
GetBaseWindow()->ShowInactive();
break;
}
- AppWindowRegistry::Get(browser_context_)->AppWindowShown(this);
+ AppWindowRegistry::Get(browser_context_)->AppWindowShown(this, was_hidden);
has_been_shown_ = true;
SendOnWindowShownIfShown();
diff --git a/extensions/browser/app_window/app_window_registry.cc b/extensions/browser/app_window/app_window_registry.cc
index 48397f5..572c4b2 100644
--- a/extensions/browser/app_window/app_window_registry.cc
+++ b/extensions/browser/app_window/app_window_registry.cc
@@ -60,7 +60,8 @@
void AppWindowRegistry::Observer::OnAppWindowHidden(AppWindow* app_window) {
}
-void AppWindowRegistry::Observer::OnAppWindowShown(AppWindow* app_window) {
+void AppWindowRegistry::Observer::OnAppWindowShown(AppWindow* app_window,
+ bool was_shown) {
}
AppWindowRegistry::Observer::~Observer() {
@@ -100,8 +101,9 @@
FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowHidden(app_window));
}
-void AppWindowRegistry::AppWindowShown(AppWindow* app_window) {
- FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowShown(app_window));
+void AppWindowRegistry::AppWindowShown(AppWindow* app_window, bool was_hidden) {
+ FOR_EACH_OBSERVER(Observer, observers_,
+ OnAppWindowShown(app_window, was_hidden));
}
void AppWindowRegistry::RemoveAppWindow(AppWindow* app_window) {
diff --git a/extensions/browser/app_window/app_window_registry.h b/extensions/browser/app_window/app_window_registry.h
index 7037953..ed2cdc6 100644
--- a/extensions/browser/app_window/app_window_registry.h
+++ b/extensions/browser/app_window/app_window_registry.h
@@ -44,7 +44,7 @@
// it not visible.
virtual void OnAppWindowHidden(AppWindow* app_window);
// Called just after a app window was shown.
- virtual void OnAppWindowShown(AppWindow* app_window);
+ virtual void OnAppWindowShown(AppWindow* app_window, bool was_hidden);
protected:
virtual ~Observer();
@@ -67,7 +67,7 @@
// Called by |app_window| when it is activated.
void AppWindowActivated(AppWindow* app_window);
void AppWindowHidden(AppWindow* app_window);
- void AppWindowShown(AppWindow* app_window);
+ void AppWindowShown(AppWindow* app_window, bool was_hidden);
void RemoveAppWindow(AppWindow* app_window);
void AddObserver(Observer* observer);
diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc
index 25bc847..14e382e 100644
--- a/google_apis/gcm/engine/gcm_store_impl.cc
+++ b/google_apis/gcm/engine/gcm_store_impl.cc
@@ -552,11 +552,11 @@
// Remove all existing settings.
leveldb::ReadOptions read_options;
read_options.verify_checksums = true;
- scoped_ptr<leveldb::Iterator> db_iter(db_->NewIterator(read_options));
- for (db_iter->Seek(MakeSlice(kGServiceSettingKeyStart));
- db_iter->Valid() && db_iter->key().ToString() < kGServiceSettingKeyEnd;
- db_iter->Next()) {
- write_batch.Delete(db_iter->key());
+ scoped_ptr<leveldb::Iterator> iter(db_->NewIterator(read_options));
+ for (iter->Seek(MakeSlice(kGServiceSettingKeyStart));
+ iter->Valid() && iter->key().ToString() < kGServiceSettingKeyEnd;
+ iter->Next()) {
+ write_batch.Delete(iter->key());
}
// Add the new settings.
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 6905d2a..8577d82 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -628,7 +628,7 @@
return vertex_array_manager_.get();
}
ImageManager* GetImageManager() override { return image_manager_.get(); }
- bool ProcessPendingQueries() override;
+ bool ProcessPendingQueries(bool did_finish) override;
bool HasMoreIdleWork() override;
void PerformIdleWork() override;
@@ -3998,12 +3998,12 @@
void GLES2DecoderImpl::DoFinish() {
glFinish();
ProcessPendingReadPixels();
- ProcessPendingQueries();
+ ProcessPendingQueries(true);
}
void GLES2DecoderImpl::DoFlush() {
glFlush();
- ProcessPendingQueries();
+ ProcessPendingQueries(false);
}
void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
@@ -9957,11 +9957,11 @@
}
}
-bool GLES2DecoderImpl::ProcessPendingQueries() {
+bool GLES2DecoderImpl::ProcessPendingQueries(bool did_finish) {
if (query_manager_.get() == NULL) {
return false;
}
- if (!query_manager_->ProcessPendingQueries()) {
+ if (!query_manager_->ProcessPendingQueries(did_finish)) {
current_decoder_error_ = error::kOutOfBounds;
}
return query_manager_->HavePendingQueries();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 8d72335..63618c2 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -171,7 +171,7 @@
virtual ImageManager* GetImageManager() = 0;
// Process any pending queries. Returns false if there are no pending queries.
- virtual bool ProcessPendingQueries() = 0;
+ virtual bool ProcessPendingQueries(bool did_finish) = 0;
// Returns false if there are no idle work to be made.
virtual bool HasMoreIdleWork() = 0;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index 7346d8e..d855c87 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -57,7 +57,7 @@
MOCK_METHOD0(GetContextGroup, ContextGroup*());
MOCK_METHOD0(GetContextState, const ContextState*());
MOCK_METHOD0(GetCapabilities, Capabilities());
- MOCK_METHOD0(ProcessPendingQueries, bool());
+ MOCK_METHOD1(ProcessPendingQueries, bool(bool));
MOCK_METHOD0(HasMoreIdleWork, bool());
MOCK_METHOD0(PerformIdleWork, void());
MOCK_METHOD1(RestoreState, void(const ContextState* prev_state));
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index e97b4c4..43f8606 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -636,7 +636,7 @@
QueryManager* query_manager = test->GetDecoder()->GetQueryManager();
ASSERT_TRUE(query_manager != NULL);
- bool process_success = query_manager->ProcessPendingQueries();
+ bool process_success = query_manager->ProcessPendingQueries(false);
EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError ||
!process_success);
@@ -797,7 +797,7 @@
EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
.WillOnce(Return(GL_TIMEOUT_EXPIRED))
.RetiresOnSaturation();
- bool process_success = query_manager->ProcessPendingQueries();
+ bool process_success = query_manager->ProcessPendingQueries(false);
EXPECT_TRUE(process_success);
EXPECT_TRUE(query->pending());
@@ -810,7 +810,7 @@
EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
.WillOnce(Return(GL_ALREADY_SIGNALED))
.RetiresOnSaturation();
- process_success = query_manager->ProcessPendingQueries();
+ process_success = query_manager->ProcessPendingQueries(false);
EXPECT_TRUE(process_success);
EXPECT_FALSE(query->pending());
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc
index 058a546..48df8dd 100644
--- a/gpu/command_buffer/service/gpu_scheduler.cc
+++ b/gpu/command_buffer/service/gpu_scheduler.cc
@@ -170,7 +170,7 @@
bool GpuScheduler::HasMoreWork() {
return !unschedule_fences_.empty() ||
- (decoder_ && decoder_->ProcessPendingQueries()) ||
+ (decoder_ && decoder_->ProcessPendingQueries(false)) ||
HasMoreIdleWork();
}
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index 5f518ec..fdb5fa8 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -64,7 +64,7 @@
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -105,7 +105,7 @@
return AddToPendingTransferQueue(submit_count);
}
-bool AsyncPixelTransfersCompletedQuery::Process() {
+bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) {
QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
shm_id(), shm_offset(), sizeof(*sync));
if (!sync)
@@ -141,7 +141,7 @@
GLuint service_id);
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -169,7 +169,7 @@
return AddToPendingQueue(submit_count);
}
-bool AllSamplesPassedQuery::Process() {
+bool AllSamplesPassedQuery::Process(bool did_finish) {
GLuint available = 0;
glGetQueryObjectuivARB(
service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
@@ -200,7 +200,7 @@
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -226,7 +226,7 @@
return MarkAsCompleted(elapsed.InMicroseconds());
}
-bool CommandsIssuedQuery::Process() {
+bool CommandsIssuedQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -247,7 +247,7 @@
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -269,7 +269,7 @@
return MarkAsCompleted(now.InMicroseconds());
}
-bool CommandLatencyQuery::Process() {
+bool CommandLatencyQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -293,7 +293,7 @@
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -324,7 +324,7 @@
base::Bind(&AsyncReadPixelsCompletedQuery::Complete,
AsWeakPtr()));
- return Process();
+ return Process(false);
}
void AsyncReadPixelsCompletedQuery::Complete() {
@@ -332,7 +332,7 @@
complete_result_ = MarkAsCompleted(1);
}
-bool AsyncReadPixelsCompletedQuery::Process() {
+bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) {
return !completed_ || complete_result_;
}
@@ -353,7 +353,7 @@
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -376,7 +376,7 @@
return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError());
}
-bool GetErrorQuery::Process() {
+bool GetErrorQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -400,7 +400,7 @@
// Overridden from QueryManager::Query:
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -424,9 +424,16 @@
return AddToPendingQueue(submit_count);
}
-bool CommandsCompletedQuery::Process() {
- if (fence_ && !fence_->HasCompleted())
+bool CommandsCompletedQuery::Process(bool did_finish) {
+ // Note: |did_finish| guarantees that the GPU has passed the fence but
+ // we cannot assume that GLFence::HasCompleted() will return true yet as
+ // that's not guaranteed by all GLFence implementations.
+ //
+ // TODO(reveman): Add UMA stats to determine how common it is that glFinish()
+ // needs to be called for these queries to complete. crbug.com/431845
+ if (!did_finish && fence_ && !fence_->HasCompleted())
return true;
+
return MarkAsCompleted(0);
}
@@ -635,10 +642,10 @@
return true;
}
-bool QueryManager::ProcessPendingQueries() {
+bool QueryManager::ProcessPendingQueries(bool did_finish) {
while (!pending_queries_.empty()) {
Query* query = pending_queries_.front().get();
- if (!query->Process()) {
+ if (!query->Process(did_finish)) {
return false;
}
if (query->pending()) {
@@ -658,7 +665,7 @@
bool QueryManager::ProcessPendingTransferQueries() {
while (!pending_transfer_queries_.empty()) {
Query* query = pending_transfer_queries_.front().get();
- if (!query->Process()) {
+ if (!query->Process(false)) {
return false;
}
if (query->pending()) {
diff --git a/gpu/command_buffer/service/query_manager.h b/gpu/command_buffer/service/query_manager.h
index 62da3b8..5f14929 100644
--- a/gpu/command_buffer/service/query_manager.h
+++ b/gpu/command_buffer/service/query_manager.h
@@ -64,7 +64,7 @@
virtual bool End(base::subtle::Atomic32 submit_count) = 0;
// Returns false if shared memory for sync is invalid.
- virtual bool Process() = 0;
+ virtual bool Process(bool did_finish) = 0;
virtual void Destroy(bool have_context) = 0;
@@ -170,8 +170,9 @@
bool EndQuery(Query* query, base::subtle::Atomic32 submit_count);
// Processes pending queries. Returns false if any queries are pointing
- // to invalid shared memory.
- bool ProcessPendingQueries();
+ // to invalid shared memory. |did_finish| is true if this is called as
+ // a result of calling glFinish().
+ bool ProcessPendingQueries(bool did_finish);
// True if there are pending queries.
bool HavePendingQueries();
diff --git a/gpu/command_buffer/service/query_manager_unittest.cc b/gpu/command_buffer/service/query_manager_unittest.cc
index 80efd69..7c8e93c 100644
--- a/gpu/command_buffer/service/query_manager_unittest.cc
+++ b/gpu/command_buffer/service/query_manager_unittest.cc
@@ -214,7 +214,7 @@
const GLuint kResult = 1;
// Check nothing happens if there are no pending queries.
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
// Create Query.
scoped_refptr<QueryManager::Query> query(
@@ -239,7 +239,7 @@
GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
.WillOnce(SetArgumentPointee<2>(0))
.RetiresOnSaturation();
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
EXPECT_TRUE(query->pending());
EXPECT_EQ(0, sync->process_count);
EXPECT_EQ(0u, sync->result);
@@ -254,7 +254,7 @@
GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
.WillOnce(SetArgumentPointee<2>(kResult))
.RetiresOnSaturation();
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
EXPECT_FALSE(query->pending());
EXPECT_EQ(kSubmitCount, sync->process_count);
EXPECT_EQ(kResult, sync->result);
@@ -262,7 +262,7 @@
// Process with no queries.
// Expect no GL commands/
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
}
TEST_F(QueryManagerTest, ProcessPendingQueries) {
@@ -342,7 +342,7 @@
GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
.WillOnce(SetArgumentPointee<2>(0))
.RetiresOnSaturation();
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
}
EXPECT_FALSE(query1->pending());
EXPECT_FALSE(query2->pending());
@@ -361,7 +361,7 @@
GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
.WillOnce(SetArgumentPointee<2>(0))
.RetiresOnSaturation();
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
EXPECT_TRUE(query3->pending());
EXPECT_EQ(0, sync3->process_count);
EXPECT_EQ(0u, sync3->result);
@@ -377,7 +377,7 @@
GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _))
.WillOnce(SetArgumentPointee<2>(kResult3))
.RetiresOnSaturation();
- EXPECT_TRUE(manager_->ProcessPendingQueries());
+ EXPECT_TRUE(manager_->ProcessPendingQueries(false));
EXPECT_FALSE(query3->pending());
EXPECT_EQ(kSubmitCount3, sync3->process_count);
EXPECT_EQ(kResult3, sync3->result);
@@ -410,7 +410,7 @@
GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
.WillOnce(SetArgumentPointee<2>(kResult))
.RetiresOnSaturation();
- EXPECT_FALSE(manager_->ProcessPendingQueries());
+ EXPECT_FALSE(manager_->ProcessPendingQueries(false));
}
TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) {
@@ -439,7 +439,7 @@
GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
.WillOnce(SetArgumentPointee<2>(kResult))
.RetiresOnSaturation();
- EXPECT_FALSE(manager_->ProcessPendingQueries());
+ EXPECT_FALSE(manager_->ProcessPendingQueries(false));
}
TEST_F(QueryManagerTest, ExitWithPendingQuery) {
diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc
index 5e1c973..6e01eda 100644
--- a/media/audio/mac/audio_low_latency_input_mac.cc
+++ b/media/audio/mac/audio_low_latency_input_mac.cc
@@ -461,6 +461,28 @@
if (!audio_input)
return kAudioUnitErr_InvalidElement;
+ // Update the |mDataByteSize| value in the audio_buffer_list() since
+ // |number_of_frames| can be changed on the fly.
+ // |mDataByteSize| needs to be exactly mapping to |number_of_frames|,
+ // otherwise it will put CoreAudio into bad state and results in
+ // AudioUnitRender() returning -50 for the new created stream.
+ // See crbug/428706 for details.
+ UInt32 new_size = number_of_frames * audio_input->format_.mBytesPerFrame;
+ AudioBuffer* audio_buffer = audio_input->audio_buffer_list()->mBuffers;
+ if (new_size != audio_buffer->mDataByteSize) {
+ if (new_size > audio_buffer->mDataByteSize) {
+ // This can happen iff the device is unpluged during recording. In such
+ // case the buffer will not be used anymore since |audio_unit_| becomes
+ // invalid. We allocate enough memory here to avoid depending on
+ // how CoreAudio handles it.
+ audio_input->audio_data_buffer_.reset(new uint8[new_size]);
+ audio_buffer->mData = audio_input->audio_data_buffer_.get();
+ }
+
+ // Update the |mDataByteSize| to match |number_of_frames|.
+ audio_buffer->mDataByteSize = new_size;
+ }
+
// Receive audio from the AUHAL from the output scope of the Audio Unit.
OSStatus result = AudioUnitRender(audio_input->audio_unit(),
flags,
diff --git a/media/cast/logging/logging_defines.h b/media/cast/logging/logging_defines.h
index 021a3c9..0f57fe9 100644
--- a/media/cast/logging/logging_defines.h
+++ b/media/cast/logging/logging_defines.h
@@ -65,7 +65,10 @@
EventMediaType media_type;
- // Render / playout delay. Only set for FRAME_PLAYOUT events.
+ // Only set for FRAME_PLAYOUT events.
+ // If this value is zero the frame is rendered on time.
+ // If this value is positive it means the frame is rendered late.
+ // If this value is negative it means the frame is rendered early.
base::TimeDelta delay_delta;
// Whether the frame is a key frame. Only set for video FRAME_ENCODED event.
diff --git a/media/cast/logging/stats_event_subscriber.cc b/media/cast/logging/stats_event_subscriber.cc
index b22812e..c42affa 100644
--- a/media/cast/logging/stats_event_subscriber.cc
+++ b/media/cast/logging/stats_event_subscriber.cc
@@ -101,7 +101,12 @@
: event_media_type_(event_media_type),
clock_(clock),
offset_estimator_(offset_estimator),
+ capture_latency_datapoints_(0),
+ encode_time_datapoints_(0),
+ queueing_latency_datapoints_(0),
network_latency_datapoints_(0),
+ packet_latency_datapoints_(0),
+ frame_latency_datapoints_(0),
e2e_latency_datapoints_(0),
num_frames_dropped_by_encoder_(0),
num_frames_late_(0),
@@ -150,7 +155,9 @@
RecordE2ELatency(frame_event);
base::TimeDelta delay_delta = frame_event.delay_delta;
histograms_[PLAYOUT_DELAY_MS_HISTO]->Add(delay_delta.InMillisecondsF());
- if (delay_delta <= base::TimeDelta())
+
+ // Positive delay_delta means the frame is late.
+ if (delay_delta > base::TimeDelta())
num_frames_late_++;
}
@@ -182,7 +189,7 @@
if (type == PACKET_SENT_TO_NETWORK ||
type == PACKET_RECEIVED) {
- RecordNetworkLatency(packet_event);
+ RecordPacketRelatedLatencies(packet_event);
} else if (type == PACKET_RETRANSMITTED) {
// We only measure network latency using packets that doesn't have to be
// retransmitted as there is precisely one sent-receive timestamp pairs.
@@ -226,6 +233,8 @@
stats->SetDouble(CastStatToString(it->first),
round(it->second * 1000.0) / 1000.0);
}
+
+ // Populate all histograms.
for (HistogramMap::const_iterator it = histograms_.begin();
it != histograms_.end();
++it) {
@@ -244,8 +253,18 @@
frame_stats_.clear();
packet_stats_.clear();
+ total_capture_latency_ = base::TimeDelta();
+ capture_latency_datapoints_ = 0;
+ total_encode_time_ = base::TimeDelta();
+ encode_time_datapoints_ = 0;
+ total_queueing_latency_ = base::TimeDelta();
+ queueing_latency_datapoints_ = 0;
total_network_latency_ = base::TimeDelta();
network_latency_datapoints_ = 0;
+ total_packet_latency_ = base::TimeDelta();
+ packet_latency_datapoints_ = 0;
+ total_frame_latency_ = base::TimeDelta();
+ frame_latency_datapoints_ = 0;
total_e2e_latency_ = base::TimeDelta();
e2e_latency_datapoints_ = 0;
num_frames_dropped_by_encoder_ = 0;
@@ -269,47 +288,75 @@
STAT_ENUM_TO_STRING(CAPTURE_FPS);
STAT_ENUM_TO_STRING(ENCODE_FPS);
STAT_ENUM_TO_STRING(DECODE_FPS);
+ STAT_ENUM_TO_STRING(AVG_CAPTURE_LATENCY_MS);
STAT_ENUM_TO_STRING(AVG_ENCODE_TIME_MS);
- STAT_ENUM_TO_STRING(AVG_PLAYOUT_DELAY_MS);
+ STAT_ENUM_TO_STRING(AVG_QUEUEING_LATENCY_MS);
STAT_ENUM_TO_STRING(AVG_NETWORK_LATENCY_MS);
+ STAT_ENUM_TO_STRING(AVG_PACKET_LATENCY_MS);
+ STAT_ENUM_TO_STRING(AVG_FRAME_LATENCY_MS);
STAT_ENUM_TO_STRING(AVG_E2E_LATENCY_MS);
STAT_ENUM_TO_STRING(ENCODE_KBPS);
STAT_ENUM_TO_STRING(TRANSMISSION_KBPS);
STAT_ENUM_TO_STRING(RETRANSMISSION_KBPS);
- STAT_ENUM_TO_STRING(PACKET_LOSS_FRACTION);
STAT_ENUM_TO_STRING(MS_SINCE_LAST_RECEIVER_RESPONSE);
STAT_ENUM_TO_STRING(NUM_FRAMES_CAPTURED);
STAT_ENUM_TO_STRING(NUM_FRAMES_DROPPED_BY_ENCODER);
STAT_ENUM_TO_STRING(NUM_FRAMES_LATE);
STAT_ENUM_TO_STRING(NUM_PACKETS_SENT);
STAT_ENUM_TO_STRING(NUM_PACKETS_RETRANSMITTED);
+ STAT_ENUM_TO_STRING(NUM_PACKETS_RECEIVED);
STAT_ENUM_TO_STRING(NUM_PACKETS_RTX_REJECTED);
STAT_ENUM_TO_STRING(FIRST_EVENT_TIME_MS);
STAT_ENUM_TO_STRING(LAST_EVENT_TIME_MS);
STAT_ENUM_TO_STRING(CAPTURE_LATENCY_MS_HISTO);
- STAT_ENUM_TO_STRING(ENCODE_LATENCY_MS_HISTO);
+ STAT_ENUM_TO_STRING(ENCODE_TIME_MS_HISTO);
+ STAT_ENUM_TO_STRING(QUEUEING_LATENCY_MS_HISTO);
+ STAT_ENUM_TO_STRING(NETWORK_LATENCY_MS_HISTO);
STAT_ENUM_TO_STRING(PACKET_LATENCY_MS_HISTO);
STAT_ENUM_TO_STRING(FRAME_LATENCY_MS_HISTO);
+ STAT_ENUM_TO_STRING(E2E_LATENCY_MS_HISTO);
STAT_ENUM_TO_STRING(PLAYOUT_DELAY_MS_HISTO);
}
NOTREACHED();
return "";
}
-const int kMaxLatencyBucketMs = 800;
-const int kBucketWidthMs = 20;
+const int kDefaultMaxLatencyBucketMs = 800;
+const int kDefaultBucketWidthMs = 20;
+
+// For small latency values.
+const int kSmallMaxLatencyBucketMs = 100;
+const int kSmallBucketWidthMs = 5;
+
+// For large latency values.
+const int kLargeMaxLatencyBucketMs = 1200;
+const int kLargeBucketWidthMs = 50;
void StatsEventSubscriber::InitHistograms() {
- histograms_[CAPTURE_LATENCY_MS_HISTO].reset(
- new SimpleHistogram(0, kMaxLatencyBucketMs, kBucketWidthMs));
- histograms_[ENCODE_LATENCY_MS_HISTO].reset(
- new SimpleHistogram(0, kMaxLatencyBucketMs, kBucketWidthMs));
+ histograms_[E2E_LATENCY_MS_HISTO].reset(
+ new SimpleHistogram(0, kLargeMaxLatencyBucketMs,
+ kLargeBucketWidthMs));
+ histograms_[QUEUEING_LATENCY_MS_HISTO].reset(
+ new SimpleHistogram(0, kDefaultMaxLatencyBucketMs,
+ kDefaultBucketWidthMs));
+ histograms_[NETWORK_LATENCY_MS_HISTO].reset(
+ new SimpleHistogram(0, kDefaultMaxLatencyBucketMs,
+ kDefaultBucketWidthMs));
histograms_[PACKET_LATENCY_MS_HISTO].reset(
- new SimpleHistogram(0, kMaxLatencyBucketMs, kBucketWidthMs));
+ new SimpleHistogram(0, kDefaultMaxLatencyBucketMs,
+ kDefaultBucketWidthMs));
histograms_[FRAME_LATENCY_MS_HISTO].reset(
- new SimpleHistogram(0, kMaxLatencyBucketMs, kBucketWidthMs));
+ new SimpleHistogram(0, kDefaultMaxLatencyBucketMs,
+ kDefaultBucketWidthMs));
histograms_[PLAYOUT_DELAY_MS_HISTO].reset(
- new SimpleHistogram(0, kMaxLatencyBucketMs, kBucketWidthMs));
+ new SimpleHistogram(0, kSmallMaxLatencyBucketMs,
+ kSmallBucketWidthMs));
+ histograms_[CAPTURE_LATENCY_MS_HISTO].reset(
+ new SimpleHistogram(0, kSmallMaxLatencyBucketMs,
+ kSmallBucketWidthMs));
+ histograms_[ENCODE_TIME_MS_HISTO].reset(
+ new SimpleHistogram(0, kSmallMaxLatencyBucketMs,
+ kSmallBucketWidthMs));
}
void StatsEventSubscriber::GetStatsInternal(StatsMap* stats_map) const {
@@ -325,7 +372,6 @@
end_time, FRAME_ENCODED, ENCODE_FPS, stats_map);
PopulateFpsStat(
end_time, FRAME_DECODED, DECODE_FPS, stats_map);
- PopulatePlayoutDelayStat(stats_map);
PopulateFrameBitrateStat(end_time, stats_map);
PopulatePacketBitrateStat(end_time,
PACKET_SENT_TO_NETWORK,
@@ -335,14 +381,38 @@
PACKET_RETRANSMITTED,
RETRANSMISSION_KBPS,
stats_map);
- PopulatePacketLossPercentageStat(stats_map);
PopulateFrameCountStat(FRAME_CAPTURE_END, NUM_FRAMES_CAPTURED, stats_map);
PopulatePacketCountStat(PACKET_SENT_TO_NETWORK, NUM_PACKETS_SENT, stats_map);
PopulatePacketCountStat(
PACKET_RETRANSMITTED, NUM_PACKETS_RETRANSMITTED, stats_map);
+ PopulatePacketCountStat(PACKET_RECEIVED, NUM_PACKETS_RECEIVED, stats_map);
PopulatePacketCountStat(
PACKET_RTX_REJECTED, NUM_PACKETS_RTX_REJECTED, stats_map);
+ if (capture_latency_datapoints_ > 0) {
+ double avg_capture_latency_ms =
+ total_capture_latency_.InMillisecondsF() /
+ capture_latency_datapoints_;
+ stats_map->insert(
+ std::make_pair(AVG_CAPTURE_LATENCY_MS, avg_capture_latency_ms));
+ }
+
+ if (encode_time_datapoints_ > 0) {
+ double avg_encode_time_ms =
+ total_encode_time_.InMillisecondsF() /
+ encode_time_datapoints_;
+ stats_map->insert(
+ std::make_pair(AVG_ENCODE_TIME_MS, avg_encode_time_ms));
+ }
+
+ if (queueing_latency_datapoints_ > 0) {
+ double avg_queueing_latency_ms =
+ total_queueing_latency_.InMillisecondsF() /
+ queueing_latency_datapoints_;
+ stats_map->insert(
+ std::make_pair(AVG_QUEUEING_LATENCY_MS, avg_queueing_latency_ms));
+ }
+
if (network_latency_datapoints_ > 0) {
double avg_network_latency_ms =
total_network_latency_.InMillisecondsF() /
@@ -351,6 +421,21 @@
std::make_pair(AVG_NETWORK_LATENCY_MS, avg_network_latency_ms));
}
+ if (packet_latency_datapoints_ > 0) {
+ double avg_packet_latency_ms =
+ total_packet_latency_.InMillisecondsF() /
+ packet_latency_datapoints_;
+ stats_map->insert(
+ std::make_pair(AVG_PACKET_LATENCY_MS, avg_packet_latency_ms));
+ }
+
+ if (frame_latency_datapoints_ > 0) {
+ double avg_frame_latency_ms =
+ total_frame_latency_.InMillisecondsF() / frame_latency_datapoints_;
+ stats_map->insert(
+ std::make_pair(AVG_FRAME_LATENCY_MS, avg_frame_latency_ms));
+ }
+
if (e2e_latency_datapoints_ > 0) {
double avg_e2e_latency_ms =
total_e2e_latency_.InMillisecondsF() / e2e_latency_datapoints_;
@@ -378,6 +463,13 @@
}
}
+StatsEventSubscriber::SimpleHistogram*
+StatsEventSubscriber::GetHistogramForTesting(
+ CastStat stats) const {
+ DCHECK(histograms_.find(stats) != histograms_.end());
+ return histograms_.find(stats)->second.get();
+}
+
bool StatsEventSubscriber::GetReceiverOffset(base::TimeDelta* offset) {
base::TimeDelta receiver_offset_lower_bound;
base::TimeDelta receiver_offset_upper_bound;
@@ -403,7 +495,7 @@
if (recent_frame_infos_.size() >= kMaxFrameInfoMapSize) {
FrameInfoMap::iterator erase_it = recent_frame_infos_.begin();
- if (erase_it->second.encode_time.is_null())
+ if (erase_it->second.encode_end_time.is_null())
num_frames_dropped_by_encoder_++;
recent_frame_infos_.erase(erase_it);
}
@@ -419,13 +511,15 @@
void StatsEventSubscriber::RecordCaptureLatency(const FrameEvent& frame_event) {
FrameInfoMap::iterator it =
recent_frame_infos_.find(frame_event.rtp_timestamp);
- if (it == recent_frame_infos_.end())
+ if (it == recent_frame_infos_.end()) {
return;
+ }
if (!it->second.capture_time.is_null()) {
- double capture_latency_ms =
- (it->second.capture_time - frame_event.timestamp).InMillisecondsF();
- histograms_[CAPTURE_LATENCY_MS_HISTO]->Add(capture_latency_ms);
+ base::TimeDelta latency = frame_event.timestamp - it->second.capture_time;
+ total_capture_latency_ += latency;
+ capture_latency_datapoints_++;
+ histograms_[CAPTURE_LATENCY_MS_HISTO]->Add(latency.InMillisecondsF());
}
it->second.capture_end_time = frame_event.timestamp;
@@ -436,18 +530,20 @@
recent_frame_infos_.find(frame_event.rtp_timestamp);
if (it == recent_frame_infos_.end()) {
FrameInfo frame_info;
- frame_info.encode_time = frame_event.timestamp;
+ frame_info.encode_end_time = frame_event.timestamp;
MaybeInsertFrameInfo(frame_event.rtp_timestamp, frame_info);
return;
}
if (!it->second.capture_end_time.is_null()) {
- double encode_latency_ms =
- (frame_event.timestamp - it->second.capture_end_time).InMillisecondsF();
- histograms_[ENCODE_LATENCY_MS_HISTO]->Add(encode_latency_ms);
+ base::TimeDelta latency =
+ frame_event.timestamp - it->second.capture_end_time;
+ total_encode_time_ += latency;
+ encode_time_datapoints_++;
+ histograms_[ENCODE_TIME_MS_HISTO]->Add(latency.InMillisecondsF());
}
- it->second.encode_time = frame_event.timestamp;
+ it->second.encode_end_time = frame_event.timestamp;
}
void StatsEventSubscriber::RecordFrameTxLatency(const FrameEvent& frame_event) {
@@ -456,7 +552,7 @@
if (it == recent_frame_infos_.end())
return;
- if (it->second.encode_time.is_null())
+ if (it->second.encode_end_time.is_null())
return;
base::TimeDelta receiver_offset;
@@ -464,9 +560,10 @@
return;
base::TimeTicks sender_time = frame_event.timestamp - receiver_offset;
- double frame_tx_latency_ms =
- (sender_time - it->second.encode_time).InMillisecondsF();
- histograms_[FRAME_LATENCY_MS_HISTO]->Add(frame_tx_latency_ms);
+ base::TimeDelta latency = sender_time - it->second.encode_end_time;
+ total_frame_latency_ += latency;
+ frame_latency_datapoints_++;
+ histograms_[FRAME_LATENCY_MS_HISTO]->Add(latency.InMillisecondsF());
}
void StatsEventSubscriber::RecordE2ELatency(const FrameEvent& frame_event) {
@@ -482,8 +579,10 @@
// Playout time is event time + playout delay.
base::TimeTicks playout_time =
frame_event.timestamp + frame_event.delay_delta - receiver_offset;
- total_e2e_latency_ += playout_time - it->second.capture_time;
+ base::TimeDelta latency = playout_time - it->second.capture_time;
+ total_e2e_latency_ += latency;
e2e_latency_datapoints_++;
+ histograms_[E2E_LATENCY_MS_HISTO]->Add(latency.InMillisecondsF());
}
void StatsEventSubscriber::UpdateLastResponseTime(
@@ -502,8 +601,23 @@
packet_sent_times_.erase(key);
}
-void StatsEventSubscriber::RecordNetworkLatency(
+void StatsEventSubscriber::RecordPacketRelatedLatencies(
const PacketEvent& packet_event) {
+ // Log queueing latency.
+ if (packet_event.type == PACKET_SENT_TO_NETWORK) {
+ FrameInfoMap::iterator it =
+ recent_frame_infos_.find(packet_event.rtp_timestamp);
+ if (it != recent_frame_infos_.end()) {
+ base::TimeDelta latency =
+ packet_event.timestamp - it->second.encode_end_time;
+ total_queueing_latency_ += latency;
+ queueing_latency_datapoints_++;
+ histograms_[QUEUEING_LATENCY_MS_HISTO]->Add(
+ latency.InMillisecondsF());
+ }
+ }
+
+ // Log network latency and total packet latency;
base::TimeDelta receiver_offset;
if (!GetReceiverOffset(&receiver_offset))
return;
@@ -535,17 +649,28 @@
match = true;
}
if (match) {
+ packet_sent_times_.erase(it);
+
// Subtract by offset.
packet_received_time -= receiver_offset;
base::TimeDelta latency_delta = packet_received_time - packet_sent_time;
total_network_latency_ += latency_delta;
network_latency_datapoints_++;
-
- histograms_[PACKET_LATENCY_MS_HISTO]->Add(
+ histograms_[NETWORK_LATENCY_MS_HISTO]->Add(
latency_delta.InMillisecondsF());
- packet_sent_times_.erase(it);
+ // Log total network latency.
+ FrameInfoMap::iterator frame_it =
+ recent_frame_infos_.find(packet_event.rtp_timestamp);
+ if (frame_it != recent_frame_infos_.end()) {
+ base::TimeDelta latency =
+ packet_received_time - frame_it->second.encode_end_time;
+ total_packet_latency_ += latency;
+ packet_latency_datapoints_++;
+ histograms_[PACKET_LATENCY_MS_HISTO]->Add(
+ latency.InMillisecondsF());
+ }
}
}
}
@@ -583,18 +708,6 @@
}
}
-void StatsEventSubscriber::PopulatePlayoutDelayStat(StatsMap* stats_map) const {
- FrameStatsMap::const_iterator it = frame_stats_.find(FRAME_PLAYOUT);
- if (it != frame_stats_.end()) {
- double avg_delay_ms = 0.0;
- base::TimeDelta sum_delay = it->second.sum_delay;
- int count = it->second.event_counter;
- if (count != 0)
- avg_delay_ms = sum_delay.InMillisecondsF() / count;
- stats_map->insert(std::make_pair(AVG_PLAYOUT_DELAY_MS, avg_delay_ms));
- }
-}
-
void StatsEventSubscriber::PopulateFrameBitrateStat(base::TimeTicks end_time,
StatsMap* stats_map) const {
FrameStatsMap::const_iterator it = frame_stats_.find(FRAME_ENCODED);
@@ -626,28 +739,6 @@
}
}
-void StatsEventSubscriber::PopulatePacketLossPercentageStat(
- StatsMap* stats_map) const {
- // We assume that retransmission means that the packet's previous
- // (re)transmission was lost.
- // This means the percentage of packet loss is
- // (# of retransmit events) / (# of transmit + retransmit events).
- PacketStatsMap::const_iterator sent_it =
- packet_stats_.find(PACKET_SENT_TO_NETWORK);
- if (sent_it == packet_stats_.end())
- return;
- PacketStatsMap::const_iterator retransmitted_it =
- packet_stats_.find(PACKET_RETRANSMITTED);
- int sent_count = sent_it->second.event_counter;
- int retransmitted_count = 0;
- if (retransmitted_it != packet_stats_.end())
- retransmitted_count = retransmitted_it->second.event_counter;
- double packet_loss_fraction = static_cast<double>(retransmitted_count) /
- (sent_count + retransmitted_count);
- stats_map->insert(
- std::make_pair(PACKET_LOSS_FRACTION, packet_loss_fraction));
-}
-
StatsEventSubscriber::FrameLogStats::FrameLogStats()
: event_counter(0), sum_size(0) {}
StatsEventSubscriber::FrameLogStats::~FrameLogStats() {}
diff --git a/media/cast/logging/stats_event_subscriber.h b/media/cast/logging/stats_event_subscriber.h
index 2039402..3e8c83b 100644
--- a/media/cast/logging/stats_event_subscriber.h
+++ b/media/cast/logging/stats_event_subscriber.h
@@ -57,6 +57,7 @@
FRIEND_TEST_ALL_PREFIXES(StatsEventSubscriberTest, PlayoutDelay);
FRIEND_TEST_ALL_PREFIXES(StatsEventSubscriberTest, E2ELatency);
FRIEND_TEST_ALL_PREFIXES(StatsEventSubscriberTest, Packets);
+ FRIEND_TEST_ALL_PREFIXES(StatsEventSubscriberTest, Histograms);
static const size_t kMaxFrameInfoMapSize = 100;
@@ -113,15 +114,22 @@
ENCODE_FPS,
// Decode frame rate.
DECODE_FPS,
+ // Average capture latency in milliseconds.
+ AVG_CAPTURE_LATENCY_MS,
// Average encode duration in milliseconds.
- // TODO(imcheng): This stat is not populated yet because we do not have
- // the time when encode started. Record it in FRAME_ENCODED event.
AVG_ENCODE_TIME_MS,
- // Average playout delay in milliseconds.
- AVG_PLAYOUT_DELAY_MS,
+ // Duration from when a frame is encoded to when the packet is first
+ // sent.
+ AVG_QUEUEING_LATENCY_MS,
// Duration from when a packet is transmitted to when it is received.
// This measures latency from sender to receiver.
AVG_NETWORK_LATENCY_MS,
+ // Duration from when a frame is encoded to when the packet is first
+ // received.
+ AVG_PACKET_LATENCY_MS,
+ // Average latency between frame encoded and the moment when the frame
+ // is fully received.
+ AVG_FRAME_LATENCY_MS,
// Duration from when a frame is captured to when it should be played out.
AVG_E2E_LATENCY_MS,
// Encode bitrate in kbps.
@@ -130,8 +138,6 @@
TRANSMISSION_KBPS,
// Packet retransmission bitrate in kbps.
RETRANSMISSION_KBPS,
- // Fraction of packet loss.
- PACKET_LOSS_FRACTION,
// Duration in milliseconds since last receiver response.
MS_SINCE_LAST_RECEIVER_RESPONSE,
// Number of frames captured.
@@ -144,6 +150,8 @@
NUM_PACKETS_SENT,
// Number of packets that were retransmitted.
NUM_PACKETS_RETRANSMITTED,
+ // Number of packets that were received by receiver.
+ NUM_PACKETS_RECEIVED,
// Number of packets that had their retransmission cancelled.
NUM_PACKETS_RTX_REJECTED,
// Unix time in milliseconds of first event since reset.
@@ -153,9 +161,12 @@
// Histograms
CAPTURE_LATENCY_MS_HISTO,
- ENCODE_LATENCY_MS_HISTO,
+ ENCODE_TIME_MS_HISTO,
+ QUEUEING_LATENCY_MS_HISTO,
+ NETWORK_LATENCY_MS_HISTO,
PACKET_LATENCY_MS_HISTO,
FRAME_LATENCY_MS_HISTO,
+ E2E_LATENCY_MS_HISTO,
PLAYOUT_DELAY_MS_HISTO
};
@@ -165,7 +176,7 @@
base::TimeTicks capture_time;
base::TimeTicks capture_end_time;
- base::TimeTicks encode_time;
+ base::TimeTicks encode_end_time;
bool encoded;
};
@@ -186,6 +197,9 @@
// Assigns |stats_map| with stats data. Used for testing.
void GetStatsInternal(StatsMap* stats_map) const;
+ // Return a histogram of the type specified.
+ SimpleHistogram* GetHistogramForTesting(CastStat stats) const;
+
void UpdateFirstLastEventTime(base::TimeTicks timestamp,
bool is_receiver_event);
bool GetReceiverOffset(base::TimeDelta* offset);
@@ -198,7 +212,7 @@
void RecordE2ELatency(const FrameEvent& frame_event);
void RecordPacketSentTime(const PacketEvent& packet_event);
void ErasePacketSentTime(const PacketEvent& packet_event);
- void RecordNetworkLatency(const PacketEvent& packet_event);
+ void RecordPacketRelatedLatencies(const PacketEvent& packet_event);
void UpdateLastResponseTime(base::TimeTicks receiver_time);
void PopulateFpsStat(base::TimeTicks now,
@@ -211,13 +225,11 @@
void PopulatePacketCountStat(CastLoggingEvent event,
CastStat stat,
StatsMap* stats_map) const;
- void PopulatePlayoutDelayStat(StatsMap* stats_map) const;
void PopulateFrameBitrateStat(base::TimeTicks now, StatsMap* stats_map) const;
void PopulatePacketBitrateStat(base::TimeTicks now,
CastLoggingEvent event,
CastStat stat,
StatsMap* stats_map) const;
- void PopulatePacketLossPercentageStat(StatsMap* stats_map) const;
const EventMediaType event_media_type_;
@@ -230,8 +242,18 @@
FrameStatsMap frame_stats_;
PacketStatsMap packet_stats_;
+ base::TimeDelta total_capture_latency_;
+ int capture_latency_datapoints_;
+ base::TimeDelta total_encode_time_;
+ int encode_time_datapoints_;
+ base::TimeDelta total_queueing_latency_;
+ int queueing_latency_datapoints_;
base::TimeDelta total_network_latency_;
int network_latency_datapoints_;
+ base::TimeDelta total_packet_latency_;
+ int packet_latency_datapoints_;
+ base::TimeDelta total_frame_latency_;
+ int frame_latency_datapoints_;
base::TimeDelta total_e2e_latency_;
int e2e_latency_datapoints_;
diff --git a/media/cast/logging/stats_event_subscriber_unittest.cc b/media/cast/logging/stats_event_subscriber_unittest.cc
index 41388e0..570e2cc 100644
--- a/media/cast/logging/stats_event_subscriber_unittest.cc
+++ b/media/cast/logging/stats_event_subscriber_unittest.cc
@@ -131,6 +131,11 @@
ASSERT_TRUE(it != stats_map.end());
EXPECT_DOUBLE_EQ(it->second, static_cast<double>(dropped_frames));
+
+ it = stats_map.find(StatsEventSubscriber::AVG_CAPTURE_LATENCY_MS);
+ ASSERT_TRUE(it != stats_map.end());
+
+ EXPECT_DOUBLE_EQ(it->second, static_cast<double>(0.01));
}
TEST_F(StatsEventSubscriberTest, Encode) {
@@ -236,12 +241,10 @@
uint32 rtp_timestamp = 0;
uint32 frame_id = 0;
int num_frames = 10;
- int total_delay_ms = 0;
int late_frames = 0;
for (int i = 0, delay_ms = -50; i < num_frames; i++, delay_ms += 10) {
base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms);
- total_delay_ms += delay_ms;
- if (delay_ms <= 0)
+ if (delay_ms > 0)
late_frames++;
cast_environment_->Logging()->InsertFrameEventWithDelay(
receiver_clock_.NowTicks(),
@@ -259,14 +262,8 @@
StatsEventSubscriber::StatsMap stats_map;
subscriber_->GetStatsInternal(&stats_map);
- StatsEventSubscriber::StatsMap::iterator it =
- stats_map.find(StatsEventSubscriber::AVG_PLAYOUT_DELAY_MS);
- ASSERT_TRUE(it != stats_map.end());
-
- EXPECT_DOUBLE_EQ(
- it->second, static_cast<double>(total_delay_ms) / num_frames);
-
- it = stats_map.find(StatsEventSubscriber::NUM_FRAMES_LATE);
+ StatsEventSubscriber::StatsMap::iterator it = stats_map.find(
+ StatsEventSubscriber::NUM_FRAMES_LATE);
ASSERT_TRUE(it != stats_map.end());
EXPECT_DOUBLE_EQ(it->second, late_frames);
@@ -326,10 +323,22 @@
base::TimeTicks start_time = sender_clock_->NowTicks();
int total_size = 0;
int retransmit_total_size = 0;
- base::TimeDelta total_latency;
+ base::TimeDelta total_network_latency;
+ base::TimeDelta total_queueing_latency;
+ base::TimeDelta total_packet_latency;
int num_packets_transmitted = 0;
+ int num_packets_received = 0;
int num_packets_retransmitted = 0;
int num_packets_rtx_rejected = 0;
+
+ base::TimeTicks sender_encoded_time = sender_clock_->NowTicks();
+ base::TimeTicks receiver_encoded_time = receiver_clock_.NowTicks();
+ cast_environment_->Logging()->InsertFrameEvent(sender_encoded_time,
+ FRAME_ENCODED,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ 0);
+
// Every 2nd packet will be retransmitted once.
// Every 4th packet will be retransmitted twice.
// Every 8th packet will be retransmitted 3 times + 1 rejected retransmission.
@@ -346,12 +355,15 @@
num_packets - 1,
size);
num_packets_transmitted++;
+ total_queueing_latency += sender_clock_->NowTicks() - sender_encoded_time;
int latency_micros = 20000 + base::RandInt(-10000, 10000);
base::TimeDelta latency = base::TimeDelta::FromMicroseconds(latency_micros);
// Latency is only recorded for packets that aren't retransmitted.
if (i % 2 != 0) {
- total_latency += latency;
+ total_network_latency += latency;
+ total_packet_latency +=
+ receiver_clock_.NowTicks() - receiver_encoded_time + latency;
num_latency_recorded_packets++;
}
@@ -428,6 +440,7 @@
i,
num_packets - 1,
size);
+ num_packets_received++;
}
base::TimeTicks end_time = sender_clock_->NowTicks();
@@ -436,15 +449,28 @@
StatsEventSubscriber::StatsMap stats_map;
subscriber_->GetStatsInternal(&stats_map);
- // Measure AVG_NETWORK_LATENCY_MS, TRANSMISSION_KBPS, RETRANSMISSION_KBPS,
- // and PACKET_LOSS_FRACTION.
+ // Measure AVG_NETWORK_LATENCY_MS, TRANSMISSION_KBPS, RETRANSMISSION_KBPS.
StatsEventSubscriber::StatsMap::iterator it =
stats_map.find(StatsEventSubscriber::AVG_NETWORK_LATENCY_MS);
ASSERT_TRUE(it != stats_map.end());
EXPECT_DOUBLE_EQ(
it->second,
- total_latency.InMillisecondsF() / num_latency_recorded_packets);
+ total_network_latency.InMillisecondsF() / num_latency_recorded_packets);
+
+ it = stats_map.find(StatsEventSubscriber::AVG_QUEUEING_LATENCY_MS);
+ ASSERT_TRUE(it != stats_map.end());
+
+ EXPECT_DOUBLE_EQ(
+ it->second,
+ total_queueing_latency.InMillisecondsF() / num_packets);
+
+ it = stats_map.find(StatsEventSubscriber::AVG_PACKET_LATENCY_MS);
+ ASSERT_TRUE(it != stats_map.end());
+
+ EXPECT_DOUBLE_EQ(
+ it->second,
+ total_packet_latency.InMillisecondsF() / num_latency_recorded_packets);
it = stats_map.find(StatsEventSubscriber::TRANSMISSION_KBPS);
ASSERT_TRUE(it != stats_map.end());
@@ -459,18 +485,16 @@
static_cast<double>(retransmit_total_size) /
duration.InMillisecondsF() * 8);
- it = stats_map.find(StatsEventSubscriber::PACKET_LOSS_FRACTION);
- ASSERT_TRUE(it != stats_map.end());
-
- EXPECT_DOUBLE_EQ(
- it->second,
- static_cast<double>(num_packets_retransmitted) / num_packets_transmitted);
-
it = stats_map.find(StatsEventSubscriber::NUM_PACKETS_SENT);
ASSERT_TRUE(it != stats_map.end());
EXPECT_DOUBLE_EQ(it->second, static_cast<double>(num_packets));
+ it = stats_map.find(StatsEventSubscriber::NUM_PACKETS_RECEIVED);
+ ASSERT_TRUE(it != stats_map.end());
+
+ EXPECT_DOUBLE_EQ(it->second, static_cast<double>(num_packets_received));
+
it = stats_map.find(StatsEventSubscriber::NUM_PACKETS_RETRANSMITTED);
ASSERT_TRUE(it != stats_map.end());
@@ -482,5 +506,122 @@
EXPECT_DOUBLE_EQ(it->second, static_cast<double>(num_packets_rtx_rejected));
}
+bool CheckHistogramHasValue(base::ListValue* values,
+ const std::string& bucket, int expected_count) {
+ for (size_t i = 0; i < values->GetSize(); ++i) {
+ const base::DictionaryValue* dict = NULL;
+ values->GetDictionary(i, &dict);
+ if (!dict->HasKey(bucket))
+ continue;
+ int bucket_count = 0;
+ if (!dict->GetInteger(bucket, &bucket_count))
+ return false;
+ return bucket_count == expected_count;
+ }
+ return false;
+}
+
+TEST_F(StatsEventSubscriberTest, Histograms) {
+ Init(VIDEO_EVENT);
+ AdvanceClocks(base::TimeDelta::FromMilliseconds(123));
+
+ uint32 rtp_timestamp = 123;
+ uint32 frame_id = 0;
+
+ // 10 Frames with capture latency in the bucket of "10-14"ms.
+ // 10 Frames with encode time in the bucket of "15-19"ms.
+ for (int i = 0; i < 10; ++i) {
+ ++frame_id;
+ ++rtp_timestamp;
+ cast_environment_->Logging()->InsertFrameEvent(sender_clock_->NowTicks(),
+ FRAME_CAPTURE_BEGIN,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ frame_id);
+ AdvanceClocks(base::TimeDelta::FromMilliseconds(10));
+ cast_environment_->Logging()->InsertFrameEvent(sender_clock_->NowTicks(),
+ FRAME_CAPTURE_END,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ frame_id);
+ AdvanceClocks(base::TimeDelta::FromMilliseconds(15));
+ cast_environment_->Logging()->InsertEncodedFrameEvent(
+ sender_clock_->NowTicks(),
+ FRAME_ENCODED,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ frame_id,
+ 1024,
+ true,
+ 5678);
+ }
+
+ // Send 3 packets for the last frame.
+ // Queueing latencies are 100ms, 200ms and 300ms.
+ for (int i = 0; i < 3; ++i) {
+ AdvanceClocks(base::TimeDelta::FromMilliseconds(100));
+ cast_environment_->Logging()->InsertPacketEvent(sender_clock_->NowTicks(),
+ PACKET_SENT_TO_NETWORK,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ 0,
+ i,
+ 2,
+ 123);
+ }
+
+ // Receive 3 packets for the last frame.
+ // Network latencies are 100ms, 200ms and 300ms.
+ // Packet latencies are 400ms.
+ AdvanceClocks(base::TimeDelta::FromMilliseconds(100));
+ for (int i = 0; i < 3; ++i) {
+ cast_environment_->Logging()->InsertPacketEvent(receiver_clock_.NowTicks(),
+ PACKET_RECEIVED,
+ VIDEO_EVENT,
+ rtp_timestamp,
+ 0,
+ i,
+ 2,
+ 123);
+ }
+
+ StatsEventSubscriber::SimpleHistogram* histogram;
+ scoped_ptr<base::ListValue> values;
+
+ histogram = subscriber_->GetHistogramForTesting(
+ StatsEventSubscriber::CAPTURE_LATENCY_MS_HISTO);
+ ASSERT_TRUE(histogram);
+ values = histogram->GetHistogram().Pass();
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "10-14", 10));
+
+ histogram = subscriber_->GetHistogramForTesting(
+ StatsEventSubscriber::ENCODE_TIME_MS_HISTO);
+ ASSERT_TRUE(histogram);
+ values = histogram->GetHistogram().Pass();
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "15-19", 10));
+
+ histogram = subscriber_->GetHistogramForTesting(
+ StatsEventSubscriber::QUEUEING_LATENCY_MS_HISTO);
+ ASSERT_TRUE(histogram);
+ values = histogram->GetHistogram().Pass();
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1));
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "200-219", 1));
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "300-319", 1));
+
+ histogram = subscriber_->GetHistogramForTesting(
+ StatsEventSubscriber::NETWORK_LATENCY_MS_HISTO);
+ ASSERT_TRUE(histogram);
+ values = histogram->GetHistogram().Pass();
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1));
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "200-219", 1));
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "300-319", 1));
+
+ histogram = subscriber_->GetHistogramForTesting(
+ StatsEventSubscriber::PACKET_LATENCY_MS_HISTO);
+ ASSERT_TRUE(histogram);
+ values = histogram->GetHistogram().Pass();
+ EXPECT_TRUE(CheckHistogramHasValue(values.get(), "400-419", 3));
+}
+
} // namespace cast
} // namespace media
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index 4b61e0e..89fbfff 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -444,16 +444,13 @@
// The certificate claimed DNS names that are in violation of name constraints.
NET_ERROR(CERT_NAME_CONSTRAINT_VIOLATION, -212)
-// The certificate's validity period is too long.
-NET_ERROR(CERT_VALIDITY_TOO_LONG, -213)
-
// Add new certificate error codes here.
//
// Update the value of CERT_END whenever you add a new certificate error
// code.
// The value immediately past the last certificate error code.
-NET_ERROR(CERT_END, -214)
+NET_ERROR(CERT_END, -213)
// The URL is invalid.
NET_ERROR(INVALID_URL, -300)
diff --git a/net/cert/cert_status_flags.cc b/net/cert/cert_status_flags.cc
index e8d9aab..d278ea4 100644
--- a/net/cert/cert_status_flags.cc
+++ b/net/cert/cert_status_flags.cc
@@ -49,8 +49,6 @@
return CERT_STATUS_PINNED_KEY_MISSING;
case ERR_CERT_NAME_CONSTRAINT_VIOLATION:
return CERT_STATUS_NAME_CONSTRAINT_VIOLATION;
- case ERR_CERT_VALIDITY_TOO_LONG:
- return CERT_STATUS_VALIDITY_TOO_LONG;
default:
return 0;
}
@@ -83,8 +81,6 @@
return ERR_CERT_WEAK_KEY;
if (cert_status & CERT_STATUS_DATE_INVALID)
return ERR_CERT_DATE_INVALID;
- if (cert_status & CERT_STATUS_VALIDITY_TOO_LONG)
- return ERR_CERT_VALIDITY_TOO_LONG;
// Unknown status. Give it the benefit of the doubt.
if (cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION)
diff --git a/net/cert/cert_status_flags_list.h b/net/cert/cert_status_flags_list.h
index 932e938..c660a7b 100644
--- a/net/cert/cert_status_flags_list.h
+++ b/net/cert/cert_status_flags_list.h
@@ -24,7 +24,6 @@
// 1 << 12 was used for CERT_STATUS_WEAK_DH_KEY
CERT_STATUS_FLAG(PINNED_KEY_MISSING, 1 << 13)
CERT_STATUS_FLAG(NAME_CONSTRAINT_VIOLATION, 1 << 14)
-CERT_STATUS_FLAG(VALIDITY_TOO_LONG, 1 << 15)
// Bits 16 to 31 are for non-error statuses.
CERT_STATUS_FLAG(IS_EV, 1 << 16)
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 981bea0..222ba47 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -4,13 +4,10 @@
#include "net/cert/cert_verify_proc.h"
-#include <stdint.h>
-
#include "base/basictypes.h"
#include "base/metrics/histogram.h"
#include "base/sha1.h"
#include "base/strings/stringprintf.h"
-#include "base/time/time.h"
#include "build/build_config.h"
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
@@ -36,6 +33,7 @@
#error Implement certificate verification.
#endif
+
namespace net {
namespace {
@@ -278,13 +276,6 @@
// now treat it as a warning and do not map it to an error return value.
}
- // Flag certificates using too long validity periods.
- if (verify_result->is_issued_by_known_root && HasTooLongValidity(*cert)) {
- verify_result->cert_status |= CERT_STATUS_VALIDITY_TOO_LONG;
- if (rv == OK)
- rv = MapCertStatusToNetError(verify_result->cert_status);
- }
-
return rv;
}
@@ -623,41 +614,4 @@
return false;
}
-// static
-bool CertVerifyProc::HasTooLongValidity(const X509Certificate& cert) {
- const base::Time& start = cert.valid_start();
- const base::Time& expiry = cert.valid_expiry();
- if (start.is_max() || start.is_null() || expiry.is_max() ||
- expiry.is_null() || start > expiry) {
- return true;
- }
-
- base::Time::Exploded exploded_start;
- base::Time::Exploded exploded_expiry;
- cert.valid_start().UTCExplode(&exploded_start);
- cert.valid_expiry().UTCExplode(&exploded_expiry);
-
- if (exploded_expiry.year - exploded_start.year > 10)
- return true;
- int month_diff = (exploded_expiry.year - exploded_start.year) * 12 +
- (exploded_expiry.month - exploded_start.month);
-
- // Add any remainder as a full month.
- if (exploded_expiry.day_of_month > exploded_start.day_of_month)
- ++month_diff;
-
- static const base::Time time_2015_04_01 =
- base::Time::FromInternalValue(INT64_C(1427871600));
- static const base::Time time_2012_07_01 =
- base::Time::FromInternalValue(INT64_C(1341126000));
- static const base::Time time_2019_07_01 =
- base::Time::FromInternalValue(INT64_C(1561964400));
-
- if (start >= time_2015_04_01)
- return month_diff > 39;
- if (start >= time_2012_07_01)
- return month_diff > 60;
- return month_diff > 120 || expiry > time_2019_07_01;
-}
-
} // namespace net
diff --git a/net/cert/cert_verify_proc.h b/net/cert/cert_verify_proc.h
index f60ed6d..95e464e 100644
--- a/net/cert/cert_verify_proc.h
+++ b/net/cert/cert_verify_proc.h
@@ -73,7 +73,6 @@
private:
friend class base::RefCountedThreadSafe<CertVerifyProc>;
FRIEND_TEST_ALL_PREFIXES(CertVerifyProcTest, DigiNotarCerts);
- FRIEND_TEST_ALL_PREFIXES(CertVerifyProcTest, TestHasTooLongValidity);
// Performs the actual verification using the desired underlying
// cryptographic library.
@@ -100,18 +99,6 @@
const std::vector<std::string>& dns_names,
const std::vector<std::string>& ip_addrs);
- // The CA/Browser Forum's Baseline Requirements specify maximum validity
- // periods (https://cabforum.org/Baseline_Requirements_V1.pdf):
- //
- // For certificates issued after 1 July 2012: 60 months.
- // For certificates issued after 1 April 2015: 39 months.
- //
- // For certificates issued before the BRs took effect, there were no
- // guidelines, but clamp them at a maximum of 10 year validity, with the
- // requirement they expire within 7 years after the effective date of the BRs
- // (i.e. by 1 July 2019).
- static bool HasTooLongValidity(const X509Certificate& cert);
-
DISALLOW_COPY_AND_ASSIGN(CertVerifyProc);
};
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index a004f98..10a880b 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -615,36 +615,16 @@
verify_result.cert_status & CERT_STATUS_NAME_CONSTRAINT_VIOLATION);
}
-TEST_F(CertVerifyProcTest, TestHasTooLongValidity) {
- base::FilePath certs_dir = GetTestCertsDirectory();
-
- scoped_refptr<X509Certificate> twitter =
- ImportCertFromFile(certs_dir, "twitter-chain.pem");
- EXPECT_FALSE(CertVerifyProc::HasTooLongValidity(*twitter));
-
- scoped_refptr<X509Certificate> eleven_years =
- ImportCertFromFile(certs_dir, "11_year_validity.pem");
- EXPECT_TRUE(CertVerifyProc::HasTooLongValidity(*eleven_years));
-
- scoped_refptr<X509Certificate> forty_months =
- ImportCertFromFile(certs_dir, "40_months_after_2015_04.pem");
- EXPECT_TRUE(CertVerifyProc::HasTooLongValidity(*forty_months));
-
- scoped_refptr<X509Certificate> sixty_one_months =
- ImportCertFromFile(certs_dir, "61_months_after_2012_07.pem");
- EXPECT_TRUE(CertVerifyProc::HasTooLongValidity(*sixty_one_months));
-}
-
TEST_F(CertVerifyProcTest, TestKnownRoot) {
if (!SupportsDetectingKnownRoots()) {
- LOG(INFO) << "Skipping this test on this platform.";
+ LOG(INFO) << "Skipping this test in this platform.";
return;
}
base::FilePath certs_dir = GetTestCertsDirectory();
CertificateList certs = CreateCertificateListFromFile(
- certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO);
- ASSERT_EQ(3U, certs.size());
+ certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO);
+ ASSERT_EQ(2U, certs.size());
X509Certificate::OSCertHandles intermediates;
intermediates.push_back(certs[1]->os_cert_handle());
@@ -655,18 +635,20 @@
int flags = 0;
CertVerifyResult verify_result;
- // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug
+ // This will blow up, May 24th, 2019. Sorry! Please disable and file a bug
// against agl. See also PublicKeyHashes.
int error = Verify(cert_chain.get(),
- "twitter.com",
+ "satveda.com",
flags,
NULL,
empty_cert_list_,
&verify_result);
EXPECT_EQ(OK, error);
+ EXPECT_EQ(CERT_STATUS_SHA1_SIGNATURE_PRESENT, verify_result.cert_status);
EXPECT_TRUE(verify_result.is_issued_by_known_root);
}
+// The certse.pem certificate has been revoked. crbug.com/259723.
TEST_F(CertVerifyProcTest, PublicKeyHashes) {
if (!SupportsReturningVerifiedChain()) {
LOG(INFO) << "Skipping this test in this platform.";
@@ -675,8 +657,8 @@
base::FilePath certs_dir = GetTestCertsDirectory();
CertificateList certs = CreateCertificateListFromFile(
- certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO);
- ASSERT_EQ(3U, certs.size());
+ certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO);
+ ASSERT_EQ(2U, certs.size());
X509Certificate::OSCertHandles intermediates;
intermediates.push_back(certs[1]->os_cert_handle());
@@ -687,16 +669,17 @@
int flags = 0;
CertVerifyResult verify_result;
- // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug
+ // This will blow up, May 24th, 2019. Sorry! Please disable and file a bug
// against agl. See also TestKnownRoot.
int error = Verify(cert_chain.get(),
- "twitter.com",
+ "satveda.com",
flags,
NULL,
empty_cert_list_,
&verify_result);
EXPECT_EQ(OK, error);
- ASSERT_LE(3U, verify_result.public_key_hashes.size());
+ EXPECT_EQ(CERT_STATUS_SHA1_SIGNATURE_PRESENT, verify_result.cert_status);
+ ASSERT_LE(2U, verify_result.public_key_hashes.size());
HashValueVector sha1_hashes;
for (size_t i = 0; i < verify_result.public_key_hashes.size(); ++i) {
@@ -704,10 +687,10 @@
continue;
sha1_hashes.push_back(verify_result.public_key_hashes[i]);
}
- ASSERT_LE(3u, sha1_hashes.size());
+ ASSERT_LE(2u, sha1_hashes.size());
- for (size_t i = 0; i < 3; ++i) {
- EXPECT_EQ(HexEncode(kTwitterSPKIs[i], base::kSHA1Length),
+ for (size_t i = 0; i < 2; ++i) {
+ EXPECT_EQ(HexEncode(kSatvedaSPKIs[i], base::kSHA1Length),
HexEncode(sha1_hashes[i].data(), base::kSHA1Length));
}
@@ -717,10 +700,10 @@
continue;
sha256_hashes.push_back(verify_result.public_key_hashes[i]);
}
- ASSERT_LE(3u, sha256_hashes.size());
+ ASSERT_LE(2u, sha256_hashes.size());
- for (size_t i = 0; i < 3; ++i) {
- EXPECT_EQ(HexEncode(kTwitterSPKIsSHA256[i], crypto::kSHA256Length),
+ for (size_t i = 0; i < 2; ++i) {
+ EXPECT_EQ(HexEncode(kSatvedaSPKIsSHA256[i], crypto::kSHA256Length),
HexEncode(sha256_hashes[i].data(), crypto::kSHA256Length));
}
}
@@ -827,7 +810,7 @@
}
CertificateList cert_list = CreateCertificateListFromFile(
- GetTestCertsDirectory(), "reject_intranet_hosts.pem",
+ GetTestCertsDirectory(), "ok_cert.pem",
X509Certificate::FORMAT_AUTO);
ASSERT_EQ(1U, cert_list.size());
scoped_refptr<X509Certificate> cert(cert_list[0]);
diff --git a/net/data/ssl/certificates/11_year_validity.pem b/net/data/ssl/certificates/11_year_validity.pem
deleted file mode 100644
index 742da09..0000000
--- a/net/data/ssl/certificates/11_year_validity.pem
+++ /dev/null
@@ -1,81 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 5 (0x5)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: CN=Test Root CA
- Validity
- Not Before: Oct 30 00:00:00 2014 GMT
- Not After : Oct 27 19:26:19 2025 GMT
- Subject: CN=xn--wgv71a119e.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:bc:20:51:b0:06:00:cb:4d:f0:82:41:9e:a7:df:
- e0:15:cf:bc:e5:4b:13:5c:19:51:9d:6c:18:9b:e6:
- 77:4e:94:01:64:41:57:33:0d:9b:67:23:2d:8c:22:
- 3f:c2:a1:db:d0:ec:20:af:88:95:29:62:0c:74:76:
- fc:5b:26:d6:6d:f7:36:cf:b2:ed:64:5d:cc:c0:f6:
- 54:3a:c3:89:b1:2a:6f:28:c9:11:05:74:f4:3e:bc:
- 1f:e2:e6:04:ab:ad:8f:59:05:f2:03:3d:8e:fb:0c:
- 9d:18:c1:12:f8:60:98:b3:e2:a5:ba:00:59:e5:e4:
- 19:a1:d9:3b:b1:0a:77:10:e2:72:90:0e:93:50:d8:
- b2:f9:39:4b:14:80:4a:18:93:c8:d7:fb:b3:32:0c:
- af:c7:f3:d1:d5:48:87:9f:8f:ef:ff:8c:13:61:a5:
- 17:32:9d:63:91:c6:93:e9:7c:66:ad:27:b7:9a:fa:
- 49:b8:4c:68:c6:ff:18:94:62:4a:f5:03:e4:20:5a:
- 7b:96:fd:d6:76:a7:73:9a:e6:ac:1e:9c:83:de:5c:
- ce:7d:67:2d:71:ad:33:fc:7e:ba:4a:1d:15:22:32:
- 05:9c:65:c5:9d:fa:a5:16:9e:d2:85:fc:c7:a1:cb:
- ca:84:d2:bb:8d:11:7b:c3:0c:5f:e5:25:c3:4c:a2:
- cb:cb
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints: critical
- CA:FALSE
- X509v3 Subject Key Identifier:
- C1:6A:E8:21:0E:C3:F4:D7:73:21:43:E3:B1:FA:65:2C:6F:2D:46:01
- X509v3 Authority Key Identifier:
- keyid:CC:56:4D:CF:92:F0:A5:B8:36:08:B0:46:B5:84:E2:4A:00:56:20:57
-
- X509v3 Extended Key Usage:
- TLS Web Server Authentication, TLS Web Client Authentication
- X509v3 Subject Alternative Name:
- IP Address:127.0.0.1
- Signature Algorithm: sha256WithRSAEncryption
- d0:30:42:a6:35:ce:60:1c:10:56:d0:de:14:d2:8e:6b:97:4b:
- 0c:bc:5b:a0:ad:95:99:c1:a3:0b:61:06:e2:7b:7d:4f:94:09:
- f1:d6:ca:2f:c9:c6:b3:96:4c:3e:0b:be:15:b2:1d:85:7c:f7:
- c4:02:33:e5:c5:1b:99:c5:24:a6:34:e1:19:53:ff:7e:5b:0c:
- be:cf:b7:32:86:6c:91:8a:ee:db:8e:ad:44:cf:d7:bc:97:a3:
- ff:aa:d0:73:52:21:63:e1:7e:1e:06:58:c1:ac:76:ee:67:a8:
- 37:bd:a6:51:3d:53:ec:f5:a9:a3:e0:b1:3b:d3:7e:f7:2d:4e:
- 91:b0:77:a5:40:47:98:d9:04:66:83:71:dd:6f:91:f4:e7:6e:
- f4:3c:89:a9:65:51:82:ac:43:f0:c0:e7:cf:4f:17:40:dd:10:
- 22:d7:e1:37:2d:44:31:d0:d7:d6:73:9f:83:ce:69:bd:50:0e:
- e3:12:e4:21:84:da:ca:e0:10:5e:7c:4d:48:d4:72:49:d9:cd:
- 35:d3:34:92:d0:4c:a6:33:cc:a5:a4:a0:03:fe:0f:37:1b:f6:
- 59:aa:8d:c1:3a:0d:b7:f0:dc:d9:0d:b4:a8:8a:eb:d3:b1:e4:
- d0:56:bf:99:6a:f4:a1:09:ff:6e:fd:c0:78:02:03:51:54:ee:
- 3a:a7:5e:3f
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgIBBTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQxMDMwMDAwMDAwWhcNMjUxMDI3MTkyNjE5WjAdMRswGQYD
-VQQDDBJ4bi0td2d2NzFhMTE5ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQC8IFGwBgDLTfCCQZ6n3+AVz7zlSxNcGVGdbBib5ndOlAFkQVczDZtn
-Iy2MIj/CodvQ7CCviJUpYgx0dvxbJtZt9zbPsu1kXczA9lQ6w4mxKm8oyREFdPQ+
-vB/i5gSrrY9ZBfIDPY77DJ0YwRL4YJiz4qW6AFnl5Bmh2TuxCncQ4nKQDpNQ2LL5
-OUsUgEoYk8jX+7MyDK/H89HVSIefj+//jBNhpRcynWORxpPpfGatJ7ea+km4TGjG
-/xiUYkr1A+QgWnuW/dZ2p3Oa5qwenIPeXM59Zy1xrTP8frpKHRUiMgWcZcWd+qUW
-ntKF/Mehy8qE0ruNEXvDDF/lJcNMosvLAgMBAAGjgYAwfjAMBgNVHRMBAf8EAjAA
-MB0GA1UdDgQWBBTBaughDsP013MhQ+Ox+mUsby1GATAfBgNVHSMEGDAWgBTMVk3P
-kvCluDYIsEa1hOJKAFYgVzAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
-DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEA0DBCpjXOYBwQVtDe
-FNKOa5dLDLxboK2VmcGjC2EG4nt9T5QJ8dbKL8nGs5ZMPgu+FbIdhXz3xAIz5cUb
-mcUkpjThGVP/flsMvs+3MoZskYru246tRM/XvJej/6rQc1IhY+F+HgZYwax27meo
-N72mUT1T7PWpo+CxO9N+9y1OkbB3pUBHmNkEZoNx3W+R9Odu9DyJqWVRgqxD8MDn
-z08XQN0QItfhNy1EMdDX1nOfg85pvVAO4xLkIYTayuAQXnxNSNRySdnNNdM0ktBM
-pjPMpaSgA/4PNxv2WaqNwToNt/Dc2Q20qIrr07Hk0Fa/mWr0oQn/bv3AeAIDUVTu
-OqdePw==
------END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/40_months_after_2015_04.pem b/net/data/ssl/certificates/40_months_after_2015_04.pem
deleted file mode 100644
index 34128a9..0000000
--- a/net/data/ssl/certificates/40_months_after_2015_04.pem
+++ /dev/null
@@ -1,81 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 6 (0x6)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: CN=Test Root CA
- Validity
- Not Before: Apr 2 00:00:00 2015 GMT
- Not After : Sep 1 00:00:00 2018 GMT
- Subject: CN=xn--wgv71a119e.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:c1:86:e0:72:bf:df:69:da:78:b1:87:99:03:40:
- 19:d1:8b:a9:a3:80:2e:75:25:27:c7:bc:dd:4b:8c:
- 8d:11:b1:dd:24:68:12:8d:46:b8:45:19:fc:24:e8:
- 2a:15:21:84:9d:a2:08:6b:3e:38:34:3f:29:00:5f:
- 04:68:ed:33:4e:35:41:c3:06:54:f3:41:8b:61:83:
- 3e:1b:78:59:6b:d2:c3:83:ea:16:99:1f:a7:1c:13:
- 34:b5:25:c6:01:6d:34:b5:90:0f:7c:70:f0:ab:18:
- 0c:59:a8:7f:ec:20:21:a7:7e:3b:b9:0c:bb:ef:a9:
- ce:1b:75:6d:ac:23:c1:56:c1:28:95:70:85:99:a3:
- 94:86:ee:c6:45:97:af:29:e1:86:ee:b6:b3:95:97:
- 4e:38:9a:03:a8:50:a8:21:ae:48:ae:dd:9a:89:0c:
- 81:c6:98:b1:07:5f:55:44:26:6a:3a:cb:8c:d4:07:
- 67:71:5d:b1:33:25:2a:ef:f8:af:6b:72:78:f1:9b:
- 95:c6:3e:0c:57:77:5f:63:1f:99:1d:b0:a3:ac:f6:
- 7d:65:04:7d:aa:f2:99:b9:6f:e7:75:01:34:ec:c5:
- 60:b0:c1:bc:c1:f0:d9:10:28:fb:10:ac:ad:3f:ba:
- 2f:40:96:c7:59:57:d8:f0:f2:c2:3d:96:bf:86:1f:
- 95:55
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints: critical
- CA:FALSE
- X509v3 Subject Key Identifier:
- DF:3C:D7:74:E3:7F:2B:EC:C9:44:98:6A:8B:E8:9B:46:23:9B:A4:3C
- X509v3 Authority Key Identifier:
- keyid:98:AF:9A:51:3C:AB:23:88:17:DB:39:AB:FA:17:91:96:8B:83:C5:F1
-
- X509v3 Extended Key Usage:
- TLS Web Server Authentication, TLS Web Client Authentication
- X509v3 Subject Alternative Name:
- IP Address:127.0.0.1
- Signature Algorithm: sha256WithRSAEncryption
- 45:0b:b9:a7:3d:d4:a7:c9:0e:d8:a1:df:bf:e0:93:26:c1:da:
- 48:ac:70:3b:15:82:30:c9:4d:0f:02:fc:ba:03:24:ab:df:10:
- 47:8e:14:ab:e9:20:95:91:56:41:bd:0c:2e:c9:7c:61:d9:69:
- 6c:9f:fb:25:eb:34:d4:7a:70:9c:36:ba:64:80:8b:4a:c4:8c:
- 23:92:8b:7c:b5:47:e9:f7:37:4c:e0:db:22:ad:67:d0:66:b6:
- 9e:01:9e:9f:6e:63:e1:5d:97:90:3f:e0:5c:4c:d5:f5:23:11:
- b1:2e:db:c9:79:0f:37:7a:78:67:86:87:14:1b:ab:5b:65:67:
- 61:44:ab:43:c5:6e:19:83:99:64:23:d5:61:bc:4c:36:a2:59:
- 88:4a:69:18:57:33:c5:38:22:4b:33:64:77:43:81:47:55:f2:
- b2:0f:dc:d3:0e:62:4f:19:6b:6b:89:37:33:3b:6a:d5:15:b6:
- be:7f:03:ad:88:d2:e2:8e:9e:77:44:39:8e:93:b4:87:87:f6:
- 5a:5a:d1:20:94:cc:de:d9:9d:5c:7f:42:dd:81:ce:fa:77:23:
- 05:11:bd:8c:2e:06:c3:94:65:cf:8f:9b:db:9a:58:d7:e7:36:
- ff:49:4a:9c:99:c7:3a:9a:d1:32:bb:a4:66:d2:80:7d:80:d7:
- c9:1d:d7:e7
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgIBBjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUwNDAyMDAwMDAwWhcNMTgwOTAxMDAwMDAwWjAdMRswGQYD
-VQQDDBJ4bi0td2d2NzFhMTE5ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDBhuByv99p2nixh5kDQBnRi6mjgC51JSfHvN1LjI0Rsd0kaBKNRrhF
-Gfwk6CoVIYSdoghrPjg0PykAXwRo7TNONUHDBlTzQYthgz4beFlr0sOD6haZH6cc
-EzS1JcYBbTS1kA98cPCrGAxZqH/sICGnfju5DLvvqc4bdW2sI8FWwSiVcIWZo5SG
-7sZFl68p4YbutrOVl044mgOoUKghrkiu3ZqJDIHGmLEHX1VEJmo6y4zUB2dxXbEz
-JSrv+K9rcnjxm5XGPgxXd19jH5kdsKOs9n1lBH2q8pm5b+d1ATTsxWCwwbzB8NkQ
-KPsQrK0/ui9AlsdZV9jw8sI9lr+GH5VVAgMBAAGjgYAwfjAMBgNVHRMBAf8EAjAA
-MB0GA1UdDgQWBBTfPNd0438r7MlEmGqL6JtGI5ukPDAfBgNVHSMEGDAWgBSYr5pR
-PKsjiBfbOav6F5GWi4PF8TAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
-DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEARQu5pz3Up8kO2KHf
-v+CTJsHaSKxwOxWCMMlNDwL8ugMkq98QR44Uq+kglZFWQb0MLsl8YdlpbJ/7Jes0
-1HpwnDa6ZICLSsSMI5KLfLVH6fc3TODbIq1n0Ga2ngGen25j4V2XkD/gXEzV9SMR
-sS7byXkPN3p4Z4aHFBurW2VnYUSrQ8VuGYOZZCPVYbxMNqJZiEppGFczxTgiSzNk
-d0OBR1Xysg/c0w5iTxlra4k3Mztq1RW2vn8DrYjS4o6ed0Q5jpO0h4f2WlrRIJTM
-3tmdXH9C3YHO+ncjBRG9jC4Gw5Rlz4+b25pY1+c2/0lKnJnHOprRMrukZtKAfYDX
-yR3X5w==
------END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/61_months_after_2012_07.pem b/net/data/ssl/certificates/61_months_after_2012_07.pem
deleted file mode 100644
index 49dc04e..0000000
--- a/net/data/ssl/certificates/61_months_after_2012_07.pem
+++ /dev/null
@@ -1,81 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 7 (0x7)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: CN=Test Root CA
- Validity
- Not Before: Oct 30 00:00:00 2014 GMT
- Not After : Nov 3 19:26:20 2019 GMT
- Subject: CN=xn--wgv71a119e.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:ca:83:f9:aa:c5:28:81:20:c9:a9:62:66:9b:10:
- 75:c1:e7:9a:15:5b:ef:13:ce:c6:d1:aa:be:23:7b:
- ca:28:7b:bc:62:27:4a:9d:16:e0:ac:db:07:54:f1:
- 3a:79:4f:24:4d:52:2c:35:12:aa:fd:cb:f7:98:5d:
- 40:03:56:01:36:b1:1a:34:71:9c:98:5d:76:96:2f:
- 91:ca:9f:49:e2:f0:1e:86:fc:d3:66:37:1a:27:b4:
- db:4d:b3:ca:85:04:59:b5:2f:35:32:d5:59:a6:31:
- f5:85:35:63:88:e5:0a:1b:3b:9a:7c:29:e2:6d:b3:
- ed:23:19:36:6d:62:fd:be:77:10:cc:69:2d:32:ce:
- 98:59:29:ec:e4:27:e9:c2:ae:86:79:37:76:cb:ba:
- ee:86:5f:39:02:25:b2:50:aa:43:7e:77:fe:03:16:
- d1:05:56:b5:31:a0:0b:41:88:3e:69:b4:b9:89:70:
- d1:e5:7d:a7:77:ed:8d:13:db:20:3b:4b:c0:a0:6e:
- 48:61:47:c2:6f:57:f4:4a:ac:bd:28:e3:0f:e4:40:
- 3f:a3:05:86:46:1a:95:13:d1:be:76:69:92:d5:6b:
- 71:59:1d:a0:fc:b7:4c:9a:e6:2b:f6:82:50:a9:35:
- 19:9b:b4:3c:0d:0b:7a:10:0e:3d:84:2f:c3:68:61:
- 2f:03
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints: critical
- CA:FALSE
- X509v3 Subject Key Identifier:
- 74:7C:2F:56:AE:BF:08:E2:6F:5B:D4:6C:B0:4C:04:3F:11:59:15:0E
- X509v3 Authority Key Identifier:
- keyid:CC:56:4D:CF:92:F0:A5:B8:36:08:B0:46:B5:84:E2:4A:00:56:20:57
-
- X509v3 Extended Key Usage:
- TLS Web Server Authentication, TLS Web Client Authentication
- X509v3 Subject Alternative Name:
- IP Address:127.0.0.1
- Signature Algorithm: sha256WithRSAEncryption
- 19:42:64:03:f7:2a:90:ee:82:93:de:69:49:28:32:42:ba:db:
- 37:16:0d:db:b3:81:ad:50:a8:b2:f7:20:35:e4:bb:89:7d:f3:
- e5:75:7f:3e:bd:41:05:24:eb:5a:94:18:cc:c4:ac:d2:0a:24:
- 39:4b:2e:6d:a4:2f:99:6b:19:9e:c8:44:53:3f:15:52:c7:51:
- af:37:64:a2:d7:27:74:72:6a:d0:cc:c0:ac:8b:7e:7c:0c:f1:
- ee:e9:bf:03:19:20:e3:44:88:56:a2:1f:36:59:7f:35:22:13:
- d1:48:a0:7a:59:16:85:df:31:e9:30:ae:df:54:b7:8b:78:a8:
- 20:27:5c:cc:0c:8b:43:65:4f:71:41:c2:5b:42:4a:a7:1b:f8:
- 44:e3:6b:50:1f:85:0f:e3:30:9a:5f:01:8a:19:80:b1:9d:d8:
- 34:c4:54:87:ff:ad:8a:56:d7:3b:9f:13:dd:0c:a5:b7:0d:a9:
- a8:66:91:4a:0e:d4:7d:5c:40:39:5a:12:e1:ab:fc:88:9f:b7:
- 26:c7:11:f0:1b:7d:2d:29:77:20:97:0c:ea:14:d4:24:13:9f:
- 8f:b2:49:eb:3b:2b:79:d3:d2:ef:65:82:d7:75:09:26:61:9b:
- ef:45:0d:95:65:1b:42:76:f6:db:98:fa:3f:45:c0:7b:8d:94:
- 9a:62:8a:88
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgIBBzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQxMDMwMDAwMDAwWhcNMTkxMTAzMTkyNjIwWjAdMRswGQYD
-VQQDDBJ4bi0td2d2NzFhMTE5ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDKg/mqxSiBIMmpYmabEHXB55oVW+8TzsbRqr4je8ooe7xiJ0qdFuCs
-2wdU8Tp5TyRNUiw1Eqr9y/eYXUADVgE2sRo0cZyYXXaWL5HKn0ni8B6G/NNmNxon
-tNtNs8qFBFm1LzUy1VmmMfWFNWOI5QobO5p8KeJts+0jGTZtYv2+dxDMaS0yzphZ
-KezkJ+nCroZ5N3bLuu6GXzkCJbJQqkN+d/4DFtEFVrUxoAtBiD5ptLmJcNHlfad3
-7Y0T2yA7S8CgbkhhR8JvV/RKrL0o4w/kQD+jBYZGGpUT0b52aZLVa3FZHaD8t0ya
-5iv2glCpNRmbtDwNC3oQDj2EL8NoYS8DAgMBAAGjgYAwfjAMBgNVHRMBAf8EAjAA
-MB0GA1UdDgQWBBR0fC9Wrr8I4m9b1GywTAQ/EVkVDjAfBgNVHSMEGDAWgBTMVk3P
-kvCluDYIsEa1hOJKAFYgVzAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
-DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAGUJkA/cqkO6Ck95p
-SSgyQrrbNxYN27OBrVCosvcgNeS7iX3z5XV/Pr1BBSTrWpQYzMSs0gokOUsubaQv
-mWsZnshEUz8VUsdRrzdkotcndHJq0MzArIt+fAzx7um/Axkg40SIVqIfNll/NSIT
-0UigelkWhd8x6TCu31S3i3ioICdczAyLQ2VPcUHCW0JKpxv4RONrUB+FD+Mwml8B
-ihmAsZ3YNMRUh/+tilbXO58T3Qyltw2pqGaRSg7UfVxAOVoS4av8iJ+3JscR8Bt9
-LSl3IJcM6hTUJBOfj7JJ6zsredPS72WC13UJJmGb70UNlWUbQnb225j6P0XAe42U
-mmKKiA==
------END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/README b/net/data/ssl/certificates/README
index c9e1dc5..5d1faf2 100644
--- a/net/data/ssl/certificates/README
+++ b/net/data/ssl/certificates/README
@@ -129,8 +129,8 @@
- expired_cert.pem
- ok_cert.pem
- root_ca_cert.pem
- These certificates are the common certificates used by the Python test
- server for simulating HTTPS connections.
+ These certificates are the common certificates used by the Python test
+ server for simulating HTTPS connections.
- name_constraint_bad.pem
- name_constraint_good.pem
@@ -147,12 +147,6 @@
- punycodetest.pem : A test self-signed server certificate with punycode name.
The common name is "xn--wgv71a119e.com" (日本語.com)
-- 40_months_after_2015_04.pem
-- 61_months_after_2012_07.pem
-- 11_year_validity.pem
- Certs to test that the maximum validity durations set by the CA/Browser
- Forum Baseline Requirements are enforced.
-
===== From net/data/ssl/scripts/generate-weak-test-chains.sh
- 2048-rsa-root.pem
- {768-rsa,1024-rsa,2048-rsa,prime256v1-ecdsa}-intermediate.pem
@@ -258,3 +252,5 @@
containing the intermediate, which can be served via a URLRequestFilter.
aia-intermediate.der is stored in DER form for convenience, since that is
the form expected of certificates discovered via AIA.
+
+
diff --git a/net/data/ssl/certificates/reject_intranet_hosts.pem b/net/data/ssl/certificates/reject_intranet_hosts.pem
deleted file mode 100644
index d5040cc..0000000
--- a/net/data/ssl/certificates/reject_intranet_hosts.pem
+++ /dev/null
@@ -1,69 +0,0 @@
-Certificate:
- Data:
- Version: 1 (0x0)
- Serial Number: 15207369410964614739 (0xd30b6de83cafee53)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
- Validity
- Not Before: Oct 31 19:51:55 2014 GMT
- Not After : Oct 30 19:51:55 2017 GMT
- Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:a0:5c:e4:0d:5d:e4:01:47:d8:8c:06:41:12:f8:
- 63:a9:d9:41:3d:e9:75:ad:80:ae:e9:32:2a:d6:6a:
- 42:7c:be:f5:1b:02:99:36:a4:dd:02:db:32:36:ab:
- ac:8b:c5:78:cb:a2:03:28:db:95:83:56:9a:03:f4:
- 37:70:dc:16:56:d9:0a:c6:34:23:f5:58:36:21:c8:
- fd:b7:41:1e:2f:85:50:50:d9:76:c0:7d:9e:0d:d7:
- ad:df:94:06:c1:b6:a4:c9:ee:61:16:5a:54:c2:1d:
- 5e:d9:79:73:4a:21:d0:d3:fe:88:ee:27:3a:5f:e6:
- a3:cf:89:44:93:80:64:53:50:36:98:c5:da:1f:87:
- 1e:a1:2e:e0:5a:60:c7:80:a7:93:eb:b8:39:33:c3:
- d7:e7:2b:bd:9b:48:5d:a4:af:ee:7d:93:5a:d0:9f:
- 3b:6d:a8:52:95:ce:d1:bf:0b:a4:60:34:ee:77:80:
- 50:35:0d:af:eb:0f:48:69:ab:c7:87:a8:31:44:69:
- 9c:21:d6:01:de:61:04:95:a4:85:d0:d6:2e:a6:7c:
- d1:fd:61:45:51:fd:bb:bc:be:6b:d3:87:54:50:b8:
- 36:f8:f0:0f:a4:07:e0:28:86:13:5b:72:ae:5d:b3:
- a2:fa:b7:54:8d:c9:6a:b3:82:88:4f:40:6d:36:1a:
- f5:2d
- Exponent: 65537 (0x10001)
- Signature Algorithm: sha256WithRSAEncryption
- 47:0d:cd:15:ec:51:89:2f:e0:d1:4e:04:7a:8e:cf:f5:16:ec:
- 11:55:bc:48:92:3b:98:60:ba:f1:97:98:a7:22:bf:9e:00:ac:
- 4a:5b:a7:e1:b5:aa:b7:20:c5:fc:85:d5:3f:cf:53:da:60:94:
- 75:93:78:87:e0:99:d7:f0:c7:35:e5:6d:82:f7:e7:23:e1:fe:
- 88:4d:f0:bf:3b:68:70:61:c1:e8:8d:e1:2a:c9:75:c9:28:66:
- 71:79:ff:58:a7:79:c3:1c:97:db:9c:3c:25:84:e0:c2:da:77:
- 08:9e:4e:9a:5a:c8:48:83:fe:74:41:73:13:46:c2:69:27:31:
- 71:d9:7d:40:46:43:59:6d:cd:54:d8:63:44:5b:5f:22:b9:8e:
- 2b:ba:99:d1:38:89:0c:ac:b8:f2:c2:b9:a2:67:ae:3d:56:b6:
- c7:c0:cd:4c:e6:70:ce:8e:50:67:3c:93:c5:20:c2:45:66:e5:
- 79:7b:29:54:0e:fc:eb:39:75:51:54:5d:fc:69:ad:80:dc:88:
- b0:6c:be:0c:e4:9f:e3:81:3c:aa:6b:b6:a6:34:b6:1e:f7:a9:
- 8a:3f:bd:3f:2e:e4:da:c0:27:cb:50:fd:8a:7f:44:bd:a3:70:
- ad:4e:e4:1b:16:9a:fd:82:4d:55:26:06:ca:c7:25:49:fc:2b:
- 9e:54:87:7f
------BEGIN CERTIFICATE-----
-MIIDPDCCAiQCCQDTC23oPK/uUzANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJV
-UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQ
-MA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTE0MTAzMTE5
-NTE1NVoXDTE3MTAzMDE5NTE1NVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
-bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
-Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKBc5A1d5AFH2IwGQRL4Y6nZQT3pda2ArukyKtZqQny+9RsCmTak3QLb
-MjarrIvFeMuiAyjblYNWmgP0N3DcFlbZCsY0I/VYNiHI/bdBHi+FUFDZdsB9ng3X
-rd+UBsG2pMnuYRZaVMIdXtl5c0oh0NP+iO4nOl/mo8+JRJOAZFNQNpjF2h+HHqEu
-4Fpgx4Cnk+u4OTPD1+crvZtIXaSv7n2TWtCfO22oUpXO0b8LpGA07neAUDUNr+sP
-SGmrx4eoMURpnCHWAd5hBJWkhdDWLqZ80f1hRVH9u7y+a9OHVFC4NvjwD6QH4CiG
-E1tyrl2zovq3VI3JarOCiE9AbTYa9S0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA
-Rw3NFexRiS/g0U4Eeo7P9RbsEVW8SJI7mGC68ZeYpyK/ngCsSlun4bWqtyDF/IXV
-P89T2mCUdZN4h+CZ1/DHNeVtgvfnI+H+iE3wvztocGHB6I3hKsl1yShmcXn/WKd5
-wxyX25w8JYTgwtp3CJ5OmlrISIP+dEFzE0bCaScxcdl9QEZDWW3NVNhjRFtfIrmO
-K7qZ0TiJDKy48sK5omeuPVa2x8DNTOZwzo5QZzyTxSDCRWbleXspVA786zl1UVRd
-/GmtgNyIsGy+DOSf44E8qmu2pjS2Hvepij+9Py7k2sAny1D9in9EvaNwrU7kGxaa
-/YJNVSYGysclSfwrnlSHfw==
------END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/satveda.pem b/net/data/ssl/certificates/satveda.pem
new file mode 100644
index 0000000..4f79703
--- /dev/null
+++ b/net/data/ssl/certificates/satveda.pem
@@ -0,0 +1,207 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 21120020890699950 (0x4b088c0ed6c8ae)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
+ Validity
+ Not Before: Mar 9 07:19:24 2013 GMT
+ Not After : May 24 09:39:06 2019 GMT
+ Subject: OU=Domain Control Validated, CN=www.satveda.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:bb:e0:ea:82:8e:50:bf:ba:94:89:e3:f4:dc:b4:
+ a1:06:91:c1:46:bc:33:37:74:e0:c6:71:e7:f0:09:
+ ec:d8:8e:ac:48:82:3f:b6:b4:49:80:98:04:04:61:
+ f7:ea:d2:ad:23:ed:2b:28:54:f2:14:e2:f4:84:88:
+ 9c:4f:d1:b1:1b:52:98:a6:3e:85:e3:eb:22:df:09:
+ 86:ff:14:9c:41:46:dd:13:ed:d9:f0:5d:a5:fe:7f:
+ 6f:31:6b:a0:50:a5:f2:9a:ba:ea:8c:77:4d:1c:64:
+ 82:7a:ea:f4:54:5b:f3:92:81:5e:5c:b1:04:da:c1:
+ d6:72:7d:e1:e5:ec:ad:53:ae:3d:14:21:44:2e:67:
+ f3:a2:c9:7d:9e:0b:98:4d:89:fc:c8:1e:a6:00:45:
+ 8b:b6:a7:b9:dc:5e:5a:ff:0c:52:c6:92:7e:60:08:
+ d4:8d:34:6c:00:98:bc:43:e9:7b:e1:92:0b:f5:81:
+ f0:48:09:18:5a:35:8a:e2:74:f2:9d:da:48:b0:7d:
+ 02:f8:a4:2b:5e:a0:22:cf:a0:15:9f:fb:ca:4d:8c:
+ f3:26:cb:62:74:a3:04:6e:e2:38:aa:0a:19:42:e8:
+ e3:57:a5:d3:97:64:38:31:89:3e:af:93:af:d6:e3:
+ 60:c1:c3:6a:9c:58:da:16:60:c7:78:01:cf:dc:7c:
+ e1:11
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints: critical
+ CA:FALSE
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication, TLS Web Client Authentication
+ X509v3 Key Usage: critical
+ Digital Signature, Key Encipherment
+ X509v3 CRL Distribution Points:
+
+ Full Name:
+ URI:http://crl.godaddy.com/gds1-87.crl
+
+ X509v3 Certificate Policies:
+ Policy: 2.16.840.1.114413.1.7.23.1
+ CPS: http://certificates.godaddy.com/repository/
+
+ Authority Information Access:
+ OCSP - URI:http://ocsp.godaddy.com/
+ CA Issuers - URI:http://certificates.godaddy.com/repository/gd_intermediate.crt
+
+ X509v3 Authority Key Identifier:
+ keyid:FD:AC:61:32:93:6C:45:D6:E2:EE:85:5F:9A:BA:E7:76:99:68:CC:E7
+
+ X509v3 Subject Alternative Name:
+ DNS:www.satveda.com, DNS:satveda.com
+ X509v3 Subject Key Identifier:
+ A7:39:2E:DC:0F:22:D5:D6:C6:B1:3B:35:65:3D:0D:B1:75:5B:F7:69
+ Signature Algorithm: sha1WithRSAEncryption
+ 15:a9:fd:28:f6:cd:d1:f0:2d:d7:1c:df:b5:48:5c:c5:2c:44:
+ 59:ad:ba:3d:bc:08:30:6f:50:a4:9f:0b:05:28:d7:5e:62:87:
+ f9:5d:24:c0:b1:ce:a1:d2:eb:aa:77:9b:01:21:1b:56:dd:e5:
+ 32:18:38:44:24:60:76:14:4d:4a:6a:d2:37:8b:64:45:5a:ba:
+ 4f:bf:b0:33:dd:f6:59:dc:fd:47:a9:3b:4f:29:65:3d:a4:0e:
+ c7:89:22:48:e7:6b:e4:38:b7:d4:e2:27:1f:22:9c:99:b0:bd:
+ b4:59:6d:8d:53:30:fa:28:ef:6c:66:b8:af:6c:9b:93:52:72:
+ 37:b3:2f:c1:bd:73:22:b4:2e:fa:08:fd:0c:95:89:21:eb:01:
+ 34:82:18:15:12:3c:a1:2c:d9:fc:f3:f9:48:1f:09:44:18:b8:
+ 7a:5b:57:ea:10:62:59:90:8c:dc:6f:52:f2:2a:a2:da:fc:2d:
+ b4:8a:fb:11:cd:60:da:f9:dd:31:08:31:04:11:81:4e:4b:8a:
+ 81:40:70:5e:00:99:87:cb:d6:e0:d8:85:fe:4a:2e:97:99:a0:
+ 3d:6e:6f:26:a9:4d:e6:97:cb:c5:09:ef:49:24:c7:96:27:7e:
+ bf:e4:cb:02:f8:00:63:43:7f:ca:05:75:d2:89:7a:f0:25:52:
+ ac:47:fb:e6
+-----BEGIN CERTIFICATE-----
+MIIFRTCCBC2gAwIBAgIHSwiMDtbIrjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
+BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm
+aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5
+IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky
+ODcwHhcNMTMwMzA5MDcxOTI0WhcNMTkwNTI0MDkzOTA2WjA9MSEwHwYDVQQLExhE
+b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxGDAWBgNVBAMTD3d3dy5zYXR2ZWRhLmNv
+bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALvg6oKOUL+6lInj9Ny0
+oQaRwUa8Mzd04MZx5/AJ7NiOrEiCP7a0SYCYBARh9+rSrSPtKyhU8hTi9ISInE/R
+sRtSmKY+hePrIt8Jhv8UnEFG3RPt2fBdpf5/bzFroFCl8pq66ox3TRxkgnrq9FRb
+85KBXlyxBNrB1nJ94eXsrVOuPRQhRC5n86LJfZ4LmE2J/MgepgBFi7anudxeWv8M
+UsaSfmAI1I00bACYvEPpe+GSC/WB8EgJGFo1iuJ08p3aSLB9AvikK16gIs+gFZ/7
+yk2M8ybLYnSjBG7iOKoKGULo41el05dkODGJPq+Tr9bjYMHDapxY2hZgx3gBz9x8
+4RECAwEAAaOCAbowggG2MA8GA1UdEwEB/wQFMAMBAQAwHQYDVR0lBBYwFAYIKwYB
+BQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB/wQEAwIFoDAzBgNVHR8ELDAqMCigJqAk
+hiJodHRwOi8vY3JsLmdvZGFkZHkuY29tL2dkczEtODcuY3JsMFMGA1UdIARMMEow
+SAYLYIZIAYb9bQEHFwEwOTA3BggrBgEFBQcCARYraHR0cDovL2NlcnRpZmljYXRl
+cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzCBgAYIKwYBBQUHAQEEdDByMCQGCCsG
+AQUFBzABhhhodHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wSgYIKwYBBQUHMAKGPmh0
+dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9nZF9pbnRl
+cm1lZGlhdGUuY3J0MB8GA1UdIwQYMBaAFP2sYTKTbEXW4u6FX5q653aZaMznMCcG
+A1UdEQQgMB6CD3d3dy5zYXR2ZWRhLmNvbYILc2F0dmVkYS5jb20wHQYDVR0OBBYE
+FKc5LtwPItXWxrE7NWU9DbF1W/dpMA0GCSqGSIb3DQEBBQUAA4IBAQAVqf0o9s3R
+8C3XHN+1SFzFLERZrbo9vAgwb1CknwsFKNdeYof5XSTAsc6h0uuqd5sBIRtW3eUy
+GDhEJGB2FE1KatI3i2RFWrpPv7Az3fZZ3P1HqTtPKWU9pA7HiSJI52vkOLfU4icf
+IpyZsL20WW2NUzD6KO9sZrivbJuTUnI3sy/BvXMitC76CP0MlYkh6wE0ghgVEjyh
+LNn88/lIHwlEGLh6W1fqEGJZkIzcb1LyKqLa/C20ivsRzWDa+d0xCDEEEYFOS4qB
+QHBeAJmHy9bg2IX+Si6XmaA9bm8mqU3ml8vFCe9JJMeWJ36/5MsC+ABjQ3/KBXXS
+iXrwJVKsR/vm
+-----END CERTIFICATE-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 769 (0x301)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
+ Validity
+ Not Before: Nov 16 01:54:37 2006 GMT
+ Not After : Nov 16 01:54:37 2026 GMT
+ Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c4:2d:d5:15:8c:9c:26:4c:ec:32:35:eb:5f:b8:
+ 59:01:5a:a6:61:81:59:3b:70:63:ab:e3:dc:3d:c7:
+ 2a:b8:c9:33:d3:79:e4:3a:ed:3c:30:23:84:8e:b3:
+ 30:14:b6:b2:87:c3:3d:95:54:04:9e:df:99:dd:0b:
+ 25:1e:21:de:65:29:7e:35:a8:a9:54:eb:f6:f7:32:
+ 39:d4:26:55:95:ad:ef:fb:fe:58:86:d7:9e:f4:00:
+ 8d:8c:2a:0c:bd:42:04:ce:a7:3f:04:f6:ee:80:f2:
+ aa:ef:52:a1:69:66:da:be:1a:ad:5d:da:2c:66:ea:
+ 1a:6b:bb:e5:1a:51:4a:00:2f:48:c7:98:75:d8:b9:
+ 29:c8:ee:f8:66:6d:0a:9c:b3:f3:fc:78:7c:a2:f8:
+ a3:f2:b5:c3:f3:b9:7a:91:c1:a7:e6:25:2e:9c:a8:
+ ed:12:65:6e:6a:f6:12:44:53:70:30:95:c3:9c:2b:
+ 58:2b:3d:08:74:4a:f2:be:51:b0:bf:87:d0:4c:27:
+ 58:6b:b5:35:c5:9d:af:17:31:f8:0b:8f:ee:ad:81:
+ 36:05:89:08:98:cf:3a:af:25:87:c0:49:ea:a7:fd:
+ 67:f7:45:8e:97:cc:14:39:e2:36:85:b5:7e:1a:37:
+ fd:16:f6:71:11:9a:74:30:16:fe:13:94:a3:3f:84:
+ 0d:4f
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ FD:AC:61:32:93:6C:45:D6:E2:EE:85:5F:9A:BA:E7:76:99:68:CC:E7
+ X509v3 Authority Key Identifier:
+ keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
+
+ X509v3 Basic Constraints: critical
+ CA:TRUE, pathlen:0
+ Authority Information Access:
+ OCSP - URI:http://ocsp.godaddy.com
+
+ X509v3 CRL Distribution Points:
+
+ Full Name:
+ URI:http://certificates.godaddy.com/repository/gdroot.crl
+
+ X509v3 Certificate Policies:
+ Policy: X509v3 Any Policy
+ CPS: http://certificates.godaddy.com/repository
+
+ X509v3 Key Usage: critical
+ Certificate Sign, CRL Sign
+ Signature Algorithm: sha1WithRSAEncryption
+ d2:86:c0:ec:bd:f9:a1:b6:67:ee:66:0b:a2:06:3a:04:50:8e:
+ 15:72:ac:4a:74:95:53:cb:37:cb:44:49:ef:07:90:6b:33:d9:
+ 96:f0:94:56:a5:13:30:05:3c:85:32:21:7b:c9:c7:0a:a8:24:
+ a4:90:de:46:d3:25:23:14:03:67:c2:10:d6:6f:0f:5d:7b:7a:
+ cc:9f:c5:58:2a:c1:c4:9e:21:a8:5a:f3:ac:a4:46:f3:9e:e4:
+ 63:cb:2f:90:a4:29:29:01:d9:72:2c:29:df:37:01:27:bc:4f:
+ ee:68:d3:21:8f:c0:b3:e4:f5:09:ed:d2:10:aa:53:b4:be:f0:
+ cc:59:0b:d6:3b:96:1c:95:24:49:df:ce:ec:fd:a7:48:91:14:
+ 45:0e:3a:36:6f:da:45:b3:45:a2:41:c9:d4:d7:44:4e:3e:b9:
+ 74:76:d5:a2:13:55:2c:c6:87:a3:b5:99:ac:06:84:87:7f:75:
+ 06:fc:bf:14:4c:0e:cc:6e:c4:df:3d:b7:12:71:f4:e8:f1:51:
+ 40:22:28:49:e0:1d:4b:87:a8:34:cc:06:a2:dd:12:5a:d1:86:
+ 36:64:03:35:6f:6f:77:6e:eb:f2:85:50:98:5e:ab:03:53:ad:
+ 91:23:63:1f:16:9c:cd:b9:b2:05:63:3a:e1:f4:68:1b:17:05:
+ 35:95:53:ee
+-----BEGIN CERTIFICATE-----
+MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
+ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
+MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
+QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
+b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
+b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
+KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
+VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
+SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
+cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
+6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
+MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
+kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
+BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
+BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
+c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
+AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
+BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
+OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
+A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
+0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
+RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
+qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
+U+4=
+-----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/twitter-chain.pem b/net/data/ssl/certificates/twitter-chain.pem
deleted file mode 100644
index 0d66f4a..0000000
--- a/net/data/ssl/certificates/twitter-chain.pem
+++ /dev/null
@@ -1,302 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 1a:c8:5e:b7:ae:c3:51:3c:d8:0d:85:38:5e:cf:d2:08
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, O=Symantec Corporation, OU=Symantec Trust Network, CN=Symantec Class 3 EV SSL CA - G3
- Validity
- Not Before: Sep 10 00:00:00 2014 GMT
- Not After : May 9 23:59:59 2016 GMT
- Subject: 1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/businessCategory=Private Organization/serialNumber=4337446, C=US/postalCode=94103-1307, ST=California, L=San Francisco/street=1355 Market St, O=Twitter, Inc., OU=Twitter Security, CN=twitter.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:e3:ac:59:34:07:dc:11:f8:1c:ca:b3:0f:93:44:
- 8a:54:34:76:90:6a:c0:22:00:be:95:9a:da:58:3c:
- 6c:38:31:a2:a2:1f:3b:64:e2:9d:e0:f5:c2:ab:07:
- 90:5b:7c:fe:f9:88:8c:6a:9d:69:3b:e0:23:65:b7:
- 11:d6:e8:88:d6:3e:6d:8b:ed:ca:ea:58:0b:fe:4d:
- bf:2a:95:ca:bb:21:bb:ce:d6:e2:10:02:11:21:68:
- 26:f7:92:7e:9c:a3:80:b1:82:d7:e5:a6:a0:86:47:
- 42:1a:c6:5b:04:d9:c3:b5:b2:9b:38:d4:a1:6d:3b:
- bd:d8:05:f0:51:9b:bd:95:77:7f:e9:02:8e:60:a3:
- 7a:65:20:52:23:db:8d:01:27:24:c2:00:66:0d:14:
- 66:b3:52:2b:cc:6b:5b:a5:44:2f:e2:40:6d:da:21:
- a1:92:5a:57:12:d3:47:01:ef:e9:df:af:c6:91:8c:
- 21:af:77:65:13:36:1c:63:7a:2d:05:e6:63:c5:0b:
- d8:39:e9:ac:f2:3b:ff:9d:c5:a7:46:0a:6e:1a:66:
- 10:1e:4a:e7:ba:c7:89:79:1f:ae:f1:f3:84:03:ca:
- e7:50:8a:19:63:bf:3c:20:10:78:c5:f4:53:3c:7d:
- 5e:0d:af:96:70:89:92:b9:7f:9a:19:0c:f6:78:6a:
- 8f:73
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Alternative Name:
- DNS:twitter.com, DNS:www.twitter.com
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Key Usage: critical
- Digital Signature, Key Encipherment
- X509v3 Extended Key Usage:
- TLS Web Server Authentication, TLS Web Client Authentication
- X509v3 Certificate Policies:
- Policy: 2.16.840.1.113733.1.7.23.6
- CPS: https://d.symcb.com/cps
- User Notice:
- Explicit Text: https://d.symcb.com/rpa
-
- X509v3 Authority Key Identifier:
- keyid:01:59:AB:E7:DD:3A:0B:59:A6:64:63:D6:CF:20:07:57:D5:91:E7:6A
-
- X509v3 CRL Distribution Points:
-
- Full Name:
- URI:http://sr.symcb.com/sr.crl
-
- Authority Information Access:
- OCSP - URI:http://sr.symcd.com
- CA Issuers - URI:http://sr.symcb.com/sr.crt
-
- Signature Algorithm: sha256WithRSAEncryption
- d1:53:68:e9:d6:20:d0:56:7a:10:80:b8:e9:7e:00:c9:9e:d5:
- 35:4a:a2:d2:a0:16:8a:e2:fb:eb:96:88:77:c2:6e:35:f4:a7:
- a9:aa:dc:35:7b:c6:7d:5e:3c:f6:c9:5b:a0:d1:58:ae:7d:96:
- e7:54:02:5c:69:1b:56:92:26:ad:06:2c:c1:5a:ff:59:f3:8a:
- 8c:94:32:0d:1a:42:d1:6e:bc:1c:bd:a8:c6:08:01:1b:73:17:
- 93:28:30:ae:ce:4d:4e:2d:4b:bf:22:af:9a:61:32:7a:a8:68:
- 25:19:3c:6d:fb:67:cc:29:3f:5b:f5:d1:af:4c:bf:67:a3:60:
- c4:dd:b0:fb:83:55:6d:b5:2c:a9:7d:34:ad:b0:08:c7:2c:f0:
- cb:4c:d8:2b:79:f4:e9:da:7f:6e:c0:de:55:7c:d6:d6:47:cf:
- c4:90:ef:4f:be:eb:c9:3d:05:71:6b:5e:c7:36:8d:4f:0c:3c:
- 47:83:a5:11:88:22:f8:46:e0:f8:9b:1a:fe:e9:a2:df:90:81:
- 10:71:f3:97:9c:b7:69:60:77:20:d6:87:85:ee:5a:77:d2:92:
- ec:d9:5d:1f:31:3b:3a:e2:5b:35:d1:92:36:db:44:d4:79:d9:
- 6c:03:24:87:5d:c3:86:c6:10:e2:ea:65:7c:cf:b8:ef:c2:31:
- 02:55:72:12
------BEGIN CERTIFICATE-----
-MIIFjTCCBHWgAwIBAgIQGshet67DUTzYDYU4Xs/SCDANBgkqhkiG9w0BAQsFADB3
-MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd
-BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVj
-IENsYXNzIDMgRVYgU1NMIENBIC0gRzMwHhcNMTQwOTEwMDAwMDAwWhcNMTYwNTA5
-MjM1OTU5WjCCARIxEzARBgsrBgEEAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIB
-AgwIRGVsYXdhcmUxHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRAwDgYD
-VQQFEwc0MzM3NDQ2MQswCQYDVQQGEwJVUzETMBEGA1UEEQwKOTQxMDMtMTMwNzET
-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEXMBUG
-A1UECQwOMTM1NSBNYXJrZXQgU3QxFjAUBgNVBAoMDVR3aXR0ZXIsIEluYy4xGTAX
-BgNVBAsMEFR3aXR0ZXIgU2VjdXJpdHkxFDASBgNVBAMMC3R3aXR0ZXIuY29tMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA46xZNAfcEfgcyrMPk0SKVDR2
-kGrAIgC+lZraWDxsODGioh87ZOKd4PXCqweQW3z++YiMap1pO+AjZbcR1uiI1j5t
-i+3K6lgL/k2/KpXKuyG7ztbiEAIRIWgm95J+nKOAsYLX5aaghkdCGsZbBNnDtbKb
-ONShbTu92AXwUZu9lXd/6QKOYKN6ZSBSI9uNASckwgBmDRRms1IrzGtbpUQv4kBt
-2iGhklpXEtNHAe/p36/GkYwhr3dlEzYcY3otBeZjxQvYOems8jv/ncWnRgpuGmYQ
-HkrnuseJeR+u8fOEA8rnUIoZY788IBB4xfRTPH1eDa+WcImSuX+aGQz2eGqPcwID
-AQABo4IBdjCCAXIwJwYDVR0RBCAwHoILdHdpdHRlci5jb22CD3d3dy50d2l0dGVy
-LmNvbTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEF
-BQcDAQYIKwYBBQUHAwIwZgYDVR0gBF8wXTBbBgtghkgBhvhFAQcXBjBMMCMGCCsG
-AQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEFBQcCAjAZGhdo
-dHRwczovL2Quc3ltY2IuY29tL3JwYTAfBgNVHSMEGDAWgBQBWavn3ToLWaZkY9bP
-IAdX1ZHnajArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vc3Iuc3ltY2IuY29tL3Ny
-LmNybDBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zci5zeW1j
-ZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zci5zeW1jYi5jb20vc3IuY3J0MA0G
-CSqGSIb3DQEBCwUAA4IBAQDRU2jp1iDQVnoQgLjpfgDJntU1SqLSoBaK4vvrloh3
-wm419Kepqtw1e8Z9Xjz2yVug0ViufZbnVAJcaRtWkiatBizBWv9Z84qMlDINGkLR
-brwcvajGCAEbcxeTKDCuzk1OLUu/Iq+aYTJ6qGglGTxt+2fMKT9b9dGvTL9no2DE
-3bD7g1VttSypfTStsAjHLPDLTNgrefTp2n9uwN5VfNbWR8/EkO9PvuvJPQVxa17H
-No1PDDxHg6URiCL4RuD4mxr+6aLfkIEQcfOXnLdpYHcg1oeF7lp30pLs2V0fMTs6
-4ls10ZI220TUedlsAySHXcOGxhDi6mV8z7jvwjECVXIS
------END CERTIFICATE-----
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 7e:e1:4a:6f:6f:ef:f2:d3:7f:3f:ad:65:4d:3a:da:b4
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5
- Validity
- Not Before: Oct 31 00:00:00 2013 GMT
- Not After : Oct 30 23:59:59 2023 GMT
- Subject: C=US, O=Symantec Corporation, OU=Symantec Trust Network, CN=Symantec Class 3 EV SSL CA - G3
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:d8:a1:65:74:23:e8:2b:64:e2:32:d7:33:37:3d:
- 8e:f5:34:16:48:dd:4f:7f:87:1c:f8:44:23:13:8e:
- fb:11:d8:44:5a:18:71:8e:60:16:26:92:9b:fd:17:
- 0b:e1:71:70:42:fe:bf:fa:1c:c0:aa:a3:a7:b5:71:
- e8:ff:18:83:f6:df:10:0a:13:62:c8:3d:9c:a7:de:
- 2e:3f:0c:d9:1d:e7:2e:fb:2a:ce:c8:9a:7f:87:bf:
- d8:4c:04:15:32:c9:d1:cc:95:71:a0:4e:28:4f:84:
- d9:35:fb:e3:86:6f:94:53:e6:72:8a:63:67:2e:be:
- 69:f6:f7:6e:8e:9c:60:04:eb:29:fa:c4:47:42:d2:
- 78:98:e3:ec:0b:a5:92:dc:b7:9a:bd:80:64:2b:38:
- 7c:38:09:5b:66:f6:2d:95:7a:86:b2:34:2e:85:9e:
- 90:0e:5f:b7:5d:a4:51:72:46:70:13:bf:67:f2:b6:
- a7:4d:14:1e:6c:b9:53:ee:23:1a:4e:8d:48:55:43:
- 41:b1:89:75:6a:40:28:c5:7d:dd:d2:6e:d2:02:19:
- 2f:7b:24:94:4b:eb:f1:1a:a9:9b:e3:23:9a:ea:fa:
- 33:ab:0a:2c:b7:f4:60:08:dd:9f:1c:cd:dd:2d:01:
- 66:80:af:b3:2f:29:1d:23:b8:8a:e1:a1:70:07:0c:
- 34:0f
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- Authority Information Access:
- OCSP - URI:http://s2.symcb.com
-
- X509v3 Basic Constraints: critical
- CA:TRUE, pathlen:0
- X509v3 Certificate Policies:
- Policy: X509v3 Any Policy
- CPS: http://www.symauth.com/cps
- User Notice:
- Explicit Text: http://www.symauth.com/rpa
-
- X509v3 CRL Distribution Points:
-
- Full Name:
- URI:http://s1.symcb.com/pca3-g5.crl
-
- X509v3 Key Usage: critical
- Certificate Sign, CRL Sign
- X509v3 Subject Alternative Name:
- DirName:/CN=SymantecPKI-1-533
- X509v3 Subject Key Identifier:
- 01:59:AB:E7:DD:3A:0B:59:A6:64:63:D6:CF:20:07:57:D5:91:E7:6A
- X509v3 Authority Key Identifier:
- keyid:7F:D3:65:A7:C2:DD:EC:BB:F0:30:09:F3:43:39:FA:02:AF:33:31:33
-
- Signature Algorithm: sha256WithRSAEncryption
- 42:01:55:7b:d0:16:1a:5d:58:e8:bb:9b:a8:4d:d7:f3:d7:eb:
- 13:94:86:d6:7f:21:0b:47:bc:57:9b:92:5d:4f:05:9f:38:a4:
- 10:7c:cf:83:be:06:43:46:8d:08:bc:6a:d7:10:a6:fa:ab:af:
- 2f:61:a8:63:f2:65:df:7f:4c:88:12:88:4f:b3:69:d9:ff:27:
- c0:0a:97:91:8f:56:fb:89:c4:a8:bb:92:2d:1b:73:b0:c6:ab:
- 36:f4:96:6c:20:08:ef:0a:1e:66:24:45:4f:67:00:40:c8:07:
- 54:74:33:3b:a6:ad:bb:23:9f:66:ed:a2:44:70:34:fb:0e:ea:
- 01:fd:cf:78:74:df:a7:ad:55:b7:5f:4d:f6:d6:3f:e0:86:ce:
- 24:c7:42:a9:13:14:44:35:4b:b6:df:c9:60:ac:0c:7f:d9:93:
- 21:4b:ee:9c:e4:49:02:98:d3:60:7b:5c:bc:d5:30:2f:07:ce:
- 44:42:c4:0b:99:fe:e6:9f:fc:b0:78:86:51:6d:d1:2c:9d:c6:
- 96:fb:85:82:bb:04:2f:f7:62:80:ef:62:da:7f:f6:0e:ac:90:
- b8:56:bd:79:3f:f2:80:6e:a3:d9:b9:0f:5d:3a:07:1d:91:93:
- 86:4b:29:4c:e1:dc:b5:e1:e0:33:9d:b3:cb:36:91:4b:fe:a1:
- b4:ee:f0:f9
------BEGIN CERTIFICATE-----
-MIIFKzCCBBOgAwIBAgIQfuFKb2/v8tN/P61lTTratDANBgkqhkiG9w0BAQsFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB3MQsw
-CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
-BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIENs
-YXNzIDMgRVYgU1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQDYoWV0I+grZOIy1zM3PY71NBZI3U9/hxz4RCMTjvsR2ERaGHGOYBYmkpv9
-FwvhcXBC/r/6HMCqo6e1cej/GIP23xAKE2LIPZyn3i4/DNkd5y77Ks7Imn+Hv9hM
-BBUyydHMlXGgTihPhNk1++OGb5RT5nKKY2cuvmn2926OnGAE6yn6xEdC0niY4+wL
-pZLct5q9gGQrOHw4CVtm9i2VeoayNC6FnpAOX7ddpFFyRnATv2fytqdNFB5suVPu
-IxpOjUhVQ0GxiXVqQCjFfd3SbtICGS97JJRL6/EaqZvjI5rq+jOrCiy39GAI3Z8c
-zd0tAWaAr7MvKR0juIrhoXAHDDQPAgMBAAGjggFdMIIBWTAvBggrBgEFBQcBAQQj
-MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/BAgw
-BgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggrBgEFBQcCARYaaHR0cDov
-L3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIwHBoaaHR0cDovL3d3dy5z
-eW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3MxLnN5bWNi
-LmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwx
-GjAYBgNVBAMTEVN5bWFudGVjUEtJLTEtNTMzMB0GA1UdDgQWBBQBWavn3ToLWaZk
-Y9bPIAdX1ZHnajAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzANBgkq
-hkiG9w0BAQsFAAOCAQEAQgFVe9AWGl1Y6LubqE3X89frE5SG1n8hC0e8V5uSXU8F
-nzikEHzPg74GQ0aNCLxq1xCm+quvL2GoY/Jl339MiBKIT7Np2f8nwAqXkY9W+4nE
-qLuSLRtzsMarNvSWbCAI7woeZiRFT2cAQMgHVHQzO6atuyOfZu2iRHA0+w7qAf3P
-eHTfp61Vt19N9tY/4IbOJMdCqRMURDVLtt/JYKwMf9mTIUvunORJApjTYHtcvNUw
-LwfORELEC5n+5p/8sHiGUW3RLJ3GlvuFgrsEL/digO9i2n/2DqyQuFa9eT/ygG6j
-2bkPXToHHZGThkspTOHcteHgM52zyzaRS/6htO7w+Q==
------END CERTIFICATE-----
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 18:da:d1:9e:26:7d:e8:bb:4a:21:58:cd:cc:6b:3b:4a
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5
- Validity
- Not Before: Nov 8 00:00:00 2006 GMT
- Not After : Jul 16 23:59:59 2036 GMT
- Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- Public-Key: (2048 bit)
- Modulus:
- 00:af:24:08:08:29:7a:35:9e:60:0c:aa:e7:4b:3b:
- 4e:dc:7c:bc:3c:45:1c:bb:2b:e0:fe:29:02:f9:57:
- 08:a3:64:85:15:27:f5:f1:ad:c8:31:89:5d:22:e8:
- 2a:aa:a6:42:b3:8f:f8:b9:55:b7:b1:b7:4b:b3:fe:
- 8f:7e:07:57:ec:ef:43:db:66:62:15:61:cf:60:0d:
- a4:d8:de:f8:e0:c3:62:08:3d:54:13:eb:49:ca:59:
- 54:85:26:e5:2b:8f:1b:9f:eb:f5:a1:91:c2:33:49:
- d8:43:63:6a:52:4b:d2:8f:e8:70:51:4d:d1:89:69:
- 7b:c7:70:f6:b3:dc:12:74:db:7b:5d:4b:56:d3:96:
- bf:15:77:a1:b0:f4:a2:25:f2:af:1c:92:67:18:e5:
- f4:06:04:ef:90:b9:e4:00:e4:dd:3a:b5:19:ff:02:
- ba:f4:3c:ee:e0:8b:eb:37:8b:ec:f4:d7:ac:f2:f6:
- f0:3d:af:dd:75:91:33:19:1d:1c:40:cb:74:24:19:
- 21:93:d9:14:fe:ac:2a:52:c7:8f:d5:04:49:e4:8d:
- 63:47:88:3c:69:83:cb:fe:47:bd:2b:7e:4f:c5:95:
- ae:0e:9d:d4:d1:43:c0:67:73:e3:14:08:7e:e5:3f:
- 9f:73:b8:33:0a:cf:5d:3f:34:87:96:8a:ee:53:e8:
- 25:15
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints: critical
- CA:TRUE
- X509v3 Key Usage: critical
- Certificate Sign, CRL Sign
- 1.3.6.1.5.5.7.1.12:
- 0_.].[0Y0W0U..image/gif0!0.0...+..............k...j.H.,{..0%.#http://logo.verisign.com/vslogo.gif
- X509v3 Subject Key Identifier:
- 7F:D3:65:A7:C2:DD:EC:BB:F0:30:09:F3:43:39:FA:02:AF:33:31:33
- Signature Algorithm: sha1WithRSAEncryption
- 93:24:4a:30:5f:62:cf:d8:1a:98:2f:3d:ea:dc:99:2d:bd:77:
- f6:a5:79:22:38:ec:c4:a7:a0:78:12:ad:62:0e:45:70:64:c5:
- e7:97:66:2d:98:09:7e:5f:af:d6:cc:28:65:f2:01:aa:08:1a:
- 47:de:f9:f9:7c:92:5a:08:69:20:0d:d9:3e:6d:6e:3c:0d:6e:
- d8:e6:06:91:40:18:b9:f8:c1:ed:df:db:41:aa:e0:96:20:c9:
- cd:64:15:38:81:c9:94:ee:a2:84:29:0b:13:6f:8e:db:0c:dd:
- 25:02:db:a4:8b:19:44:d2:41:7a:05:69:4a:58:4f:60:ca:7e:
- 82:6a:0b:02:aa:25:17:39:b5:db:7f:e7:84:65:2a:95:8a:bd:
- 86:de:5e:81:16:83:2d:10:cc:de:fd:a8:82:2a:6d:28:1f:0d:
- 0b:c4:e5:e7:1a:26:19:e1:f4:11:6f:10:b5:95:fc:e7:42:05:
- 32:db:ce:9d:51:5e:28:b6:9e:85:d3:5b:ef:a5:7d:45:40:72:
- 8e:b7:0e:6b:0e:06:fb:33:35:48:71:b8:9d:27:8b:c4:65:5f:
- 0d:86:76:9c:44:7a:f6:95:5c:f6:5d:32:08:33:a4:54:b6:18:
- 3f:68:5c:f2:42:4a:85:38:54:83:5f:d1:e8:2c:f2:ac:11:d6:
- a8:ed:63:6a
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
diff --git a/net/data/ssl/scripts/generate-test-certs.sh b/net/data/ssl/scripts/generate-test-certs.sh
index c94ca6c..d62bb98 100755
--- a/net/data/ssl/scripts/generate-test-certs.sh
+++ b/net/data/ssl/scripts/generate-test-certs.sh
@@ -124,51 +124,7 @@
SUBJECT_NAME="req_punycode_dn" \
try openssl req -x509 -days 3650 -extensions req_punycode \
-config ../scripts/ee.cnf -newkey rsa:2048 -text \
- -out ../certificates/punycodetest.pem
-
-## Reject intranet hostnames in "publicly" trusted certs
-# 365 * 3 = 1095
-SUBJECT_NAME="req_dn" \
- try openssl req -x509 -days 1095 \
- -config ../scripts/ee.cnf -newkey rsa:2048 -text \
- -out ../certificates/reject_intranet_hosts.pem
-
-## Validity too long
-# 365 * 11 = 4015
-try openssl req -config ../scripts/ee.cnf \
- -newkey rsa:2048 -text -out ../certificates/11_year_validity.req
-CA_COMMON_NAME="Test Root CA" \
- try openssl ca \
- -batch \
- -extensions user_cert \
- -startdate 141030000000Z \
- -days 4015 \
- -in ../certificates/11_year_validity.req \
- -out ../certificates/11_year_validity.pem \
- -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
- -newkey rsa:2048 -text -out ../certificates/40_months_after_2015_04.req
-CA_COMMON_NAME="Test Root CA" \
- try openssl ca \
- -batch \
- -extensions user_cert \
- -startdate 150402000000Z \
- -enddate 180901000000Z \
- -in ../certificates/40_months_after_2015_04.req \
- -out ../certificates/40_months_after_2015_04.pem \
- -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
- -newkey rsa:2048 -text -out ../certificates/61_months_after_2012_07.req
-# 30 * 61 = 1830
-CA_COMMON_NAME="Test Root CA" \
- try openssl ca \
- -batch \
- -extensions user_cert \
- -startdate 141030000000Z \
- -days 1830 \
- -in ../certificates/61_months_after_2012_07.req \
- -out ../certificates/61_months_after_2012_07.pem \
- -config ca.cnf
+ -out ../certificates/punycodetest.pem
# Regenerate CRLSets
## Block a leaf cert directly by SPKI
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc
index 2ec0fb5..9569b38 100644
--- a/net/http/http_response_info.cc
+++ b/net/http/http_response_info.cc
@@ -396,9 +396,9 @@
case CONNECTION_INFO_SPDY3:
return "spdy/3";
case CONNECTION_INFO_SPDY4:
- // This is the HTTP/2 draft-15 identifier. For internal
+ // This is the HTTP/2 draft 14 identifier. For internal
// consistency, HTTP/2 is named SPDY4 within Chromium.
- return "h2-15";
+ return "h2-14";
case CONNECTION_INFO_QUIC1_SPDY3:
return "quic/1+spdy/3";
case NUM_OF_CONNECTION_INFOS:
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc
index cc41ea8..4433b4e 100644
--- a/net/http/http_server_properties.cc
+++ b/net/http/http_server_properties.cc
@@ -20,7 +20,7 @@
"npn-spdy/2",
"npn-spdy/3",
"npn-spdy/3.1",
- "npn-h2-15", // HTTP/2 draft-15. Called SPDY4 internally.
+ "npn-h2-14", // HTTP/2 draft 14. Called SPDY4 internally.
"quic"
};
diff --git a/net/quic/crypto/quic_crypto_client_config.cc b/net/quic/crypto/quic_crypto_client_config.cc
index 5b120c9..4828c3a 100644
--- a/net/quic/crypto/quic_crypto_client_config.cc
+++ b/net/quic/crypto/quic_crypto_client_config.cc
@@ -32,25 +32,21 @@
namespace {
-enum ServerConfigState {
- // WARNING: Do not change the numerical values of any of server config state.
- // Do not remove deprecated server config states - just comment them as
- // deprecated.
- SERVER_CONFIG_EMPTY = 0,
- SERVER_CONFIG_INVALID = 1,
- SERVER_CONFIG_CORRUPTED = 2,
- SERVER_CONFIG_EXPIRED = 3,
- SERVER_CONFIG_INVALID_EXPIRY = 4,
+// Tracks the reason (the state of the server config) for sending inchoate
+// ClientHello to the server.
+void RecordInchoateClientHelloReason(
+ QuicCryptoClientConfig::CachedState::ServerConfigState state) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.QuicInchoateClientHelloReason", state,
+ QuicCryptoClientConfig::CachedState::SERVER_CONFIG_COUNT);
+}
- // NOTE: Add new server config states only immediately above this line. Make
- // sure to update the QuicServerConfigState enum in
- // tools/metrics/histograms/histograms.xml accordingly.
- SERVER_CONFIG_COUNT
-};
-
-void RecordServerConfigState(ServerConfigState server_config_state) {
- UMA_HISTOGRAM_ENUMERATION("Net.QuicClientHelloServerConfigState",
- server_config_state, SERVER_CONFIG_COUNT);
+// Tracks the state of the QUIC server information loaded from the disk cache.
+void RecordDiskCacheServerConfigState(
+ QuicCryptoClientConfig::CachedState::ServerConfigState state) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.QuicServerInfo.DiskCacheState", state,
+ QuicCryptoClientConfig::CachedState::SERVER_CONFIG_COUNT);
}
} // namespace
@@ -72,12 +68,12 @@
bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const {
if (server_config_.empty()) {
- RecordServerConfigState(SERVER_CONFIG_EMPTY);
+ RecordInchoateClientHelloReason(SERVER_CONFIG_EMPTY);
return false;
}
if (!server_config_valid_) {
- RecordServerConfigState(SERVER_CONFIG_INVALID);
+ RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID);
return false;
}
@@ -85,13 +81,13 @@
if (!scfg) {
// Should be impossible short of cache corruption.
DCHECK(false);
- RecordServerConfigState(SERVER_CONFIG_CORRUPTED);
+ RecordInchoateClientHelloReason(SERVER_CONFIG_CORRUPTED);
return false;
}
uint64 expiry_seconds;
if (scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) {
- RecordServerConfigState(SERVER_CONFIG_INVALID_EXPIRY);
+ RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID_EXPIRY);
return false;
}
if (now.ToUNIXSeconds() >= expiry_seconds) {
@@ -99,7 +95,7 @@
"Net.QuicClientHelloServerConfig.InvalidDuration",
base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - expiry_seconds),
base::TimeDelta::FromMinutes(1), base::TimeDelta::FromDays(20), 50);
- RecordServerConfigState(SERVER_CONFIG_EXPIRED);
+ RecordInchoateClientHelloReason(SERVER_CONFIG_EXPIRED);
return false;
}
@@ -123,7 +119,8 @@
return scfg_.get();
}
-QuicErrorCode QuicCryptoClientConfig::CachedState::SetServerConfig(
+QuicCryptoClientConfig::CachedState::ServerConfigState
+QuicCryptoClientConfig::CachedState::SetServerConfig(
StringPiece server_config, QuicWallTime now, string* error_details) {
const bool matches_existing = server_config == server_config_;
@@ -141,18 +138,18 @@
if (!new_scfg) {
*error_details = "SCFG invalid";
- return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
+ return SERVER_CONFIG_INVALID;
}
uint64 expiry_seconds;
if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) {
*error_details = "SCFG missing EXPY";
- return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
+ return SERVER_CONFIG_INVALID_EXPIRY;
}
if (now.ToUNIXSeconds() >= expiry_seconds) {
*error_details = "SCFG has expired";
- return QUIC_CRYPTO_SERVER_CONFIG_EXPIRED;
+ return SERVER_CONFIG_EXPIRED;
}
if (!matches_existing) {
@@ -160,7 +157,7 @@
SetProofInvalid();
scfg_.reset(new_scfg_storage.release());
}
- return QUIC_NO_ERROR;
+ return SERVER_CONFIG_VALID;
}
void QuicCryptoClientConfig::CachedState::InvalidateServerConfig() {
@@ -228,13 +225,15 @@
DCHECK(server_config_.empty());
if (server_config.empty()) {
+ RecordDiskCacheServerConfigState(SERVER_CONFIG_EMPTY);
return false;
}
string error_details;
- QuicErrorCode error = SetServerConfig(server_config, now,
- &error_details);
- if (error != QUIC_NO_ERROR) {
+ ServerConfigState state = SetServerConfig(server_config, now,
+ &error_details);
+ RecordDiskCacheServerConfigState(state);
+ if (state != SERVER_CONFIG_VALID) {
DVLOG(1) << "SetServerConfig failed with " << error_details;
return false;
}
@@ -594,9 +593,15 @@
return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND;
}
- QuicErrorCode error = cached->SetServerConfig(scfg, now, error_details);
- if (error != QUIC_NO_ERROR) {
- return error;
+ CachedState::ServerConfigState state = cached->SetServerConfig(
+ scfg, now, error_details);
+ if (state == CachedState::SERVER_CONFIG_EXPIRED) {
+ return QUIC_CRYPTO_SERVER_CONFIG_EXPIRED;
+ }
+ // TODO(rtenneti): Return more specific error code than returning
+ // QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER.
+ if (state != CachedState::SERVER_CONFIG_VALID) {
+ return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
}
StringPiece token;
diff --git a/net/quic/crypto/quic_crypto_client_config.h b/net/quic/crypto/quic_crypto_client_config.h
index 584e487..4bfed1b 100644
--- a/net/quic/crypto/quic_crypto_client_config.h
+++ b/net/quic/crypto/quic_crypto_client_config.h
@@ -35,6 +35,24 @@
// over several connections to the same server.
class NET_EXPORT_PRIVATE CachedState {
public:
+ // Enum to track if the server config is valid or not. If it is not valid,
+ // it specifies why it is invalid.
+ enum ServerConfigState {
+ // WARNING: Do not change the numerical values of any of server config
+ // state. Do not remove deprecated server config states - just comment
+ // them as deprecated.
+ SERVER_CONFIG_EMPTY = 0,
+ SERVER_CONFIG_INVALID = 1,
+ SERVER_CONFIG_CORRUPTED = 2,
+ SERVER_CONFIG_EXPIRED = 3,
+ SERVER_CONFIG_INVALID_EXPIRY = 4,
+ SERVER_CONFIG_VALID = 5,
+ // NOTE: Add new server config states only immediately above this line.
+ // Make sure to update the QuicServerConfigState enum in
+ // tools/metrics/histograms/histograms.xml accordingly.
+ SERVER_CONFIG_COUNT
+ };
+
CachedState();
~CachedState();
@@ -54,9 +72,9 @@
// SetServerConfig checks that |server_config| parses correctly and stores
// it in |server_config_|. |now| is used to judge whether |server_config|
// has expired.
- QuicErrorCode SetServerConfig(base::StringPiece server_config,
- QuicWallTime now,
- std::string* error_details);
+ ServerConfigState SetServerConfig(base::StringPiece server_config,
+ QuicWallTime now,
+ std::string* error_details);
// InvalidateServerConfig clears the cached server config (if any).
void InvalidateServerConfig();
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h
index afd5ed4..ad920d0 100644
--- a/net/quic/quic_protocol.h
+++ b/net/quic/quic_protocol.h
@@ -76,6 +76,9 @@
// Smaller values are ignored.
const QuicByteCount kMinSocketReceiveBuffer = 16 * 1024;
+// Don't allow a client to suggest an RTT shorter than 10ms.
+const uint32 kMinInitialRoundTripTimeUs = 10 * kNumMicrosPerMilli;
+
// Don't allow a client to suggest an RTT longer than 15 seconds.
const uint32 kMaxInitialRoundTripTimeUs = 15 * kNumMicrosPerSecond;
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index bdf8690..9e2d04f 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -97,12 +97,16 @@
void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
if (config.HasReceivedInitialRoundTripTimeUs() &&
config.ReceivedInitialRoundTripTimeUs() > 0) {
- rtt_stats_.set_initial_rtt_us(min(kMaxInitialRoundTripTimeUs,
- config.ReceivedInitialRoundTripTimeUs()));
- } else if (config.HasInitialRoundTripTimeUsToSend()) {
rtt_stats_.set_initial_rtt_us(
- min(kMaxInitialRoundTripTimeUs,
- config.GetInitialRoundTripTimeUsToSend()));
+ max(kMinInitialRoundTripTimeUs,
+ min(kMaxInitialRoundTripTimeUs,
+ config.ReceivedInitialRoundTripTimeUs())));
+ } else if (config.HasInitialRoundTripTimeUsToSend() &&
+ config.GetInitialRoundTripTimeUsToSend() > 0) {
+ rtt_stats_.set_initial_rtt_us(
+ max(kMinInitialRoundTripTimeUs,
+ min(kMaxInitialRoundTripTimeUs,
+ config.GetInitialRoundTripTimeUsToSend())));
}
// TODO(ianswett): BBR is currently a server only feature.
if (FLAGS_quic_allow_bbr &&
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 0ea6d7c..076797a 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -993,6 +993,8 @@
void QuicStreamFactory::InitializeCachedStateInCryptoConfig(
const QuicServerId& server_id,
const scoped_ptr<QuicServerInfo>& server_info) {
+ // |server_info| will be NULL, if a non-empty server config already exists in
+ // the memory cache. This is a minor optimization to avoid LookupOrCreate.
if (!server_info)
return;
@@ -1001,6 +1003,27 @@
if (!cached->IsEmpty())
return;
+ if (http_server_properties_) {
+ if (quic_supported_servers_at_startup_.empty()) {
+ for (const std::pair<net::HostPortPair, net::AlternateProtocolInfo>&
+ key_value : http_server_properties_->alternate_protocol_map()) {
+ if (key_value.second.protocol == QUIC) {
+ quic_supported_servers_at_startup_.insert(key_value.first);
+ }
+ }
+ }
+
+ // TODO(rtenneti): Delete the following histogram after collecting stats.
+ // If the AlternateProtocolMap contained an entry for this host, check if
+ // the disk cache contained an entry for it.
+ if (ContainsKey(quic_supported_servers_at_startup_,
+ server_id.host_port_pair())) {
+ UMA_HISTOGRAM_BOOLEAN(
+ "Net.QuicServerInfo.ExpectConfigMissingFromDiskCache",
+ server_info->state().server_config.empty());
+ }
+ }
+
if (!cached->Initialize(server_info->state().server_config,
server_info->state().source_address_token,
server_info->state().certs,
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h
index c892cb2..2fad1fc 100644
--- a/net/quic/quic_stream_factory.h
+++ b/net/quic/quic_stream_factory.h
@@ -299,6 +299,7 @@
// Local address of socket that was created in CreateSession.
IPEndPoint local_address_;
bool check_persisted_supports_quic_;
+ std::set<HostPortPair> quic_supported_servers_at_startup_;
base::TaskRunner* task_runner_;
diff --git a/net/quic/quic_time.h b/net/quic/quic_time.h
index 5fbe30c..53e5ebe 100644
--- a/net/quic/quic_time.h
+++ b/net/quic/quic_time.h
@@ -18,6 +18,8 @@
namespace net {
static const uint64 kNumMicrosPerSecond = base::Time::kMicrosecondsPerSecond;
+static const uint64 kNumMicrosPerMilli =
+ base::Time::kMicrosecondsPerMillisecond;
// A QuicTime is a purely relative time. QuicTime values from different clocks
// cannot be compared to each other. If you need an absolute time, see
diff --git a/net/socket/next_proto.h b/net/socket/next_proto.h
index 89400a9..4df6e9b 100644
--- a/net/socket/next_proto.h
+++ b/net/socket/next_proto.h
@@ -27,8 +27,7 @@
kProtoSPDYMinimumVersion = kProtoDeprecatedSPDY2,
kProtoSPDY3 = 101,
kProtoSPDY31 = 102,
- // HTTP/2 draft-14 was 103,
- kProtoSPDY4 = 104, // SPDY4 is HTTP/2 draft-15.
+ kProtoSPDY4 = 103, // SPDY4 is HTTP/2.
kProtoSPDYMaximumVersion = kProtoSPDY4,
kProtoQUIC1SPDY3 = 200,
diff --git a/net/socket/ssl_client_socket.cc b/net/socket/ssl_client_socket.cc
index 269ca7e..3184e04 100644
--- a/net/socket/ssl_client_socket.cc
+++ b/net/socket/ssl_client_socket.cc
@@ -37,8 +37,8 @@
return kProtoSPDY3;
} else if (proto_string == "spdy/3.1") {
return kProtoSPDY31;
- } else if (proto_string == "h2-15") {
- // This is the HTTP/2 draft-15 identifier. For internal
+ } else if (proto_string == "h2-14") {
+ // This is the HTTP/2 draft 14 identifier. For internal
// consistency, HTTP/2 is named SPDY4 within Chromium.
return kProtoSPDY4;
} else if (proto_string == "quic/1+spdy/3") {
@@ -60,9 +60,9 @@
case kProtoSPDY31:
return "spdy/3.1";
case kProtoSPDY4:
- // This is the HTTP/2 draft-15 identifier. For internal
+ // This is the HTTP/2 draft 14 identifier. For internal
// consistency, HTTP/2 is named SPDY4 within Chromium.
- return "h2-15";
+ return "h2-14";
case kProtoQUIC1SPDY3:
return "quic/1+spdy/3";
case kProtoUnknown:
diff --git a/net/test/test_certificate_data.h b/net/test/test_certificate_data.h
index 17de41f..3ccda5e 100644
--- a/net/test/test_certificate_data.h
+++ b/net/test/test_certificate_data.h
@@ -9,26 +9,22 @@
"\x15\x60\xde\x65\x4e\x03\x9f\xd0\x08\x82"
"\xa9\x6a\xc4\x65\x8e\x6f\x92\x06\x84\x35";
-// kTwitterSPKIs contains the SHA1 hashes of the SPKIs of the twitter-chain.pem
+// kSatvedaSPKIs contains the SHA1 hashes of the SPKIs of the satveda.pem
// certificate chain, in order.
-static const char kTwitterSPKIs[3][21] = {
- "\x26\x9a\x19\xa3\x88\x28\xc1\xdd\x70\x1b"
- "\xa0\xca\x2c\x98\xdb\xc6\xe1\x4f\x37\x3e",
- "\x47\x49\xdf\x16\x57\xf4\x6c\x8b\xd2\x8c"
- "\x79\x1b\x99\xfb\x9f\x28\x81\x2a\x60\xe0",
- "\xb1\x81\x08\x1a\x19\xa4\xc0\x94\x1f\xfa"
- "\xe8\x95\x28\xc1\x24\xc9\x9b\x34\xac\xc7",
+static const char kSatvedaSPKIs[2][21] = {
+ "\xd6\x2d\x7a\x12\x02\x7f\x9b\x8e\x4f\x2b"
+ "\x07\xc5\xfb\xf9\x2a\x2e\x9a\xcc\x0e\xe3",
+ "\xba\x2e\xb5\xa8\x3e\x13\x23\xd9\x53\x4b"
+ "\x5e\x65\xbc\xe7\xa3\x13\x5d\xd0\xa9\x96",
};
-// kTwitterSPKIsSHA256 contains the SHA256 hashes of the SPKIs of the
-// twitter-chain.pem certificate chain, in order.
-static const char kTwitterSPKIsSHA256[3][33] = {
- "\x20\xec\x5d\x0a\xfb\xc6\xc0\xe2\xe1\x95\x56\xc5\x35\x2b\x3c\x60"
- "\x78\xa6\xed\x95\x55\xc2\xfa\x86\x82\x40\x4f\xdb\x55\x29\xd3\xad",
- "\x80\xcc\x56\x3a\xb5\xf8\x3c\xc4\x1e\xb0\xaf\x6a\x14\xd6\xd8\x07"
- "\x18\xc1\x7e\x35\x2f\x96\x49\xff\xbc\xdd\x67\xf8\xbf\x65\x13\x91",
- "\x25\xb4\x1b\x50\x6e\x49\x30\x95\x28\x23\xa6\xeb\x9f\x1d\x31\xde"
- "\xf6\x45\xea\x38\xa5\xc6\xc6\xa9\x6d\x71\x95\x7e\x38\x4d\xf0\x58",
+// kSatvedaSPKIsSHA256 contains the SHA256 hashes of the SPKIs of the
+// satveda.pem certificate chain, in order.
+static const char kSatvedaSPKIsSHA256[2][33] = {
+ "\xb9\x42\xab\xf2\x08\x63\xef\x81\x70\x88\x45\xc4\x39\xa2\x6e\x9c"
+ "\x2f\x9a\xf9\xf4\xcb\x23\x61\xd4\x83\x97\x61\x6d\xf2\x5b\x27\xa8",
+ "\x32\xb6\x4b\x66\x72\x7a\x20\x63\xe4\x06\x6f\x3b\x95\x8c\xb0\xaa"
+ "\xee\x57\x6a\x5e\xce\xfd\x95\x33\x99\xbb\x88\x74\x73\x1d\x95\x87",
};
// Certificates for test data. They're obtained with:
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index 55e2d88..1fb3e79 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -924,7 +924,7 @@
// Client tries to request twice the server's max initial window, and the
// server limits it to the max.
client_config_.SetInitialCongestionWindowToSend(2 * kMaxInitialWindow);
- client_config_.SetInitialRoundTripTimeUsToSend(1000);
+ client_config_.SetInitialRoundTripTimeUsToSend(20000);
ASSERT_TRUE(Initialize());
client_->client()->WaitForCryptoHandshakeConfirmed();
@@ -949,9 +949,9 @@
EXPECT_EQ(GetParam().use_pacing, server_sent_packet_manager.using_pacing());
EXPECT_EQ(GetParam().use_pacing, client_sent_packet_manager.using_pacing());
- // The client *should* set the intitial RTT.
- EXPECT_EQ(1000u, client_sent_packet_manager.GetRttStats()->initial_rtt_us());
- EXPECT_EQ(1000u, server_sent_packet_manager.GetRttStats()->initial_rtt_us());
+ // The client *should* set the intitial RTT, but it's increased to 10ms.
+ EXPECT_EQ(20000u, client_sent_packet_manager.GetRttStats()->initial_rtt_us());
+ EXPECT_EQ(20000u, server_sent_packet_manager.GetRttStats()->initial_rtt_us());
// Now use the negotiated limits with packet loss.
SetPacketLossPercentage(30);
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 666bd03..c3b1cad 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -214,7 +214,8 @@
ftp_enabled_(false),
#endif
http_cache_enabled_(true),
- throttling_enabled_(false) {
+ throttling_enabled_(false),
+ channel_id_enabled_(true) {
}
URLRequestContextBuilder::~URLRequestContextBuilder() {}
@@ -296,12 +297,14 @@
storage->set_http_auth_handler_factory(http_auth_handler_registry_factory);
storage->set_cookie_store(new CookieMonster(NULL, NULL));
- // TODO(mmenke): This always creates a file thread, even when it ends up
- // not being used. Consider lazily creating the thread.
- storage->set_channel_id_service(
- new ChannelIDService(
- new DefaultChannelIDStore(NULL),
- context->GetFileThread()->message_loop_proxy()));
+ if (channel_id_enabled_) {
+ // TODO(mmenke): This always creates a file thread, even when it ends up
+ // not being used. Consider lazily creating the thread.
+ storage->set_channel_id_service(
+ new ChannelIDService(
+ new DefaultChannelIDStore(NULL),
+ context->GetFileThread()->message_loop_proxy()));
+ }
storage->set_transport_security_state(new net::TransportSecurityState());
if (!transport_security_persister_path_.empty()) {
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h
index 9053372..233918c 100644
--- a/net/url_request/url_request_context_builder.h
+++ b/net/url_request/url_request_context_builder.h
@@ -166,6 +166,10 @@
throttling_enabled_ = throttling_enabled;
}
+ void set_channel_id_enabled(bool enable) {
+ channel_id_enabled_ = enable;
+ }
+
URLRequestContext* Build();
private:
@@ -192,6 +196,7 @@
#endif
bool http_cache_enabled_;
bool throttling_enabled_;
+ bool channel_id_enabled_;
HttpCacheParams http_cache_params_;
HttpNetworkSessionParams http_network_session_params_;
diff --git a/ppapi/proxy/host_dispatcher.cc b/ppapi/proxy/host_dispatcher.cc
index 0e821db..ee7e919 100644
--- a/ppapi/proxy/host_dispatcher.cc
+++ b/ppapi/proxy/host_dispatcher.cc
@@ -224,7 +224,10 @@
// Need to query. Cache the result so we only do this once.
bool supported = false;
- Send(new PpapiMsg_IsInterfaceSupported(iface_name, &supported));
+ bool previous_reentrancy_value = allow_plugin_reentrancy_;
+ allow_plugin_reentrancy_ = true;
+ Send(new PpapiMsg_SupportsInterface(iface_name, &supported));
+ allow_plugin_reentrancy_ = previous_reentrancy_value;
std::pair<PluginSupportedMap::iterator, bool> iter_success_pair;
iter_success_pair = plugin_supported_.insert(
@@ -271,11 +274,6 @@
}
}
-void HostDispatcher::OnHostMsgPluginSupportsInterface(
- const std::string& interface_name) {
- plugin_supported_[interface_name] = true;
-}
-
// ScopedModuleReference -------------------------------------------------------
ScopedModuleReference::ScopedModuleReference(Dispatcher* dispatcher)
diff --git a/ppapi/proxy/host_dispatcher.h b/ppapi/proxy/host_dispatcher.h
index 0f503ff..345f8ea 100644
--- a/ppapi/proxy/host_dispatcher.h
+++ b/ppapi/proxy/host_dispatcher.h
@@ -122,7 +122,6 @@
int int_log_level,
const std::string& source,
const std::string& value);
- void OnHostMsgPluginSupportsInterface(const std::string& interface_name);
void RemoveSyncMessageStatusObserver(SyncMessageStatusObserver* obs);
diff --git a/ppapi/proxy/plugin_dispatcher.cc b/ppapi/proxy/plugin_dispatcher.cc
index c3e96e2..ad3e7a0 100644
--- a/ppapi/proxy/plugin_dispatcher.cc
+++ b/ppapi/proxy/plugin_dispatcher.cc
@@ -223,8 +223,7 @@
// Handle some plugin-specific control messages.
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PluginDispatcher, msg)
- IPC_MESSAGE_HANDLER(PpapiMsg_IsInterfaceSupported,
- OnMsgIsInterfaceSupported)
+ IPC_MESSAGE_HANDLER(PpapiMsg_SupportsInterface, OnMsgSupportsInterface)
IPC_MESSAGE_HANDLER(PpapiMsg_SetPreferences, OnMsgSetPreferences)
IPC_MESSAGE_UNHANDLED(handled = false);
IPC_END_MESSAGE_MAP()
@@ -298,7 +297,7 @@
}
}
-void PluginDispatcher::OnMsgIsInterfaceSupported(
+void PluginDispatcher::OnMsgSupportsInterface(
const std::string& interface_name,
bool* result) {
*result = !!GetPluginInterface(interface_name);
diff --git a/ppapi/proxy/plugin_dispatcher.h b/ppapi/proxy/plugin_dispatcher.h
index 2dc526f..f8e22f6 100644
--- a/ppapi/proxy/plugin_dispatcher.h
+++ b/ppapi/proxy/plugin_dispatcher.h
@@ -175,8 +175,7 @@
void ForceFreeAllInstances();
// IPC message handlers.
- void OnMsgIsInterfaceSupported(
- const std::string& interface_name, bool* result);
+ void OnMsgSupportsInterface(const std::string& interface_name, bool* result);
void OnMsgSetPreferences(const Preferences& prefs);
virtual bool SendMessage(IPC::Message* msg);
diff --git a/ppapi/proxy/plugin_dispatcher_unittest.cc b/ppapi/proxy/plugin_dispatcher_unittest.cc
index 83a5cf4..821ecad 100644
--- a/ppapi/proxy/plugin_dispatcher_unittest.cc
+++ b/ppapi/proxy/plugin_dispatcher_unittest.cc
@@ -62,10 +62,10 @@
RegisterTestInterface(PPP_INSTANCE_INTERFACE, &dummy_ppp_instance_interface);
// Sending a request for a random interface should fail.
- EXPECT_FALSE(IsInterfaceSupported("Random interface"));
+ EXPECT_FALSE(SupportsInterface("Random interface"));
// Sending a request for a supported PPP interface should succeed.
- EXPECT_TRUE(IsInterfaceSupported(PPP_INSTANCE_INTERFACE));
+ EXPECT_TRUE(SupportsInterface(PPP_INSTANCE_INTERFACE));
}
TEST_F(PluginDispatcherTest, PPBCreation) {
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 135786c..484e6c7 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -486,13 +486,9 @@
// Sent in both directions to see if the other side supports the given
// interface.
-IPC_SYNC_MESSAGE_CONTROL1_1(PpapiMsg_IsInterfaceSupported,
+IPC_SYNC_MESSAGE_CONTROL1_1(PpapiMsg_SupportsInterface,
std::string /* interface_name */,
bool /* result */)
-// Sent by the plugin side of the proxy to inform the renderer that a given
-// plugin interface (PPP_*) is supported.
-IPC_MESSAGE_CONTROL1(PpapiHostMsg_PluginSupportsInterface,
- std::string /* interface_name */)
IPC_MESSAGE_CONTROL1(PpapiHostMsg_LogInterfaceUsage,
int /* interface_hash */)
@@ -1184,9 +1180,9 @@
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance,
PP_Instance /* instance */,
uint32 /* result */)
-IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBTesting_SimulateInputEvent,
- PP_Instance /* instance */,
- ppapi::InputEventData /* input_event */)
+IPC_SYNC_MESSAGE_ROUTED2_0(PpapiHostMsg_PPBTesting_SimulateInputEvent,
+ PP_Instance /* instance */,
+ ppapi::InputEventData /* input_event */)
IPC_SYNC_MESSAGE_ROUTED1_0(
PpapiHostMsg_PPBTesting_SetMinimumArrayBufferSizeForShmem,
uint32_t /* threshold */)
diff --git a/ppapi/proxy/ppapi_proxy_test.cc b/ppapi/proxy/ppapi_proxy_test.cc
index b75f4b8..2c0b136 100644
--- a/ppapi/proxy/ppapi_proxy_test.cc
+++ b/ppapi/proxy/ppapi_proxy_test.cc
@@ -122,13 +122,13 @@
registered_interfaces_[name] = test_interface;
}
-bool ProxyTestHarnessBase::IsInterfaceSupported(const char* name) {
+bool ProxyTestHarnessBase::SupportsInterface(const char* name) {
sink().ClearMessages();
// IPC doesn't actually write to this when we send a message manually
// not actually using IPC.
bool unused_result = false;
- PpapiMsg_IsInterfaceSupported msg(name, &unused_result);
+ PpapiMsg_SupportsInterface msg(name, &unused_result);
GetDispatcher()->OnMessageReceived(msg);
const IPC::Message* reply_msg =
@@ -137,8 +137,8 @@
if (!reply_msg)
return false;
- TupleTypes<PpapiMsg_IsInterfaceSupported::ReplyParam>::ValueTuple reply_data;
- EXPECT_TRUE(PpapiMsg_IsInterfaceSupported::ReadReplyParam(
+ TupleTypes<PpapiMsg_SupportsInterface::ReplyParam>::ValueTuple reply_data;
+ EXPECT_TRUE(PpapiMsg_SupportsInterface::ReadReplyParam(
reply_msg, &reply_data));
sink().ClearMessages();
diff --git a/ppapi/proxy/ppapi_proxy_test.h b/ppapi/proxy/ppapi_proxy_test.h
index c0c11cd..ce9ec65 100644
--- a/ppapi/proxy/ppapi_proxy_test.h
+++ b/ppapi/proxy/ppapi_proxy_test.h
@@ -76,7 +76,7 @@
// Sends a "supports interface" message to the current dispatcher and returns
// true if it's supported. This is just for the convenience of tests.
- bool IsInterfaceSupported(const char* name);
+ bool SupportsInterface(const char* name);
private:
// Destination for IPC messages sent by the test.
diff --git a/ppapi/proxy/ppb_video_decoder_proxy.cc b/ppapi/proxy/ppb_video_decoder_proxy.cc
index 8913c01..7699c84 100644
--- a/ppapi/proxy/ppb_video_decoder_proxy.cc
+++ b/ppapi/proxy/ppb_video_decoder_proxy.cc
@@ -6,7 +6,6 @@
#include "base/logging.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
-#include "ppapi/c/dev/ppp_video_decoder_dev.h"
#include "ppapi/proxy/enter_proxy.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
@@ -196,14 +195,6 @@
if (!dispatcher->preferences().is_accelerated_video_decode_enabled)
return 0;
- // We must get the plugin interface now, prior to doing Create synchronously.
- // Otherwise, the browser will try to get the interface via a re-entrant
- // sync message back to us, which would deadlock.
- const std::string if_name = PPP_VIDEODECODER_DEV_INTERFACE_0_11;
- if (!dispatcher->GetPluginInterface(if_name))
- return 0;
- dispatcher->Send(new PpapiHostMsg_PluginSupportsInterface(if_name));
-
EnterResourceNoLock<PPB_Graphics3D_API> enter_context(graphics_context,
true);
if (enter_context.failed())
diff --git a/remoting/webapp/base/html/main.css b/remoting/webapp/base/html/main.css
index d1ffd11..8d7a52c 100644
--- a/remoting/webapp/base/html/main.css
+++ b/remoting/webapp/base/html/main.css
@@ -673,11 +673,9 @@
#session-client-plugin {
box-shadow: 0 0 8px 0 black;
-webkit-user-select: none;
-}
-
-#session-client-plugin {
display: block;
flex-shrink: 0;
+ z-index: 2; /* Show above the dialog screen so that click-to-play works. */
}
.session-client-inactive {
diff --git a/third_party/libjingle/BUILD.gn b/third_party/libjingle/BUILD.gn
index 38f0a02..f56e81e 100644
--- a/third_party/libjingle/BUILD.gn
+++ b/third_party/libjingle/BUILD.gn
@@ -552,7 +552,6 @@
deps = [
":libjingle_webrtc_common",
"//third_party/webrtc",
- "//third_party/webrtc/modules/audio_processing",
"//third_party/webrtc/system_wrappers",
"//third_party/webrtc/voice_engine",
]
diff --git a/third_party/libjingle/libjingle.gyp b/third_party/libjingle/libjingle.gyp
index cc48f24..f062841 100644
--- a/third_party/libjingle/libjingle.gyp
+++ b/third_party/libjingle/libjingle.gyp
@@ -598,7 +598,6 @@
'<(libjingle_source)/talk/media/webrtc/webrtcvoiceengine.h',
],
'dependencies': [
- '<(DEPTH)/third_party/webrtc/modules/modules.gyp:audio_processing',
'<(DEPTH)/third_party/webrtc/system_wrappers/source/system_wrappers.gyp:system_wrappers',
'<(DEPTH)/third_party/webrtc/voice_engine/voice_engine.gyp:voice_engine',
'<(DEPTH)/third_party/webrtc/webrtc.gyp:webrtc',
diff --git a/third_party/libjingle/overrides/init_webrtc.cc b/third_party/libjingle/overrides/init_webrtc.cc
index b160cbb..041fb20 100644
--- a/third_party/libjingle/overrides/init_webrtc.cc
+++ b/third_party/libjingle/overrides/init_webrtc.cc
@@ -12,8 +12,6 @@
#include "base/metrics/histogram.h"
#include "base/native_library.h"
#include "base/path_service.h"
-#include "third_party/webrtc/common.h"
-#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/base/basictypes.h"
#include "webrtc/base/logging.h"
@@ -82,13 +80,6 @@
return true;
}
-webrtc::AudioProcessing* CreateWebRtcAudioProcessing(
- const webrtc::Config& config) {
- // libpeerconnection is being compiled as a static lib, use
- // webrtc::AudioProcessing directly.
- return webrtc::AudioProcessing::Create(config);
-}
-
#else // !LIBPEERCONNECTION_LIB
// When being compiled as a shared library, we need to bridge the gap between
@@ -98,7 +89,6 @@
// Global function pointers to the factory functions in the shared library.
CreateWebRtcMediaEngineFunction g_create_webrtc_media_engine = NULL;
DestroyWebRtcMediaEngineFunction g_destroy_webrtc_media_engine = NULL;
-CreateWebRtcAudioProcessingFunction g_create_webrtc_audio_processing = NULL;
// Returns the full or relative path to the libpeerconnection module depending
// on what platform we're on.
@@ -175,8 +165,8 @@
&AddTraceEvent,
&g_create_webrtc_media_engine,
&g_destroy_webrtc_media_engine,
- &init_diagnostic_logging,
- &g_create_webrtc_audio_processing);
+ &init_diagnostic_logging);
+
if (init_ok)
rtc::SetExtraLoggingInit(init_diagnostic_logging);
return init_ok;
@@ -200,12 +190,4 @@
g_destroy_webrtc_media_engine(media_engine);
}
-webrtc::AudioProcessing* CreateWebRtcAudioProcessing(
- const webrtc::Config& config) {
- // The same as CreateWebRtcMediaEngine(), we call InitializeWebRtcModule here
- // for convenience of tests.
- InitializeWebRtcModule();
- return g_create_webrtc_audio_processing(config);
-}
-
#endif // LIBPEERCONNECTION_LIB
diff --git a/third_party/libjingle/overrides/init_webrtc.h b/third_party/libjingle/overrides/init_webrtc.h
index c29bd71..714f9c6 100644
--- a/third_party/libjingle/overrides/init_webrtc.h
+++ b/third_party/libjingle/overrides/init_webrtc.h
@@ -23,8 +23,6 @@
namespace webrtc {
class AudioDeviceModule;
-class AudioProcessing;
-class Config;
namespace metrics {
class Histogram;
} // namespace metrics
@@ -53,9 +51,6 @@
typedef void (*InitDiagnosticLoggingDelegateFunctionFunction)(
void (*DelegateFunction)(const std::string&));
-typedef webrtc::AudioProcessing* (*CreateWebRtcAudioProcessingFunction)(
- const webrtc::Config& config);
-
// A typedef for the main initialize function in libpeerconnection.
// This will initialize logging in the module with the proper arguments
// as well as provide pointers back to a couple webrtc factory functions.
@@ -77,8 +72,7 @@
webrtc::AddTraceEventPtr trace_add_trace_event,
CreateWebRtcMediaEngineFunction* create_media_engine,
DestroyWebRtcMediaEngineFunction* destroy_media_engine,
- InitDiagnosticLoggingDelegateFunctionFunction* init_diagnostic_logging,
- CreateWebRtcAudioProcessingFunction* create_audio_processing);
+ InitDiagnosticLoggingDelegateFunctionFunction* init_diagnostic_logging);
#if !defined(LIBPEERCONNECTION_IMPLEMENTATION)
// Load and initialize the shared WebRTC module (libpeerconnection).
@@ -87,11 +81,6 @@
// If not called explicitly, this function will still be called from the main
// CreateWebRtcMediaEngine factory function the first time it is called.
bool InitializeWebRtcModule();
-
-// Return a webrtc::AudioProcessing object.
-webrtc::AudioProcessing* CreateWebRtcAudioProcessing(
- const webrtc::Config& config);
-
#endif
#endif // THIRD_PARTY_LIBJINGLE_OVERRIDES_INIT_WEBRTC_H_
diff --git a/third_party/libjingle/overrides/initialize_module.cc b/third_party/libjingle/overrides/initialize_module.cc
index 1250cfb..09afbc2 100644
--- a/third_party/libjingle/overrides/initialize_module.cc
+++ b/third_party/libjingle/overrides/initialize_module.cc
@@ -8,7 +8,6 @@
#include "base/logging.h"
#include "init_webrtc.h"
#include "talk/media/webrtc/webrtcmediaengine.h"
-#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/base/basictypes.h"
#include "webrtc/base/logging.h"
@@ -99,9 +98,7 @@
CreateWebRtcMediaEngineFunction* create_media_engine,
DestroyWebRtcMediaEngineFunction* destroy_media_engine,
InitDiagnosticLoggingDelegateFunctionFunction*
- init_diagnostic_logging,
- CreateWebRtcAudioProcessingFunction*
- create_audio_processing) {
+ init_diagnostic_logging) {
#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
g_alloc = alloc;
g_dealloc = dealloc;
@@ -115,7 +112,6 @@
*create_media_engine = &CreateWebRtcMediaEngine;
*destroy_media_engine = &DestroyWebRtcMediaEngine;
*init_diagnostic_logging = &rtc::InitDiagnosticLoggingDelegateFunction;
- *create_audio_processing = &webrtc::AudioProcessing::Create;
if (CommandLine::Init(0, NULL)) {
#if !defined(OS_WIN)
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index e077c0a..915dec4 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -17334,6 +17334,9 @@
<histogram name="Net.QuicClientHelloServerConfigState"
enum="QuicServerConfigState">
+ <obsolete>
+ Deprecated as of 11/2014. Replaced by Net.QuicInchoateClientHelloReason.
+ </obsolete>
<owner>rtenneti@chromium.org</owner>
<summary>
The reason (the state of the server config) for sending inchoate ClientHello
@@ -17399,6 +17402,15 @@
</summary>
</histogram>
+<histogram name="Net.QuicInchoateClientHelloReason"
+ enum="QuicServerConfigState">
+ <owner>rtenneti@chromium.org</owner>
+ <summary>
+ The reason (the state of the server config) for sending inchoate ClientHello
+ to the server.
+ </summary>
+</histogram>
+
<histogram name="Net.QuicNumSentClientHellos">
<owner>rch@chromium.org</owner>
<summary>The number of client hello messages sent.</summary>
@@ -17448,6 +17460,15 @@
<summary>Time spent to load QUIC server information from disk cache.</summary>
</histogram>
+<histogram name="Net.QuicServerInfo.DiskCacheState"
+ enum="QuicServerConfigState">
+ <owner>rtenneti@chromium.org</owner>
+ <summary>
+ The state of the QUIC server information when it's loaded from the disk
+ cache.
+ </summary>
+</histogram>
+
<histogram name="Net.QuicServerInfo.DiskCacheWaitForDataReadyTime"
units="milliseconds">
<owner>rtenneti@chromium.org</owner>
@@ -17456,6 +17477,16 @@
</summary>
</histogram>
+<histogram name="Net.QuicServerInfo.ExpectConfigMissingFromDiskCache"
+ enum="BooleanMissingFromDiskCache">
+ <owner>rtenneti@chromium.org</owner>
+ <summary>
+ The number of times AlternateProtocolMap supports QUIC, but there is no QUIC
+ server information in the disk cache. This is recorded whenever QUIC server
+ information is loaded from the disk cache.
+ </summary>
+</histogram>
+
<histogram name="Net.QuicSession.21CumulativePacketsReceived"
units="Received in Ranges">
<owner>rch@chromium.org</owner>
@@ -25112,6 +25143,32 @@
</summary>
</histogram>
+<histogram name="Plugin.Flash.ClickSize.AspectRatio">
+ <owner>tommycli@chromium.org</owner>
+ <summary>
+ Aspect ratio of Flash plugins users click at least once. The aspect ratio is
+ multiplied by 100 and stored as a rounded integer.
+ </summary>
+</histogram>
+
+<histogram name="Plugin.Flash.ClickSize.Height" units="pixels">
+ <owner>tommycli@chromium.org</owner>
+ <summary>Height of Flash plugins users click at least once.</summary>
+</histogram>
+
+<histogram name="Plugin.Flash.ClickSize.Width" units="pixels">
+ <owner>tommycli@chromium.org</owner>
+ <summary>Width of Flash plugins users click at least once.</summary>
+</histogram>
+
+<histogram name="Plugin.Flash.TinyContentSize" enum="FlashTinyContentSize">
+ <owner>tommycli@chromium.org</owner>
+ <summary>
+ Collects the sizes of all loaded Flash plugin instances. This is for
+ determining the prevalence of tiny flash plugin instances.
+ </summary>
+</histogram>
+
<histogram name="Plugin.FlashNavigateUsage" enum="FlashNavigateUsageType">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<summary>Record usage of PPB_Flash.Navigate() Pepper API.</summary>
@@ -25123,7 +25180,7 @@
<summary>Collects Flash usage data.</summary>
</histogram>
-<histogram name="Plugin.PowerSaverPeripheralHeuristic"
+<histogram name="Plugin.PowerSaver.PeripheralHeuristic"
enum="PluginPowerSaverPeripheralHeuristicDecision">
<owner>tommycli@chromium.org</owner>
<summary>
@@ -25135,7 +25192,7 @@
</summary>
</histogram>
-<histogram name="Plugin.PowerSaverUnthrottle"
+<histogram name="Plugin.PowerSaver.Unthrottle"
enum="PluginPowerSaverUnthrottleMethod">
<owner>tommycli@chromium.org</owner>
<summary>
@@ -41293,6 +41350,11 @@
<int value="1" label="Migrated"/>
</enum>
+<enum name="BooleanMissingFromDiskCache" type="int">
+ <int value="0" label="Has data in disk cache"/>
+ <int value="1" label="Missing data in disk cache"/>
+</enum>
+
<enum name="BooleanOrphan" type="int">
<int value="0" label="Non-orphan"/>
<int value="1" label="Orphan"/>
@@ -45907,6 +45969,13 @@
<int value="15" label="The total number of navigate requests."/>
</enum>
+<enum name="FlashTinyContentSize" type="int">
+ <int value="0" label="1x1 or smaller"/>
+ <int value="1" label="5x5 or smaller"/>
+ <int value="2" label="10x10 or smaller"/>
+ <int value="3" label="Large"/>
+</enum>
+
<enum name="FlashUsage" type="int">
<int value="0" label="Started NPAPI Flash at least once">
Number of browser processes that have started at least one NPAPI Flash
@@ -52557,6 +52626,7 @@
<int value="2" label="SERVER_CONFIG_CORRUPTED"/>
<int value="3" label="SERVER_CONFIG_EXPIRED"/>
<int value="4" label="SERVER_CONFIG_INVALID_EXPIRY"/>
+ <int value="5" label="SERVER_CONFIG_VALID"/>
</enum>
<enum name="QuicSessionErrorCodes" type="int">
diff --git a/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java b/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java
index b80de90..c1056b0 100644
--- a/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java
+++ b/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java
@@ -74,6 +74,9 @@
});
setAnchorView(mAnchorView);
+ Rect originalPadding = new Rect();
+ getBackground().getPadding(originalPadding);
+ setVerticalOffset(-originalPadding.top);
}
/**
@@ -111,8 +114,8 @@
setInputMethodMode(INPUT_METHOD_NEEDED);
int contentWidth = measureContentWidth();
- float contentWidthInDip = contentWidth /
- mContext.getResources().getDisplayMetrics().density;
+ float contentWidthInDip = contentWidth
+ / mContext.getResources().getDisplayMetrics().density;
if (contentWidthInDip > mAnchorWidth) {
setContentWidth(contentWidth);
final Rect displayFrame = new Rect();
diff --git a/ui/base/win/shell.cc b/ui/base/win/shell.cc
index ee656ed..91eaf93 100644
--- a/ui/base/win/shell.cc
+++ b/ui/base/win/shell.cc
@@ -10,6 +10,7 @@
#include <shellapi.h>
#include "base/command_line.h"
+#include "base/debug/alias.h"
#include "base/files/file_path.h"
#include "base/native_library.h"
#include "base/strings/string_util.h"
@@ -146,7 +147,9 @@
switches::kDisableDwmComposition))
return false;
- if (base::win::GetVersion() < base::win::VERSION_VISTA)
+ base::win::Version version = base::win::GetVersion();
+ base::debug::Alias(&version); // TODO(scottmg): http://crbug.com/431549.
+ if (version < base::win::VERSION_VISTA)
return false;
// If composition is not enabled, we behave like on XP.
BOOL enabled = FALSE;
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
index 78d4004..cb0c6b1 100644
--- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -200,7 +200,10 @@
var externalFileUrl;
for (var i = 0; i < this.selectedEntries_.length; i++) {
var url = this.selectedEntries_[i].toURL();
- dataTransfer.items.add(this.selectedAsyncData_[url].file);
+ if (!this.selectedAsyncData_[url])
+ continue;
+ if (this.selectedAsyncData_[url].file)
+ dataTransfer.items.add(this.selectedAsyncData_[url].file);
if (!externalFileUrl)
externalFileUrl = this.selectedAsyncData_[url].externalFileUrl;
}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
index edb3dc2..0df02c3 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -209,7 +209,10 @@
*/
FileManagerUI.prototype.relayout = function() {
this.locationLine.truncate();
- this.listContainer.currentView.relayout();
+ if (this.listContainer.currentListType !==
+ ListContainer.ListType.UNINITIALIZED) {
+ this.listContainer.currentView.relayout();
+ }
};
/**
@@ -221,13 +224,13 @@
switch (listType) {
case ListContainer.ListType.DETAIL:
- this.toggleViewButton.classList.add('table');
- this.toggleViewButton.classList.remove('grid');
+ this.toggleViewButton.classList.remove('table');
+ this.toggleViewButton.classList.add('grid');
break;
case ListContainer.ListType.THUMBNAIL:
- this.toggleViewButton.classList.add('grid');
- this.toggleViewButton.classList.remove('table');
+ this.toggleViewButton.classList.remove('grid');
+ this.toggleViewButton.classList.add('table');
break;
default:
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index 1aba788..768be0b 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1206,11 +1206,9 @@
const SkScalar y_offset = SkFixedToScalar(hb_positions[i].y_offset);
run->positions[i].set(run->width + x_offset, -y_offset);
run->width += SkFixedToScalar(hb_positions[i].x_advance);
-#if defined(OS_LINUX)
- // Match Pango's glyph rounding logic on Linux.
+ // Round run widths if subpixel positioning is off to match native behavior.
if (!run->render_params.subpixel_positioning)
run->width = std::floor(run->width + 0.5f);
-#endif
}
hb_buffer_destroy(buffer);
diff --git a/ui/login/account_picker/user_pod_row.css b/ui/login/account_picker/user_pod_row.css
index 246c1fb..780fec9 100644
--- a/ui/login/account_picker/user_pod_row.css
+++ b/ui/login/account_picker/user_pod_row.css
@@ -259,6 +259,21 @@
background-image: url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_PRESSED');
}
+.custom-icon-locked-to-be-activated {
+ background-image:
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED');
+}
+
+.custom-icon-locked-to-be-activated.icon-with-tooltip:hover {
+ background-image:
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_HOVER');
+}
+
+.custom-icon-locked-to-be-activated.interactive-custom-icon:active {
+ background-image:
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_PRESSED');
+}
+
.custom-icon-locked-with-proximity-hint {
background-image:
url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT');
@@ -299,6 +314,12 @@
url('chrome://theme/IDR_EASY_UNLOCK_LOCKED')
url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_HOVER')
url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_PRESSED')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_HOVER')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_PRESSED')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT_HOVER')
+ url('chrome://theme/IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT_PRESSED')
url('chrome://theme/IDR_EASY_UNLOCK_UNLOCKED')
url('chrome://theme/IDR_EASY_UNLOCK_UNLOCKED_HOVER')
url('chrome://theme/IDR_EASY_UNLOCK_UNLOCKED_PRESSED');
diff --git a/ui/login/account_picker/user_pod_row.js b/ui/login/account_picker/user_pod_row.js
index ec32f89..f4adf57 100644
--- a/ui/login/account_picker/user_pod_row.js
+++ b/ui/login/account_picker/user_pod_row.js
@@ -191,6 +191,8 @@
*/
UserPodCustomIcon.ICONS = [
{id: 'locked', class: 'custom-icon-locked'},
+ {id: 'locked-to-be-activated',
+ class: 'custom-icon-locked-to-be-activated'},
{id: 'locked-with-proximity-hint',
class: 'custom-icon-locked-with-proximity-hint'},
{id: 'unlocked', class: 'custom-icon-unlocked'},
diff --git a/ui/message_center/views/message_center_view.cc b/ui/message_center/views/message_center_view.cc
index b9b6f16..983febf 100644
--- a/ui/message_center/views/message_center_view.cc
+++ b/ui/message_center/views/message_center_view.cc
@@ -54,13 +54,6 @@
const int kDefaultAnimationDurationMs = 120;
const int kDefaultFrameRateHz = 60;
-
-void SetViewHierarchyEnabled(views::View* view, bool enabled) {
- for (int i = 0; i < view->child_count(); i++)
- SetViewHierarchyEnabled(view->child_at(i), enabled);
- view->SetEnabled(enabled);
-}
-
} // namespace
class NoNotificationMessageView : public views::View {
@@ -692,13 +685,13 @@
if (is_closing_)
return;
- SetViewHierarchyEnabled(scroller_, false);
+ scroller_->SetEnabled(false);
button_bar_->SetAllButtonsEnabled(false);
message_list_view_->ClearAllNotifications(scroller_->GetVisibleRect());
}
void MessageCenterView::OnAllNotificationsCleared() {
- SetViewHierarchyEnabled(scroller_, true);
+ scroller_->SetEnabled(true);
button_bar_->SetAllButtonsEnabled(true);
button_bar_->SetCloseAllButtonEnabled(false);
message_center_->RemoveAllVisibleNotifications(true); // Action by user.
@@ -870,13 +863,12 @@
next_focused_view = message_list_view_->child_at(index - 1);
if (next_focused_view) {
- if (view->IsCloseButtonFocused()) {
+ if (view->IsCloseButtonFocused())
// Safe cast since all views in MessageListView are MessageViews.
static_cast<MessageView*>(
next_focused_view)->RequestFocusOnCloseButton();
- } else {
+ else
next_focused_view->RequestFocus();
- }
}
}
}
diff --git a/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png
new file mode 100644
index 0000000..73a83c0
--- /dev/null
+++ b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png
Binary files differ
diff --git a/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png
new file mode 100644
index 0000000..45abc6e
--- /dev/null
+++ b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png
Binary files differ
diff --git a/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png
new file mode 100644
index 0000000..a41cbeb
--- /dev/null
+++ b/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png
new file mode 100644
index 0000000..37c36b9
--- /dev/null
+++ b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png
new file mode 100644
index 0000000..4b488c2
--- /dev/null
+++ b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png
new file mode 100644
index 0000000..dd7de16
--- /dev/null
+++ b/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png
Binary files differ
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd
index 7b33c23..cadb517 100644
--- a/ui/resources/ui_resources.grd
+++ b/ui/resources/ui_resources.grd
@@ -270,6 +270,9 @@
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED" file="common/easy_unlock_locked.png" />
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_HOVER" file="common/easy_unlock_locked_hover.png" />
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_PRESSED" file="common/easy_unlock_locked_pressed.png" />
+ <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED" file="common/easy_unlock_locked_to_be_activated.png" />
+ <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_HOVER" file="common/easy_unlock_locked_to_be_activated_hover.png" />
+ <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_TO_BE_ACTIVATED_PRESSED" file="common/easy_unlock_locked_to_be_activated_pressed.png" />
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT" file="common/easy_unlock_locked_with_proximity_hint.png" />
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT_HOVER" file="common/easy_unlock_locked_with_proximity_hint_hover.png" />
<structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_LOCKED_WITH_PROXIMITY_HINT_PRESSED" file="common/easy_unlock_locked_with_proximity_hint_pressed.png" />
diff --git a/ui/resources/ui_resources.target.darwin-arm.mk b/ui/resources/ui_resources.target.darwin-arm.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-arm.mk
+++ b/ui/resources/ui_resources.target.darwin-arm.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.darwin-arm64.mk b/ui/resources/ui_resources.target.darwin-arm64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-arm64.mk
+++ b/ui/resources/ui_resources.target.darwin-arm64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.darwin-mips.mk b/ui/resources/ui_resources.target.darwin-mips.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-mips.mk
+++ b/ui/resources/ui_resources.target.darwin-mips.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.darwin-mips64.mk b/ui/resources/ui_resources.target.darwin-mips64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-mips64.mk
+++ b/ui/resources/ui_resources.target.darwin-mips64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.darwin-x86.mk b/ui/resources/ui_resources.target.darwin-x86.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-x86.mk
+++ b/ui/resources/ui_resources.target.darwin-x86.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.darwin-x86_64.mk b/ui/resources/ui_resources.target.darwin-x86_64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.darwin-x86_64.mk
+++ b/ui/resources/ui_resources.target.darwin-x86_64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-arm.mk b/ui/resources/ui_resources.target.linux-arm.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-arm.mk
+++ b/ui/resources/ui_resources.target.linux-arm.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-arm64.mk b/ui/resources/ui_resources.target.linux-arm64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-arm64.mk
+++ b/ui/resources/ui_resources.target.linux-arm64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-mips.mk b/ui/resources/ui_resources.target.linux-mips.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-mips.mk
+++ b/ui/resources/ui_resources.target.linux-mips.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-mips64.mk b/ui/resources/ui_resources.target.linux-mips64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-mips64.mk
+++ b/ui/resources/ui_resources.target.linux-mips64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-x86.mk b/ui/resources/ui_resources.target.linux-x86.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-x86.mk
+++ b/ui/resources/ui_resources.target.linux-x86.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/resources/ui_resources.target.linux-x86_64.mk b/ui/resources/ui_resources.target.linux-x86_64.mk
index 884c2db..6b7e62c 100644
--- a/ui/resources/ui_resources.target.linux-x86_64.mk
+++ b/ui/resources/ui_resources.target.linux-x86_64.mk
@@ -20,7 +20,7 @@
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
-$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+$(gyp_shared_intermediate_dir)/ui/resources/grit/ui_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/ui/resources/ui_resources.grd $(LOCAL_PATH)/ui/resources/default_100_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_100_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_100_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-bar.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-left.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-border-right.png $(LOCAL_PATH)/ui/resources/default_100_percent/linux/linux-progress-value.png $(LOCAL_PATH)/ui/resources/default_100_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_2_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/close_dialog_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/back_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_center.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_left.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/browser_action_badge_right.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/checkmark.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/close_3_mask.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/default_favicon_64.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_hardlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_to_be_activated_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_locked_with_proximity_hint_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_spinner.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/easy_unlock_unlocked_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/folder_closed_rtl.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/forward_arrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/menu_check.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/message_close.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/common/ntp_white_google_logo.png $(LOCAL_PATH)/ui/resources/default_200_percent/cros/menu_droparrow.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_hover.png $(LOCAL_PATH)/ui/resources/default_200_percent/disable_pressed.png $(LOCAL_PATH)/ui/resources/default_200_percent/throbber.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_32.png $(LOCAL_PATH)/ui/resources/default_300_percent/common/default_favicon_64.png $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/ios_plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from ui_resources.grd ($@)"
$(hide)cd $(gyp_local_path)/ui/resources; mkdir -p $(gyp_shared_intermediate_dir)/ui/resources/grit $(gyp_shared_intermediate_dir)/ui/resources; python ../../tools/grit/grit.py -i ui_resources.grd build -f ../../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/ui/resources" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" --no-output-all-resource-defines -D enable_printing -D use_concatenated_impulse_responses -D enable_webrtc -D enable_notifications
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc
index 1078d0b..9d71a98 100644
--- a/ui/views/controls/label.cc
+++ b/ui/views/controls/label.cc
@@ -437,7 +437,10 @@
NOTREACHED();
break;
}
- text_size.set_height(available.height());
+ if (!multi_line_)
+ text_size.set_height(available.height());
+ // Support vertical centering of multi-line labels: http://crbug.com/429595
+ origin.Offset(0, std::max(0, (available.height() - text_size.height())) / 2);
return gfx::Rect(origin, text_size);
}
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc
index 076ec46..3a99557 100644
--- a/ui/views/controls/label_unittest.cc
+++ b/ui/views/controls/label_unittest.cc
@@ -523,9 +523,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(extra.width() / 2, text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
int expected_flags = gfx::Canvas::MULTI_LINE |
gfx::Canvas::TEXT_ALIGN_CENTER |
gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
@@ -541,9 +541,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(0, text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
expected_flags = gfx::Canvas::MULTI_LINE |
gfx::Canvas::TEXT_ALIGN_LEFT |
gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
@@ -558,9 +558,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(extra.width(), text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
expected_flags = gfx::Canvas::MULTI_LINE |
gfx::Canvas::TEXT_ALIGN_RIGHT |
gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
@@ -584,7 +584,7 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(border.left() + extra.width() / 2, text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
EXPECT_EQ(center_bounds.height(), text_bounds.height());
expected_flags = gfx::Canvas::MULTI_LINE |
@@ -601,7 +601,7 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(border.left(), text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
EXPECT_EQ(center_bounds.height(), text_bounds.height());
expected_flags = gfx::Canvas::MULTI_LINE |
@@ -618,7 +618,7 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(extra.width() + border.left(), text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
EXPECT_EQ(center_bounds.height(), text_bounds.height());
expected_flags = gfx::Canvas::MULTI_LINE |
@@ -785,9 +785,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(extra.width() / 2, text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & flags);
#if !defined(OS_WIN)
@@ -801,9 +801,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(extra.width(), text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & flags);
#if !defined(OS_WIN)
@@ -816,9 +816,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(0, text_bounds.x());
- EXPECT_EQ(0, text_bounds.y());
+ EXPECT_EQ(extra.height() / 2, text_bounds.y());
EXPECT_GT(text_bounds.width(), kMinTextDimension);
- EXPECT_EQ(text_bounds.height(), label.height());
+ EXPECT_GT(text_bounds.height(), kMinTextDimension);
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & flags);
#if !defined(OS_WIN)
@@ -840,9 +840,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(border.left() + extra.width() / 2, text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
- EXPECT_EQ(label.GetContentsBounds().height(), text_bounds.height());
+ EXPECT_EQ(center_bounds.height(), text_bounds.height());
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & flags);
#if !defined(OS_WIN)
@@ -855,9 +855,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(border.left() + extra.width(), text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
- EXPECT_EQ(label.GetContentsBounds().height(), text_bounds.height());
+ EXPECT_EQ(center_bounds.height(), text_bounds.height());
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & flags);
#if !defined(OS_WIN)
@@ -870,9 +870,9 @@
label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags);
EXPECT_EQ(label.text(), paint_text);
EXPECT_EQ(border.left(), text_bounds.x());
- EXPECT_EQ(border.top(), text_bounds.y());
+ EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y());
EXPECT_EQ(center_bounds.width(), text_bounds.width());
- EXPECT_EQ(label.GetContentsBounds().height(), text_bounds.height());
+ EXPECT_EQ(center_bounds.height(), text_bounds.height());
EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags);
EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & flags);
#if !defined(OS_WIN)
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index fe562a7..08e337f 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -871,8 +871,7 @@
void HWNDMessageHandler::SizeConstraintsChanged() {
LONG style = GetWindowLong(hwnd(), GWL_STYLE);
// Ignore if this is not a standard window.
- // WS_OVERLAPPED is just the *absence* of WS_POPUP and WS_CHILD.
- if ((style & (WS_POPUP | WS_CHILD)) == WS_OVERLAPPED)
+ if (!(style & WS_OVERLAPPED))
return;
if (delegate_->CanResize()) {