Commit 61b192c3 authored by Esmael El-Moslimany's avatar Esmael El-Moslimany Committed by Commit Bot

Settings: close dialog or validate inputs when search engine template URL's change

Bug: 781703
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: If6fda4644b20764c0561d03a826c97e561f80337
Reviewed-on: https://chromium-review.googlesource.com/1024967
Commit-Queue: Esmael El-Moslimany <aee@chromium.org>
Reviewed-by: default avatarDemetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#553757}
parent d3394e24
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
'dependencies': [ 'dependencies': [
'<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
'<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
'<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:web_ui_listener_behavior',
'search_engines_browser_proxy', 'search_engines_browser_proxy',
], ],
'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
......
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html">
<link rel="import" href="../i18n_setup.html"> <link rel="import" href="../i18n_setup.html">
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
Polymer({ Polymer({
is: 'settings-search-engine-dialog', is: 'settings-search-engine-dialog',
behaviors: [WebUIListenerBehavior],
properties: { properties: {
/** /**
* The search engine to be edited. If not populated a new search engine * The search engine to be edited. If not populated a new search engine
...@@ -69,6 +71,9 @@ Polymer({ ...@@ -69,6 +71,9 @@ Polymer({
this.addEventListener('cancel', () => { this.addEventListener('cancel', () => {
this.browserProxy_.searchEngineEditCancelled(); this.browserProxy_.searchEngineEditCancelled();
}); });
this.addWebUIListener(
'search-engines-changed', this.enginesChanged_.bind(this));
}, },
/** @override */ /** @override */
...@@ -79,6 +84,25 @@ Polymer({ ...@@ -79,6 +84,25 @@ Polymer({
this.$.dialog.showModal(); this.$.dialog.showModal();
}, },
/**
* @param {!SearchEnginesInfo} searchEnginesInfo
* @private
*/
enginesChanged_: function(searchEnginesInfo) {
if (this.model) {
const engineWasRemoved = ['defaults', 'others', 'extensions'].every(
engineType =>
searchEnginesInfo[engineType].every(e => e.id != this.model.id));
if (engineWasRemoved) {
this.cancel_();
return;
}
}
[this.$.searchEngine, this.$.keyword, this.$.queryUrl].forEach(
element => this.validateElement_(element));
},
/** @private */ /** @private */
cancel_: function() { cancel_: function() {
this.$.dialog.cancel(); this.$.dialog.cancel();
...@@ -92,12 +116,10 @@ Polymer({ ...@@ -92,12 +116,10 @@ Polymer({
}, },
/** /**
* @param {!Event} event * @param {!Element} inputElement
* @private * @private
*/ */
validate_: function(event) { validateElement_: function(inputElement) {
const inputElement = Polymer.dom(event).localTarget;
// If element is empty, disable the action button, but don't show the red // If element is empty, disable the action button, but don't show the red
// invalid message. // invalid message.
if (inputElement.value == '') { if (inputElement.value == '') {
...@@ -114,6 +136,15 @@ Polymer({ ...@@ -114,6 +136,15 @@ Polymer({
}); });
}, },
/**
* @param {!Event} event
* @private
*/
validate_: function(event) {
const inputElement = /** @type {!Element} */ (event.target);
this.validateElement_(inputElement);
},
/** @private */ /** @private */
updateActionButtonState_: function() { updateActionButtonState_: function() {
const allValid = [ const allValid = [
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
* canBeDisabled: boolean, * canBeDisabled: boolean,
* icon: string}|undefined), * icon: string}|undefined),
* iconURL: (string|undefined), * iconURL: (string|undefined),
* id: number,
* isOmniboxExtension: boolean, * isOmniboxExtension: boolean,
* keyword: string, * keyword: string,
* modelIndex: number, * modelIndex: number,
......
...@@ -188,6 +188,7 @@ SearchEnginesHandler::CreateDictionaryForEngine(int index, bool is_default) { ...@@ -188,6 +188,7 @@ SearchEnginesHandler::CreateDictionaryForEngine(int index, bool is_default) {
// in @typedef for SearchEngine. Please update it whenever you add or remove // in @typedef for SearchEngine. Please update it whenever you add or remove
// any keys here. // any keys here.
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
dict->SetInteger("id", template_url->id());
dict->SetString("name", template_url->short_name()); dict->SetString("name", template_url->short_name());
dict->SetString("displayName", dict->SetString("displayName",
table_model->GetText( table_model->GetText(
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
cr.define('settings_search_engines_page', function() { cr.define('settings_search_engines_page', function() {
/** /**
* @param {number} id
* @param {string} name * @param {string} name
* @param {boolean} canBeDefault * @param {boolean} canBeDefault
* @param {boolean} canBeEdited * @param {boolean} canBeEdited
...@@ -11,19 +12,20 @@ cr.define('settings_search_engines_page', function() { ...@@ -11,19 +12,20 @@ cr.define('settings_search_engines_page', function() {
* @return {!SearchEngine} * @return {!SearchEngine}
*/ */
function createSampleSearchEngine( function createSampleSearchEngine(
name, canBeDefault, canBeEdited, canBeRemoved) { id, name, canBeDefault, canBeEdited, canBeRemoved) {
return { return {
canBeDefault: canBeDefault, canBeDefault: canBeDefault,
canBeEdited: canBeEdited, canBeEdited: canBeEdited,
canBeRemoved: canBeRemoved, canBeRemoved: canBeRemoved,
default: false, default: false,
displayName: name + " displayName", displayName: name + ' displayName',
iconURL: "http://www.google.com/favicon.ico", iconURL: 'http://www.google.com/favicon.ico',
id: id,
isOmniboxExtension: false, isOmniboxExtension: false,
keyword: name, keyword: name,
modelIndex: 0, modelIndex: 0,
name: name, name: name,
url: "https://" + name + ".com/search?p=%s", url: 'https://' + name + '.com/search?p=%s',
urlLocked: false, urlLocked: false,
}; };
} }
...@@ -35,17 +37,18 @@ cr.define('settings_search_engines_page', function() { ...@@ -35,17 +37,18 @@ cr.define('settings_search_engines_page', function() {
canBeEdited: false, canBeEdited: false,
canBeRemoved: false, canBeRemoved: false,
default: false, default: false,
displayName: "Omnibox extension displayName", displayName: 'Omnibox extension displayName',
extension: { extension: {
icon: "chrome://extension-icon/some-extension-icon", icon: 'chrome://extension-icon/some-extension-icon',
id: "dummyextensionid", id: 'dummyextensionid',
name: "Omnibox extension" name: 'Omnibox extension'
}, },
id: 0,
isOmniboxExtension: true, isOmniboxExtension: true,
keyword: "oe", keyword: 'oe',
modelIndex: 6, modelIndex: 6,
name: "Omnibox extension", name: 'Omnibox extension',
url: "chrome-extension://dummyextensionid/?q=%s", url: 'chrome-extension://dummyextensionid/?q=%s',
urlLocked: false urlLocked: false
}; };
} }
...@@ -134,6 +137,29 @@ cr.define('settings_search_engines_page', function() { ...@@ -134,6 +137,29 @@ cr.define('settings_search_engines_page', function() {
return browserProxy.whenCalled('searchEngineEditCompleted'); return browserProxy.whenCalled('searchEngineEditCompleted');
}); });
}); });
test('DialogCloseWhenEnginesChangedModelEngineNotFound', function() {
dialog.set(
'model', createSampleSearchEngine(0, 'G', false, false, false));
cr.webUIListenerCallback('search-engines-changed', {
defaults: [],
others: [createSampleSearchEngine(1, 'H', false, false, false)],
extensions: [],
});
return browserProxy.whenCalled('searchEngineEditCancelled');
});
test('DialogValidateInputsWhenEnginesChanged', function() {
dialog.set(
'model', createSampleSearchEngine(0, 'G', false, false, false));
dialog.set('keyword_', 'G');
cr.webUIListenerCallback('search-engines-changed', {
defaults: [],
others: [createSampleSearchEngine(0, 'G', false, false, false)],
extensions: [],
});
return browserProxy.whenCalled('validateSearchEngineInput');
});
}); });
} }
...@@ -146,7 +172,7 @@ cr.define('settings_search_engines_page', function() { ...@@ -146,7 +172,7 @@ cr.define('settings_search_engines_page', function() {
let browserProxy = null; let browserProxy = null;
/** @type {!SearchEngine} */ /** @type {!SearchEngine} */
const searchEngine = createSampleSearchEngine('G', true, true, true); const searchEngine = createSampleSearchEngine(0, 'G', true, true, true);
setup(function() { setup(function() {
browserProxy = new settings_search.TestSearchEnginesBrowserProxy(); browserProxy = new settings_search.TestSearchEnginesBrowserProxy();
...@@ -244,25 +270,25 @@ cr.define('settings_search_engines_page', function() { ...@@ -244,25 +270,25 @@ cr.define('settings_search_engines_page', function() {
test('Remove_Disabled', function() { test('Remove_Disabled', function() {
testButtonDisabled( testButtonDisabled(
createSampleSearchEngine('G', true, true, false), 'delete'); createSampleSearchEngine(0, 'G', true, true, false), 'delete');
}); });
test('MakeDefault_Disabled', function() { test('MakeDefault_Disabled', function() {
testButtonDisabled( testButtonDisabled(
createSampleSearchEngine('G', false, true, true), 'makeDefault'); createSampleSearchEngine(0, 'G', false, true, true), 'makeDefault');
}); });
test('Edit_Disabled', function() { test('Edit_Disabled', function() {
testButtonDisabled( testButtonDisabled(
createSampleSearchEngine('G', true, false, true), 'edit'); createSampleSearchEngine(0, 'G', true, false, true), 'edit');
}); });
test('All_Disabled', function() { test('All_Disabled', function() {
entry.engine = createSampleSearchEngine('G', true, false, false); entry.engine = createSampleSearchEngine(0, 'G', true, false, false);
Polymer.dom.flush(); Polymer.dom.flush();
assertTrue(entry.hasAttribute('show-dots_')); assertTrue(entry.hasAttribute('show-dots_'));
entry.engine = createSampleSearchEngine('G', false, false, false); entry.engine = createSampleSearchEngine(1, 'G', false, false, false);
Polymer.dom.flush(); Polymer.dom.flush();
assertFalse(entry.hasAttribute('show-dots_')); assertFalse(entry.hasAttribute('show-dots_'));
}); });
...@@ -279,10 +305,10 @@ cr.define('settings_search_engines_page', function() { ...@@ -279,10 +305,10 @@ cr.define('settings_search_engines_page', function() {
/** @type {!SearchEnginesInfo} */ /** @type {!SearchEnginesInfo} */
const searchEnginesInfo = { const searchEnginesInfo = {
defaults: [createSampleSearchEngine( defaults: [createSampleSearchEngine(
'search_engine_G', false, false, false)], 0, 'search_engine_G', false, false, false)],
others: [ others: [
createSampleSearchEngine('search_engine_B', false, false, false), createSampleSearchEngine(1, 'search_engine_B', false, false, false),
createSampleSearchEngine('search_engine_A', false, false, false), createSampleSearchEngine(2, 'search_engine_A', false, false, false),
], ],
extensions: [createSampleOmniboxExtension()], extensions: [createSampleOmniboxExtension()],
}; };
...@@ -356,7 +382,7 @@ cr.define('settings_search_engines_page', function() { ...@@ -356,7 +382,7 @@ cr.define('settings_search_engines_page', function() {
cr.webUIListenerCallback('search-engines-changed', { cr.webUIListenerCallback('search-engines-changed', {
defaults: [], defaults: [],
others: [createSampleSearchEngine('G', false, false, false)], others: [createSampleSearchEngine(0, 'G', false, false, false)],
extensions: [], extensions: [],
}); });
assertTrue(message.hasAttribute('hidden')); assertTrue(message.hasAttribute('hidden'));
......
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