Re-land 53849 (Revert 53857) - Implement most of the startup page controls in DOMUI prefs

Hooks up display of startup pages, removal of pages, and setting the startup pages to the currently open tabs.
Uses a select for now, but will eventually be replaced with a List so the favicons can be displayed.

BUG=48713
TEST=Startup pages can be viewed, removed, and set to current in DOMUI prefs.

Review URL: http://codereview.chromium.org/3046025

TBR=stuartmorgan@chromium.org
Review URL: http://codereview.chromium.org/3058018

TBR=stuartmorgan@chromium.org
Review URL: http://codereview.chromium.org/3032035

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54031 0039d316-1c4b-4281-b951-d872f2087c98
parent 5de3c683
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "chrome/browser/profile.h" #include "chrome/browser/profile.h"
#include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "gfx/codec/png_codec.h" #include "gfx/codec/png_codec.h"
#include "grit/app_resources.h" #include "grit/app_resources.h"
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
...@@ -83,7 +84,9 @@ void CustomHomePagesTableModel::SetToCurrentlyOpenPages() { ...@@ -83,7 +84,9 @@ void CustomHomePagesTableModel::SetToCurrentlyOpenPages() {
for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) { for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) {
const GURL url = browser->GetTabContentsAt(tab_index)->GetURL(); const GURL url = browser->GetTabContentsAt(tab_index)->GetURL();
if (!url.is_empty()) if (!url.is_empty() &&
!(url.SchemeIs(chrome::kChromeUIScheme) &&
url.host() == chrome::kChromeUIOptionsHost))
Add(add_index++, url); Add(add_index++, url);
} }
} }
......
...@@ -10,13 +10,15 @@ ...@@ -10,13 +10,15 @@
#include "base/string_util.h" #include "base/string_util.h"
#include "base/utf_string_conversions.h" #include "base/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/custom_home_pages_table_model.h"
#include "chrome/browser/profile.h" #include "chrome/browser/profile.h"
#include "chrome/browser/session_startup_pref.h"
#include "chrome/installer/util/browser_distribution.h" #include "chrome/installer/util/browser_distribution.h"
#include "grit/chromium_strings.h" #include "grit/chromium_strings.h"
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
BrowserOptionsHandler::BrowserOptionsHandler() BrowserOptionsHandler::BrowserOptionsHandler()
: template_url_model_(NULL) { : template_url_model_(NULL), startup_custom_pages_table_model_(NULL) {
#if !defined(OS_MACOSX) #if !defined(OS_MACOSX)
default_browser_worker_ = new ShellIntegration::DefaultBrowserWorker(this); default_browser_worker_ = new ShellIntegration::DefaultBrowserWorker(this);
#endif #endif
...@@ -75,17 +77,18 @@ void BrowserOptionsHandler::RegisterMessages() { ...@@ -75,17 +77,18 @@ void BrowserOptionsHandler::RegisterMessages() {
dom_ui_->RegisterMessageCallback( dom_ui_->RegisterMessageCallback(
"setDefaultSearchEngine", "setDefaultSearchEngine",
NewCallback(this, &BrowserOptionsHandler::SetDefaultSearchEngine)); NewCallback(this, &BrowserOptionsHandler::SetDefaultSearchEngine));
dom_ui_->RegisterMessageCallback(
"removeStartupPages",
NewCallback(this, &BrowserOptionsHandler::RemoveStartupPages));
dom_ui_->RegisterMessageCallback(
"setStartupPagesToCurrentPages",
NewCallback(this, &BrowserOptionsHandler::SetStartupPagesToCurrentPages));
} }
void BrowserOptionsHandler::Initialize() { void BrowserOptionsHandler::Initialize() {
UpdateDefaultBrowserState(); UpdateDefaultBrowserState();
UpdateStartupPages();
template_url_model_ = dom_ui_->GetProfile()->GetTemplateURLModel(); UpdateSearchEngines();
if (template_url_model_) {
template_url_model_->Load();
template_url_model_->AddObserver(this);
OnTemplateURLModelChanged();
}
} }
void BrowserOptionsHandler::UpdateDefaultBrowserState() { void BrowserOptionsHandler::UpdateDefaultBrowserState() {
...@@ -211,3 +214,89 @@ void BrowserOptionsHandler::SetDefaultSearchEngine(const Value* value) { ...@@ -211,3 +214,89 @@ void BrowserOptionsHandler::SetDefaultSearchEngine(const Value* value) {
template_url_model_->SetDefaultSearchProvider(model_urls[selected_index]); template_url_model_->SetDefaultSearchProvider(model_urls[selected_index]);
} }
void BrowserOptionsHandler::UpdateSearchEngines() {
template_url_model_ = dom_ui_->GetProfile()->GetTemplateURLModel();
if (template_url_model_) {
template_url_model_->Load();
template_url_model_->AddObserver(this);
OnTemplateURLModelChanged();
}
}
void BrowserOptionsHandler::UpdateStartupPages() {
Profile* profile = dom_ui_->GetProfile();
startup_custom_pages_table_model_.reset(
new CustomHomePagesTableModel(profile));
startup_custom_pages_table_model_->SetObserver(this);
const SessionStartupPref startup_pref =
SessionStartupPref::GetStartupPref(profile->GetPrefs());
startup_custom_pages_table_model_->SetURLs(startup_pref.urls);
}
void BrowserOptionsHandler::OnModelChanged() {
// TODO(stuartmorgan): Add support for showing favicons.
ListValue startup_pages;
int page_count = startup_custom_pages_table_model_->RowCount();
for (int i = 0; i < page_count; ++i) {
DictionaryValue* entry = new DictionaryValue();
entry->SetString(L"title",
startup_custom_pages_table_model_->GetText(i, 0));
entry->SetString(L"tooltip",
startup_custom_pages_table_model_->GetTooltip(i));
startup_pages.Append(entry);
}
dom_ui_->CallJavascriptFunction(L"BrowserOptions.updateStartupPages",
startup_pages);
}
void BrowserOptionsHandler::OnItemsChanged(int start, int length) {
OnModelChanged();
}
void BrowserOptionsHandler::OnItemsAdded(int start, int length) {
OnModelChanged();
}
void BrowserOptionsHandler::OnItemsRemoved(int start, int length) {
OnModelChanged();
}
void BrowserOptionsHandler::SetStartupPagesToCurrentPages(const Value* value) {
startup_custom_pages_table_model_->SetToCurrentlyOpenPages();
SaveStartupPagesPref();
}
void BrowserOptionsHandler::RemoveStartupPages(const Value* value) {
if (!value || !value->IsType(Value::TYPE_LIST)) {
NOTREACHED();
return;
}
const ListValue* param_values = static_cast<const ListValue*>(value);
for (int i = param_values->GetSize() - 1; i >= 0; --i) {
std::string string_value;
if (!param_values->GetString(i, &string_value)) {
NOTREACHED();
return;
}
int selected_index = StringToInt(string_value);
if (selected_index < 0 ||
selected_index >= startup_custom_pages_table_model_->RowCount()) {
NOTREACHED();
return;
}
startup_custom_pages_table_model_->Remove(selected_index);
}
SaveStartupPagesPref();
}
void BrowserOptionsHandler::SaveStartupPagesPref() {
PrefService* prefs = dom_ui_->GetProfile()->GetPrefs();
SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs);
pref.urls = startup_custom_pages_table_model_->GetURLs();
SessionStartupPref::SetStartupPref(prefs, pref);
}
...@@ -6,14 +6,18 @@ ...@@ -6,14 +6,18 @@
#define CHROME_BROWSER_DOM_UI_BROWSER_OPTIONS_HANDLER_H_ #define CHROME_BROWSER_DOM_UI_BROWSER_OPTIONS_HANDLER_H_
#pragma once #pragma once
#include "app/table_model_observer.h"
#include "chrome/browser/dom_ui/options_ui.h" #include "chrome/browser/dom_ui/options_ui.h"
#include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/search_engines/template_url_model.h"
#include "chrome/browser/shell_integration.h" #include "chrome/browser/shell_integration.h"
class CustomHomePagesTableModel;
// Chrome browser options page UI handler. // Chrome browser options page UI handler.
class BrowserOptionsHandler : public OptionsPageUIHandler, class BrowserOptionsHandler : public OptionsPageUIHandler,
public ShellIntegration::DefaultBrowserObserver, public ShellIntegration::DefaultBrowserObserver,
public TemplateURLModelObserver { public TemplateURLModelObserver,
public TableModelObserver {
public: public:
BrowserOptionsHandler(); BrowserOptionsHandler();
virtual ~BrowserOptionsHandler(); virtual ~BrowserOptionsHandler();
...@@ -31,6 +35,12 @@ class BrowserOptionsHandler : public OptionsPageUIHandler, ...@@ -31,6 +35,12 @@ class BrowserOptionsHandler : public OptionsPageUIHandler,
// TemplateURLModelObserver implementation. // TemplateURLModelObserver implementation.
virtual void OnTemplateURLModelChanged(); virtual void OnTemplateURLModelChanged();
// TableModelObserver implementation.
virtual void OnModelChanged();
virtual void OnItemsChanged(int start, int length);
virtual void OnItemsAdded(int start, int length);
virtual void OnItemsRemoved(int start, int length);
private: private:
// Makes this the default browser. Called from DOMUI. // Makes this the default browser. Called from DOMUI.
void BecomeDefaultBrowser(const Value* value); void BecomeDefaultBrowser(const Value* value);
...@@ -38,6 +48,12 @@ class BrowserOptionsHandler : public OptionsPageUIHandler, ...@@ -38,6 +48,12 @@ class BrowserOptionsHandler : public OptionsPageUIHandler,
// Sets the search engine at the given index to be default. Called from DOMUI. // Sets the search engine at the given index to be default. Called from DOMUI.
void SetDefaultSearchEngine(const Value* value); void SetDefaultSearchEngine(const Value* value);
// Removes the startup page at the given indexes. Called from DOMUI.
void RemoveStartupPages(const Value* value);
// Sets the startup page set to the current pages. Called from DOMUI.
void SetStartupPagesToCurrentPages(const Value* value);
// Returns the string ID for the given default browser state. // Returns the string ID for the given default browser state.
int StatusStringIdForState(ShellIntegration::DefaultBrowserState state); int StatusStringIdForState(ShellIntegration::DefaultBrowserState state);
...@@ -48,10 +64,24 @@ class BrowserOptionsHandler : public OptionsPageUIHandler, ...@@ -48,10 +64,24 @@ class BrowserOptionsHandler : public OptionsPageUIHandler,
// Updates the UI with the given state for the default browser. // Updates the UI with the given state for the default browser.
void SetDefaultBrowserUIString(int status_string_id); void SetDefaultBrowserUIString(int status_string_id);
// Loads the current set of custom startup pages and reports it to the DOMUI.
void UpdateStartupPages();
// Loads the possible default search engine list and reports it to the DOMUI.
void UpdateSearchEngines();
// Writes the current set of startup pages to prefs.
void SaveStartupPagesPref();
scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_; scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_;
TemplateURLModel* template_url_model_; // Weak. TemplateURLModel* template_url_model_; // Weak.
// TODO(stuartmorgan): Once there are no other clients of
// CustomHomePagesTableModel, consider changing it to something more like
// TemplateURLModel.
scoped_ptr<CustomHomePagesTableModel> startup_custom_pages_table_model_;
DISALLOW_COPY_AND_ASSIGN(BrowserOptionsHandler); DISALLOW_COPY_AND_ASSIGN(BrowserOptionsHandler);
}; };
......
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
pref="session.restore_on_startup" value="4"><span pref="session.restore_on_startup" value="4"><span
i18n-content="startupShowPages"></span></label> i18n-content="startupShowPages"></span></label>
<div class="suboption"> <div class="suboption">
<select id="startupPages" size="3"> <select id="startupPages" size="3" multiple>
</select><br> </select><br>
<button id="startupAddButton" <button id="startupAddButton"
i18n-content="startupAddButton"></button> i18n-content="startupAddButton"></button>
<button id="startupRemoveButton" disabled <button id="startupRemoveButton" disabled
i18n-content="startupRemoveButton"></button> i18n-content="startupRemoveButton"></button>
<button id="startupUseCurrentButton" disabled <button id="startupUseCurrentButton"
i18n-content="startupUseCurrent"></button> i18n-content="startupUseCurrent"></button>
</div> </div>
</div> </div>
......
...@@ -23,15 +23,19 @@ BrowserOptions.prototype = { ...@@ -23,15 +23,19 @@ BrowserOptions.prototype = {
// Call base class implementation to start preference initialization. // Call base class implementation to start preference initialization.
OptionsPage.prototype.initializePage.call(this); OptionsPage.prototype.initializePage.call(this);
// Wire up buttons. // Wire up controls.
var self = this;
$('startupPages').onchange = function(event) {
self.updateRemoveButtonState_();
};
$('startupAddButton').onclick = function(event) { $('startupAddButton').onclick = function(event) {
OptionsPage.showOverlay('addStartupPageOverlay'); OptionsPage.showOverlay('addStartupPageOverlay');
}; };
$('startupRemoveButton').onclick = function(event) { $('startupRemoveButton').onclick = function(event) {
// TODO(stuartmorgan): Remove selected element(s). self.removeSelectedStartupPages_();
}; };
$('startupUseCurrentButton').onclick = function(event) { $('startupUseCurrentButton').onclick = function(event) {
// TODO(stuartmorgan): Add all open tabs (except this one). chrome.send('setStartupPagesToCurrentPages');
}; };
$('defaultSearchManageEnginesButton').onclick = function(event) { $('defaultSearchManageEnginesButton').onclick = function(event) {
OptionsPage.showPageByName('searchEngines'); OptionsPage.showPageByName('searchEngines');
...@@ -81,10 +85,10 @@ BrowserOptions.prototype = { ...@@ -81,10 +85,10 @@ BrowserOptions.prototype = {
updateSearchEngines_: function(engines, defaultValue) { updateSearchEngines_: function(engines, defaultValue) {
this.clearSearchEngines_(); this.clearSearchEngines_();
engineSelect = $('defaultSearchEngine'); engineSelect = $('defaultSearchEngine');
engineCount = engines.length engineCount = engines.length;
var defaultIndex = -1; var defaultIndex = -1;
for (var i = 0; i < engineCount; i++) { for (var i = 0; i < engineCount; i++) {
var engine = engines[i] var engine = engines[i];
var option = new Option(engine['name'], engine['index']); var option = new Option(engine['name'], engine['index']);
if (defaultValue == option.value) if (defaultValue == option.value)
defaultIndex = i; defaultIndex = i;
...@@ -94,6 +98,55 @@ BrowserOptions.prototype = { ...@@ -94,6 +98,55 @@ BrowserOptions.prototype = {
engineSelect.selectedIndex = defaultIndex; engineSelect.selectedIndex = defaultIndex;
}, },
/**
* Clears the startup page list.
* @private
*/
clearStartupPages_: function() {
$('startupPages').textContent = '';
},
/**
* Updates the startup pages list with the given entries.
* @param {Array} pages List of startup pages.
*/
updateStartupPages_: function(pages) {
// TODO(stuartmorgan): Replace <select> with a DOMUI List.
this.clearStartupPages_();
pageList = $('startupPages');
pageCount = pages.length;
for (var i = 0; i < pageCount; i++) {
var page = pages[i];
var option = new Option(page['title']);
option.title = page['tooltip'];
pageList.appendChild(option);
}
this.updateRemoveButtonState_();
},
/**
* Sets the enabled state of the startup page Remove button based on
* the current selection in the startup pages list.
*/
updateRemoveButtonState_: function() {
$('startupRemoveButton').disabled = ($('startupPages').selectedIndex == -1);
},
/**
* Removes the selected startup pages.
*/
removeSelectedStartupPages_: function() {
var pageSelect = $('startupPages');
var optionCount = pageSelect.options.length;
var selections = [];
for (var i = 0; i < optionCount; i++) {
if (pageSelect.options[i].selected)
selections.push(String(i));
}
chrome.send('removeStartupPages', selections);
},
/** /**
* Set the default search engine based on the popup selection. * Set the default search engine based on the popup selection.
*/ */
...@@ -110,8 +163,12 @@ BrowserOptions.prototype = { ...@@ -110,8 +163,12 @@ BrowserOptions.prototype = {
BrowserOptions.updateDefaultBrowserState = function(statusString, isDefault) { BrowserOptions.updateDefaultBrowserState = function(statusString, isDefault) {
BrowserOptions.getInstance().updateDefaultBrowserState_(statusString, BrowserOptions.getInstance().updateDefaultBrowserState_(statusString,
isDefault); isDefault);
} };
BrowserOptions.updateSearchEngines = function(engines, defaultValue) { BrowserOptions.updateSearchEngines = function(engines, defaultValue) {
BrowserOptions.getInstance().updateSearchEngines_(engines, defaultValue); BrowserOptions.getInstance().updateSearchEngines_(engines, defaultValue);
} };
BrowserOptions.updateStartupPages = function(pages) {
BrowserOptions.getInstance().updateStartupPages_(pages);
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment