172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/theme_util.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_install_ui.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_updater.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_USES_GTK) 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/gtk/gtk_theme_service.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/theme_specifics.pb.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service_factory.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_constants.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCurrentThemeClientTag[] = "current_theme"; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool IsSystemThemeDistinctFromDefaultTheme() { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_USES_GTK) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UseSystemTheme(Profile* profile) { 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_USES_GTK) 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return GtkThemeService::GetFrom(profile)->UseGtkTheme(); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AreThemeSpecificsEqual(const sync_pb::ThemeSpecifics& a, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& b) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return AreThemeSpecificsEqualHelper( 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch a, b, IsSystemThemeDistinctFromDefaultTheme()); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AreThemeSpecificsEqualHelper( 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& a, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& b, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_system_theme_distinct_from_default_theme) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (a.use_custom_theme() != b.use_custom_theme()) { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (a.use_custom_theme()) { 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're using a custom theme, so simply compare IDs since those 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // are guaranteed unique. 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return a.custom_theme_id() == b.custom_theme_id(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (is_system_theme_distinct_from_default_theme) { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're not using a custom theme, but we care about system 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // vs. default. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return a.use_system_theme_by_default() == b.use_system_theme_by_default(); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're not using a custom theme, and we don't care about system 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // vs. default. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace { 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsTheme(const Extension& extension) { 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return extension.is_theme(); 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetCurrentThemeFromThemeSpecifics( 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& theme_specifics, 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) { 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (theme_specifics.use_custom_theme()) { 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(akalin): Figure out what to do about third-party themes 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (i.e., those not on either Google gallery). 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string id(theme_specifics.custom_theme_id()); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL update_url(theme_specifics.custom_theme_update_url()); 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Applying theme " << id << " with update_url " << update_url; 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionServiceInterface* extensions_service = 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->GetExtensionService(); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHECK(extensions_service); 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = extensions_service->GetExtensionById(id, true); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (extension) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!extension->is_theme()) { 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Extension " << id << " is not a theme; aborting"; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!extensions_service->IsExtensionEnabled(id)) { 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Theme " << id << " is not enabled; aborting"; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get previous theme info before we set the new theme. 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string previous_theme_id; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Extension* current_theme = 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeServiceFactory::GetThemeForProfile(profile); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (current_theme) { 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(current_theme->is_theme()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch previous_theme_id = current_theme->id(); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool previous_use_system_theme = UseSystemTheme(profile); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An enabled theme extension with the given id was found, so 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // just set the current theme to it. 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeServiceFactory::GetForProfile(profile)->SetTheme(extension); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Pretend the theme was just installed. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionInstallUI::ShowThemeInfoBar( 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch previous_theme_id, previous_use_system_theme, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension, profile); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No extension with this id exists -- we must install it; we do 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // so by adding it as a pending extension and then triggering an 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // auto-update cycle. 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Themes don't need to install silently as they just pop up an 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // informational dialog after installation instead of a 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // confirmation dialog. 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const bool kInstallSilently = false; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const bool kEnableOnInstall = true; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const bool kEnableIncognitoOnInstall = false; 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extensions_service->pending_extension_manager()->AddFromSync( 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen id, update_url, &IsTheme, 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kInstallSilently, kEnableOnInstall, kEnableIncognitoOnInstall); 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extensions_service->CheckForUpdatesSoon(); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (theme_specifics.use_system_theme_by_default()) { 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeServiceFactory::GetForProfile(profile)->SetNativeTheme(); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeServiceFactory::GetForProfile(profile)->UseDefaultTheme(); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UpdateThemeSpecificsOrSetCurrentThemeIfNecessary( 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile, sync_pb::ThemeSpecifics* theme_specifics) { 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!theme_specifics->use_custom_theme() && 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (ThemeServiceFactory::GetThemeForProfile(profile) || 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (UseSystemTheme(profile) && 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IsSystemThemeDistinctFromDefaultTheme()))) { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetThemeSpecificsFromCurrentTheme(profile, theme_specifics); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentThemeFromThemeSpecificsIfNecessary(*theme_specifics, profile); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GetThemeSpecificsFromCurrentTheme( 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile, 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_pb::ThemeSpecifics* theme_specifics) { 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Extension* current_theme = 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeServiceFactory::GetThemeForProfile(profile); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (current_theme) { 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(current_theme->is_theme()); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetThemeSpecificsFromCurrentThemeHelper( 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_theme, 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IsSystemThemeDistinctFromDefaultTheme(), 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UseSystemTheme(profile), 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GetThemeSpecificsFromCurrentThemeHelper( 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Extension* current_theme, 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_system_theme_distinct_from_default_theme, 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool use_system_theme_by_default, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_pb::ThemeSpecifics* theme_specifics) { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool use_custom_theme = (current_theme != NULL); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->set_use_custom_theme(use_custom_theme); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (is_system_theme_distinct_from_default_theme) { 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->set_use_system_theme_by_default( 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch use_system_theme_by_default); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!use_system_theme_by_default); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (use_custom_theme) { 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(current_theme); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(current_theme->is_theme()); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->set_custom_theme_name(current_theme->name()); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->set_custom_theme_id(current_theme->id()); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->set_custom_theme_update_url( 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_theme->update_url().spec()); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!current_theme); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->clear_custom_theme_name(); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->clear_custom_theme_id(); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_specifics->clear_custom_theme_update_url(); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetCurrentThemeFromThemeSpecificsIfNecessary( 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& theme_specifics, Profile* profile) { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_pb::ThemeSpecifics old_theme_specifics; 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetThemeSpecificsFromCurrentTheme(profile, &old_theme_specifics); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!AreThemeSpecificsEqual(old_theme_specifics, theme_specifics)) { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentThemeFromThemeSpecifics(theme_specifics, profile); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 218