diff options
Diffstat (limited to 'chrome/renderer')
-rwxr-xr-x | chrome/renderer/extensions/greasemonkey_api_unittest.cc | 89 | ||||
-rw-r--r-- | chrome/renderer/resources/greasemonkey_api.js | 56 |
2 files changed, 139 insertions, 6 deletions
diff --git a/chrome/renderer/extensions/greasemonkey_api_unittest.cc b/chrome/renderer/extensions/greasemonkey_api_unittest.cc new file mode 100755 index 0000000..fef69a8 --- /dev/null +++ b/chrome/renderer/extensions/greasemonkey_api_unittest.cc @@ -0,0 +1,89 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/string_util.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/resource_bundle.h" +#include "chrome/test/v8_unit_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +#include "grit/renderer_resources.h" + +// TODO(port) +#if defined(OS_WIN) + +static const char kGreasemonkeyApi[] = "greasemonkey_api.js"; +static const char kGreasemonkeyApiTest[] = "greasemonkey_api_test.js"; + +class GreasemonkeyApiTest : public V8UnitTest { + public: + GreasemonkeyApiTest() {} + + virtual void SetUp() { + V8UnitTest::SetUp(); + + // Add the greasemonkey api to the context. + StringPiece api_js = + ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_GREASEMONKEY_API_JS); + ExecuteScriptInContext(api_js, kGreasemonkeyApi); + + // Add the test functions to the context. + std::wstring test_js_file_path; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_js_file_path)); + file_util::AppendToPath(&test_js_file_path, L"extensions"); + file_util::AppendToPath(&test_js_file_path, + UTF8ToWide(kGreasemonkeyApiTest)); + std::string test_js; + ASSERT_TRUE(file_util::ReadFileToString(test_js_file_path, &test_js)); + ExecuteScriptInContext(test_js, kGreasemonkeyApiTest); + } +}; + +TEST_F(GreasemonkeyApiTest, GetSetValue) { + TestFunction("testGetSetValue"); +} + +TEST_F(GreasemonkeyApiTest, DeleteValue) { + TestFunction("testDeleteValue"); +} + +TEST_F(GreasemonkeyApiTest, ListValues) { + TestFunction("testListValues"); +} + +TEST_F(GreasemonkeyApiTest, GetResourceURL) { + TestFunction("testGetResourceURL"); +} + +TEST_F(GreasemonkeyApiTest, GetResourceText) { + TestFunction("testGetResourceText"); +} + +TEST_F(GreasemonkeyApiTest, AddStyle) { + TestFunction("testAddStyle"); +} + +/* +TEST_F(GreasemonkeyApiTest, XmlhttpRequest) { + TestFunction("testXmlhttpRequest"); +} +*/ + +TEST_F(GreasemonkeyApiTest, RegisterMenuCommand) { + TestFunction("testRegisterMenuCommand"); +} + +TEST_F(GreasemonkeyApiTest, OpenInTab) { + TestFunction("testOpenInTab"); +} + +TEST_F(GreasemonkeyApiTest, Log) { + TestFunction("testLog"); +} + +#endif // #if defined(OSWIN) + diff --git a/chrome/renderer/resources/greasemonkey_api.js b/chrome/renderer/resources/greasemonkey_api.js index 2d791dd..57fa252 100644 --- a/chrome/renderer/resources/greasemonkey_api.js +++ b/chrome/renderer/resources/greasemonkey_api.js @@ -1,20 +1,57 @@ // Implementation of the Greasemonkey API, see: // http://wiki.greasespot.net/Greasemonkey_Manual:APIs +const MIN_INT_32 = -0x80000000; +const MAX_INT_32 = 0x7FFFFFFF; + +// Prefix for user script values that are stored in localStorage. +const STORAGE_NS = "__userscript__."; + function GM_getValue(name, defaultValue) { - throw new Error("not implemented."); + var value = localStorage.getItem(STORAGE_NS + name); + return value ? value : defaultValue; } function GM_setValue(name, value) { - throw new Error("not implemented."); + // The values for GM_getValue() and GM_setValue() can only be boolean, + // strings, or 32 bit integers. See the setPrefs function in: + // http://greasemonkey.devjavu.com/browser/trunk/src/chrome/chromeFiles/content/prefmanager.js + var goodType = false; + switch (typeof(value)) { + case "string": + case "boolean": + goodType = true; + break; + case "number": + // Note that "value % 1 == 0" checks that the number is not a float. + if (value % 1 == 0 && value >= MIN_INT_32 && value <= MAX_INT_32) { + goodType = true; + } + break; + } + + if (!goodType) { + throw new Error("Unsupported type for GM_setValue. Supported types " + + "are: string, bool, and 32 bit integers."); + } + + localStorage.setItem(STORAGE_NS + name, value); } function GM_deleteValue(name) { - throw new Error("not implemented."); + localStorage.removeItem(STORAGE_NS + name); } function GM_listValues() { - throw new Error("not implemented."); + var values = []; + for (var i = 0; i < localStorage.length; i++) { + var key = localStorage.key(i); + if (key.indexOf(STORAGE_NS) == 0) { + key = key.substring(STORAGE_NS.length); + values.push(key); + } + } + return values; } function GM_getResourceURL(resourceName) { @@ -26,7 +63,14 @@ function GM_getResourceText(resourceName) { } function GM_addStyle(css) { - throw new Error("not implemented."); + var head = document.getElementsByTagName("head")[0]; + if (!head) { + return; + } + var style = document.createElement("style"); + style.type = "text/css"; + style.innerHTML = css; + head.appendChild(style); } function GM_xmlhttpRequest(details) { @@ -39,7 +83,7 @@ function GM_registerMenuCommand(commandName, commandFunc, accelKey, } function GM_openInTab(url) { - throw new Error("not implemented."); + window.open(url, ""); } function GM_log(message) { |