| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/tabs/tabs.h" | |
| 6 | 5 |
| 7 #include <string> | 6 #include <string> |
| 8 | 7 |
| 9 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/string_util.h" |
| 11 #include "base/stringprintf.h" | 11 #include "base/stringprintf.h" |
| 12 #include "base/string_util.h" | |
| 13 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/extensions/api/tabs/tabs_api.h" |
| 14 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" | 14 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
| 15 #include "chrome/browser/extensions/extension_function_test_utils.h" | 15 #include "chrome/browser/extensions/extension_function_test_utils.h" |
| 16 #include "chrome/browser/extensions/extension_tab_util.h" | 16 #include "chrome/browser/extensions/extension_tab_util.h" |
| 17 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 17 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
| 18 #include "chrome/browser/prefs/pref_service.h" | 18 #include "chrome/browser/prefs/pref_service.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/ui/browser.h" | 20 #include "chrome/browser/ui/browser.h" |
| 21 #include "chrome/browser/ui/browser_commands.h" | 21 #include "chrome/browser/ui/browser_commands.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 22 #include "chrome/browser/ui/browser_window.h" |
| 23 #include "chrome/test/base/in_process_browser_test.h" | 23 #include "chrome/test/base/in_process_browser_test.h" |
| 24 #include "chrome/test/base/ui_test_utils.h" | 24 #include "chrome/test/base/ui_test_utils.h" |
| 25 #include "ui/gfx/rect.h" | 25 #include "ui/gfx/rect.h" |
| 26 | 26 |
| 27 namespace keys = extensions::tabs_constants; | 27 namespace keys = extensions::tabs_constants; |
| 28 namespace utils = extension_function_test_utils; | 28 namespace utils = extension_function_test_utils; |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 class ExtensionTabsTest : public InProcessBrowserTest { | 32 class ExtensionTabsTest : public InProcessBrowserTest { |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 } | 35 } |
| 36 | 36 |
| 37 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetWindow) { | 37 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetWindow) { |
| 38 int window_id = ExtensionTabUtil::GetWindowId(browser()); | 38 int window_id = ExtensionTabUtil::GetWindowId(browser()); |
| 39 | 39 |
| 40 // Invalid window ID error. | 40 // Invalid window ID error. |
| 41 scoped_refptr<GetWindowFunction> function = new GetWindowFunction(); | 41 scoped_refptr<WindowsGetFunction> function = new WindowsGetFunction(); |
| 42 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 42 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 43 function->set_extension(extension.get()); | 43 function->set_extension(extension.get()); |
| 44 EXPECT_TRUE(MatchPattern( | 44 EXPECT_TRUE(MatchPattern( |
| 45 utils::RunFunctionAndReturnError( | 45 utils::RunFunctionAndReturnError( |
| 46 function.get(), | 46 function.get(), |
| 47 base::StringPrintf("[%u]", window_id + 1), | 47 base::StringPrintf("[%u]", window_id + 1), |
| 48 browser()), | 48 browser()), |
| 49 keys::kWindowNotFoundError)); | 49 keys::kWindowNotFoundError)); |
| 50 | 50 |
| 51 // Basic window details. | 51 // Basic window details. |
| 52 gfx::Rect bounds; | 52 gfx::Rect bounds; |
| 53 if (browser()->window()->IsMinimized()) | 53 if (browser()->window()->IsMinimized()) |
| 54 bounds = browser()->window()->GetRestoredBounds(); | 54 bounds = browser()->window()->GetRestoredBounds(); |
| 55 else | 55 else |
| 56 bounds = browser()->window()->GetBounds(); | 56 bounds = browser()->window()->GetBounds(); |
| 57 | 57 |
| 58 function = new GetWindowFunction(); | 58 function = new WindowsGetFunction(); |
| 59 function->set_extension(extension.get()); | 59 function->set_extension(extension.get()); |
| 60 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 60 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 61 utils::RunFunctionAndReturnSingleResult( | 61 utils::RunFunctionAndReturnSingleResult( |
| 62 function.get(), | 62 function.get(), |
| 63 base::StringPrintf("[%u]", window_id), | 63 base::StringPrintf("[%u]", window_id), |
| 64 browser()))); | 64 browser()))); |
| 65 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); | 65 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); |
| 66 EXPECT_FALSE(utils::GetBoolean(result.get(), "incognito")); | 66 EXPECT_FALSE(utils::GetBoolean(result.get(), "incognito")); |
| 67 EXPECT_EQ("normal", utils::GetString(result.get(), "type")); | 67 EXPECT_EQ("normal", utils::GetString(result.get(), "type")); |
| 68 EXPECT_EQ(bounds.x(), utils::GetInteger(result.get(), "left")); | 68 EXPECT_EQ(bounds.x(), utils::GetInteger(result.get(), "left")); |
| 69 EXPECT_EQ(bounds.y(), utils::GetInteger(result.get(), "top")); | 69 EXPECT_EQ(bounds.y(), utils::GetInteger(result.get(), "top")); |
| 70 EXPECT_EQ(bounds.width(), utils::GetInteger(result.get(), "width")); | 70 EXPECT_EQ(bounds.width(), utils::GetInteger(result.get(), "width")); |
| 71 EXPECT_EQ(bounds.height(), utils::GetInteger(result.get(), "height")); | 71 EXPECT_EQ(bounds.height(), utils::GetInteger(result.get(), "height")); |
| 72 | 72 |
| 73 // With "populate" enabled. | 73 // With "populate" enabled. |
| 74 function = new GetWindowFunction(); | 74 function = new WindowsGetFunction(); |
| 75 function->set_extension(extension.get()); | 75 function->set_extension(extension.get()); |
| 76 result.reset(utils::ToDictionary( | 76 result.reset(utils::ToDictionary( |
| 77 utils::RunFunctionAndReturnSingleResult( | 77 utils::RunFunctionAndReturnSingleResult( |
| 78 function.get(), | 78 function.get(), |
| 79 base::StringPrintf("[%u, {\"populate\": true}]", window_id), | 79 base::StringPrintf("[%u, {\"populate\": true}]", window_id), |
| 80 browser()))); | 80 browser()))); |
| 81 | 81 |
| 82 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); | 82 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); |
| 83 // "populate" was enabled so tabs should be populated. | 83 // "populate" was enabled so tabs should be populated. |
| 84 ListValue* tabs = NULL; | 84 ListValue* tabs = NULL; |
| 85 EXPECT_TRUE(result.get()->GetList(keys::kTabsKey, &tabs)); | 85 EXPECT_TRUE(result.get()->GetList(keys::kTabsKey, &tabs)); |
| 86 | 86 |
| 87 // TODO(aa): Can't assume window is focused. On mac, calling Activate() from a | 87 // TODO(aa): Can't assume window is focused. On mac, calling Activate() from a |
| 88 // browser test doesn't seem to do anything, so can't test the opposite | 88 // browser test doesn't seem to do anything, so can't test the opposite |
| 89 // either. | 89 // either. |
| 90 EXPECT_EQ(browser()->window()->IsActive(), | 90 EXPECT_EQ(browser()->window()->IsActive(), |
| 91 utils::GetBoolean(result.get(), "focused")); | 91 utils::GetBoolean(result.get(), "focused")); |
| 92 | 92 |
| 93 // TODO(aa): Minimized and maximized dimensions. Is there a way to set | 93 // TODO(aa): Minimized and maximized dimensions. Is there a way to set |
| 94 // minimize/maximize programmatically? | 94 // minimize/maximize programmatically? |
| 95 | 95 |
| 96 // Popup. | 96 // Popup. |
| 97 Browser* popup_browser = new Browser( | 97 Browser* popup_browser = new Browser( |
| 98 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile())); | 98 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile())); |
| 99 function = new GetWindowFunction(); | 99 function = new WindowsGetFunction(); |
| 100 function->set_extension(extension.get()); | 100 function->set_extension(extension.get()); |
| 101 result.reset(utils::ToDictionary( | 101 result.reset(utils::ToDictionary( |
| 102 utils::RunFunctionAndReturnSingleResult( | 102 utils::RunFunctionAndReturnSingleResult( |
| 103 function.get(), | 103 function.get(), |
| 104 base::StringPrintf( | 104 base::StringPrintf( |
| 105 "[%u]", ExtensionTabUtil::GetWindowId(popup_browser)), | 105 "[%u]", ExtensionTabUtil::GetWindowId(popup_browser)), |
| 106 browser()))); | 106 browser()))); |
| 107 EXPECT_EQ("popup", utils::GetString(result.get(), "type")); | 107 EXPECT_EQ("popup", utils::GetString(result.get(), "type")); |
| 108 | 108 |
| 109 // Panel. | 109 // Panel. |
| 110 Browser* panel_browser = new Browser( | 110 Browser* panel_browser = new Browser( |
| 111 Browser::CreateParams(Browser::TYPE_PANEL, browser()->profile())); | 111 Browser::CreateParams(Browser::TYPE_PANEL, browser()->profile())); |
| 112 function = new GetWindowFunction(); | 112 function = new WindowsGetFunction(); |
| 113 function->set_extension(extension.get()); | 113 function->set_extension(extension.get()); |
| 114 result.reset(utils::ToDictionary( | 114 result.reset(utils::ToDictionary( |
| 115 utils::RunFunctionAndReturnSingleResult( | 115 utils::RunFunctionAndReturnSingleResult( |
| 116 function.get(), | 116 function.get(), |
| 117 base::StringPrintf( | 117 base::StringPrintf( |
| 118 "[%u]", ExtensionTabUtil::GetWindowId(panel_browser)), | 118 "[%u]", ExtensionTabUtil::GetWindowId(panel_browser)), |
| 119 browser()))); | 119 browser()))); |
| 120 EXPECT_EQ("panel", utils::GetString(result.get(), "type")); | 120 EXPECT_EQ("panel", utils::GetString(result.get(), "type")); |
| 121 | 121 |
| 122 // Incognito. | 122 // Incognito. |
| 123 Browser* incognito_browser = CreateIncognitoBrowser(); | 123 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 124 int incognito_window_id = ExtensionTabUtil::GetWindowId(incognito_browser); | 124 int incognito_window_id = ExtensionTabUtil::GetWindowId(incognito_browser); |
| 125 | 125 |
| 126 // Without "include_incognito". | 126 // Without "include_incognito". |
| 127 function = new GetWindowFunction(); | 127 function = new WindowsGetFunction(); |
| 128 function->set_extension(extension.get()); | 128 function->set_extension(extension.get()); |
| 129 EXPECT_TRUE(MatchPattern( | 129 EXPECT_TRUE(MatchPattern( |
| 130 utils::RunFunctionAndReturnError( | 130 utils::RunFunctionAndReturnError( |
| 131 function.get(), | 131 function.get(), |
| 132 base::StringPrintf("[%u]", incognito_window_id), | 132 base::StringPrintf("[%u]", incognito_window_id), |
| 133 browser()), | 133 browser()), |
| 134 keys::kWindowNotFoundError)); | 134 keys::kWindowNotFoundError)); |
| 135 | 135 |
| 136 // With "include_incognito". | 136 // With "include_incognito". |
| 137 function = new GetWindowFunction(); | 137 function = new WindowsGetFunction(); |
| 138 function->set_extension(extension.get()); | 138 function->set_extension(extension.get()); |
| 139 result.reset(utils::ToDictionary( | 139 result.reset(utils::ToDictionary( |
| 140 utils::RunFunctionAndReturnSingleResult( | 140 utils::RunFunctionAndReturnSingleResult( |
| 141 function.get(), | 141 function.get(), |
| 142 base::StringPrintf("[%u]", incognito_window_id), | 142 base::StringPrintf("[%u]", incognito_window_id), |
| 143 browser(), | 143 browser(), |
| 144 utils::INCLUDE_INCOGNITO))); | 144 utils::INCLUDE_INCOGNITO))); |
| 145 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); | 145 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); |
| 146 } | 146 } |
| 147 | 147 |
| 148 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetCurrentWindow) { | 148 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetCurrentWindow) { |
| 149 int window_id = ExtensionTabUtil::GetWindowId(browser()); | 149 int window_id = ExtensionTabUtil::GetWindowId(browser()); |
| 150 Browser* new_browser = CreateBrowser(browser()->profile()); | 150 Browser* new_browser = CreateBrowser(browser()->profile()); |
| 151 int new_id = ExtensionTabUtil::GetWindowId(new_browser); | 151 int new_id = ExtensionTabUtil::GetWindowId(new_browser); |
| 152 | 152 |
| 153 // Get the current window using new_browser. | 153 // Get the current window using new_browser. |
| 154 scoped_refptr<GetCurrentWindowFunction> function = | 154 scoped_refptr<WindowsGetCurrentFunction> function = |
| 155 new GetCurrentWindowFunction(); | 155 new WindowsGetCurrentFunction(); |
| 156 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 156 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 157 function->set_extension(extension.get()); | 157 function->set_extension(extension.get()); |
| 158 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 158 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 159 utils::RunFunctionAndReturnSingleResult(function.get(), | 159 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 160 "[]", | 160 "[]", |
| 161 new_browser))); | 161 new_browser))); |
| 162 | 162 |
| 163 // The id should match the window id of the browser instance that was passed | 163 // The id should match the window id of the browser instance that was passed |
| 164 // to RunFunctionAndReturnSingleResult. | 164 // to RunFunctionAndReturnSingleResult. |
| 165 EXPECT_EQ(new_id, utils::GetInteger(result.get(), "id")); | 165 EXPECT_EQ(new_id, utils::GetInteger(result.get(), "id")); |
| 166 ListValue* tabs = NULL; | 166 ListValue* tabs = NULL; |
| 167 EXPECT_FALSE(result.get()->GetList(keys::kTabsKey, &tabs)); | 167 EXPECT_FALSE(result.get()->GetList(keys::kTabsKey, &tabs)); |
| 168 | 168 |
| 169 // Get the current window using the old window and make the tabs populated. | 169 // Get the current window using the old window and make the tabs populated. |
| 170 function = new GetCurrentWindowFunction(); | 170 function = new WindowsGetCurrentFunction(); |
| 171 function->set_extension(extension.get()); | 171 function->set_extension(extension.get()); |
| 172 result.reset(utils::ToDictionary( | 172 result.reset(utils::ToDictionary( |
| 173 utils::RunFunctionAndReturnSingleResult(function.get(), | 173 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 174 "[{\"populate\": true}]", | 174 "[{\"populate\": true}]", |
| 175 browser()))); | 175 browser()))); |
| 176 | 176 |
| 177 // The id should match the window id of the browser instance that was passed | 177 // The id should match the window id of the browser instance that was passed |
| 178 // to RunFunctionAndReturnSingleResult. | 178 // to RunFunctionAndReturnSingleResult. |
| 179 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); | 179 EXPECT_EQ(window_id, utils::GetInteger(result.get(), "id")); |
| 180 // "populate" was enabled so tabs should be populated. | 180 // "populate" was enabled so tabs should be populated. |
| 181 EXPECT_TRUE(result.get()->GetList(keys::kTabsKey, &tabs)); | 181 EXPECT_TRUE(result.get()->GetList(keys::kTabsKey, &tabs)); |
| 182 } | 182 } |
| 183 | 183 |
| 184 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindows) { | 184 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindows) { |
| 185 const size_t NUM_WINDOWS = 5; | 185 const size_t NUM_WINDOWS = 5; |
| 186 std::set<int> window_ids; | 186 std::set<int> window_ids; |
| 187 std::set<int> result_ids; | 187 std::set<int> result_ids; |
| 188 window_ids.insert(ExtensionTabUtil::GetWindowId(browser())); | 188 window_ids.insert(ExtensionTabUtil::GetWindowId(browser())); |
| 189 | 189 |
| 190 for (size_t i = 0; i < NUM_WINDOWS - 1; ++i) { | 190 for (size_t i = 0; i < NUM_WINDOWS - 1; ++i) { |
| 191 Browser* new_browser = CreateBrowser(browser()->profile()); | 191 Browser* new_browser = CreateBrowser(browser()->profile()); |
| 192 window_ids.insert(ExtensionTabUtil::GetWindowId(new_browser)); | 192 window_ids.insert(ExtensionTabUtil::GetWindowId(new_browser)); |
| 193 } | 193 } |
| 194 | 194 |
| 195 scoped_refptr<GetAllWindowsFunction> function = new GetAllWindowsFunction(); | 195 scoped_refptr<WindowsGetAllFunction> function = new WindowsGetAllFunction(); |
| 196 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 196 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 197 function->set_extension(extension.get()); | 197 function->set_extension(extension.get()); |
| 198 scoped_ptr<base::ListValue> result(utils::ToList( | 198 scoped_ptr<base::ListValue> result(utils::ToList( |
| 199 utils::RunFunctionAndReturnSingleResult(function.get(), | 199 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 200 "[]", | 200 "[]", |
| 201 browser()))); | 201 browser()))); |
| 202 | 202 |
| 203 ListValue* windows = result.get(); | 203 ListValue* windows = result.get(); |
| 204 EXPECT_EQ(NUM_WINDOWS, windows->GetSize()); | 204 EXPECT_EQ(NUM_WINDOWS, windows->GetSize()); |
| 205 for (size_t i = 0; i < NUM_WINDOWS; ++i) { | 205 for (size_t i = 0; i < NUM_WINDOWS; ++i) { |
| 206 DictionaryValue* result_window = NULL; | 206 DictionaryValue* result_window = NULL; |
| 207 EXPECT_TRUE(windows->GetDictionary(i, &result_window)); | 207 EXPECT_TRUE(windows->GetDictionary(i, &result_window)); |
| 208 result_ids.insert(utils::GetInteger(result_window, "id")); | 208 result_ids.insert(utils::GetInteger(result_window, "id")); |
| 209 | 209 |
| 210 // "populate" was not passed in so tabs are not populated. | 210 // "populate" was not passed in so tabs are not populated. |
| 211 ListValue* tabs = NULL; | 211 ListValue* tabs = NULL; |
| 212 EXPECT_FALSE(result_window->GetList(keys::kTabsKey, &tabs)); | 212 EXPECT_FALSE(result_window->GetList(keys::kTabsKey, &tabs)); |
| 213 } | 213 } |
| 214 // The returned ids should contain all the current browser instance ids. | 214 // The returned ids should contain all the current browser instance ids. |
| 215 EXPECT_EQ(window_ids, result_ids); | 215 EXPECT_EQ(window_ids, result_ids); |
| 216 | 216 |
| 217 result_ids.clear(); | 217 result_ids.clear(); |
| 218 function = new GetAllWindowsFunction(); | 218 function = new WindowsGetAllFunction(); |
| 219 function->set_extension(extension.get()); | 219 function->set_extension(extension.get()); |
| 220 result.reset(utils::ToList( | 220 result.reset(utils::ToList( |
| 221 utils::RunFunctionAndReturnSingleResult(function.get(), | 221 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 222 "[{\"populate\": true}]", | 222 "[{\"populate\": true}]", |
| 223 browser()))); | 223 browser()))); |
| 224 | 224 |
| 225 windows = result.get(); | 225 windows = result.get(); |
| 226 EXPECT_EQ(NUM_WINDOWS, windows->GetSize()); | 226 EXPECT_EQ(NUM_WINDOWS, windows->GetSize()); |
| 227 for (size_t i = 0; i < windows->GetSize(); ++i) { | 227 for (size_t i = 0; i < windows->GetSize(); ++i) { |
| 228 DictionaryValue* result_window = NULL; | 228 DictionaryValue* result_window = NULL; |
| 229 EXPECT_TRUE(windows->GetDictionary(i, &result_window)); | 229 EXPECT_TRUE(windows->GetDictionary(i, &result_window)); |
| 230 result_ids.insert(utils::GetInteger(result_window, "id")); | 230 result_ids.insert(utils::GetInteger(result_window, "id")); |
| 231 | 231 |
| 232 // "populate" was enabled so tabs should be populated. | 232 // "populate" was enabled so tabs should be populated. |
| 233 ListValue* tabs = NULL; | 233 ListValue* tabs = NULL; |
| 234 EXPECT_TRUE(result_window->GetList(keys::kTabsKey, &tabs)); | 234 EXPECT_TRUE(result_window->GetList(keys::kTabsKey, &tabs)); |
| 235 } | 235 } |
| 236 // The returned ids should contain all the current browser instance ids. | 236 // The returned ids should contain all the current browser instance ids. |
| 237 EXPECT_EQ(window_ids, result_ids); | 237 EXPECT_EQ(window_ids, result_ids); |
| 238 } | 238 } |
| 239 | 239 |
| 240 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, UpdateNoPermissions) { | 240 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, UpdateNoPermissions) { |
| 241 // The test empty extension has no permissions, therefore it should not get | 241 // The test empty extension has no permissions, therefore it should not get |
| 242 // tab data in the function result. | 242 // tab data in the function result. |
| 243 scoped_refptr<UpdateTabFunction> update_tab_function(new UpdateTabFunction()); | 243 scoped_refptr<TabsUpdateFunction> update_tab_function( |
| 244 new TabsUpdateFunction()); |
| 244 scoped_refptr<extensions::Extension> empty_extension( | 245 scoped_refptr<extensions::Extension> empty_extension( |
| 245 utils::CreateEmptyExtension()); | 246 utils::CreateEmptyExtension()); |
| 246 update_tab_function->set_extension(empty_extension.get()); | 247 update_tab_function->set_extension(empty_extension.get()); |
| 247 // Without a callback the function will not generate a result. | 248 // Without a callback the function will not generate a result. |
| 248 update_tab_function->set_has_callback(true); | 249 update_tab_function->set_has_callback(true); |
| 249 | 250 |
| 250 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 251 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 251 utils::RunFunctionAndReturnSingleResult( | 252 utils::RunFunctionAndReturnSingleResult( |
| 252 update_tab_function.get(), | 253 update_tab_function.get(), |
| 253 "[null, {\"url\": \"about:blank\", \"pinned\": true}]", | 254 "[null, {\"url\": \"about:blank\", \"pinned\": true}]", |
| 254 browser()))); | 255 browser()))); |
| 255 // The url is stripped since the extension does not have tab permissions. | 256 // The url is stripped since the extension does not have tab permissions. |
| 256 EXPECT_FALSE(result->HasKey("url")); | 257 EXPECT_FALSE(result->HasKey("url")); |
| 257 EXPECT_TRUE(utils::GetBoolean(result.get(), "pinned")); | 258 EXPECT_TRUE(utils::GetBoolean(result.get(), "pinned")); |
| 258 } | 259 } |
| 259 | 260 |
| 260 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, | 261 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, |
| 261 DefaultToIncognitoWhenItIsForced) { | 262 DefaultToIncognitoWhenItIsForced) { |
| 262 static const char kArgsWithoutExplicitIncognitoParam[] = | 263 static const char kArgsWithoutExplicitIncognitoParam[] = |
| 263 "[{\"url\": \"about:blank\"}]"; | 264 "[{\"url\": \"about:blank\"}]"; |
| 264 // Force Incognito mode. | 265 // Force Incognito mode. |
| 265 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), | 266 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), |
| 266 IncognitoModePrefs::FORCED); | 267 IncognitoModePrefs::FORCED); |
| 267 // Run without an explicit "incognito" param. | 268 // Run without an explicit "incognito" param. |
| 268 scoped_refptr<CreateWindowFunction> function(new CreateWindowFunction()); | 269 scoped_refptr<WindowsCreateFunction> function(new WindowsCreateFunction()); |
| 269 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 270 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 270 function->set_extension(extension.get()); | 271 function->set_extension(extension.get()); |
| 271 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 272 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 272 utils::RunFunctionAndReturnSingleResult( | 273 utils::RunFunctionAndReturnSingleResult( |
| 273 function.get(), | 274 function.get(), |
| 274 kArgsWithoutExplicitIncognitoParam, | 275 kArgsWithoutExplicitIncognitoParam, |
| 275 browser(), | 276 browser(), |
| 276 utils::INCLUDE_INCOGNITO))); | 277 utils::INCLUDE_INCOGNITO))); |
| 277 | 278 |
| 278 // Make sure it is a new(different) window. | 279 // Make sure it is a new(different) window. |
| 279 EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), | 280 EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), |
| 280 utils::GetInteger(result.get(), "id")); | 281 utils::GetInteger(result.get(), "id")); |
| 281 // ... and it is incognito. | 282 // ... and it is incognito. |
| 282 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); | 283 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); |
| 283 | 284 |
| 284 // Now try creating a window from incognito window. | 285 // Now try creating a window from incognito window. |
| 285 Browser* incognito_browser = CreateIncognitoBrowser(); | 286 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 286 // Run without an explicit "incognito" param. | 287 // Run without an explicit "incognito" param. |
| 287 function = new CreateWindowFunction(); | 288 function = new WindowsCreateFunction(); |
| 288 function->set_extension(extension.get()); | 289 function->set_extension(extension.get()); |
| 289 result.reset(utils::ToDictionary( | 290 result.reset(utils::ToDictionary( |
| 290 utils::RunFunctionAndReturnSingleResult( | 291 utils::RunFunctionAndReturnSingleResult( |
| 291 function.get(), | 292 function.get(), |
| 292 kArgsWithoutExplicitIncognitoParam, | 293 kArgsWithoutExplicitIncognitoParam, |
| 293 incognito_browser, | 294 incognito_browser, |
| 294 utils::INCLUDE_INCOGNITO))); | 295 utils::INCLUDE_INCOGNITO))); |
| 295 // Make sure it is a new(different) window. | 296 // Make sure it is a new(different) window. |
| 296 EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), | 297 EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), |
| 297 utils::GetInteger(result.get(), "id")); | 298 utils::GetInteger(result.get(), "id")); |
| 298 // ... and it is incognito. | 299 // ... and it is incognito. |
| 299 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); | 300 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); |
| 300 } | 301 } |
| 301 | 302 |
| 302 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, | 303 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, |
| 303 DefaultToIncognitoWhenItIsForcedAndNoArgs) { | 304 DefaultToIncognitoWhenItIsForcedAndNoArgs) { |
| 304 static const char kEmptyArgs[] = "[]"; | 305 static const char kEmptyArgs[] = "[]"; |
| 305 // Force Incognito mode. | 306 // Force Incognito mode. |
| 306 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), | 307 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), |
| 307 IncognitoModePrefs::FORCED); | 308 IncognitoModePrefs::FORCED); |
| 308 // Run without an explicit "incognito" param. | 309 // Run without an explicit "incognito" param. |
| 309 scoped_refptr<CreateWindowFunction> function = new CreateWindowFunction(); | 310 scoped_refptr<WindowsCreateFunction> function = new WindowsCreateFunction(); |
| 310 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 311 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 311 function->set_extension(extension.get()); | 312 function->set_extension(extension.get()); |
| 312 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 313 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 313 utils::RunFunctionAndReturnSingleResult(function.get(), | 314 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 314 kEmptyArgs, | 315 kEmptyArgs, |
| 315 browser(), | 316 browser(), |
| 316 utils::INCLUDE_INCOGNITO))); | 317 utils::INCLUDE_INCOGNITO))); |
| 317 | 318 |
| 318 // Make sure it is a new(different) window. | 319 // Make sure it is a new(different) window. |
| 319 EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), | 320 EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), |
| 320 utils::GetInteger(result.get(), "id")); | 321 utils::GetInteger(result.get(), "id")); |
| 321 // ... and it is incognito. | 322 // ... and it is incognito. |
| 322 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); | 323 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); |
| 323 | 324 |
| 324 // Now try creating a window from incognito window. | 325 // Now try creating a window from incognito window. |
| 325 Browser* incognito_browser = CreateIncognitoBrowser(); | 326 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 326 // Run without an explicit "incognito" param. | 327 // Run without an explicit "incognito" param. |
| 327 function = new CreateWindowFunction(); | 328 function = new WindowsCreateFunction(); |
| 328 function->set_extension(extension.get()); | 329 function->set_extension(extension.get()); |
| 329 result.reset(utils::ToDictionary( | 330 result.reset(utils::ToDictionary( |
| 330 utils::RunFunctionAndReturnSingleResult(function.get(), | 331 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 331 kEmptyArgs, | 332 kEmptyArgs, |
| 332 incognito_browser, | 333 incognito_browser, |
| 333 utils::INCLUDE_INCOGNITO))); | 334 utils::INCLUDE_INCOGNITO))); |
| 334 // Make sure it is a new(different) window. | 335 // Make sure it is a new(different) window. |
| 335 EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), | 336 EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), |
| 336 utils::GetInteger(result.get(), "id")); | 337 utils::GetInteger(result.get(), "id")); |
| 337 // ... and it is incognito. | 338 // ... and it is incognito. |
| 338 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); | 339 EXPECT_TRUE(utils::GetBoolean(result.get(), "incognito")); |
| 339 } | 340 } |
| 340 | 341 |
| 341 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, | 342 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, |
| 342 DontCreateNormalWindowWhenIncognitoForced) { | 343 DontCreateNormalWindowWhenIncognitoForced) { |
| 343 static const char kArgsWithExplicitIncognitoParam[] = | 344 static const char kArgsWithExplicitIncognitoParam[] = |
| 344 "[{\"url\": \"about:blank\", \"incognito\": false }]"; | 345 "[{\"url\": \"about:blank\", \"incognito\": false }]"; |
| 345 // Force Incognito mode. | 346 // Force Incognito mode. |
| 346 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), | 347 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), |
| 347 IncognitoModePrefs::FORCED); | 348 IncognitoModePrefs::FORCED); |
| 348 | 349 |
| 349 // Run with an explicit "incognito" param. | 350 // Run with an explicit "incognito" param. |
| 350 scoped_refptr<CreateWindowFunction> function = new CreateWindowFunction(); | 351 scoped_refptr<WindowsCreateFunction> function = new WindowsCreateFunction(); |
| 351 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 352 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 352 function->set_extension(extension.get()); | 353 function->set_extension(extension.get()); |
| 353 EXPECT_TRUE(MatchPattern( | 354 EXPECT_TRUE(MatchPattern( |
| 354 utils::RunFunctionAndReturnError(function.get(), | 355 utils::RunFunctionAndReturnError(function.get(), |
| 355 kArgsWithExplicitIncognitoParam, | 356 kArgsWithExplicitIncognitoParam, |
| 356 browser()), | 357 browser()), |
| 357 keys::kIncognitoModeIsForced)); | 358 keys::kIncognitoModeIsForced)); |
| 358 | 359 |
| 359 // Now try opening a normal window from incognito window. | 360 // Now try opening a normal window from incognito window. |
| 360 Browser* incognito_browser = CreateIncognitoBrowser(); | 361 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 361 // Run with an explicit "incognito" param. | 362 // Run with an explicit "incognito" param. |
| 362 function = new CreateWindowFunction(); | 363 function = new WindowsCreateFunction(); |
| 363 function->set_extension(extension.get()); | 364 function->set_extension(extension.get()); |
| 364 EXPECT_TRUE(MatchPattern( | 365 EXPECT_TRUE(MatchPattern( |
| 365 utils::RunFunctionAndReturnError(function.get(), | 366 utils::RunFunctionAndReturnError(function.get(), |
| 366 kArgsWithExplicitIncognitoParam, | 367 kArgsWithExplicitIncognitoParam, |
| 367 incognito_browser), | 368 incognito_browser), |
| 368 keys::kIncognitoModeIsForced)); | 369 keys::kIncognitoModeIsForced)); |
| 369 } | 370 } |
| 370 | 371 |
| 371 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, | 372 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, |
| 372 DontCreateIncognitoWindowWhenIncognitoDisabled) { | 373 DontCreateIncognitoWindowWhenIncognitoDisabled) { |
| 373 static const char kArgs[] = | 374 static const char kArgs[] = |
| 374 "[{\"url\": \"about:blank\", \"incognito\": true }]"; | 375 "[{\"url\": \"about:blank\", \"incognito\": true }]"; |
| 375 | 376 |
| 376 Browser* incognito_browser = CreateIncognitoBrowser(); | 377 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 377 // Disable Incognito mode. | 378 // Disable Incognito mode. |
| 378 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), | 379 IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(), |
| 379 IncognitoModePrefs::DISABLED); | 380 IncognitoModePrefs::DISABLED); |
| 380 // Run in normal window. | 381 // Run in normal window. |
| 381 scoped_refptr<CreateWindowFunction> function = new CreateWindowFunction(); | 382 scoped_refptr<WindowsCreateFunction> function = new WindowsCreateFunction(); |
| 382 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 383 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 383 function->set_extension(extension.get()); | 384 function->set_extension(extension.get()); |
| 384 EXPECT_TRUE(MatchPattern( | 385 EXPECT_TRUE(MatchPattern( |
| 385 utils::RunFunctionAndReturnError(function.get(), | 386 utils::RunFunctionAndReturnError(function.get(), |
| 386 kArgs, | 387 kArgs, |
| 387 browser()), | 388 browser()), |
| 388 keys::kIncognitoModeIsDisabled)); | 389 keys::kIncognitoModeIsDisabled)); |
| 389 | 390 |
| 390 // Run in incognito window. | 391 // Run in incognito window. |
| 391 function = new CreateWindowFunction(); | 392 function = new WindowsCreateFunction(); |
| 392 function->set_extension(extension.get()); | 393 function->set_extension(extension.get()); |
| 393 EXPECT_TRUE(MatchPattern( | 394 EXPECT_TRUE(MatchPattern( |
| 394 utils::RunFunctionAndReturnError(function.get(), | 395 utils::RunFunctionAndReturnError(function.get(), |
| 395 kArgs, | 396 kArgs, |
| 396 incognito_browser), | 397 incognito_browser), |
| 397 keys::kIncognitoModeIsDisabled)); | 398 keys::kIncognitoModeIsDisabled)); |
| 398 } | 399 } |
| 399 | 400 |
| 400 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, QueryCurrentWindowTabs) { | 401 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, QueryCurrentWindowTabs) { |
| 401 const size_t kExtraWindows = 3; | 402 const size_t kExtraWindows = 3; |
| 402 for (size_t i = 0; i < kExtraWindows; ++i) | 403 for (size_t i = 0; i < kExtraWindows; ++i) |
| 403 CreateBrowser(browser()->profile()); | 404 CreateBrowser(browser()->profile()); |
| 404 | 405 |
| 405 GURL url; | 406 GURL url; |
| 406 AddTabAtIndexToBrowser(browser(), 0, url, content::PAGE_TRANSITION_LINK); | 407 AddTabAtIndexToBrowser(browser(), 0, url, content::PAGE_TRANSITION_LINK); |
| 407 int window_id = ExtensionTabUtil::GetWindowId(browser()); | 408 int window_id = ExtensionTabUtil::GetWindowId(browser()); |
| 408 | 409 |
| 409 // Get tabs in the 'current' window called from non-focused browser. | 410 // Get tabs in the 'current' window called from non-focused browser. |
| 410 scoped_refptr<QueryTabsFunction> function = new QueryTabsFunction(); | 411 scoped_refptr<TabsQueryFunction> function = new TabsQueryFunction(); |
| 411 function->set_extension(utils::CreateEmptyExtension().get()); | 412 function->set_extension(utils::CreateEmptyExtension().get()); |
| 412 scoped_ptr<base::ListValue> result(utils::ToList( | 413 scoped_ptr<base::ListValue> result(utils::ToList( |
| 413 utils::RunFunctionAndReturnSingleResult(function.get(), | 414 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 414 "[{\"currentWindow\":true}]", | 415 "[{\"currentWindow\":true}]", |
| 415 browser()))); | 416 browser()))); |
| 416 | 417 |
| 417 ListValue* result_tabs = result.get(); | 418 ListValue* result_tabs = result.get(); |
| 418 // We should have one initial tab and one added tab. | 419 // We should have one initial tab and one added tab. |
| 419 EXPECT_EQ(2u, result_tabs->GetSize()); | 420 EXPECT_EQ(2u, result_tabs->GetSize()); |
| 420 for (size_t i = 0; i < result_tabs->GetSize(); ++i) { | 421 for (size_t i = 0; i < result_tabs->GetSize(); ++i) { |
| 421 DictionaryValue* result_tab = NULL; | 422 DictionaryValue* result_tab = NULL; |
| 422 EXPECT_TRUE(result_tabs->GetDictionary(i, &result_tab)); | 423 EXPECT_TRUE(result_tabs->GetDictionary(i, &result_tab)); |
| 423 EXPECT_EQ(window_id, utils::GetInteger(result_tab, keys::kWindowIdKey)); | 424 EXPECT_EQ(window_id, utils::GetInteger(result_tab, keys::kWindowIdKey)); |
| 424 } | 425 } |
| 425 | 426 |
| 426 // Get tabs NOT in the 'current' window called from non-focused browser. | 427 // Get tabs NOT in the 'current' window called from non-focused browser. |
| 427 function = new QueryTabsFunction(); | 428 function = new TabsQueryFunction(); |
| 428 function->set_extension(utils::CreateEmptyExtension().get()); | 429 function->set_extension(utils::CreateEmptyExtension().get()); |
| 429 result.reset(utils::ToList( | 430 result.reset(utils::ToList( |
| 430 utils::RunFunctionAndReturnSingleResult(function.get(), | 431 utils::RunFunctionAndReturnSingleResult(function.get(), |
| 431 "[{\"currentWindow\":false}]", | 432 "[{\"currentWindow\":false}]", |
| 432 browser()))); | 433 browser()))); |
| 433 | 434 |
| 434 result_tabs = result.get(); | 435 result_tabs = result.get(); |
| 435 // We should have one tab for each extra window. | 436 // We should have one tab for each extra window. |
| 436 EXPECT_EQ(kExtraWindows, result_tabs->GetSize()); | 437 EXPECT_EQ(kExtraWindows, result_tabs->GetSize()); |
| 437 for (size_t i = 0; i < kExtraWindows; ++i) { | 438 for (size_t i = 0; i < kExtraWindows; ++i) { |
| 438 DictionaryValue* result_tab = NULL; | 439 DictionaryValue* result_tab = NULL; |
| 439 EXPECT_TRUE(result_tabs->GetDictionary(i, &result_tab)); | 440 EXPECT_TRUE(result_tabs->GetDictionary(i, &result_tab)); |
| 440 EXPECT_NE(window_id, utils::GetInteger(result_tab, keys::kWindowIdKey)); | 441 EXPECT_NE(window_id, utils::GetInteger(result_tab, keys::kWindowIdKey)); |
| 441 } | 442 } |
| 442 } | 443 } |
| 443 | 444 |
| 444 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DontCreateTabInClosingPopupWindow) { | 445 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DontCreateTabInClosingPopupWindow) { |
| 445 // Test creates new popup window, closes it right away and then tries to open | 446 // Test creates new popup window, closes it right away and then tries to open |
| 446 // a new tab in it. Tab should not be opened in the popup window, but in a | 447 // a new tab in it. Tab should not be opened in the popup window, but in a |
| 447 // tabbed browser window. | 448 // tabbed browser window. |
| 448 Browser* popup_browser = new Browser( | 449 Browser* popup_browser = new Browser( |
| 449 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile())); | 450 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile())); |
| 450 int window_id = ExtensionTabUtil::GetWindowId(popup_browser); | 451 int window_id = ExtensionTabUtil::GetWindowId(popup_browser); |
| 451 chrome::CloseWindow(popup_browser); | 452 chrome::CloseWindow(popup_browser); |
| 452 | 453 |
| 453 scoped_refptr<CreateTabFunction> create_tab_function(new CreateTabFunction()); | 454 scoped_refptr<TabsCreateFunction> create_tab_function( |
| 455 new TabsCreateFunction()); |
| 454 create_tab_function->set_extension(utils::CreateEmptyExtension().get()); | 456 create_tab_function->set_extension(utils::CreateEmptyExtension().get()); |
| 455 // Without a callback the function will not generate a result. | 457 // Without a callback the function will not generate a result. |
| 456 create_tab_function->set_has_callback(true); | 458 create_tab_function->set_has_callback(true); |
| 457 | 459 |
| 458 static const char kNewBlankTabArgs[] = | 460 static const char kNewBlankTabArgs[] = |
| 459 "[{\"url\": \"about:blank\", \"windowId\": %u}]"; | 461 "[{\"url\": \"about:blank\", \"windowId\": %u}]"; |
| 460 | 462 |
| 461 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( | 463 scoped_ptr<base::DictionaryValue> result(utils::ToDictionary( |
| 462 utils::RunFunctionAndReturnSingleResult( | 464 utils::RunFunctionAndReturnSingleResult( |
| 463 create_tab_function.get(), | 465 create_tab_function.get(), |
| 464 base::StringPrintf(kNewBlankTabArgs, window_id), | 466 base::StringPrintf(kNewBlankTabArgs, window_id), |
| 465 browser()))); | 467 browser()))); |
| 466 | 468 |
| 467 EXPECT_NE(window_id, utils::GetInteger(result.get(), "windowId")); | 469 EXPECT_NE(window_id, utils::GetInteger(result.get(), "windowId")); |
| 468 } | 470 } |
| 469 | 471 |
| 470 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, InvalidUpdateWindowState) { | 472 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, InvalidUpdateWindowState) { |
| 471 int window_id = ExtensionTabUtil::GetWindowId(browser()); | 473 int window_id = ExtensionTabUtil::GetWindowId(browser()); |
| 472 | 474 |
| 473 static const char kArgsMinimizedWithFocus[] = | 475 static const char kArgsMinimizedWithFocus[] = |
| 474 "[%u, {\"state\": \"minimized\", \"focused\": true}]"; | 476 "[%u, {\"state\": \"minimized\", \"focused\": true}]"; |
| 475 scoped_refptr<UpdateWindowFunction> function = new UpdateWindowFunction(); | 477 scoped_refptr<WindowsUpdateFunction> function = new WindowsUpdateFunction(); |
| 476 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); | 478 scoped_refptr<extensions::Extension> extension(utils::CreateEmptyExtension()); |
| 477 function->set_extension(extension.get()); | 479 function->set_extension(extension.get()); |
| 478 EXPECT_TRUE(MatchPattern( | 480 EXPECT_TRUE(MatchPattern( |
| 479 utils::RunFunctionAndReturnError( | 481 utils::RunFunctionAndReturnError( |
| 480 function.get(), | 482 function.get(), |
| 481 base::StringPrintf(kArgsMinimizedWithFocus, window_id), | 483 base::StringPrintf(kArgsMinimizedWithFocus, window_id), |
| 482 browser()), | 484 browser()), |
| 483 keys::kInvalidWindowStateError)); | 485 keys::kInvalidWindowStateError)); |
| 484 | 486 |
| 485 static const char kArgsMaximizedWithoutFocus[] = | 487 static const char kArgsMaximizedWithoutFocus[] = |
| 486 "[%u, {\"state\": \"maximized\", \"focused\": false}]"; | 488 "[%u, {\"state\": \"maximized\", \"focused\": false}]"; |
| 487 function = new UpdateWindowFunction(); | 489 function = new WindowsUpdateFunction(); |
| 488 function->set_extension(extension.get()); | 490 function->set_extension(extension.get()); |
| 489 EXPECT_TRUE(MatchPattern( | 491 EXPECT_TRUE(MatchPattern( |
| 490 utils::RunFunctionAndReturnError( | 492 utils::RunFunctionAndReturnError( |
| 491 function.get(), | 493 function.get(), |
| 492 base::StringPrintf(kArgsMaximizedWithoutFocus, window_id), | 494 base::StringPrintf(kArgsMaximizedWithoutFocus, window_id), |
| 493 browser()), | 495 browser()), |
| 494 keys::kInvalidWindowStateError)); | 496 keys::kInvalidWindowStateError)); |
| 495 | 497 |
| 496 static const char kArgsMinimizedWithBounds[] = | 498 static const char kArgsMinimizedWithBounds[] = |
| 497 "[%u, {\"state\": \"minimized\", \"width\": 500}]"; | 499 "[%u, {\"state\": \"minimized\", \"width\": 500}]"; |
| 498 function = new UpdateWindowFunction(); | 500 function = new WindowsUpdateFunction(); |
| 499 function->set_extension(extension.get()); | 501 function->set_extension(extension.get()); |
| 500 EXPECT_TRUE(MatchPattern( | 502 EXPECT_TRUE(MatchPattern( |
| 501 utils::RunFunctionAndReturnError( | 503 utils::RunFunctionAndReturnError( |
| 502 function.get(), | 504 function.get(), |
| 503 base::StringPrintf(kArgsMinimizedWithBounds, window_id), | 505 base::StringPrintf(kArgsMinimizedWithBounds, window_id), |
| 504 browser()), | 506 browser()), |
| 505 keys::kInvalidWindowStateError)); | 507 keys::kInvalidWindowStateError)); |
| 506 | 508 |
| 507 static const char kArgsMaximizedWithBounds[] = | 509 static const char kArgsMaximizedWithBounds[] = |
| 508 "[%u, {\"state\": \"maximized\", \"width\": 500}]"; | 510 "[%u, {\"state\": \"maximized\", \"width\": 500}]"; |
| 509 function = new UpdateWindowFunction(); | 511 function = new WindowsUpdateFunction(); |
| 510 function->set_extension(extension.get()); | 512 function->set_extension(extension.get()); |
| 511 EXPECT_TRUE(MatchPattern( | 513 EXPECT_TRUE(MatchPattern( |
| 512 utils::RunFunctionAndReturnError( | 514 utils::RunFunctionAndReturnError( |
| 513 function.get(), | 515 function.get(), |
| 514 base::StringPrintf(kArgsMaximizedWithBounds, window_id), | 516 base::StringPrintf(kArgsMaximizedWithBounds, window_id), |
| 515 browser()), | 517 browser()), |
| 516 keys::kInvalidWindowStateError)); | 518 keys::kInvalidWindowStateError)); |
| 517 } | 519 } |
| 518 | 520 |
| 519 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTab) { | 521 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTab) { |
| 520 static const char kNewBlankTabArgs[] ="about:blank"; | 522 static const char kNewBlankTabArgs[] ="about:blank"; |
| 521 | 523 |
| 522 content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(), | 524 content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(), |
| 523 NEW_FOREGROUND_TAB, | 525 NEW_FOREGROUND_TAB, |
| 524 content::PAGE_TRANSITION_LINK, false); | 526 content::PAGE_TRANSITION_LINK, false); |
| 525 content::WebContents* web_contents = browser()->OpenURL(params); | 527 content::WebContents* web_contents = browser()->OpenURL(params); |
| 526 int tab_id = ExtensionTabUtil::GetTabId(web_contents); | 528 int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| 527 int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents); | 529 int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents); |
| 528 int tab_index = -1; | 530 int tab_index = -1; |
| 529 TabStripModel* tab_strip; | 531 TabStripModel* tab_strip; |
| 530 ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index); | 532 ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index); |
| 531 | 533 |
| 532 scoped_refptr<DuplicateTabFunction> duplicate_tab_function( | 534 scoped_refptr<TabsDuplicateFunction> duplicate_tab_function( |
| 533 new DuplicateTabFunction()); | 535 new TabsDuplicateFunction()); |
| 534 scoped_ptr<base::DictionaryValue> test_extension_value( | 536 scoped_ptr<base::DictionaryValue> test_extension_value( |
| 535 utils::ParseDictionary( | 537 utils::ParseDictionary( |
| 536 "{\"name\": \"Test\", \"version\": \"1.0\", \"permissions\": [\"tabs\"]}" | 538 "{\"name\": \"Test\", \"version\": \"1.0\", \"permissions\": [\"tabs\"]}" |
| 537 )); | 539 )); |
| 538 scoped_refptr<extensions::Extension> empty_tab_extension( | 540 scoped_refptr<extensions::Extension> empty_tab_extension( |
| 539 utils::CreateExtension(test_extension_value.get())); | 541 utils::CreateExtension(test_extension_value.get())); |
| 540 duplicate_tab_function->set_extension(empty_tab_extension.get()); | 542 duplicate_tab_function->set_extension(empty_tab_extension.get()); |
| 541 duplicate_tab_function->set_has_callback(true); | 543 duplicate_tab_function->set_has_callback(true); |
| 542 | 544 |
| 543 scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary( | 545 scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 566 content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(), | 568 content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(), |
| 567 NEW_FOREGROUND_TAB, | 569 NEW_FOREGROUND_TAB, |
| 568 content::PAGE_TRANSITION_LINK, false); | 570 content::PAGE_TRANSITION_LINK, false); |
| 569 content::WebContents* web_contents = browser()->OpenURL(params); | 571 content::WebContents* web_contents = browser()->OpenURL(params); |
| 570 int tab_id = ExtensionTabUtil::GetTabId(web_contents); | 572 int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| 571 int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents); | 573 int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents); |
| 572 int tab_index = -1; | 574 int tab_index = -1; |
| 573 TabStripModel* tab_strip; | 575 TabStripModel* tab_strip; |
| 574 ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index); | 576 ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index); |
| 575 | 577 |
| 576 scoped_refptr<DuplicateTabFunction> duplicate_tab_function( | 578 scoped_refptr<TabsDuplicateFunction> duplicate_tab_function( |
| 577 new DuplicateTabFunction()); | 579 new TabsDuplicateFunction()); |
| 578 scoped_refptr<extensions::Extension> empty_extension( | 580 scoped_refptr<extensions::Extension> empty_extension( |
| 579 utils::CreateEmptyExtension()); | 581 utils::CreateEmptyExtension()); |
| 580 duplicate_tab_function->set_extension(empty_extension.get()); | 582 duplicate_tab_function->set_extension(empty_extension.get()); |
| 581 duplicate_tab_function->set_has_callback(true); | 583 duplicate_tab_function->set_has_callback(true); |
| 582 | 584 |
| 583 scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary( | 585 scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary( |
| 584 utils::RunFunctionAndReturnSingleResult( | 586 utils::RunFunctionAndReturnSingleResult( |
| 585 duplicate_tab_function.get(), base::StringPrintf("[%u]", tab_id), | 587 duplicate_tab_function.get(), base::StringPrintf("[%u]", tab_id), |
| 586 browser()))); | 588 browser()))); |
| 587 | 589 |
| 588 int duplicate_tab_id = utils::GetInteger(duplicate_result.get(), "id"); | 590 int duplicate_tab_id = utils::GetInteger(duplicate_result.get(), "id"); |
| 589 int duplicate_tab_window_id = utils::GetInteger(duplicate_result.get(), | 591 int duplicate_tab_window_id = utils::GetInteger(duplicate_result.get(), |
| 590 "windowId"); | 592 "windowId"); |
| 591 int duplicate_tab_index = utils::GetInteger(duplicate_result.get(), "index"); | 593 int duplicate_tab_index = utils::GetInteger(duplicate_result.get(), "index"); |
| 592 EXPECT_EQ(base::Value::TYPE_DICTIONARY, duplicate_result->GetType()); | 594 EXPECT_EQ(base::Value::TYPE_DICTIONARY, duplicate_result->GetType()); |
| 593 // Duplicate tab id should be different from the original tab id. | 595 // Duplicate tab id should be different from the original tab id. |
| 594 EXPECT_NE(tab_id, duplicate_tab_id); | 596 EXPECT_NE(tab_id, duplicate_tab_id); |
| 595 EXPECT_EQ(window_id, duplicate_tab_window_id); | 597 EXPECT_EQ(window_id, duplicate_tab_window_id); |
| 596 EXPECT_EQ(tab_index + 1, duplicate_tab_index); | 598 EXPECT_EQ(tab_index + 1, duplicate_tab_index); |
| 597 // The test empty extension has no permissions, therefore |duplicate_result| | 599 // The test empty extension has no permissions, therefore |duplicate_result| |
| 598 // should not contain url, title, and faviconUrl in the function result. | 600 // should not contain url, title, and faviconUrl in the function result. |
| 599 EXPECT_FALSE(utils::HasPrivacySensitiveFields(duplicate_result.get())); | 601 EXPECT_FALSE(utils::HasPrivacySensitiveFields(duplicate_result.get())); |
| 600 } | 602 } |
| OLD | NEW |