summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorerikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-29 20:28:46 +0000
committererikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-29 20:28:46 +0000
commit309934c4ceea5086567f275cef17bbfefa29996b (patch)
treed8efe2e9b30e10d67bdacc8c0f4f28614a4a2eb3 /chrome/renderer
parent36fe18f709825bc199f5eca66463a832e09638c5 (diff)
downloadchromium_src-309934c4ceea5086567f275cef17bbfefa29996b.zip
chromium_src-309934c4ceea5086567f275cef17bbfefa29996b.tar.gz
chromium_src-309934c4ceea5086567f275cef17bbfefa29996b.tar.bz2
more extensions bookmarks changes:* add schema verification* add unit tests for schema* add a few new methods (getTree, getChildren)* add events
Review URL: http://codereview.chromium.org/102009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14877 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rwxr-xr-xchrome/renderer/extensions/extension_api_client_unittest.cc172
-rwxr-xr-xchrome/renderer/renderer_resources.grd2
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js68
3 files changed, 170 insertions, 72 deletions
diff --git a/chrome/renderer/extensions/extension_api_client_unittest.cc b/chrome/renderer/extensions/extension_api_client_unittest.cc
index 87e4376..e635901 100755
--- a/chrome/renderer/extensions/extension_api_client_unittest.cc
+++ b/chrome/renderer/extensions/extension_api_client_unittest.cc
@@ -2,6 +2,10 @@
// 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/render_messages.h"
#include "chrome/renderer/extensions/extension_process_bindings.h"
#include "chrome/renderer/extensions/renderer_extension_bindings.h"
@@ -34,6 +38,23 @@ class ExtensionAPIClientTest : public RenderViewTest {
void ExpectJsFail(const std::string& js, const std::string& message) {
ExecuteJavaScript(js.c_str());
EXPECT_EQ(message, GetConsoleMessage());
+ render_thread_.sink().ClearMessages();
+ }
+
+ void ExpectJsPass(const std::string& js,
+ const std::string& function,
+ const std::string& arg1) {
+ ExecuteJavaScript(js.c_str());
+ const IPC::Message* request_msg =
+ render_thread_.sink().GetUniqueMessageMatching(
+ ViewHostMsg_ExtensionRequest::ID);
+ ASSERT_EQ("", GetConsoleMessage()) << js;
+ ASSERT_TRUE(request_msg) << js;
+ ViewHostMsg_ExtensionRequest::Param params;
+ ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
+ ASSERT_EQ(function.c_str(), params.a) << js;
+ ASSERT_EQ(arg1.c_str(), params.b) << js;
+ render_thread_.sink().ClearMessages();
}
};
@@ -85,30 +106,15 @@ TEST_F(ExtensionAPIClientTest, GetTabsForWindow) {
ExpectJsFail("chromium.tabs.getTabsForWindow(42, function(){});",
"Uncaught Error: Too many arguments.");
- ExecuteJavaScript("chromium.tabs.getTabsForWindow(function(){})");
- const IPC::Message* request_msg =
- render_thread_.sink().GetUniqueMessageMatching(
- ViewHostMsg_ExtensionRequest::ID);
- ASSERT_TRUE(request_msg);
- ViewHostMsg_ExtensionRequest::Param params;
- ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
- ASSERT_EQ("GetTabsForWindow", params.a);
- ASSERT_EQ("null", params.b);
+ ExpectJsPass("chromium.tabs.getTabsForWindow(function(){})",
+ "GetTabsForWindow", "null");
}
TEST_F(ExtensionAPIClientTest, GetTab) {
ExpectJsFail("chromium.tabs.getTab(null, function(){});",
"Uncaught Error: Parameter 0 is required.");
- ExecuteJavaScript("chromium.tabs.getTab(42)");
- const IPC::Message* request_msg =
- render_thread_.sink().GetUniqueMessageMatching(
- ViewHostMsg_ExtensionRequest::ID);
- ASSERT_TRUE(request_msg);
- ViewHostMsg_ExtensionRequest::Param params;
- ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
- ASSERT_EQ("GetTab", params.a);
- ASSERT_EQ("42", params.b);
+ ExpectJsPass("chromium.tabs.getTab(42)", "GetTab", "42");
}
TEST_F(ExtensionAPIClientTest, CreateTab) {
@@ -122,21 +128,15 @@ TEST_F(ExtensionAPIClientTest, CreateTab) {
"Uncaught Error: Invalid value for argument 0. Property "
"'foo': Unexpected property.");
- ExecuteJavaScript("chromium.tabs.createTab({"
- " url:'http://www.google.com/',"
- " selected:true,"
- " windowId:4"
- "})");
- const IPC::Message* request_msg =
- render_thread_.sink().GetUniqueMessageMatching(
- ViewHostMsg_ExtensionRequest::ID);
- ASSERT_TRUE(request_msg);
- ViewHostMsg_ExtensionRequest::Param params;
- ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
- ASSERT_EQ("CreateTab", params.a);
- ASSERT_EQ("{\"url\":\"http://www.google.com/\","
- "\"selected\":true,"
- "\"windowId\":4}", params.b);
+ ExpectJsPass("chromium.tabs.createTab({"
+ " url:'http://www.google.com/',"
+ " selected:true,"
+ " windowId:4"
+ "})",
+ "CreateTab",
+ "{\"url\":\"http://www.google.com/\","
+ "\"selected\":true,"
+ "\"windowId\":4}");
}
TEST_F(ExtensionAPIClientTest, UpdateTab) {
@@ -150,36 +150,90 @@ TEST_F(ExtensionAPIClientTest, UpdateTab) {
"Uncaught Error: Invalid value for argument 0. Property "
"'url': Expected 'string' but got 'integer'.");
- ExecuteJavaScript("chromium.tabs.updateTab({"
- " id:42,"
- " url:'http://www.google.com/',"
- " selected:true,"
- " windowId:4"
- "})");
- const IPC::Message* request_msg =
- render_thread_.sink().GetUniqueMessageMatching(
- ViewHostMsg_ExtensionRequest::ID);
- ASSERT_TRUE(request_msg);
- ViewHostMsg_ExtensionRequest::Param params;
- ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
- ASSERT_EQ("UpdateTab", params.a);
- ASSERT_EQ("{\"id\":42,"
- "\"url\":\"http://www.google.com/\","
- "\"selected\":true,"
- "\"windowId\":4}", params.b);
+ ExpectJsPass("chromium.tabs.updateTab({"
+ " id:42,"
+ " url:'http://www.google.com/',"
+ " selected:true,"
+ " windowId:4"
+ "})",
+ "UpdateTab",
+ "{\"id\":42,"
+ "\"url\":\"http://www.google.com/\","
+ "\"selected\":true,"
+ "\"windowId\":4}");
}
TEST_F(ExtensionAPIClientTest, RemoveTab) {
ExpectJsFail("chromium.tabs.removeTab('foobar', function(){});",
"Uncaught Error: Too many arguments.");
- ExecuteJavaScript("chromium.tabs.removeTab(21)");
- const IPC::Message* request_msg =
- render_thread_.sink().GetUniqueMessageMatching(
- ViewHostMsg_ExtensionRequest::ID);
- ASSERT_TRUE(request_msg);
- ViewHostMsg_ExtensionRequest::Param params;
- ViewHostMsg_ExtensionRequest::Read(request_msg, &params);
- ASSERT_EQ("RemoveTab", params.a);
- ASSERT_EQ("21", params.b);
+ ExpectJsPass("chromium.tabs.removeTab(21)", "RemoveTab", "21");
+}
+
+// Bookmark API tests
+// TODO(erikkay) add more variations here
+
+TEST_F(ExtensionAPIClientTest, CreateBookmark) {
+ ExpectJsFail(
+ "chromium.bookmarks.create({parentId:'x', title:0}, function(){})",
+ "Uncaught Error: Invalid value for argument 0. "
+ "Property 'parentId': Expected 'integer' but got 'string', "
+ "Property 'title': Expected 'string' but got 'integer'.");
+
+ ExpectJsPass(
+ "chromium.bookmarks.create({parentId:0, title:'x'}, function(){})",
+ "CreateBookmark",
+ "{\"parentId\":0,\"title\":\"x\"}");
+}
+
+TEST_F(ExtensionAPIClientTest, GetBookmarks) {
+ ExpectJsPass("chromium.bookmarks.get([], function(){});",
+ "GetBookmarks",
+ "[]");
+ ExpectJsPass("chromium.bookmarks.get([0,1,2,3], function(){});",
+ "GetBookmarks",
+ "[0,1,2,3]");
+ ExpectJsPass("chromium.bookmarks.get(null, function(){});",
+ "GetBookmarks",
+ "null");
+ ExpectJsFail("chromium.bookmarks.get({}, function(){});",
+ "Uncaught Error: Invalid value for argument 0. "
+ "Expected 'array' but got 'object'.");
+}
+
+TEST_F(ExtensionAPIClientTest, GetBookmarkChildren) {
+ ExpectJsPass("chromium.bookmarks.getChildren(42, function(){});",
+ "GetBookmarkChildren",
+ "42");
+}
+
+TEST_F(ExtensionAPIClientTest, GetBookmarkTree) {
+ ExpectJsPass("chromium.bookmarks.getTree(function(){});",
+ "GetBookmarkTree",
+ "null");
+}
+
+TEST_F(ExtensionAPIClientTest, SearchBookmarks) {
+ ExpectJsPass("chromium.bookmarks.search('hello',function(){});",
+ "SearchBookmarks",
+ "\"hello\"");
}
+
+TEST_F(ExtensionAPIClientTest, RemoveBookmark) {
+ ExpectJsPass("chromium.bookmarks.remove({id:42});",
+ "RemoveBookmark",
+ "{\"id\":42}");
+}
+
+TEST_F(ExtensionAPIClientTest, MoveBookmark) {
+ ExpectJsPass("chromium.bookmarks.move({id:42,parentId:1,index:0});",
+ "MoveBookmark",
+ "{\"id\":42,\"parentId\":1,\"index\":0}");
+}
+
+TEST_F(ExtensionAPIClientTest, SetBookmarkTitle) {
+ ExpectJsPass("chromium.bookmarks.setTitle({id:42,title:'x'});",
+ "SetBookmarkTitle",
+ "{\"id\":42,\"title\":\"x\"}");
+}
+
diff --git a/chrome/renderer/renderer_resources.grd b/chrome/renderer/renderer_resources.grd
index c59e98c..cda253b 100755
--- a/chrome/renderer/renderer_resources.grd
+++ b/chrome/renderer/renderer_resources.grd
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This comment is only here because changes to resources are not picked up
-without changes to the corresponding grd file. -->
+without changes to the corresponding grd file. -->
<grit latest_public_release="0" current_release="1">
<outputs>
<output filename="grit/renderer_resources.h" type="rc_header">
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index 75c7b54..1abb06f 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -19,6 +19,8 @@ var chromium;
native function MoveTab();
native function RemoveTab();
native function GetBookmarks();
+ native function GetBookmarkChildren();
+ native function GetBookmarkTree();
native function SearchBookmarks();
native function RemoveBookmark();
native function CreateBookmark();
@@ -238,35 +240,54 @@ var chromium;
//----------------------------------------------------------------------------
// Bookmarks
- // TODO(erikkay): Call validate() in these functions.
chromium.bookmarks = {};
chromium.bookmarks.get = function(ids, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(GetBookmarks, ids, callback);
};
chromium.bookmarks.get.params = [
{
type: "array",
- items: {
- type: chromium.types.pInt
- },
- minItems: 1,
+ items: chromium.types.pInt,
optional: true
},
- chromium.types.optFun
+ chromium.types.fun
+ ];
+
+ chromium.bookmarks.getChildren = function(id, callback) {
+ validate(arguments, arguments.callee.params);
+ sendRequest(GetBookmarkChildren, id, callback);
+ };
+
+ chromium.bookmarks.getChildren.params = [
+ chromium.types.pInt,
+ chromium.types.fun
+ ];
+
+ chromium.bookmarks.getTree = function(callback) {
+ validate(arguments, arguments.callee.params);
+ sendRequest(GetBookmarkTree, null, callback);
+ };
+
+ // TODO(erikkay): allow it to take an optional id as a starting point
+ chromium.bookmarks.getTree.params = [
+ chromium.types.fun
];
chromium.bookmarks.search = function(query, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(SearchBookmarks, query, callback);
};
chromium.bookmarks.search.params = [
- chromium.types.string,
- chromium.types.optFun
+ chromium.types.str,
+ chromium.types.fun
];
chromium.bookmarks.remove = function(bookmark, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(RemoveBookmark, bookmark, callback);
};
@@ -275,13 +296,14 @@ var chromium;
type: "object",
properties: {
id: chromium.types.pInt,
- recursive: chromium.types.bool
+ recursive: chromium.types.optBool
}
},
chromium.types.optFun
];
chromium.bookmarks.create = function(bookmark, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(CreateBookmark, bookmark, callback);
};
@@ -291,14 +313,15 @@ var chromium;
properties: {
parentId: chromium.types.optPInt,
index: chromium.types.optPInt,
- title: chromium.types.optString,
- url: chromium.types.optString,
+ title: chromium.types.optStr,
+ url: chromium.types.optStr,
}
},
chromium.types.optFun
];
chromium.bookmarks.move = function(obj, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(MoveBookmark, obj, callback);
};
@@ -315,6 +338,7 @@ var chromium;
];
chromium.bookmarks.setTitle = function(bookmark, callback) {
+ validate(arguments, arguments.callee.params);
sendRequest(SetBookmarkTitle, bookmark, callback);
};
@@ -323,12 +347,32 @@ var chromium;
type: "object",
properties: {
id: chromium.types.pInt,
- title: chromium.types.optString
+ title: chromium.types.optStr
}
},
chromium.types.optFun
];
+
+ // bookmark events
+
+ // Sends ({id, title, url, parentId, index})
+ chromium.bookmarks.onBookmarkAdded = new chromium.Event("bookmark-added");
+
+ // Sends ({parentId, index})
+ chromium.bookmarks.onBookmarkRemoved = new chromium.Event("bookmark-removed");
+
+ // Sends (id, object) where object has list of properties that have changed.
+ // Currently, this only ever includes 'title'.
+ chromium.bookmarks.onBookmarkChanged = new chromium.Event("bookmark-changed");
+
+ // Sends ({id, parentId, index, oldParentId, oldIndex})
+ chromium.bookmarks.onBookmarkMoved = new chromium.Event("bookmark-moved");
+ // Sends (id, [childrenIds])
+ chromium.bookmarks.onBookmarkChildrenReordered =
+ new chromium.Event("bookmark-children-reordered");
+
+
//----------------------------------------------------------------------------
// Self