summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer')
-rwxr-xr-xchrome/renderer/extensions/greasemonkey_api_unittest.cc89
-rw-r--r--chrome/renderer/resources/greasemonkey_api.js56
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) {