|  | // 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/containers/span.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/read_only_shared_memory_region.h" | 
|  | #include "base/memory/writable_shared_memory_region.h" | 
|  | #include "content/public/browser/notification_observer.h" | 
|  | #include "content/public/browser/notification_registrar.h" | 
|  | #include "third_party/blink/public/common/sandbox_support/sandbox_support_mac.h" | 
|  | #include "third_party/blink/public/platform/mac/web_scrollbar_theme.h" | 
|  | #include "third_party/skia/include/core/SkColor.h" | 
|  |  | 
|  | #if __OBJC__ | 
|  | @class SystemThemeObserver; | 
|  | #else | 
|  | class SystemThemeObserver; | 
|  | #endif | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | // This class is used to monitor macOS system appearance changes and to notify | 
|  | // sandboxed child processes when they change. This class lives on the UI | 
|  | // thread. | 
|  | class ThemeHelperMac : public NotificationObserver { | 
|  | public: | 
|  | // Return pointer to the singleton instance for the current process, or NULL | 
|  | // if none. | 
|  | static ThemeHelperMac* GetInstance(); | 
|  |  | 
|  | // Duplicates a handle to the read-only copy of the system color table, | 
|  | // which can be shared to sandboxed child processes. | 
|  | base::ReadOnlySharedMemoryRegion DuplicateReadOnlyColorMapRegion(); | 
|  |  | 
|  | private: | 
|  | ThemeHelperMac(); | 
|  | ~ThemeHelperMac() override; | 
|  |  | 
|  | // Looks up the blink::MacSystemColorID corresponding to the NSColor | 
|  | // selector and stores them in the |writable_color_map_| table. Looks up | 
|  | // colors for both light and dark appearances. | 
|  | void LoadSystemColors(); | 
|  |  | 
|  | // Looks up system colors for the current appearance, either a light or | 
|  | // dark appearance and stores them in values. The values parameter is the part | 
|  | // of writable_color_map_ where the colors for the current appearance should | 
|  | // be stored. | 
|  | void LoadSystemColorsForCurrentAppearance(base::span<SkColor> values); | 
|  |  | 
|  | // Overridden from NotificationObserver: | 
|  | void Observe(int type, | 
|  | const NotificationSource& source, | 
|  | const NotificationDetails& details) override; | 
|  |  | 
|  | // ObjC object that observes notifications from the system. | 
|  | SystemThemeObserver* theme_observer_;  // strong | 
|  |  | 
|  | // Writable and mapped array of SkColor values, indexed by MacSystemColorID | 
|  | // for a light appearance. Colors for a dark appearance in indexed by | 
|  | // MacSystemColorID starting at index MacSystemColorID::kCount. | 
|  | base::WritableSharedMemoryMapping writable_color_map_; | 
|  |  | 
|  | // Read-only handle to the |writable_color_map_| that can be duplicated for | 
|  | // sharing to child processes. | 
|  | base::ReadOnlySharedMemoryRegion read_only_color_map_; | 
|  |  | 
|  | NotificationRegistrar registrar_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ThemeHelperMac); | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_THEME_HELPER_MAC_H_ |