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();