diff options
author | erikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-29 20:28:46 +0000 |
---|---|---|
committer | erikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-29 20:28:46 +0000 |
commit | 309934c4ceea5086567f275cef17bbfefa29996b (patch) | |
tree | d8efe2e9b30e10d67bdacc8c0f4f28614a4a2eb3 /chrome/renderer | |
parent | 36fe18f709825bc199f5eca66463a832e09638c5 (diff) | |
download | chromium_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-x | chrome/renderer/extensions/extension_api_client_unittest.cc | 172 | ||||
-rwxr-xr-x | chrome/renderer/renderer_resources.grd | 2 | ||||
-rw-r--r-- | chrome/renderer/resources/extension_process_bindings.js | 68 |
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, ¶ms); + 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, ¶ms); - 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, ¶ms); - 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, ¶ms); - 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, ¶ms); - 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, ¶ms); - 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 |