Have Blink be told of scrollbar changes rather than paying attention itself (Chromium side).

BUG=306348
TEST=no visible change; scrollbar changes still work

Review URL: https://codereview.chromium.org/63203003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233826 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 2019ce6..3addee3 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -70,6 +70,10 @@
 #include "content/browser/android/surface_texture_peer_browser_impl.h"
 #endif
 
+#if defined(OS_MACOSX)
+#include "content/browser/theme_helper_mac.h"
+#endif
+
 #if defined(OS_WIN)
 #include <windows.h>
 #include <commctrl.h>
@@ -1021,6 +1025,10 @@
             CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP));
   }
 #endif  // !defined(OS_IOS)
+
+#if defined(OS_MACOSX)
+  ThemeHelperMac::GetInstance();
+#endif
   return result_code_;
 }
 
diff --git a/content/browser/theme_helper_mac.h b/content/browser/theme_helper_mac.h
new file mode 100644
index 0000000..ab043372
--- /dev/null
+++ b/content/browser/theme_helper_mac.h
@@ -0,0 +1,44 @@
+// Copyright 2013 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 CONTENT_BROWSER_THEME_HELPER_MAC_H_
+#define CONTENT_BROWSER_THEME_HELPER_MAC_H_
+
+#include "base/memory/singleton.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+
+namespace content {
+
+class ThemeHelperMac : public NotificationObserver {
+ public:
+  // Return pointer to the singleton instance for the current process, or NULL
+  // if none.
+  static ThemeHelperMac* GetInstance();
+
+  static void SendThemeChangeToAllRenderers(
+      float initial_button_delay,
+      float autoscroll_button_delay,
+      bool jump_on_track_click,
+      bool redraw);
+
+ private:
+  friend struct DefaultSingletonTraits<ThemeHelperMac>;
+
+  ThemeHelperMac();
+  virtual ~ThemeHelperMac();
+
+  // Overridden from NotificationObserver:
+  virtual void Observe(int type,
+                       const NotificationSource& source,
+                       const NotificationDetails& details) OVERRIDE;
+
+  NotificationRegistrar registrar_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThemeHelperMac);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_THEME_HELPER_MAC_H_
diff --git a/content/browser/theme_helper_mac.mm b/content/browser/theme_helper_mac.mm
new file mode 100644
index 0000000..3b952cc
--- /dev/null
+++ b/content/browser/theme_helper_mac.mm
@@ -0,0 +1,117 @@
+// Copyright 2013 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 "content/browser/theme_helper_mac.h"
+
+#include <Foundation/Foundation.h>
+
+#include "content/common/view_messages.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_process_host.h"
+
+@interface ScrollbarPrefsObserver : NSObject
+
++ (void)registerAsObserver;
++ (void)appearancePrefsChanged:(NSNotification*)notification;
++ (void)behaviorPrefsChanged:(NSNotification*)notification;
++ (void)notifyPrefsChangedWithRedraw:(BOOL)redraw;
+
+@end
+
+@implementation ScrollbarPrefsObserver
+
++ (void)registerAsObserver {
+  [[NSDistributedNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(appearancePrefsChanged:)
+             name:@"AppleAquaScrollBarVariantChanged"
+           object:nil
+suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately];
+
+  [[NSDistributedNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(behaviorPrefsChanged:)
+             name:@"AppleNoRedisplayAppearancePreferenceChanged"
+           object:nil
+suspensionBehavior:NSNotificationSuspensionBehaviorCoalesce];
+}
+
++ (void)appearancePrefsChanged:(NSNotification*)notification {
+  [self notifyPrefsChangedWithRedraw:YES];
+}
+
++ (void)behaviorPrefsChanged:(NSNotification*)notification {
+  [self notifyPrefsChangedWithRedraw:NO];
+}
+
++ (void)notifyPrefsChangedWithRedraw:(BOOL)redraw {
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+  [defaults synchronize];
+
+  content::ThemeHelperMac::SendThemeChangeToAllRenderers(
+      [defaults floatForKey:@"NSScrollerButtonDelay"],
+      [defaults floatForKey:@"NSScrollerButtonPeriod"],
+      [defaults boolForKey:@"AppleScrollerPagingBehavior"],
+      redraw);
+}
+
+@end
+
+namespace content {
+
+ThemeHelperMac::ThemeHelperMac() {
+  [ScrollbarPrefsObserver registerAsObserver];
+  registrar_.Add(this,
+                 NOTIFICATION_RENDERER_PROCESS_CREATED,
+                 NotificationService::AllSources());
+}
+
+ThemeHelperMac::~ThemeHelperMac() {
+}
+
+// static
+ThemeHelperMac* ThemeHelperMac::GetInstance() {
+  return Singleton<ThemeHelperMac,
+      LeakySingletonTraits<ThemeHelperMac> >::get();
+}
+
+
+void ThemeHelperMac::Observe(int type,
+                             const NotificationSource& source,
+                             const NotificationDetails& details) {
+  DCHECK_EQ(NOTIFICATION_RENDERER_PROCESS_CREATED, type);
+
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+  [defaults synchronize];
+
+  RenderProcessHost* rph = Source<RenderProcessHost>(source).ptr();
+  rph->Send(new ViewMsg_UpdateScrollbarTheme(
+      [defaults floatForKey:@"NSScrollerButtonDelay"],
+      [defaults floatForKey:@"NSScrollerButtonPeriod"],
+      [defaults boolForKey:@"AppleScrollerPagingBehavior"],
+      false));
+}
+
+// static
+void ThemeHelperMac::SendThemeChangeToAllRenderers(
+    float initial_button_delay,
+    float autoscroll_button_delay,
+    bool jump_on_track_click,
+    bool redraw) {
+  for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
+       !it.IsAtEnd();
+       it.Advance()) {
+    it.GetCurrentValue()->Send(new ViewMsg_UpdateScrollbarTheme(
+        initial_button_delay,
+        autoscroll_button_delay,
+        jump_on_track_click,
+        redraw));
+  }
+}
+
+}  // namespace content
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 0eeff755..1b1c634f 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -1290,11 +1290,20 @@
                     gfx::Size /* size */,
                     std::vector<unsigned char> /* png */)
 
+#if defined(OS_MACOSX)
+// Notification of a change in scrollbar appearance and/or behavior.
+IPC_MESSAGE_CONTROL4(ViewMsg_UpdateScrollbarTheme,
+                     float /* initial_button_delay */,
+                     float /* autoscroll_button_delay */,
+                     bool /* jump_on_track_click */,
+                     bool /* redraw */)
+#endif
+
+#if defined(OS_ANDROID)
 // Tells the renderer to suspend/resume the webkit timers.
 IPC_MESSAGE_CONTROL1(ViewMsg_SetWebKitSharedTimersSuspended,
                      bool /* suspend */)
 
-#if defined(OS_ANDROID)
 // Sent when the browser wants the bounding boxes of the current find matches.
 //
 // If match rects are already cached on the browser side, |current_version|
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 60f268d..24ed3c1 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -1133,6 +1133,8 @@
     'browser/system_message_window_win.h',
     'browser/tcmalloc_internals_request_job.cc',
     'browser/tcmalloc_internals_request_job.h',
+    'browser/theme_helper_mac.mm',
+    'browser/theme_helper_mac.h',
     'browser/tracing/trace_controller_impl.cc',
     'browser/tracing/trace_controller_impl.h',
     'browser/tracing/trace_message_filter.cc',
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index eb75bfa..d46c5b85 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -122,6 +122,10 @@
 #include "content/child/npapi/np_channel_base.h"
 #endif
 
+#if defined(OS_MACOSX)
+#include "third_party/WebKit/public/web/mac/WebScrollbarTheme.h"
+#endif
+
 #if defined(OS_POSIX)
 #include "ipc/ipc_channel_posix.h"
 #endif
@@ -1144,8 +1148,13 @@
     IPC_MESSAGE_HANDLER(ViewMsg_NetworkStateChanged, OnNetworkStateChanged)
     IPC_MESSAGE_HANDLER(ViewMsg_TempCrashWithData, OnTempCrashWithData)
     IPC_MESSAGE_HANDLER(ViewMsg_SetRendererProcessID, OnSetRendererProcessID)
+#if defined(OS_ANDROID)
     IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended,
                         OnSetWebKitSharedTimersSuspended)
+#endif
+#if defined(OS_MACOSX)
+    IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme)
+#endif
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -1285,9 +1294,23 @@
   renderer_process_id_ = process_id;
 }
 
+#if defined(OS_ANDROID)
 void RenderThreadImpl::OnSetWebKitSharedTimersSuspended(bool suspend) {
   ToggleWebKitSharedTimer(suspend);
 }
+#endif
+
+#if defined(OS_MACOSX)
+void RenderThreadImpl::OnUpdateScrollbarTheme(float initial_button_delay,
+                                              float autoscroll_button_delay,
+                                              bool jump_on_track_click,
+                                              bool redraw) {
+  blink::WebScrollbarTheme::updateScrollbars(initial_button_delay,
+                                             autoscroll_button_delay,
+                                             jump_on_track_click,
+                                             redraw);
+}
+#endif
 
 void RenderThreadImpl::OnMemoryPressure(
     base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index 7492b92..a407a53 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -380,9 +380,17 @@
   void OnGetAccessibilityTree();
   void OnTempCrashWithData(const GURL& data);
   void OnSetRendererProcessID(base::ProcessId process_id);
-  void OnSetWebKitSharedTimersSuspended(bool suspend);
   void OnMemoryPressure(
       base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
+#if defined(OS_ANDROID)
+  void OnSetWebKitSharedTimersSuspended(bool suspend);
+#endif
+#if defined(OS_MACOSX)
+  void OnUpdateScrollbarTheme(float initial_button_delay,
+                              float autoscroll_button_delay,
+                              bool jump_on_track_click,
+                              bool redraw);
+#endif
 
   void IdleHandlerInForegroundTab();