diff options
author | skerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-18 19:26:39 +0000 |
---|---|---|
committer | skerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-18 19:26:39 +0000 |
commit | 761e7160090e0643dc265067e7f833aeedbf9e21 (patch) | |
tree | e5d7a5e59ea246e5d4f84112666dd40efe21fce2 | |
parent | 9288808841602769a316568cb6d14ed6b6d988dc (diff) | |
download | chromium_src-761e7160090e0643dc265067e7f833aeedbf9e21.zip chromium_src-761e7160090e0643dc265067e7f833aeedbf9e21.tar.gz chromium_src-761e7160090e0643dc265067e7f833aeedbf9e21.tar.bz2 |
Pass test server port to javascript part of extensions API tests.
BUG=56715
TEST=ExtensionApiTests.(I18N|History|Clipboard,TabConnect)
Review URL: http://codereview.chromium.org/3728004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62958 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/extension_apitest.cc | 31 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_apitest.h | 12 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_clipboard_apitest.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_function_dispatcher.cc | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_history_apitest.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_i18n_apitest.cc | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_tabs_apitest.cc | 13 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_test_api.cc | 46 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_test_api.h | 45 | ||||
-rw-r--r-- | chrome/common/extensions/api/extension_api.json | 48 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/clipboard/test.js | 125 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/history/test.js | 850 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/i18n/test.js | 67 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/tabs/connect/test.js | 151 |
14 files changed, 787 insertions, 607 deletions
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc index 3ab39b2..d136b50 100644 --- a/chrome/browser/extensions/extension_apitest.cc +++ b/chrome/browser/extensions/extension_apitest.cc @@ -7,6 +7,7 @@ #include "base/string_util.h" #include "base/stringprintf.h" #include "chrome/browser/browser.h" +#include "chrome/browser/extensions/extension_test_api.h" #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/profile.h" #include "chrome/common/notification_registrar.h" @@ -16,6 +17,12 @@ #include "chrome/browser/chromeos/views/domui_menu_widget.h" #endif +namespace { + +const char kTestServerPort[] = "testServer.port"; + +}; // namespace + ExtensionApiTest::ResultCatcher::ResultCatcher() : profile_restriction_(NULL), waiting_(false) { @@ -81,6 +88,17 @@ void ExtensionApiTest::ResultCatcher::Observe( } } +void ExtensionApiTest::SetUpInProcessBrowserTestFixture() { + DCHECK(!test_config_.get()) << "Previous test did not clear config state."; + test_config_.reset(new DictionaryValue()); + ExtensionTestGetConfigFunction::set_test_config_state(test_config_.get()); +} + +void ExtensionApiTest::TearDownInProcessBrowserTestFixture() { + ExtensionTestGetConfigFunction::set_test_config_state(NULL); + test_config_.reset(NULL); +} + bool ExtensionApiTest::RunExtensionTest(const char* extension_name) { return RunExtensionTestImpl(extension_name, "", false); } @@ -186,6 +204,19 @@ Extension* ExtensionApiTest::GetSingleLoadedExtension() { return extension; } +bool ExtensionApiTest::StartTestServer() { + if (!test_server()->Start()) + return false; + + // Build a dictionary of values that tests can use to build URLs that + // access the test server. Tests can see these values using the extension + // API function chrome.test.getConfig(). + test_config_->SetInteger(kTestServerPort, + test_server()->host_port_pair().port()); + + return true; +} + void ExtensionApiTest::SetUpCommandLine(CommandLine* command_line) { ExtensionBrowserTest::SetUpCommandLine(command_line); test_data_dir_ = test_data_dir_.AppendASCII("api_test"); diff --git a/chrome/browser/extensions/extension_apitest.h b/chrome/browser/extensions/extension_apitest.h index 194750d..b0a0e01 100644 --- a/chrome/browser/extensions/extension_apitest.h +++ b/chrome/browser/extensions/extension_apitest.h @@ -9,6 +9,7 @@ #include <deque> #include <string> +#include "base/values.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/common/notification_service.h" @@ -65,6 +66,9 @@ class ExtensionApiTest : public ExtensionBrowserTest { bool waiting_; }; + virtual void SetUpInProcessBrowserTestFixture(); + virtual void TearDownInProcessBrowserTestFixture(); + // Load |extension_name| and wait for pass / fail notification. // |extension_name| is a directory in "test/data/extensions/api_test". bool RunExtensionTest(const char* extension_name); @@ -84,6 +88,10 @@ class ExtensionApiTest : public ExtensionBrowserTest { // API on the page. bool RunPageTest(const std::string& page_url); + // Start the test server, and store details of its state. Those details + // will be available to javascript tests using chrome.test.getConfig(). + bool StartTestServer(); + // Test that exactly one extension loaded. If so, return a pointer to // the extension. If not, return NULL and set message_. Extension* GetSingleLoadedExtension(); @@ -98,6 +106,10 @@ class ExtensionApiTest : public ExtensionBrowserTest { bool RunExtensionTestImpl(const char* extension_name, const std::string& test_page, bool enable_incogntio); + + // Hold details of the test, set in C++, which can be accessed by + // javascript using chrome.test.getConfig(). + scoped_ptr<DictionaryValue> test_config_; }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_APITEST_H_ diff --git a/chrome/browser/extensions/extension_clipboard_apitest.cc b/chrome/browser/extensions/extension_clipboard_apitest.cc index c159f97..1e9a8aa 100644 --- a/chrome/browser/extensions/extension_clipboard_apitest.cc +++ b/chrome/browser/extensions/extension_clipboard_apitest.cc @@ -10,6 +10,6 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Clipboard) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableExperimentalExtensionApis); - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("clipboard")) << message_; } diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index c908c09..621b5b4 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -228,6 +228,7 @@ void FactoryRegistry::ResetFunctions() { RegisterFunction<ExtensionTestQuotaResetFunction>(); RegisterFunction<ExtensionTestCreateIncognitoTabFunction>(); RegisterFunction<ExtensionTestSendMessageFunction>(); + RegisterFunction<ExtensionTestGetConfigFunction>(); // Accessibility. RegisterFunction<GetFocusedControlFunction>(); diff --git a/chrome/browser/extensions/extension_history_apitest.cc b/chrome/browser/extensions/extension_history_apitest.cc index 9815ac8..1e882be 100644 --- a/chrome/browser/extensions/extension_history_apitest.cc +++ b/chrome/browser/extensions/extension_history_apitest.cc @@ -11,7 +11,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FLAKY_History) { host_resolver()->AddRule("www.a.com", "127.0.0.1"); host_resolver()->AddRule("www.b.com", "127.0.0.1"); - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("history")) << message_; } diff --git a/chrome/browser/extensions/extension_i18n_apitest.cc b/chrome/browser/extensions/extension_i18n_apitest.cc index 2798a72..5d52795 100644 --- a/chrome/browser/extensions/extension_i18n_apitest.cc +++ b/chrome/browser/extensions/extension_i18n_apitest.cc @@ -5,5 +5,6 @@ #include "chrome/browser/extensions/extension_apitest.h" IN_PROC_BROWSER_TEST_F(ExtensionApiTest, I18N) { + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("i18n")) << message_; } diff --git a/chrome/browser/extensions/extension_tabs_apitest.cc b/chrome/browser/extensions/extension_tabs_apitest.cc index 886308c..df108f3 100644 --- a/chrome/browser/extensions/extension_tabs_apitest.cc +++ b/chrome/browser/extensions/extension_tabs_apitest.cc @@ -37,34 +37,33 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_Tabs) { } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabGetCurrent) { - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("tabs/get_current")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabConnect) { - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("tabs/connect")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabOnRemoved) { - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("tabs/on_removed")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CaptureVisibleTabJpeg) { - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionSubtest("tabs/capture_visible_tab", "test_jpeg.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CaptureVisibleTabPng) { - ASSERT_TRUE(test_server()->Start()); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionSubtest("tabs/capture_visible_tab", "test_png.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabsOnUpdated) { - ASSERT_TRUE(test_server()->Start()); - + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunExtensionTest("tabs/on_updated")) << message_; } diff --git a/chrome/browser/extensions/extension_test_api.cc b/chrome/browser/extensions/extension_test_api.cc index b5f64ba..9fe1749 100644 --- a/chrome/browser/extensions/extension_test_api.cc +++ b/chrome/browser/extensions/extension_test_api.cc @@ -12,6 +12,18 @@ #include "chrome/browser/extensions/extensions_quota_service.h" #include "chrome/common/notification_service.h" +namespace { + +// If you see this error in your test, you need to set the config state +// to be returned by chrome.test.getConfig(). Do this by calling +// ExtensionTestGetConfigFunction::set_test_config_state(Value* state) +// in test set up. +const char kNoTestConfigDataError[] = "Test configuration was not set."; + +} // namespace + +ExtensionTestPassFunction::~ExtensionTestPassFunction() {} + bool ExtensionTestPassFunction::RunImpl() { NotificationService::current()->Notify( NotificationType::EXTENSION_TEST_PASSED, @@ -20,6 +32,8 @@ bool ExtensionTestPassFunction::RunImpl() { return true; } +ExtensionTestFailFunction::~ExtensionTestFailFunction() {} + bool ExtensionTestFailFunction::RunImpl() { std::string message; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &message)); @@ -30,12 +44,16 @@ bool ExtensionTestFailFunction::RunImpl() { return true; } +ExtensionTestLogFunction::~ExtensionTestLogFunction() {} + bool ExtensionTestLogFunction::RunImpl() { std::string message; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &message)); return true; } +ExtensionTestQuotaResetFunction::~ExtensionTestQuotaResetFunction() {} + bool ExtensionTestQuotaResetFunction::RunImpl() { ExtensionsService* service = profile()->GetExtensionsService(); ExtensionsQuotaService* quota = service->quota_service(); @@ -44,6 +62,9 @@ bool ExtensionTestQuotaResetFunction::RunImpl() { return true; } +ExtensionTestCreateIncognitoTabFunction:: + ~ExtensionTestCreateIncognitoTabFunction() {} + bool ExtensionTestCreateIncognitoTabFunction::RunImpl() { std::string url; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url)); @@ -61,9 +82,34 @@ bool ExtensionTestSendMessageFunction::RunImpl() { Details<std::string>(&message)); return true; } +ExtensionTestSendMessageFunction::~ExtensionTestSendMessageFunction() {} void ExtensionTestSendMessageFunction::Reply(const std::string& message) { result_.reset(Value::CreateStringValue(message)); SendResponse(true); Release(); // balanced in RunImpl } + +// static +void ExtensionTestGetConfigFunction::set_test_config_state( + DictionaryValue* value) { + TestConfigState* test_config_state = Singleton<TestConfigState>::get(); + test_config_state->set_config_state(value); +} + +ExtensionTestGetConfigFunction::TestConfigState::TestConfigState() + : config_state_(NULL) {} + +ExtensionTestGetConfigFunction::~ExtensionTestGetConfigFunction() {} + +bool ExtensionTestGetConfigFunction::RunImpl() { + TestConfigState* test_config_state = Singleton<TestConfigState>::get(); + + if (!test_config_state->config_state()) { + error_ = kNoTestConfigDataError; + return false; + } + + result_.reset(test_config_state->config_state()->DeepCopy()); + return true; +} diff --git a/chrome/browser/extensions/extension_test_api.h b/chrome/browser/extensions/extension_test_api.h index e0b8dce..27b55dc 100644 --- a/chrome/browser/extensions/extension_test_api.h +++ b/chrome/browser/extensions/extension_test_api.h @@ -6,34 +6,36 @@ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_TEST_API_H_ #pragma once +#include "base/singleton.h" +#include "base/values.h" #include "chrome/browser/extensions/extension_function.h" class ExtensionTestPassFunction : public SyncExtensionFunction { - ~ExtensionTestPassFunction() {} + ~ExtensionTestPassFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.notifyPass") }; class ExtensionTestFailFunction : public SyncExtensionFunction { - ~ExtensionTestFailFunction() {} + ~ExtensionTestFailFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.notifyFail") }; class ExtensionTestLogFunction : public SyncExtensionFunction { - ~ExtensionTestLogFunction() {} + ~ExtensionTestLogFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.log") }; class ExtensionTestQuotaResetFunction : public SyncExtensionFunction { - ~ExtensionTestQuotaResetFunction() {} + ~ExtensionTestQuotaResetFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.resetQuota") }; class ExtensionTestCreateIncognitoTabFunction : public SyncExtensionFunction { - ~ExtensionTestCreateIncognitoTabFunction() {} + ~ExtensionTestCreateIncognitoTabFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.createIncognitoTab") }; @@ -45,9 +47,40 @@ class ExtensionTestSendMessageFunction : public AsyncExtensionFunction { void Reply(const std::string& message); private: - ~ExtensionTestSendMessageFunction() {} + ~ExtensionTestSendMessageFunction(); virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("test.sendMessage") }; +class ExtensionTestGetConfigFunction : public SyncExtensionFunction { + public: + // Set the dictionary returned by chrome.test.getConfig(). + // Does not take ownership of |value|. + static void set_test_config_state(DictionaryValue* value); + + private: + // Tests that set configuration state do so by calling + // set_test_config_state() as part of test set up, and unsetting it + // during tear down. This singleton class holds a pointer to that + // state, owned by the test code. + class TestConfigState { + public: + void set_config_state(DictionaryValue* config_state) { + config_state_ = config_state; + } + const DictionaryValue* config_state() { + return config_state_; + } + private: + friend struct DefaultSingletonTraits<TestConfigState>; + TestConfigState(); + DictionaryValue* config_state_; + DISALLOW_COPY_AND_ASSIGN(TestConfigState); + }; + + ~ExtensionTestGetConfigFunction(); + virtual bool RunImpl(); + DECLARE_EXTENSION_FUNCTION_NAME("test.getConfig") +}; + #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_TEST_API_H_ diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json index bcf8b4d..dcd73f0 100644 --- a/chrome/common/extensions/api/extension_api.json +++ b/chrome/common/extensions/api/extension_api.json @@ -690,7 +690,7 @@ "url": { "type": "string", "description": "A URL or list of URLs to open as tabs in the window. Fully-qualified URLs must include a scheme (i.e. 'http://www.google.com', not 'www.google.com'). Relative URLs will be relative to the current page within the extension. Defaults to the New Tab Page.", - "optional": true, + "optional": true, "choices": [ {"type": "string"}, {"type": "array", "items": {"type": "string"}} @@ -2667,9 +2667,9 @@ "type": "string", "optional": true, "description": "The text for the context selection, if any." - }, + }, "editable": { - "type": "string", + "type": "string", "description": "A flag indicating whether the element is editable (text input, textarea, etc.)." } } @@ -2726,7 +2726,7 @@ "$ref": "Tab", "description": "The details of the tab where the click took place." } - ] + ] }, "parentId": { "type": "integer", @@ -3404,6 +3404,36 @@ "types": [], "functions": [ { + "name": "getConfig", + "type": "function", + "description": "Gives configuration options set by the test.", + "parameters": [ + { + "type": "function", "name": "callback", "parameters": [ + { + "type": "object", + "name": "testConfig", + "properties": { + "testServer": { + "type": "object", + "optional": true, + "description": "Details on the test server used to mock network responses. Will be set only if test calls ExtensionApiTest::StartTestServer().", + "properties": { + "port": { + "type": "integer", + "description": "The port on which the test server is listening.", + "minimum": 1024, + "maximum": 65535 + } + } + } + } + } + ] + } + ] + }, + { "name": "notifyFail", "type": "function", "description": "Notify the browser process that test code running in the extension failed. This is only used for internal unit testing.", @@ -4074,7 +4104,7 @@ "type": "function", "optional": "true", "parameters": [] - } + } ] } ], @@ -4091,7 +4121,7 @@ "type": "function", "parameters": [ { - "name": "id", + "name": "id", "type": "string", "description": "The id of the extension or app that was uninstalled." } @@ -4185,9 +4215,9 @@ "type": "string", "description": "The email address to use to pre-populate the login dialog (can be an empty string)." }, - { - "name": "callback", - "type": "function", + { + "name": "callback", + "type": "function", "optional": "true", "parameters": [ { diff --git a/chrome/test/data/extensions/api_test/clipboard/test.js b/chrome/test/data/extensions/api_test/clipboard/test.js index 8a50a6f..9377129 100644 --- a/chrome/test/data/extensions/api_test/clipboard/test.js +++ b/chrome/test/data/extensions/api_test/clipboard/test.js @@ -1,68 +1,73 @@ // Clipboard API test for Chrome. // browser_tests.exe --gtest_filter=ExtensionApiTest.Clipboard -const TEST_URL = "http://localhost:1337/files/extensions/test_file.html"; +const TEST_URL_TMPL = "http://localhost:PORT/files/extensions/test_file.html"; -function setupWindow(callback) { - chrome.tabs.getSelected(null, function(tab) { - chrome.tabs.update(tab.id, {"url": TEST_URL}, callback); - }); -} +chrome.test.getConfig(function(config) { -chrome.test.runTests([ - function executeCopy() { - var onRequestCompleted = chrome.test.listenForever( - chrome.extension.onRequest, - function(request, sender, sendResponse) { - if (request == "start test") { - chrome.experimental.clipboard.executeCopy( - sender.tab.id, - chrome.test.callbackPass()); - } else if (request == "copy event") { - onRequestCompleted(); - } else { - chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + var TEST_URL = TEST_URL_TMPL.replace(/PORT/, config.testServer.port); + + function setupWindow(callback) { + chrome.tabs.getSelected(null, function(tab) { + chrome.tabs.update(tab.id, {"url": TEST_URL}, callback); + }); + } + + chrome.test.runTests([ + function executeCopy() { + var onRequestCompleted = chrome.test.listenForever( + chrome.extension.onRequest, + function(request, sender, sendResponse) { + if (request == "start test") { + chrome.experimental.clipboard.executeCopy( + sender.tab.id, + chrome.test.callbackPass()); + } else if (request == "copy event") { + onRequestCompleted(); + } else { + chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + } } - } - ); - setupWindow(); - }, - function executeCut() { - var onRequestCompleted = chrome.test.listenForever( - chrome.extension.onRequest, - function(request, sender, sendResponse) { - if (request == "start test") { - chrome.experimental.clipboard.executeCut( - sender.tab.id, - chrome.test.callbackPass()); - } else if (request == "cut event") { - onRequestCompleted(); - } else { - chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + ); + setupWindow(); + }, + function executeCut() { + var onRequestCompleted = chrome.test.listenForever( + chrome.extension.onRequest, + function(request, sender, sendResponse) { + if (request == "start test") { + chrome.experimental.clipboard.executeCut( + sender.tab.id, + chrome.test.callbackPass()); + } else if (request == "cut event") { + onRequestCompleted(); + } else { + chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + } } - } - ); - setupWindow(); - }, - function executePaste() { - var onRequestCompleted = chrome.test.listenForever( - chrome.extension.onRequest, - function(request, sender, sendResponse) { - if (request == "start test") { - chrome.experimental.clipboard.executePaste( - sender.tab.id, - chrome.test.callbackPass()); - } else if (request == "paste event") { - onRequestCompleted(); - } else { - chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + ); + setupWindow(); + }, + function executePaste() { + var onRequestCompleted = chrome.test.listenForever( + chrome.extension.onRequest, + function(request, sender, sendResponse) { + if (request == "start test") { + chrome.experimental.clipboard.executePaste( + sender.tab.id, + chrome.test.callbackPass()); + } else if (request == "paste event") { + onRequestCompleted(); + } else { + chrome.test.fail("Unexpected request: " + JSON.stringify(request)); + } } - } - ); - setupWindow(); - }, - function domPaste() { - document.body.addEventListener('paste', chrome.test.callbackPass()); - document.execCommand('paste'); - } -]); + ); + setupWindow(); + }, + function domPaste() { + document.body.addEventListener('paste', chrome.test.callbackPass()); + document.execCommand('paste'); + } + ]); +}); diff --git a/chrome/test/data/extensions/api_test/history/test.js b/chrome/test/data/extensions/api_test/history/test.js index f916f5d..708fd8d 100644 --- a/chrome/test/data/extensions/api_test/history/test.js +++ b/chrome/test/data/extensions/api_test/history/test.js @@ -7,497 +7,507 @@ var assertEq = chrome.test.assertEq; var GOOGLE_URL = 'http://www.google.com/'; var PICASA_URL = 'http://www.picasa.com/'; -var A_RELATIVE_URL = - 'http://www.a.com:1337/files/extensions/api_test/history/a.html'; -var B_RELATIVE_URL = - 'http://www.b.com:1337/files/extensions/api_test/history/b.html'; - -/** -* A helper function to flip the setTimeout arguments and make the code more -* readable. -* @param {number} seconds The number of seconds to wait. -* @param {function} callback Closure. -*/ -function waitAFewSeconds(seconds, callback) { - setTimeout(callback, seconds * 1000); -}; - -/** -* Object used for listening to the chrome.history.onVisited events. The global -* object 'itemVisited' stores the last item received. -*/ -var itemVisitedCallback = null; -function itemVisitedListener(visited) { - if (null != itemVisitedCallback) { - itemVisitedCallback(visited); + +chrome.test.getConfig(function(config) { + + var fixPort = function(url) { + return url.replace(/PORT/, config.testServer.port); }; -}; - -function removeItemVisitedListener() { - chrome.history.onVisited.removeListener(itemVisitedListener); - itemVisitedCallback = null; -} - -function setItemVisitedListener(callback) { - chrome.history.onVisited.addListener(itemVisitedListener); - itemVisitedCallback = callback; -} - -function setNextItemVisitedListener(callback) { - itemVisitedCallback = callback; -} - -/** -* An object used for listening to the chrome.history.onVisitRemoved events. The -* global object 'itemRemovedInfo' stores the information from the last callback. -*/ -var itemRemovedCallback = null; -function itemRemovedListener(removed) { - if (null != itemRemovedCallback) { - itemRemovedCallback(removed); + var A_RELATIVE_URL = fixPort( + 'http://www.a.com:PORT/files/extensions/api_test/history/a.html'); + var B_RELATIVE_URL = fixPort( + 'http://www.b.com:PORT/files/extensions/api_test/history/b.html'); + + + /** + * A helper function to flip the setTimeout arguments and make the code + * more readable. + * @param {number} seconds The number of seconds to wait. + * @param {function} callback Closure. + */ + function waitAFewSeconds(seconds, callback) { + setTimeout(callback, seconds * 1000); }; -}; - -function removeItemRemovedListener() { - chrome.history.onVisited.removeListener(itemRemovedListener); - itemRemovedCallback = null; -} - -function setItemRemovedListener(callback) { - chrome.history.onVisitRemoved.addListener(itemRemovedListener); - itemRemovedCallback = callback; -} - -function setNextItemRemovedListener(callback) { - itemRemovedCallback = callback; -} - -/** -* An object used for listening to the chrome.history.onVisitRemoved events. Set -* 'tabCompleteCallback' to a function to add extra processing to the callback. -* The global object 'tabsCompleteData' contains a list of the last known state -* of every tab. -*/ -var tabCompleteCallback = null; -var tabsCompleteData = {}; -function tabsCompleteListener(tabId, changeInfo) { - if (changeInfo && changeInfo.status) { - tabsCompleteData[tabId] = changeInfo.status; + + /** + * Object used for listening to the chrome.history.onVisited events. The + * global object 'itemVisited' stores the last item received. + */ + var itemVisitedCallback = null; + function itemVisitedListener(visited) { + if (null != itemVisitedCallback) { + itemVisitedCallback(visited); + }; }; - if (null != tabCompleteCallback) { - tabCompleteCallback(); + + function removeItemVisitedListener() { + chrome.history.onVisited.removeListener(itemVisitedListener); + itemVisitedCallback = null; + } + + function setItemVisitedListener(callback) { + chrome.history.onVisited.addListener(itemVisitedListener); + itemVisitedCallback = callback; + } + + function setNextItemVisitedListener(callback) { + itemVisitedCallback = callback; + } + + /** + * An object used for listening to the chrome.history.onVisitRemoved events. + * The global object 'itemRemovedInfo' stores the information from the last + * callback. + */ + var itemRemovedCallback = null; + function itemRemovedListener(removed) { + if (null != itemRemovedCallback) { + itemRemovedCallback(removed); + }; }; -}; - -/** -* Queries the entire history for items, calling the closure with an argument -* specifying the the number of items in the query. -* @param {function(number)} callback The closure. -*/ -function countItemsInHistory(callback) { - var query = {'text': ''}; - chrome.history.search(query, function(results) { - callback(results.length); - }); -}; - -/** -* Populates the history by calling addUrl for each url in the array urls. -* @param {Array.<string>} urls The array of urls to populate the history. -* @param {function} callback Closure. -*/ -function populateHistory(urls, callback) { - urls.forEach(function(url) { - chrome.history.addUrl({ 'url': url }); - }); - callback(); -}; - -chrome.test.runTests([ - // All the tests require a blank state to start from. This test is run - // first to insure that state can be acheived. - function clearHistory() { - chrome.history.deleteAll(pass(function() { - countItemsInHistory(pass(function(count) { - assertEq(0, count); - })); - })); - }, - - function basicSearch() { - // basicSearch callback. - function basicSearchTestVerification() { - removeItemVisitedListener(); - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(GOOGLE_URL, results[0].url); - - // The test has succeeded. - chrome.test.succeed(); - }); + + function removeItemRemovedListener() { + chrome.history.onVisited.removeListener(itemRemovedListener); + itemRemovedCallback = null; + } + + function setItemRemovedListener(callback) { + chrome.history.onVisitRemoved.addListener(itemRemovedListener); + itemRemovedCallback = callback; + } + + function setNextItemRemovedListener(callback) { + itemRemovedCallback = callback; + } + + /** + * An object used for listening to the chrome.history.onVisitRemoved events. + * Set 'tabCompleteCallback' to a function to add extra processing to the + * callback. The global object 'tabsCompleteData' contains a list of the + * last known state of every tab. + */ + var tabCompleteCallback = null; + var tabsCompleteData = {}; + function tabsCompleteListener(tabId, changeInfo) { + if (changeInfo && changeInfo.status) { + tabsCompleteData[tabId] = changeInfo.status; }; + if (null != tabCompleteCallback) { + tabCompleteCallback(); + }; + }; - // basicSearch entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(basicSearchTestVerification); - populateHistory([GOOGLE_URL], function() { }); + /** + * Queries the entire history for items, calling the closure with an argument + * specifying the the number of items in the query. + * @param {function(number)} callback The closure. + */ + function countItemsInHistory(callback) { + var query = {'text': ''}; + chrome.history.search(query, function(results) { + callback(results.length); + }); + } + + /** + * Populates the history by calling addUrl for each url in the array urls. + * @param {Array.<string>} urls The array of urls to populate the history. + * @param {function} callback Closure. + */ + function populateHistory(urls, callback) { + urls.forEach(function(url) { + chrome.history.addUrl({ 'url': url }); }); - }, + callback(); + } + + chrome.test.runTests([ + // All the tests require a blank state to start from. This test is run + // first to insure that state can be acheived. + function clearHistory() { + chrome.history.deleteAll(pass(function() { + countItemsInHistory(pass(function(count) { + assertEq(0, count); + })); + })); + }, - function timeScopedSearch() { - var startDate = {}; - var endDate = {}; + function basicSearch() { + // basicSearch callback. + function basicSearchTestVerification() { + removeItemVisitedListener(); + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(GOOGLE_URL, results[0].url); - function timeScopedSearchTestVerification() { - removeItemVisitedListener(); + // The test has succeeded. + chrome.test.succeed(); + }); + }; - var query = { 'text': '', - 'startTime': startDate.getTime(), - 'endTime': endDate.getTime() }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(GOOGLE_URL, results[0].url); + // basicSearch entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(basicSearchTestVerification); + populateHistory([GOOGLE_URL], function() { }); + }); + }, - // The test has succeeded. - chrome.test.succeed(); - }); - }; + function timeScopedSearch() { + var startDate = {}; + var endDate = {}; - function onAddedItem() { - // Set the next test callback. - setNextItemVisitedListener(timeScopedSearchTestVerification); + function timeScopedSearchTestVerification() { + removeItemVisitedListener(); - // Chrome has seconds resolution, so we must wait in order to search - // a range. - waitAFewSeconds(2, function() { - endDate = new Date(); - endDate.setTime(endDate.getTime() - 500); - populateHistory([PICASA_URL], function() { }); - }); - }; + var query = { 'text': '', + 'startTime': startDate.getTime(), + 'endTime': endDate.getTime() }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(GOOGLE_URL, results[0].url); - // timeScopedSearch entry point. - chrome.history.deleteAll(function() { - // Set the test callback. - setItemVisitedListener(onAddedItem); - // Set the start time a few seconds in the past. - startDate = new Date(); - startDate.setTime(startDate.getTime() - 1000); - populateHistory([GOOGLE_URL], function() { }); - }); - }, - - function searchWithIntegerTimes() { - chrome.history.deleteAll(function() { - // Search with an integer time range. - var query = { 'text': '', - 'startTime': 0, - 'endTime': 12345678 }; - chrome.history.search(query, function(results) { - assertEq(0, results.length); - chrome.test.succeed(); - }); - }); - }, - - // Give time epochs x,y,z and history events A,B which occur in the sequence - // x A y B z, this test scopes the search to the interval [y,z] to test that - // [x,y) is excluded. The previous test scoped to the interval [x,y]. - function timeScopedSearch2() { - var startDate = {}; - var endDate = {}; - - function timeScopedSearch2TestVerification() { - removeItemVisitedListener(); - - endDate = new Date(); - endDate.setTime(endDate.getTime() + 1000); - var query = { 'text': '', - 'startTime': startDate.getTime(), - 'endTime': endDate.getTime() }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(PICASA_URL, results[0].url); - - // The test has succeeded. - chrome.test.succeed(); - }); - }; + // The test has succeeded. + chrome.test.succeed(); + }); + }; - function onAddedItem() { - // Set the next test callback. - setNextItemVisitedListener(timeScopedSearch2TestVerification); + function onAddedItem() { + // Set the next test callback. + setNextItemVisitedListener(timeScopedSearchTestVerification); - // Chrome has seconds resolution, so we must wait in order to search - // a range. - waitAFewSeconds(2, function() { + // Chrome has seconds resolution, so we must wait in order to search + // a range. + waitAFewSeconds(2, function() { + endDate = new Date(); + endDate.setTime(endDate.getTime() - 500); + populateHistory([PICASA_URL], function() { }); + }); + }; + + // timeScopedSearch entry point. + chrome.history.deleteAll(function() { + // Set the test callback. + setItemVisitedListener(onAddedItem); + // Set the start time a few seconds in the past. startDate = new Date(); startDate.setTime(startDate.getTime() - 1000); - populateHistory([PICASA_URL], function() { }); + populateHistory([GOOGLE_URL], function() { }); }); - }; + }, + + function searchWithIntegerTimes() { + chrome.history.deleteAll(function() { + // Search with an integer time range. + var query = { 'text': '', + 'startTime': 0, + 'endTime': 12345678 }; + chrome.history.search(query, function(results) { + assertEq(0, results.length); + chrome.test.succeed(); + }); + }); + }, - // timeScopedSearch entry point. - chrome.history.deleteAll(function() { - // Set the test callback. - setItemVisitedListener(onAddedItem); - populateHistory([GOOGLE_URL], function() { }); - }); - }, + // Give time epochs x,y,z and history events A,B which occur in the sequence + // x A y B z, this test scopes the search to the interval [y,z] to test that + // [x,y) is excluded. The previous test scoped to the interval [x,y]. + function timeScopedSearch2() { + var startDate = {}; + var endDate = {}; - function lengthScopedSearch() { - var urls = [GOOGLE_URL, PICASA_URL]; - var urlsAdded = 0; + function timeScopedSearch2TestVerification() { + removeItemVisitedListener(); - function lengthScopedSearchTestVerification() { - // Ensure all urls have been added. - urlsAdded += 1; - if (urlsAdded < urls.length) - return; + endDate = new Date(); + endDate.setTime(endDate.getTime() + 1000); + var query = { 'text': '', + 'startTime': startDate.getTime(), + 'endTime': endDate.getTime() }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(PICASA_URL, results[0].url); - removeItemVisitedListener(); + // The test has succeeded. + chrome.test.succeed(); + }); + } + + function onAddedItem() { + // Set the next test callback. + setNextItemVisitedListener(timeScopedSearch2TestVerification); - var query = { 'text': '', 'maxResults': 1 }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(PICASA_URL, results[0].url); + // Chrome has seconds resolution, so we must wait in order to search + // a range. + waitAFewSeconds(2, function() { + startDate = new Date(); + startDate.setTime(startDate.getTime() - 1000); + populateHistory([PICASA_URL], function() { }); + }); + }; - // The test has succeeded. - chrome.test.succeed(); + // timeScopedSearch entry point. + chrome.history.deleteAll(function() { + // Set the test callback. + setItemVisitedListener(onAddedItem); + populateHistory([GOOGLE_URL], function() { }); }); - }; + }, - // lengthScopedSearch entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(lengthScopedSearchTestVerification); - populateHistory(urls, function() { }); - }); - }, - - function fullTextSearch() { - chrome.history.deleteAll(function() { - // The continuation of the test after the windows have been opened. - var validateTest = function() { - // Continue with the test. - // A title search for www.a.com should find a. - var query = { 'text': 'www.a.com' }; + function lengthScopedSearch() { + var urls = [GOOGLE_URL, PICASA_URL]; + var urlsAdded = 0; + + function lengthScopedSearchTestVerification() { + // Ensure all urls have been added. + urlsAdded += 1; + if (urlsAdded < urls.length) + return; + + removeItemVisitedListener(); + + var query = { 'text': '', 'maxResults': 1 }; chrome.history.search(query, function(results) { assertEq(1, results.length); - assertEq(A_RELATIVE_URL, results[0].url); + assertEq(PICASA_URL, results[0].url); - // Text in the body of b.html. - query = { 'text': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(B_RELATIVE_URL, results[0].url); - - // The test has succeeded. - chrome.test.succeed(); - }); + // The test has succeeded. + chrome.test.succeed(); }); }; - // Setup a callback object for tab events. - var urls = [A_RELATIVE_URL, B_RELATIVE_URL]; - var tabIds = []; + // lengthScopedSearch entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(lengthScopedSearchTestVerification); + populateHistory(urls, function() { }); + }); + }, + + function fullTextSearch() { + chrome.history.deleteAll(function() { + // The continuation of the test after the windows have been opened. + var validateTest = function() { + // Continue with the test. + // A title search for www.a.com should find a. + var query = { 'text': 'www.a.com' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(A_RELATIVE_URL, results[0].url); - function listenerCallback() { - if (tabIds.length < urls.length) { - return; + // Text in the body of b.html. + query = { 'text': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(B_RELATIVE_URL, results[0].url); + + // The test has succeeded. + chrome.test.succeed(); + }); + }); }; - // Ensure both tabs have completed loading. - for (var index = 0, id; id = tabIds[index]; index++) { - if (!tabsCompleteData[id] || - tabsCompleteData[id] != 'complete') { + // Setup a callback object for tab events. + var urls = [A_RELATIVE_URL, B_RELATIVE_URL]; + var tabIds = []; + + function listenerCallback() { + if (tabIds.length < urls.length) { return; - }; - }; + } + + // Ensure both tabs have completed loading. + for (var index = 0, id; id = tabIds[index]; index++) { + if (!tabsCompleteData[id] || + tabsCompleteData[id] != 'complete') { + return; + }; + } + + // Unhook callbacks. + tabCompleteCallback = null; + chrome.tabs.onUpdated.removeListener(tabsCompleteListener); + + // Allow indexing to occur. + waitAFewSeconds(2, function() { + validateTest(); + }); + } - // Unhook callbacks. - tabCompleteCallback = null; - chrome.tabs.onUpdated.removeListener(tabsCompleteListener); + tabCompleteCallback = listenerCallback; + chrome.tabs.onUpdated.addListener(tabsCompleteListener); - // Allow indexing to occur. - waitAFewSeconds(2, function() { - validateTest(); + // Navigate to a few pages. + urls.forEach(function(url) { + chrome.tabs.create({ 'url': url }, function(tab) { + tabIds.push(tab.id); + }); }); - }; + }); + }, - tabCompleteCallback = listenerCallback; - chrome.tabs.onUpdated.addListener(tabsCompleteListener); + function getVisits() { + // getVisits callback. + function getVisitsTestVerification() { + removeItemVisitedListener(); - // Navigate to a few pages. - urls.forEach(function(url) { - chrome.tabs.create({ 'url': url }, function(tab) { - tabIds.push(tab.id); + // Verify that we received the url. + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(GOOGLE_URL, results[0].url); + + var id = results[0].id; + chrome.history.getVisits({ 'url': GOOGLE_URL }, function(results) { + assertEq(1, results.length); + assertEq(id, results[0].id); + + // The test has succeeded. + chrome.test.succeed(); + }); }); - }); - }); - }, + }; - function getVisits() { - // getVisits callback. - function getVisitsTestVerification() { - removeItemVisitedListener(); + // getVisits entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(getVisitsTestVerification); + populateHistory([GOOGLE_URL], function() { }); + }); + }, - // Verify that we received the url. - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(GOOGLE_URL, results[0].url); + function deleteUrl() { + function deleteUrlTestVerification() { + removeItemRemovedListener(); - var id = results[0].id; - chrome.history.getVisits({ 'url': GOOGLE_URL }, function(results) { - assertEq(1, results.length); - assertEq(id, results[0].id); + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(0, results.length); // The test has succeeded. chrome.test.succeed(); }); - }); - }; + } - // getVisits entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(getVisitsTestVerification); - populateHistory([GOOGLE_URL], function() { }); - }); - }, + function onAddedItem() { + removeItemVisitedListener(); - function deleteUrl() { - function deleteUrlTestVerification() { - removeItemRemovedListener(); + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(GOOGLE_URL, results[0].url); - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(0, results.length); + chrome.history.deleteUrl({ 'url': GOOGLE_URL }); + }); + } - // The test has succeeded. - chrome.test.succeed(); + // deleteUrl entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(onAddedItem); + setItemRemovedListener(deleteUrlTestVerification); + populateHistory([GOOGLE_URL], function() { }); }); - }; + }, - function onAddedItem() { - removeItemVisitedListener(); + function deleteRange() { + var urls = [GOOGLE_URL, PICASA_URL]; + var startDate = {}; + var endDate = {}; + var itemsAdded = 0; - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(GOOGLE_URL, results[0].url); + function deleteRangeTestVerification() { + removeItemRemovedListener(); - chrome.history.deleteUrl({ 'url': GOOGLE_URL }); - }); - }; + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(PICASA_URL, results[0].url); - // deleteUrl entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(onAddedItem); - setItemRemovedListener(deleteUrlTestVerification); - populateHistory([GOOGLE_URL], function() { }); - }); - }, + // The test has succeeded. + chrome.test.succeed(); + }); + } - function deleteRange() { - var urls = [GOOGLE_URL, PICASA_URL]; - var startDate = {}; - var endDate = {}; - var itemsAdded = 0; + function onAddedItem() { + itemsAdded += 1; - function deleteRangeTestVerification() { - removeItemRemovedListener(); + if (itemsAdded < urls.length) { + // Chrome has seconds resolution, so we must wait to search a range. + waitAFewSeconds(2, function() { + endDate = new Date(); + endDate.setTime(endDate.getTime() - 1000); + populateHistory([urls[itemsAdded]], function() { }); + }); + return; + } - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(PICASA_URL, results[0].url); + removeItemVisitedListener(); + chrome.history.deleteRange({ 'startTime': startDate.getTime(), + 'endTime': endDate.getTime() }, + function() { }); + } - // The test has succeeded. - chrome.test.succeed(); - }); - }; + // deletRange entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(onAddedItem); + setItemRemovedListener(deleteRangeTestVerification); - function onAddedItem() { - itemsAdded += 1; + startDate = new Date(); + startDate.setTime(startDate.getTime() - 1000); - if (itemsAdded < urls.length) { - // Chrome has seconds resolution, so we must wait to search a range. - waitAFewSeconds(2, function() { - endDate = new Date(); - endDate.setTime(endDate.getTime() - 1000); - populateHistory([urls[itemsAdded]], function() { }); - }); - return; - }; + populateHistory([urls[itemsAdded]], function() { }); + }); + }, - removeItemVisitedListener(); - chrome.history.deleteRange({ 'startTime': startDate.getTime(), - 'endTime': endDate.getTime() }, - function() { }); - }; + // Suppose we have time epochs x,y,z and history events A,B which occur + // in the sequence x A y B z. The previous deleteRange test deleted the + // range [x,y], this test deletes the range [y,z]. + function deleteRange2() { + var urls = [GOOGLE_URL, PICASA_URL]; + var startDate = {}; + var endDate = {}; + var itemsAdded = 0; - // deletRange entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(onAddedItem); - setItemRemovedListener(deleteRangeTestVerification); + function deleteRange2TestVerification() { + removeItemRemovedListener(); - startDate = new Date(); - startDate.setTime(startDate.getTime() - 1000); + var query = { 'text': '' }; + chrome.history.search(query, function(results) { + assertEq(1, results.length); + assertEq(GOOGLE_URL, results[0].url); - populateHistory([urls[itemsAdded]], function() { }); - }); - }, - - // Suppose we have time epochs x,y,z and history events A,B which occur in the - // sequence x A y B z. The previous deleteRange test deleted the range [x,y], - // this test deletes the range [y,z]. - function deleteRange2() { - var urls = [GOOGLE_URL, PICASA_URL]; - var startDate = {}; - var endDate = {}; - var itemsAdded = 0; - - function deleteRange2TestVerification() { - removeItemRemovedListener(); - - var query = { 'text': '' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(GOOGLE_URL, results[0].url); - - // The test has succeeded. - chrome.test.succeed(); - }); - }; + // The test has succeeded. + chrome.test.succeed(); + }); + } - function onAddedItem() { - itemsAdded += 1; + function onAddedItem() { + itemsAdded += 1; - if (itemsAdded < urls.length) { - // Chrome has seconds resolution, so we must wait to search a range. - waitAFewSeconds(2, function() { - startDate = new Date(); - startDate.setTime(startDate.getTime() - 1000); - populateHistory([urls[itemsAdded]], function() { }); - }); - return; - }; + if (itemsAdded < urls.length) { + // Chrome has seconds resolution, so we must wait to search a range. + waitAFewSeconds(2, function() { + startDate = new Date(); + startDate.setTime(startDate.getTime() - 1000); + populateHistory([urls[itemsAdded]], function() { }); + }); + return; + } - removeItemVisitedListener(); + removeItemVisitedListener(); - endDate = new Date(); - endDate.setTime(endDate.getTime() + 1000); - chrome.history.deleteRange({ 'startTime': startDate.getTime(), - 'endTime': endDate.getTime() }, - function() { }); - }; + endDate = new Date(); + endDate.setTime(endDate.getTime() + 1000); + chrome.history.deleteRange({'startTime': startDate.getTime(), + 'endTime': endDate.getTime() }, + function() { }); + } + + // deletRange entry point. + chrome.history.deleteAll(function() { + setItemVisitedListener(onAddedItem); + setItemRemovedListener(deleteRange2TestVerification); + populateHistory([urls[itemsAdded]], function() { }); + }); + }, + ]); - // deletRange entry point. - chrome.history.deleteAll(function() { - setItemVisitedListener(onAddedItem); - setItemRemovedListener(deleteRange2TestVerification); - populateHistory([urls[itemsAdded]], function() { }); - }); - }, -]); +}); diff --git a/chrome/test/data/extensions/api_test/i18n/test.js b/chrome/test/data/extensions/api_test/i18n/test.js index 40807f42..4c4671b 100644 --- a/chrome/test/data/extensions/api_test/i18n/test.js +++ b/chrome/test/data/extensions/api_test/i18n/test.js @@ -2,38 +2,45 @@ // browser_tests.exe --gtest_filter=ExtensionApiTest.I18N --lib=browser_tests var testCallback = chrome.test.testCallback; +var callbackPass = chrome.test.callbackPass; -chrome.test.runTests([ - function getAcceptLanguages() { - chrome.i18n.getAcceptLanguages(chrome.test.callbackPass(function(results) { - chrome.test.assertEq(results.length, 2); - chrome.test.assertEq(results[0], "en-US"); - chrome.test.assertEq(results[1], "en"); - })); - }, - function getMessage() { - var message = chrome.i18n.getMessage("simple_message"); - chrome.test.assertEq(message, "Simple message"); +chrome.test.getConfig(function(config) { - message = chrome.i18n.getMessage("message_with_placeholders", + var TEST_FILE_URL = "http://localhost:PORT/files/extensions/test_file.html" + .replace(/PORT/, config.testServer.port); + + chrome.test.runTests([ + function getAcceptLanguages() { + chrome.i18n.getAcceptLanguages(callbackPass(function(results) { + chrome.test.assertEq(results.length, 2); + chrome.test.assertEq(results[0], "en-US"); + chrome.test.assertEq(results[1], "en"); + })); + }, + function getMessage() { + var message = chrome.i18n.getMessage("simple_message"); + chrome.test.assertEq(message, "Simple message"); + + message = chrome.i18n.getMessage("message_with_placeholders", ["Cira", "John"]); - chrome.test.assertEq(message, "Cira and John work for Google"); + chrome.test.assertEq(message, "Cira and John work for Google"); - message = chrome.i18n.getMessage("message_with_one_placeholder", "19"); - chrome.test.assertEq(message, "Number of errors: 19"); + message = chrome.i18n.getMessage("message_with_one_placeholder", "19"); + chrome.test.assertEq(message, "Number of errors: 19"); - chrome.test.succeed(); - }, - function getMessageFromContentScript() { - chrome.extension.onRequest.addListener( - function(request, sender, sendResponse) { - chrome.test.assertEq(request, "Number of errors: 19"); - } - ); - chrome.test.log("Creating tab..."); - chrome.tabs.create({ - url: "http://localhost:1337/files/extensions/test_file.html" - }); - chrome.test.succeed(); - } -]); + chrome.test.succeed(); + }, + function getMessageFromContentScript() { + chrome.extension.onRequest.addListener( + function(request, sender, sendResponse) { + chrome.test.assertEq(request, "Number of errors: 19"); + } + ); + chrome.test.log("Creating tab..."); + chrome.tabs.create({ + url: TEST_FILE_URL + }); + chrome.test.succeed(); + } + ]); +}); diff --git a/chrome/test/data/extensions/api_test/tabs/connect/test.js b/chrome/test/data/extensions/api_test/tabs/connect/test.js index 16c8b0e..d3d969b 100644 --- a/chrome/test/data/extensions/api_test/tabs/connect/test.js +++ b/chrome/test/data/extensions/api_test/tabs/connect/test.js @@ -9,90 +9,95 @@ var pass = chrome.test.callbackPass; var assertEq = chrome.test.assertEq; var assertTrue = chrome.test.assertTrue; -chrome.test.runTests([ - function setupConnect() { - // The web page that our content script will be injected into. - var relativePath = '/files/extensions/api_test/tabs/basics/relative.html'; - var testUrl = 'http://localhost:1337' + relativePath; +chrome.test.getConfig(function(config) { - setupWindow([testUrl], pass(function(winId, tabIds) { - testTabId = tabIds[0]; - waitForAllTabs(pass()); - })); - }, + chrome.test.runTests([ + function setupConnect() { + // The web page that our content script will be injected into. + var relativePath = '/files/extensions/api_test/tabs/basics/relative.html'; + var testUrl = + ['http://localhost:PORT'.replace(/PORT/, config.testServer.port), + relativePath].join(''); - function connectMultipleConnects() { - var connectCount = 0; - function connect10() { - var port = chrome.tabs.connect(testTabId); + setupWindow([testUrl], pass(function(winId, tabIds) { + testTabId = tabIds[0]; + waitForAllTabs(pass()); + })); + }, + + function connectMultipleConnects() { + var connectCount = 0; + function connect10() { + var port = chrome.tabs.connect(testTabId); + chrome.test.listenOnce(port.onMessage, function(msg) { + assertEq(++connectCount, msg.connections); + if (connectCount < 10) + connect10(); + }); + port.postMessage("GET"); + } + connect10(); + }, + + function connectName() { + var name = "akln3901n12la"; + var port = chrome.tabs.connect(testTabId, {"name": name}); chrome.test.listenOnce(port.onMessage, function(msg) { - assertEq(++connectCount, msg.connections); - if (connectCount < 10) - connect10(); + assertEq(name, msg.name); + + var port = chrome.tabs.connect(testTabId); + chrome.test.listenOnce(port.onMessage, function(msg) { + assertEq('', msg.name); + }); + port.postMessage("GET"); }); port.postMessage("GET"); - } - connect10(); - }, - - function connectName() { - var name = "akln3901n12la"; - var port = chrome.tabs.connect(testTabId, {"name": name}); - chrome.test.listenOnce(port.onMessage, function(msg) { - assertEq(name, msg.name); + }, + function connectPostMessageTypes() { var port = chrome.tabs.connect(testTabId); + // Test the content script echoes the message back. + var echoMsg = {"num": 10, "string": "hi", "array": [1,2,3,4,5], + "obj":{"dec": 1.0}}; chrome.test.listenOnce(port.onMessage, function(msg) { - assertEq('', msg.name); + assertEq(echoMsg.num, msg.num); + assertEq(echoMsg.string, msg.string); + assertEq(echoMsg.array[4], msg.array[4]); + assertEq(echoMsg.obj.dec, msg.obj.dec); }); - port.postMessage("GET"); - }); - port.postMessage("GET"); - }, - - function connectPostMessageTypes() { - var port = chrome.tabs.connect(testTabId); - // Test the content script echoes the message back. - var echoMsg = {"num": 10, "string": "hi", "array": [1,2,3,4,5], - "obj":{"dec": 1.0}}; - chrome.test.listenOnce(port.onMessage, function(msg) { - assertEq(echoMsg.num, msg.num); - assertEq(echoMsg.string, msg.string); - assertEq(echoMsg.array[4], msg.array[4]); - assertEq(echoMsg.obj.dec, msg.obj.dec); - }); - port.postMessage(echoMsg); - }, + port.postMessage(echoMsg); + }, - function connectPostManyMessages() { - var port = chrome.tabs.connect(testTabId); - var count = 0; - var done = chrome.test.listenForever(port.onMessage, function(msg) { - assertEq(count++, msg); - if (count == 999) { - done(); + function connectPostManyMessages() { + var port = chrome.tabs.connect(testTabId); + var count = 0; + var done = chrome.test.listenForever(port.onMessage, function(msg) { + assertEq(count++, msg); + if (count == 999) { + done(); + } + }); + for (var i = 0; i < 1000; i++) { + port.postMessage(i); } - }); - for (var i = 0; i < 1000; i++) { - port.postMessage(i); - } - }, + }, - /* TODO: Enable this test once we do checking on the tab id for - chrome.tabs.connect (crbug.com/27565). - function connectNoTab() { - chrome.tabs.create({}, pass(function(tab) { - chrome.tabs.remove(tab.id, pass(function() { - var port = chrome.tabs.connect(tab.id); - assertEq(null, port); + /* TODO: Enable this test once we do checking on the tab id for + chrome.tabs.connect (crbug.com/27565). + function connectNoTab() { + chrome.tabs.create({}, pass(function(tab) { + chrome.tabs.remove(tab.id, pass(function() { + var port = chrome.tabs.connect(tab.id); + assertEq(null, port); + })); })); - })); - }, */ + }, */ - function sendRequest() { - var request = "test"; - chrome.tabs.sendRequest(testTabId, request, pass(function(response) { - assertEq(request, response); - })); - } -]); + function sendRequest() { + var request = "test"; + chrome.tabs.sendRequest(testTabId, request, pass(function(response) { + assertEq(request, response); + })); + } + ]); +}); |