diff options
45 files changed, 237 insertions, 315 deletions
diff --git a/chrome/browser/dom_ui/dom_ui.cc b/chrome/browser/dom_ui/dom_ui.cc index 976c1dc..4cb1202 100644 --- a/chrome/browser/dom_ui/dom_ui.cc +++ b/chrome/browser/dom_ui/dom_ui.cc @@ -37,7 +37,7 @@ DOMUI::~DOMUI() { // DOMUI, public: ------------------------------------------------------------- void DOMUI::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/dom_ui/dom_ui.h b/chrome/browser/dom_ui/dom_ui.h index 7fd2e55..838cbcf 100644 --- a/chrome/browser/dom_ui/dom_ui.h +++ b/chrome/browser/dom_ui/dom_ui.h @@ -16,6 +16,7 @@ class DictionaryValue; class DOMMessageHandler; class GURL; +class ListValue; class Profile; class RenderViewHost; class Value; @@ -41,7 +42,7 @@ class DOMUI { // Called from TabContents. virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/extensions/execute_code_in_tab_function.cc b/chrome/browser/extensions/execute_code_in_tab_function.cc index fca1a17..c391db8 100644 --- a/chrome/browser/extensions/execute_code_in_tab_function.cc +++ b/chrome/browser/extensions/execute_code_in_tab_function.cc @@ -18,11 +18,8 @@ namespace keys = extension_tabs_module_constants; bool ExecuteCodeInTabFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - DictionaryValue* script_info; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &script_info)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &script_info)); size_t number_of_value = script_info->size(); if (number_of_value == 0) { error_ = keys::kNoCodeOrFileToExecuteError; @@ -46,7 +43,7 @@ bool ExecuteCodeInTabFunction::RunImpl() { // If |tab_id| is specified, look for it. Otherwise default to selected tab // in the current window. Value* tab_value = NULL; - EXTENSION_FUNCTION_VALIDATE(args->Get(0, &tab_value)); + EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &tab_value)); if (tab_value->IsType(Value::TYPE_NULL)) { browser = GetCurrentBrowser(); if (!browser) { diff --git a/chrome/browser/extensions/extension_accessibility_api.cc b/chrome/browser/extensions/extension_accessibility_api.cc index aebdda2..8b4630e 100644 --- a/chrome/browser/extensions/extension_accessibility_api.cc +++ b/chrome/browser/extensions/extension_accessibility_api.cc @@ -182,7 +182,7 @@ void ExtensionAccessibilityEventRouter::DispatchEvent( bool SetAccessibilityEnabledFunction::RunImpl() { bool enabled; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsBoolean(&enabled)); + EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled)); ExtensionAccessibilityEventRouter::GetInstance() ->SetAccessibilityEnabled(enabled); return true; diff --git a/chrome/browser/extensions/extension_bookmark_manager_api.cc b/chrome/browser/extensions/extension_bookmark_manager_api.cc index 66bc9fa..9b796d2 100644 --- a/chrome/browser/extensions/extension_bookmark_manager_api.cc +++ b/chrome/browser/extensions/extension_bookmark_manager_api.cc @@ -30,9 +30,9 @@ namespace { // Returns a single bookmark node from the argument ID. // This returns NULL in case of failure. const BookmarkNode* GetNodeFromArguments(BookmarkModel* model, - const Value* args) { + const ListValue* args) { std::string id_string; - if (!args->GetAsString(&id_string)) + if (!args->GetString(0, &id_string)) return NULL; int64 id; if (!StringToInt64(id_string, &id)) @@ -42,8 +42,13 @@ const BookmarkNode* GetNodeFromArguments(BookmarkModel* model, // Gets a vector of bookmark nodes from the argument list of IDs. // This returns false in the case of failure. -bool GetNodesFromArguments(BookmarkModel* model, const ListValue* ids, +bool GetNodesFromArguments(BookmarkModel* model, const ListValue* args, std::vector<const BookmarkNode*>* nodes) { + + ListValue* ids; + if (!args->GetList(0, &ids)) + return false; + size_t count = ids->GetSize(); if (count == 0) return false; @@ -208,7 +213,7 @@ void ExtensionBookmarkManagerEventRouter::ClearBookmarkDragData() { bool ClipboardBookmarkManagerFunction::CopyOrCut(bool cut) { BookmarkModel* model = profile()->GetBookmarkModel(); std::vector<const BookmarkNode*> nodes; - EXTENSION_FUNCTION_VALIDATE(GetNodesFromArguments(model, args_as_list(), + EXTENSION_FUNCTION_VALIDATE(GetNodesFromArguments(model, args_.get(), &nodes)); bookmark_utils::CopyToClipboard(model, nodes, cut); return true; @@ -335,7 +340,7 @@ bool StartDragBookmarkManagerFunction::RunImpl() { BookmarkModel* model = profile()->GetBookmarkModel(); std::vector<const BookmarkNode*> nodes; EXTENSION_FUNCTION_VALIDATE( - GetNodesFromArguments(model, args_as_list(), &nodes)); + GetNodesFromArguments(model, args_.get(), &nodes)); if (dispatcher()->render_view_host()->delegate()->GetRenderViewType() == ViewType::TAB_CONTENTS) { @@ -354,16 +359,10 @@ bool StartDragBookmarkManagerFunction::RunImpl() { bool DropBookmarkManagerFunction::RunImpl() { BookmarkModel* model = profile()->GetBookmarkModel(); - // TODO(arv): The arguments change between a list and a value depending on the - // parameters. See http://crbug.com/36301 int64 id; std::string id_string; - if (args_->IsType(Value::TYPE_STRING)) { - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&id_string)); - } else { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - EXTENSION_FUNCTION_VALIDATE(args_as_list()->GetString(0, &id_string)); - } + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id_string)); + if (!StringToInt64(id_string, &id)) { error_ = keys::kInvalidIdError; return false; @@ -376,8 +375,8 @@ bool DropBookmarkManagerFunction::RunImpl() { } int drop_index; - if (args_as_list()->GetSize() == 2) - EXTENSION_FUNCTION_VALIDATE(args_as_list()->GetInteger(1, &drop_index)); + if (args_->GetSize() == 2) + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &drop_index)); else drop_index = drop_parent->GetChildCount(); @@ -412,9 +411,9 @@ bool GetSubtreeBookmarkManagerFunction::RunImpl() { const BookmarkNode* node; int64 id; std::string id_string; - EXTENSION_FUNCTION_VALIDATE(args_as_list()->GetString(0, &id_string)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id_string)); bool folders_only; - EXTENSION_FUNCTION_VALIDATE(args_as_list()->GetBoolean(1, &folders_only)); + EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, &folders_only)); if (id_string == "") { node = model->root_node(); } else { diff --git a/chrome/browser/extensions/extension_bookmarks_module.cc b/chrome/browser/extensions/extension_bookmarks_module.cc index 8361b82..a07179e 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.cc +++ b/chrome/browser/extensions/extension_bookmarks_module.cc @@ -228,8 +228,10 @@ void ExtensionBookmarkEventRouter::BookmarkImportEnding(BookmarkModel* model) { bool GetBookmarksFunction::RunImpl() { BookmarkModel* model = profile()->GetBookmarkModel(); scoped_ptr<ListValue> json(new ListValue()); - if (args_->IsType(Value::TYPE_LIST)) { - const ListValue* ids = args_as_list(); + Value* arg0; + EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &arg0)); + if (arg0->IsType(Value::TYPE_LIST)) { + const ListValue* ids = static_cast<const ListValue*>(arg0); size_t count = ids->GetSize(); EXTENSION_FUNCTION_VALIDATE(count > 0); for (size_t i = 0; i < count; ++i) { @@ -249,7 +251,7 @@ bool GetBookmarksFunction::RunImpl() { } else { int64 id; std::string id_string; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&id_string)); + EXTENSION_FUNCTION_VALIDATE(arg0->GetAsString(&id_string)); if (!GetBookmarkIdAsInt64(id_string, &id)) return false; const BookmarkNode* node = model->GetNodeByID(id); @@ -268,7 +270,7 @@ bool GetBookmarkChildrenFunction::RunImpl() { BookmarkModel* model = profile()->GetBookmarkModel(); int64 id; std::string id_string; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&id_string)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id_string)); if (!GetBookmarkIdAsInt64(id_string, &id)) return false; scoped_ptr<ListValue> json(new ListValue()); @@ -288,9 +290,8 @@ bool GetBookmarkChildrenFunction::RunImpl() { } bool GetBookmarkRecentFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_INTEGER)); int number_of_items; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&number_of_items)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &number_of_items)); if (number_of_items < 1) return false; @@ -317,10 +318,8 @@ bool GetBookmarkTreeFunction::RunImpl() { } bool SearchBookmarksFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_STRING)); - std::wstring query; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&query)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &query)); BookmarkModel* model = profile()->GetBookmarkModel(); ListValue* json = new ListValue(); @@ -340,35 +339,17 @@ bool SearchBookmarksFunction::RunImpl() { } // static -bool RemoveBookmarkFunction::ExtractIds(const Value* args, - std::list<int64>* ids, bool* invalid_id) { +bool RemoveBookmarkFunction::ExtractIds(const ListValue* args, + std::list<int64>* ids, + bool* invalid_id) { std::string id_string; - if (args->IsType(Value::TYPE_STRING) && - args->GetAsString(&id_string)) { - int64 id; - if (StringToInt64(id_string, &id)) - ids->push_back(id); - else - *invalid_id = true; - } else { - if (!args->IsType(Value::TYPE_LIST)) - return false; - const ListValue* ids_list = static_cast<const ListValue*>(args); - size_t count = ids_list->GetSize(); - if (count <= 0) - return false; - for (size_t i = 0; i < count; ++i) { - if (!ids_list->GetString(i, &id_string)) - return false; - int64 id; - if (StringToInt64(id_string, &id)) { - ids->push_back(id); - } else { - *invalid_id = true; - break; - } - } - } + if (!args->GetString(0, &id_string)) + return false; + int64 id; + if (StringToInt64(id_string, &id)) + ids->push_back(id); + else + *invalid_id = true; return true; } @@ -395,8 +376,9 @@ bool RemoveBookmarkFunction::RunImpl() { } bool CreateBookmarkFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); + EXTENSION_FUNCTION_VALIDATE(json != NULL); BookmarkModel* model = profile()->GetBookmarkModel(); int64 parentId; @@ -460,7 +442,7 @@ bool CreateBookmarkFunction::RunImpl() { } // static -bool MoveBookmarkFunction::ExtractIds(const Value* args, +bool MoveBookmarkFunction::ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id) { // For now, Move accepts ID parameters in the same way as an Update. @@ -476,10 +458,9 @@ bool MoveBookmarkFunction::RunImpl() { return false; } EXTENSION_FUNCTION_VALIDATE(ids.size() == 1); - const ListValue* args = args_as_list(); DictionaryValue* destination; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &destination)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &destination)); BookmarkModel* model = profile()->GetBookmarkModel(); const BookmarkNode* node = model->GetNodeByID(ids.front()); @@ -540,21 +521,11 @@ bool MoveBookmarkFunction::RunImpl() { } // static -bool UpdateBookmarkFunction::ExtractIds(const Value* args, +bool UpdateBookmarkFunction::ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id) { - std::string id_string; - if (!args->IsType(Value::TYPE_LIST)) - return false; - const ListValue* args_list = static_cast<const ListValue*>(args); - if (!args_list->GetString(0, &id_string)) - return false; - int64 id; - if (StringToInt64(id_string, &id)) - ids->push_back(id); - else - *invalid_id = true; - return true; + // For now, Update accepts ID parameters in the same way as an Remove. + return RemoveBookmarkFunction::ExtractIds(args, ids, invalid_id); } bool UpdateBookmarkFunction::RunImpl() { @@ -567,9 +538,8 @@ bool UpdateBookmarkFunction::RunImpl() { } EXTENSION_FUNCTION_VALIDATE(ids.size() == 1); - const ListValue* args = args_as_list(); DictionaryValue* updates; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &updates)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &updates)); std::wstring title; std::string url_string; @@ -636,12 +606,12 @@ class CreateBookmarkBucketMapper : public BookmarkBucketMapper<std::string> { explicit CreateBookmarkBucketMapper(Profile* profile) : profile_(profile) {} // TODO(tim): This should share code with CreateBookmarkFunction::RunImpl, // but I can't figure out a good way to do that with all the macros. - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) { - if (!args->IsType(Value::TYPE_DICTIONARY)) + virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { + DictionaryValue* json; + if (!args->GetDictionary(0, &json)) return; std::string parent_id; - const DictionaryValue* json = static_cast<const DictionaryValue*>(args); if (json->HasKey(keys::kParentIdKey)) { if (!json->GetString(keys::kParentIdKey, &parent_id)) return; @@ -671,7 +641,7 @@ class CreateBookmarkBucketMapper : public BookmarkBucketMapper<std::string> { class RemoveBookmarksBucketMapper : public BookmarkBucketMapper<std::string> { public: explicit RemoveBookmarksBucketMapper(Profile* profile) : profile_(profile) {} - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) { + virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { typedef std::list<int64> IdList; IdList ids; bool invalid_id = false; @@ -705,7 +675,7 @@ template <class FunctionType> class BookmarkIdMapper : public BookmarkBucketMapper<int64> { public: typedef std::list<int64> IdList; - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) { + virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { IdList ids; bool invalid_id = false; if (!FunctionType::ExtractIds(args, &ids, &invalid_id) || invalid_id) diff --git a/chrome/browser/extensions/extension_bookmarks_module.h b/chrome/browser/extensions/extension_bookmarks_module.h index cb25755..1a26b02 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.h +++ b/chrome/browser/extensions/extension_bookmarks_module.h @@ -124,7 +124,7 @@ class RemoveBookmarkFunction : public BookmarksFunction { public: // Returns true on successful parse and sets invalid_id to true if conversion // from id string to int64 failed. - static bool ExtractIds(const Value* args, std::list<int64>* ids, + static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); virtual bool RunImpl(); virtual void GetQuotaLimitHeuristics( @@ -148,7 +148,7 @@ class CreateBookmarkFunction : public BookmarksFunction { class MoveBookmarkFunction : public BookmarksFunction { public: - static bool ExtractIds(const Value* args, std::list<int64>* ids, + static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; @@ -159,7 +159,7 @@ class MoveBookmarkFunction : public BookmarksFunction { class UpdateBookmarkFunction : public BookmarksFunction { public: - static bool ExtractIds(const Value* args, std::list<int64>* ids, + static bool ExtractIds(const ListValue* args, std::list<int64>* ids, bool* invalid_id); virtual void GetQuotaLimitHeuristics( std::list<QuotaLimitHeuristic*>* heuristics) const; diff --git a/chrome/browser/extensions/extension_browser_actions_api.cc b/chrome/browser/extensions/extension_browser_actions_api.cc index c1ffe8e..dfcf2ad 100644 --- a/chrome/browser/extensions/extension_browser_actions_api.cc +++ b/chrome/browser/extensions/extension_browser_actions_api.cc @@ -19,8 +19,8 @@ const char kIconIndexOutOfBounds[] = } bool BrowserActionFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - details_ = args_as_dictionary(); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_)); + EXTENSION_FUNCTION_VALIDATE(details_ != NULL); if (details_->HasKey(L"tabId")) EXTENSION_FUNCTION_VALIDATE(details_->GetInteger(L"tabId", &tab_id_)); diff --git a/chrome/browser/extensions/extension_browser_actions_api.h b/chrome/browser/extensions/extension_browser_actions_api.h index 742eecd..c958cb3 100644 --- a/chrome/browser/extensions/extension_browser_actions_api.h +++ b/chrome/browser/extensions/extension_browser_actions_api.h @@ -20,7 +20,7 @@ class BrowserActionFunction : public SyncExtensionFunction { // All the browser action APIs take a single argument called details that is // a dictionary. - const DictionaryValue* details_; + DictionaryValue* details_; // The tab id the browser action function should apply to, if any, or // kDefaultTabId if none was specified. diff --git a/chrome/browser/extensions/extension_clipboard_api.cc b/chrome/browser/extensions/extension_clipboard_api.cc index dbfe664..22a6253 100644 --- a/chrome/browser/extensions/extension_clipboard_api.cc +++ b/chrome/browser/extensions/extension_clipboard_api.cc @@ -18,7 +18,7 @@ const char kNoTabError[] = "No tab with id: *."; bool ClipboardFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); TabContents* contents = NULL; if (!ExtensionTabUtil::GetTabById(tab_id, profile(), include_incognito(), diff --git a/chrome/browser/extensions/extension_context_menu_api.cc b/chrome/browser/extensions/extension_context_menu_api.cc index 08afa51..ab748f0 100644 --- a/chrome/browser/extensions/extension_context_menu_api.cc +++ b/chrome/browser/extensions/extension_context_menu_api.cc @@ -135,8 +135,8 @@ bool ExtensionContextMenuFunction::GetParent( } bool CreateContextMenuFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* properties = args_as_dictionary(); + DictionaryValue* properties; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &properties)); EXTENSION_FUNCTION_VALIDATE(properties != NULL); std::string title; @@ -201,10 +201,8 @@ bool CreateContextMenuFunction::RunImpl() { } bool UpdateContextMenuFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); int item_id = 0; - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &item_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &item_id)); ExtensionsService* service = profile()->GetExtensionsService(); ExtensionMenuManager* manager = service->menu_manager(); @@ -215,7 +213,7 @@ bool UpdateContextMenuFunction::RunImpl() { } DictionaryValue *properties = NULL; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &properties)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &properties)); EXTENSION_FUNCTION_VALIDATE(properties != NULL); ExtensionMenuManager* menu_manager = @@ -273,9 +271,8 @@ bool UpdateContextMenuFunction::RunImpl() { } bool RemoveContextMenuFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_INTEGER)); int id = 0; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &id)); ExtensionsService* service = profile()->GetExtensionsService(); ExtensionMenuManager* manager = service->menu_manager(); diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc index c9c2d09..05415cf 100644 --- a/chrome/browser/extensions/extension_cookies_api.cc +++ b/chrome/browser/extensions/extension_cookies_api.cc @@ -62,8 +62,8 @@ bool CookiesFunction::ParseCookieStore(const DictionaryValue* details, } bool GetCookieFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* details = args_as_dictionary(); + DictionaryValue* details; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); DCHECK(details); // Read/validate input parameters. @@ -103,8 +103,8 @@ bool GetCookieFunction::RunImpl() { } bool GetAllCookiesFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* details = args_as_dictionary(); + DictionaryValue* details; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); // Read/validate input parameters. GURL url; @@ -125,8 +125,8 @@ bool GetAllCookiesFunction::RunImpl() { } bool SetCookieFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* details = args_as_dictionary(); + DictionaryValue* details; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); // Read/validate input parameters. GURL url; @@ -195,8 +195,8 @@ bool SetCookieFunction::RunImpl() { } bool RemoveCookieFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* details = args_as_dictionary(); + DictionaryValue* details; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); // Read/validate input parameters. GURL url; diff --git a/chrome/browser/extensions/extension_dom_ui.cc b/chrome/browser/extensions/extension_dom_ui.cc index ddbf605..93cfa69 100644 --- a/chrome/browser/extensions/extension_dom_ui.cc +++ b/chrome/browser/extensions/extension_dom_ui.cc @@ -109,7 +109,7 @@ void ExtensionDOMUI::RenderViewReused(RenderViewHost* render_view_host) { } void ExtensionDOMUI::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/extensions/extension_dom_ui.h b/chrome/browser/extensions/extension_dom_ui.h index 7f60e2f..7e66a4a 100644 --- a/chrome/browser/extensions/extension_dom_ui.h +++ b/chrome/browser/extensions/extension_dom_ui.h @@ -38,7 +38,7 @@ class ExtensionDOMUI virtual void RenderViewCreated(RenderViewHost* render_view_host); virtual void RenderViewReused(RenderViewHost* render_view_host); virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/extensions/extension_function.cc b/chrome/browser/extensions/extension_function.cc index 43b7033..437867f 100644 --- a/chrome/browser/extensions/extension_function.cc +++ b/chrome/browser/extensions/extension_function.cc @@ -16,9 +16,9 @@ Extension* ExtensionFunction::GetExtension() { return service->GetExtensionById(extension_id_, false); } -void AsyncExtensionFunction::SetArgs(const Value* args) { +void AsyncExtensionFunction::SetArgs(const ListValue* args) { DCHECK(!args_.get()); // Should only be called once. - args_.reset(args->DeepCopy()); + args_.reset(static_cast<ListValue*>(args->DeepCopy())); } const std::string AsyncExtensionFunction::GetResult() { @@ -40,8 +40,6 @@ void AsyncExtensionFunction::SendResponse(bool success) { } bool AsyncExtensionFunction::HasOptionalArgument(size_t index) { - DCHECK(args_->IsType(Value::TYPE_LIST)); - ListValue* args_list = static_cast<ListValue*>(args_.get()); Value* value; - return args_list->Get(index, &value) && !value->IsType(Value::TYPE_NULL); + return args_->Get(index, &value) && !value->IsType(Value::TYPE_NULL); } diff --git a/chrome/browser/extensions/extension_function.h b/chrome/browser/extensions/extension_function.h index c715c28..d0e1d74 100644 --- a/chrome/browser/extensions/extension_function.h +++ b/chrome/browser/extensions/extension_function.h @@ -58,7 +58,7 @@ class ExtensionFunction : public base::RefCounted<ExtensionFunction> { std::string extension_id() const { return extension_id_; } // Specifies the raw arguments to the function, as a JSON value. - virtual void SetArgs(const Value* args) = 0; + virtual void SetArgs(const ListValue* args) = 0; // Retrieves the results of the function as a JSON-encoded string (may // be empty). @@ -165,7 +165,7 @@ class AsyncExtensionFunction : public ExtensionFunction { public: AsyncExtensionFunction() : args_(NULL), bad_message_(false) {} - virtual void SetArgs(const Value* args); + virtual void SetArgs(const ListValue* args); virtual const std::string GetResult(); virtual const std::string GetError() { return error_; } virtual void Run() { @@ -182,19 +182,12 @@ class AsyncExtensionFunction : public ExtensionFunction { void SendResponse(bool success); - const ListValue* args_as_list() { - return static_cast<ListValue*>(args_.get()); - } - const DictionaryValue* args_as_dictionary() { - return static_cast<DictionaryValue*>(args_.get()); - } - // Return true if the argument to this function at |index| was provided and // is non-null. bool HasOptionalArgument(size_t index); // The arguments to the API. Only non-null if argument were specified. - scoped_ptr<Value> args_; + scoped_ptr<ListValue> args_; // The result of the API. This should be populated by the derived class before // SendResponse() is called. diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index a0b846a..40dbae5 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -378,7 +378,7 @@ Browser* ExtensionFunctionDispatcher::GetCurrentBrowser( } void ExtensionFunctionDispatcher::HandleRequest(const std::string& name, - const Value* args, + const ListValue* args, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/extensions/extension_function_dispatcher.h b/chrome/browser/extensions/extension_function_dispatcher.h index 6ef4d17..d9b973d 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.h +++ b/chrome/browser/extensions/extension_function_dispatcher.h @@ -18,11 +18,11 @@ class Extension; class ExtensionDOMUI; class ExtensionFunction; class ExtensionHost; +class ListValue; class Profile; class RenderViewHost; class RenderViewHostDelegate; class TabContents; -class Value; // A factory function for creating new ExtensionFunction instances. typedef ExtensionFunction* (*ExtensionFunctionFactory)(); @@ -95,7 +95,7 @@ class ExtensionFunctionDispatcher { Delegate* delegate() { return delegate_; } // Handle a request to execute an extension function. - void HandleRequest(const std::string& name, const Value* args, + void HandleRequest(const std::string& name, const ListValue* args, const GURL& source_url, int request_id, bool has_callback); // Send a response to a function. diff --git a/chrome/browser/extensions/extension_history_api.cc b/chrome/browser/extensions/extension_history_api.cc index 400c163..db4ec49 100644 --- a/chrome/browser/extensions/extension_history_api.cc +++ b/chrome/browser/extensions/extension_history_api.cc @@ -206,8 +206,8 @@ void HistoryFunctionWithCallback::SendResponseToCallback() { } bool GetVisitsHistoryFunction::RunAsyncImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); Value* value; EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value)); @@ -243,8 +243,8 @@ void GetVisitsHistoryFunction::QueryComplete( } bool SearchHistoryFunction::RunAsyncImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); // Initialize the HistoryQuery std::wstring search_text; @@ -293,8 +293,8 @@ void SearchHistoryFunction::SearchComplete( } bool AddUrlHistoryFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); Value* value; EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value)); @@ -311,8 +311,8 @@ bool AddUrlHistoryFunction::RunImpl() { } bool DeleteUrlHistoryFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); Value* value; EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value)); @@ -329,8 +329,8 @@ bool DeleteUrlHistoryFunction::RunImpl() { } bool DeleteRangeHistoryFunction::RunAsyncImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* json = args_as_dictionary(); + DictionaryValue* json; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json)); Value* value = NULL; EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kStartTimeKey, &value)); diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 3a6ccc3..1ae5aca 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -539,7 +539,7 @@ WebPreferences ExtensionHost::GetWebkitPrefs() { } void ExtensionHost::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index 013cb99..8329164 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -130,7 +130,7 @@ class ExtensionHost : public RenderViewHostDelegate, virtual WebPreferences GetWebkitPrefs(); virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/extensions/extension_idle_api.cc b/chrome/browser/extensions/extension_idle_api.cc index da1e2b1..0a6a25f 100644 --- a/chrome/browser/extensions/extension_idle_api.cc +++ b/chrome/browser/extensions/extension_idle_api.cc @@ -137,7 +137,7 @@ void ExtensionIdlePollingTask::Run() { bool ExtensionIdleQueryStateFunction::RunImpl() { int threshold; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&threshold)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &threshold)); threshold = CheckThresholdBounds(threshold); IdleState state = ThrottledCalculateIdleState(threshold, profile()); result_.reset(CreateIdleValue(state)); diff --git a/chrome/browser/extensions/extension_infobar_module.cc b/chrome/browser/extensions/extension_infobar_module.cc index d8cea95..d8d4950 100644 --- a/chrome/browser/extensions/extension_infobar_module.cc +++ b/chrome/browser/extensions/extension_infobar_module.cc @@ -20,8 +20,8 @@ namespace keys = extension_infobar_module_constants; bool ShowInfoBarFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); std::string html_path; EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kHtmlPath, &html_path)); diff --git a/chrome/browser/extensions/extension_metrics_module.cc b/chrome/browser/extensions/extension_metrics_module.cc index 30db486..380cf0af 100644 --- a/chrome/browser/extensions/extension_metrics_module.cc +++ b/chrome/browser/extensions/extension_metrics_module.cc @@ -29,8 +29,7 @@ std::string BuildMetricName(const std::string& name, bool MetricsRecordUserActionFunction::RunImpl() { std::string name; - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_STRING)); - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&name)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &name)); name = BuildMetricName(name, GetExtension()); UserMetrics::RecordComputedAction(name, profile()); @@ -39,11 +38,8 @@ bool MetricsRecordUserActionFunction::RunImpl() { bool MetricsHistogramHelperFunction::GetNameAndSample(std::string* name, int* sample) { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - - EXTENSION_FUNCTION_VALIDATE(args->GetString(0, name)); - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(1, sample)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, name)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, sample)); return true; } @@ -74,15 +70,12 @@ bool MetricsHistogramHelperFunction::RecordValue(const std::string& name, } bool MetricsRecordValueFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - int sample; - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(1, &sample)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &sample)); // Get the histogram parameters from the metric type object. DictionaryValue* metric_type; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(0, &metric_type)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &metric_type)); std::string name; std::string type; diff --git a/chrome/browser/extensions/extension_page_actions_module.cc b/chrome/browser/extensions/extension_page_actions_module.cc index a169450..f91c5ef 100644 --- a/chrome/browser/extensions/extension_page_actions_module.cc +++ b/chrome/browser/extensions/extension_page_actions_module.cc @@ -32,13 +32,10 @@ const char kNoIconSpecified[] = "Page action has no icons to show."; // TODO(EXTENSIONS_DEPRECATED): obsolete API. bool PageActionFunction::SetPageActionEnabled(bool enable) { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - std::string page_action_id; - EXTENSION_FUNCTION_VALIDATE(args->GetString(0, &page_action_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &page_action_id)); DictionaryValue* action; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &action)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &action)); int tab_id; EXTENSION_FUNCTION_VALIDATE(action->GetInteger(keys::kTabIdKey, &tab_id)); @@ -117,7 +114,7 @@ bool PageActionFunction::InitCommon(int tab_id) { bool PageActionFunction::SetVisible(bool visible) { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); if (!InitCommon(tab_id)) return false; @@ -143,8 +140,8 @@ bool PageActionHideFunction::RunImpl() { } bool PageActionSetIconFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); @@ -179,8 +176,8 @@ bool PageActionSetIconFunction::RunImpl() { } bool PageActionSetTitleFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); @@ -196,8 +193,8 @@ bool PageActionSetTitleFunction::RunImpl() { } bool PageActionSetPopupFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); @@ -221,8 +218,8 @@ bool PageActionSetPopupFunction::RunImpl() { // Not currently exposed to extensions. To re-enable, add mapping in // extension_function_dispatcher. bool PageActionSetBadgeBackgroundColorFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); @@ -247,8 +244,8 @@ bool PageActionSetBadgeBackgroundColorFunction::RunImpl() { // Not currently exposed to extensions. To re-enable, add mapping in // extension_function_dispatcher. bool PageActionSetBadgeTextColorFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); @@ -273,8 +270,8 @@ bool PageActionSetBadgeTextColorFunction::RunImpl() { // Not currently exposed to extensions. To re-enable, add mapping in // extension_function_dispatcher. bool PageActionSetBadgeTextFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int tab_id; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id)); diff --git a/chrome/browser/extensions/extension_popup_api.cc b/chrome/browser/extensions/extension_popup_api.cc index acc47e3..c648744 100644 --- a/chrome/browser/extensions/extension_popup_api.cc +++ b/chrome/browser/extensions/extension_popup_api.cc @@ -329,14 +329,11 @@ bool PopupShowFunction::RunImpl() { return false; } - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - std::string url_string; - EXTENSION_FUNCTION_VALIDATE(args->GetString(0, &url_string)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); DictionaryValue* show_details = NULL; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &show_details)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &show_details)); DictionaryValue* dom_anchor = NULL; EXTENSION_FUNCTION_VALIDATE(show_details->GetDictionary(kDomAnchorKey, diff --git a/chrome/browser/extensions/extension_processes_api.cc b/chrome/browser/extensions/extension_processes_api.cc index fda8c7f..c4895d3 100644 --- a/chrome/browser/extensions/extension_processes_api.cc +++ b/chrome/browser/extensions/extension_processes_api.cc @@ -20,7 +20,7 @@ DictionaryValue* CreateProcessValue(int process_id) { bool GetProcessForTabFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); TabContents* contents = NULL; int tab_index = -1; diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index 8de4842..047f9aa 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -220,7 +220,7 @@ bool ExtensionTabUtil::GetTabById(int tab_id, Profile* profile, bool GetWindowFunction::RunImpl() { int window_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&window_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); Browser* browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); @@ -254,9 +254,10 @@ bool GetLastFocusedWindowFunction::RunImpl() { bool GetAllWindowsFunction::RunImpl() { bool populate_tabs = false; - if (!args_->IsType(Value::TYPE_NULL)) { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + if (HasOptionalArgument(0)) { + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); + if (args->HasKey(keys::kPopulateKey)) { EXTENSION_FUNCTION_VALIDATE(args->GetBoolean(keys::kPopulateKey, &populate_tabs)); @@ -283,9 +284,10 @@ bool CreateWindowFunction::RunImpl() { GURL url; // Look for optional url. - if (!args_->IsType(Value::TYPE_NULL)) { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue *args = args_as_dictionary(); + if (HasOptionalArgument(0)) { + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); + std::string url_string; if (args->HasKey(keys::kUrlKey)) { EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, @@ -315,8 +317,9 @@ bool CreateWindowFunction::RunImpl() { Profile* window_profile = profile(); Browser::Type window_type = Browser::TYPE_NORMAL; - if (args_->IsType(Value::TYPE_DICTIONARY)) { - const DictionaryValue *args = args_as_dictionary(); + if (!args_->empty()) { + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); // Any part of the bounds can optionally be set by the caller. int bounds_val; @@ -386,12 +389,10 @@ bool CreateWindowFunction::RunImpl() { } bool UpdateWindowFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); int window_id; - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &window_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); DictionaryValue* update_props; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &update_props)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props)); Browser* browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); @@ -438,7 +439,7 @@ bool UpdateWindowFunction::RunImpl() { bool RemoveWindowFunction::RunImpl() { int window_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&window_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); Browser* browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); @@ -457,8 +458,8 @@ bool GetSelectedTabFunction::RunImpl() { // windowId defaults to "current" window. int window_id = -1; - if (!args_->IsType(Value::TYPE_NULL)) { - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&window_id)); + if (HasOptionalArgument(0)) { + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); } else { @@ -484,8 +485,8 @@ bool GetAllTabsInWindowFunction::RunImpl() { Browser* browser; // windowId defaults to "current" window. int window_id = -1; - if (!args_->IsType(Value::TYPE_NULL)) { - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&window_id)); + if (HasOptionalArgument(0)) { + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); } else { @@ -502,8 +503,8 @@ bool GetAllTabsInWindowFunction::RunImpl() { } bool CreateTabFunction::RunImpl() { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); Browser *browser; // windowId defaults to "current" window. @@ -589,7 +590,7 @@ bool CreateTabFunction::RunImpl() { bool GetTabFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); TabStripModel* tab_strip = NULL; TabContents* contents = NULL; @@ -615,11 +616,9 @@ bool GetCurrentTabFunction::RunImpl() { bool UpdateTabFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); DictionaryValue* update_props; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &update_props)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props)); TabStripModel* tab_strip = NULL; TabContents* contents = NULL; @@ -697,11 +696,9 @@ bool UpdateTabFunction::RunImpl() { bool MoveTabFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); DictionaryValue* update_props; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &update_props)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props)); int new_index; EXTENSION_FUNCTION_VALIDATE(update_props->GetInteger( @@ -772,7 +769,7 @@ bool MoveTabFunction::RunImpl() { bool RemoveTabFunction::RunImpl() { int tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); Browser* browser = NULL; TabContents* contents = NULL; @@ -801,11 +798,8 @@ bool CaptureVisibleTabFunction::RunImpl() { // windowId defaults to "current" window. int window_id = -1; - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST)); - const ListValue* args = args_as_list(); - if (HasOptionalArgument(0)) { - EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &window_id)); + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id)); browser = GetBrowserInProfileWithId(profile(), window_id, include_incognito(), &error_); } else { @@ -822,7 +816,7 @@ bool CaptureVisibleTabFunction::RunImpl() { if (HasOptionalArgument(1)) { DictionaryValue* options; - EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &options)); + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &options)); if (options->HasKey(keys::kFormatKey)) { std::string format; @@ -967,8 +961,8 @@ bool DetectTabLanguageFunction::RunImpl() { // If |tab_id| is specified, look for it. Otherwise default to selected tab // in the current window. - if (!args_->IsType(Value::TYPE_NULL)) { - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id)); + if (HasOptionalArgument(0)) { + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); if (!GetTabById(tab_id, profile(), include_incognito(), &browser, NULL, &contents, NULL, &error_)) { return false; diff --git a/chrome/browser/extensions/extension_test_api.cc b/chrome/browser/extensions/extension_test_api.cc index 48323d4..e5ae650 100644 --- a/chrome/browser/extensions/extension_test_api.cc +++ b/chrome/browser/extensions/extension_test_api.cc @@ -20,7 +20,7 @@ bool ExtensionTestPassFunction::RunImpl() { bool ExtensionTestFailFunction::RunImpl() { std::string message; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&message)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &message)); NotificationService::current()->Notify( NotificationType::EXTENSION_TEST_FAILED, Source<Profile>(dispatcher()->profile()), @@ -30,7 +30,7 @@ bool ExtensionTestFailFunction::RunImpl() { bool ExtensionTestLogFunction::RunImpl() { std::string message; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&message)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &message)); printf("%s\n", message.c_str()); LOG(INFO) << message; return true; @@ -46,7 +46,7 @@ bool ExtensionTestQuotaResetFunction::RunImpl() { bool ExtensionTestCreateIncognitoTabFunction::RunImpl() { std::string url; - EXTENSION_FUNCTION_VALIDATE(args_->GetAsString(&url)); + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url)); Browser::OpenURLOffTheRecord(profile(), GURL(url)); return true; } diff --git a/chrome/browser/extensions/extension_toolstrip_api.cc b/chrome/browser/extensions/extension_toolstrip_api.cc index 3732c68..26618e0 100644 --- a/chrome/browser/extensions/extension_toolstrip_api.cc +++ b/chrome/browser/extensions/extension_toolstrip_api.cc @@ -77,8 +77,8 @@ bool ToolstripExpandFunction::RunImpl() { return false; } - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); int height; EXTENSION_FUNCTION_VALIDATE(args->GetInteger(keys::kHeightKey, @@ -115,9 +115,9 @@ bool ToolstripCollapseFunction::RunImpl() { } GURL url; - if (args_->GetType() != Value::TYPE_NULL) { - EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); - const DictionaryValue* args = args_as_dictionary(); + if (HasOptionalArgument(0)) { + DictionaryValue* args; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); if (args->HasKey(keys::kUrlKey)) { std::string url_string; diff --git a/chrome/browser/extensions/extensions_quota_service.cc b/chrome/browser/extensions/extensions_quota_service.cc index 9005d8f..de5b926 100644 --- a/chrome/browser/extensions/extensions_quota_service.cc +++ b/chrome/browser/extensions/extensions_quota_service.cc @@ -29,7 +29,7 @@ ExtensionsQuotaService::~ExtensionsQuotaService() { } bool ExtensionsQuotaService::Assess(const std::string& extension_id, - ExtensionFunction* function, const Value* args, + ExtensionFunction* function, const ListValue* args, const base::TimeTicks& event_time) { // Lookup function list for extension. FunctionHeuristicsMap& functions = function_heuristics_[extension_id]; @@ -83,7 +83,7 @@ void QuotaLimitHeuristic::Bucket::Reset(const Config& config, expiration_ = start + config.refill_interval; } -bool QuotaLimitHeuristic::ApplyToArgs(const Value* args, +bool QuotaLimitHeuristic::ApplyToArgs(const ListValue* args, const base::TimeTicks& event_time) { BucketList buckets; bucket_mapper_->GetBucketsForArgs(args, &buckets); diff --git a/chrome/browser/extensions/extensions_quota_service.h b/chrome/browser/extensions/extensions_quota_service.h index 700f9cc..b2999ab 100644 --- a/chrome/browser/extensions/extensions_quota_service.h +++ b/chrome/browser/extensions/extensions_quota_service.h @@ -43,7 +43,7 @@ class ExtensionsQuotaService { // Returns true if the request is fine and can proceed, false if the request // should be throttled and an error returned to the extension. bool Assess(const std::string& extension_id, ExtensionFunction* function, - const Value* args, const base::TimeTicks& event_time); + const ListValue* args, const base::TimeTicks& event_time); private: friend class ExtensionTestQuotaResetFunction; typedef std::map<std::string, QuotaLimitHeuristics> FunctionHeuristicsMap; @@ -136,7 +136,8 @@ class QuotaLimitHeuristic { // occurs while parsing |args|, the function aborts - buckets may be non- // empty). The expectation is that invalid args and associated errors are // handled by the ExtensionFunction itself so we don't concern ourselves. - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) = 0; + virtual void GetBucketsForArgs(const ListValue* args, + BucketList* buckets) = 0; }; // Ownership of |mapper| is given to the new QuotaLimitHeuristic. @@ -148,7 +149,7 @@ class QuotaLimitHeuristic { // implementation of a derived class) to perform an operation with |args|, // based on the history of similar operations with similar arguments (which // is retrieved using the BucketMapper). - bool ApplyToArgs(const Value* args, const base::TimeTicks& event_time); + bool ApplyToArgs(const ListValue* args, const base::TimeTicks& event_time); protected: const Config& config() { return config_; } diff --git a/chrome/browser/extensions/extensions_quota_service_unittest.cc b/chrome/browser/extensions/extensions_quota_service_unittest.cc index 80457eb..72958a9 100644 --- a/chrome/browser/extensions/extensions_quota_service_unittest.cc +++ b/chrome/browser/extensions/extensions_quota_service_unittest.cc @@ -29,11 +29,10 @@ class Mapper : public QuotaLimitHeuristic::BucketMapper { public: Mapper() {} virtual ~Mapper() { STLDeleteValues(&buckets_); } - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) { - const ListValue* v = static_cast<const ListValue*>(args); - for (size_t i = 0; i < v->GetSize(); i++) { + virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { + for (size_t i = 0; i < args->GetSize(); i++) { int id; - ASSERT_TRUE(v->GetInteger(i, &id)); + ASSERT_TRUE(args->GetInteger(i, &id)); if (buckets_.find(id) == buckets_.end()) buckets_[id] = new Bucket(); buckets->push_back(buckets_[id]); @@ -47,13 +46,13 @@ class Mapper : public QuotaLimitHeuristic::BucketMapper { class MockMapper : public QuotaLimitHeuristic::BucketMapper { public: - virtual void GetBucketsForArgs(const Value* args, BucketList* buckets) {} + virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) {} }; class MockFunction : public ExtensionFunction { public: explicit MockFunction(const std::string& name) { set_name(name); } - virtual void SetArgs(const Value* args) {} + virtual void SetArgs(const ListValue* args) {} virtual const std::string GetError() { return std::string(); } virtual const std::string GetResult() { return std::string(); } virtual void Run() {} diff --git a/chrome/browser/notifications/balloon_host.cc b/chrome/browser/notifications/balloon_host.cc index 9ac6455..3dbefdc 100644 --- a/chrome/browser/notifications/balloon_host.cc +++ b/chrome/browser/notifications/balloon_host.cc @@ -72,7 +72,7 @@ void BalloonHost::RenderViewGone(RenderViewHost* render_view_host) { } void BalloonHost::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/notifications/balloon_host.h b/chrome/browser/notifications/balloon_host.h index 4e7a77c..06c780e 100644 --- a/chrome/browser/notifications/balloon_host.h +++ b/chrome/browser/notifications/balloon_host.h @@ -74,7 +74,7 @@ class BalloonHost : public RenderViewHostDelegate, return this; } virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 1d75014..f67dafe 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1241,7 +1241,7 @@ void RenderViewHost::OnMsgDOMUISend( scoped_ptr<Value> value; if (!content.empty()) { value.reset(base::JSONReader::Read(content, false)); - if (!value.get()) { + if (!value.get() || !value->IsType(Value::TYPE_LIST)) { // The page sent us something that we didn't understand. // This probably indicates a programming error. NOTREACHED() << "Invalid JSON argument in OnMsgDOMUISend."; @@ -1249,8 +1249,11 @@ void RenderViewHost::OnMsgDOMUISend( } } - delegate_->ProcessDOMUIMessage(message, value.get(), source_url, - kRequestId, kHasCallback); + delegate_->ProcessDOMUIMessage(message, + static_cast<const ListValue*>(value.get()), + source_url, + kRequestId, + kHasCallback); } void RenderViewHost::OnMsgForwardMessageToExternalHost( @@ -1754,7 +1757,7 @@ void RenderViewHost::OnRequestNotificationPermission( } void RenderViewHost::OnExtensionRequest(const std::string& name, - const ListValue& args_holder, + const ListValue& args, const GURL& source_url, int request_id, bool has_callback) { @@ -1766,16 +1769,7 @@ void RenderViewHost::OnExtensionRequest(const std::string& name, return; } - // The renderer sends the args in a 1-element list to make serialization - // easier. - Value* args = NULL; - if (!args_holder.IsType(Value::TYPE_LIST) || - !static_cast<const ListValue*>(&args_holder)->Get(0, &args)) { - NOTREACHED(); - return; - } - - delegate_->ProcessDOMUIMessage(name, args, source_url, request_id, + delegate_->ProcessDOMUIMessage(name, &args, source_url, request_id, has_callback); } diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index b8ca5f0..6fc89bf 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -26,6 +26,7 @@ class BookmarkNode; struct ContextMenuParams; class FilePath; class GURL; +class ListValue; struct NativeWebKeyboardEvent; class NavigationEntry; class OSExchangeData; @@ -38,7 +39,6 @@ class ResourceRequestDetails; class SkBitmap; class TabContents; struct ThumbnailScore; -class Value; struct ViewHostMsg_DidPrintPage_Params; struct ViewHostMsg_FrameNavigate_Params; struct ViewHostMsg_RunFileChooser_Params; @@ -554,7 +554,7 @@ class RenderViewHostDelegate { // A message was sent from HTML-based UI. // By default we ignore such messages. virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) {} diff --git a/chrome/browser/tab_contents/background_contents.cc b/chrome/browser/tab_contents/background_contents.cc index c61802d..33822a7 100644 --- a/chrome/browser/tab_contents/background_contents.cc +++ b/chrome/browser/tab_contents/background_contents.cc @@ -145,7 +145,7 @@ WebPreferences BackgroundContents::GetWebkitPrefs() { } void BackgroundContents::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/tab_contents/background_contents.h b/chrome/browser/tab_contents/background_contents.h index 348b28a..e2542ad 100644 --- a/chrome/browser/tab_contents/background_contents.h +++ b/chrome/browser/tab_contents/background_contents.h @@ -51,7 +51,7 @@ class BackgroundContents : public RenderViewHostDelegate, const ViewHostMsg_FrameNavigate_Params& params); virtual WebPreferences GetWebkitPrefs(); virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 52b6698..3e38fe0 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -2526,7 +2526,7 @@ void TabContents::DomOperationResponse(const std::string& json_string, } void TabContents::ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback) { diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h index 93c8c71..fa4f201 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -929,7 +929,7 @@ class TabContents : public PageNavigator, virtual void DomOperationResponse(const std::string& json_string, int automation_id); virtual void ProcessDOMUIMessage(const std::string& message, - const Value* content, + const ListValue* content, const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index d350263..2f71dc6 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1915,7 +1915,7 @@ IPC_BEGIN_MESSAGES(ViewHost) // request. The browser will always respond with a ViewMsg_ExtensionResponse. IPC_MESSAGE_ROUTED5(ViewHostMsg_ExtensionRequest, std::string /* name */, - ListValue /* argument */, + ListValue /* arguments */, GURL /* source_url */, int /* callback id */, bool /* has_callback */) diff --git a/chrome/renderer/extensions/extension_api_client_unittest.cc b/chrome/renderer/extensions/extension_api_client_unittest.cc index 776d694..c44f9ee 100644 --- a/chrome/renderer/extensions/extension_api_client_unittest.cc +++ b/chrome/renderer/extensions/extension_api_client_unittest.cc @@ -72,9 +72,8 @@ class ExtensionAPIClientTest : public RenderViewTest { ViewHostMsg_ExtensionRequest::Read(request_msg, ¶ms); ASSERT_EQ(function.c_str(), params.a) << js; - Value* args = NULL; ASSERT_TRUE(params.b.IsType(Value::TYPE_LIST)); - ASSERT_TRUE(static_cast<const ListValue*>(¶ms.b)->Get(0, &args)); + ListValue* args = ¶ms.b; base::JSONReader reader; scoped_ptr<Value> arg1_value(reader.JsonToValue(arg1, false, false)); @@ -157,7 +156,7 @@ TEST_F(ExtensionAPIClientTest, GetWindow) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.windows.get(2, function(){})", - "windows.get", "2"); + "windows.get", "[2]"); } // This test flakily crashes (http://crbug.com/22248) @@ -242,11 +241,11 @@ TEST_F(ExtensionAPIClientTest, CreateWindow) { " height:200" "})", "windows.create", - "{\"url\":\"http://www.google.com/\"," + "[{\"url\":\"http://www.google.com/\"," "\"left\":0," "\"top\":10," "\"width\":100," - "\"height\":200}"); + "\"height\":200}]"); } TEST_F(ExtensionAPIClientTest, UpdateWindow) { @@ -291,10 +290,10 @@ TEST_F(ExtensionAPIClientTest, RemoveWindow) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.windows.remove(2, function(){})", - "windows.remove", "2"); + "windows.remove", "[2]"); ExpectJsPass("chrome.windows.remove(2)", - "windows.remove", "2"); + "windows.remove", "[2]"); } // Tab API tests @@ -315,7 +314,7 @@ TEST_F(ExtensionAPIClientTest, GetTab) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.tabs.get(2, function(){})", - "tabs.get", "2"); + "tabs.get", "[2]"); } TEST_F(ExtensionAPIClientTest, GetCurrentTab) { @@ -330,7 +329,7 @@ TEST_F(ExtensionAPIClientTest, GetCurrentTab) { "Expected 'function' but got 'string'."); ExpectJsPass("chrome.tabs.getCurrent(function(){})", - "tabs.getCurrent", "null"); + "tabs.getCurrent", "[]"); } TEST_F(ExtensionAPIClientTest, DetectTabLanguage) { @@ -346,7 +345,7 @@ TEST_F(ExtensionAPIClientTest, DetectTabLanguage) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.tabs.detectLanguage(null, function(){})", - "tabs.detectLanguage", "null"); + "tabs.detectLanguage", "[null]"); } TEST_F(ExtensionAPIClientTest, GetSelectedTab) { @@ -365,10 +364,10 @@ TEST_F(ExtensionAPIClientTest, GetSelectedTab) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.tabs.getSelected(2, function(){})", - "tabs.getSelected", "2"); + "tabs.getSelected", "[2]"); ExpectJsPass("chrome.tabs.getSelected(null, function(){})", - "tabs.getSelected", "null"); + "tabs.getSelected", "[null]"); } @@ -388,10 +387,10 @@ TEST_F(ExtensionAPIClientTest, GetAllTabsInWindow) { "Expected 'integer' but got 'string'."); ExpectJsPass("chrome.tabs.getAllInWindow(32, function(){})", - "tabs.getAllInWindow", "32"); + "tabs.getAllInWindow", "[32]"); ExpectJsPass("chrome.tabs.getAllInWindow(undefined, function(){})", - "tabs.getAllInWindow", "null"); + "tabs.getAllInWindow", "[null]"); } TEST_F(ExtensionAPIClientTest, CreateTab) { @@ -412,10 +411,10 @@ TEST_F(ExtensionAPIClientTest, CreateTab) { " windowId:4" "})", "tabs.create", - "{\"url\":\"http://www.google.com/\"," + "[{\"url\":\"http://www.google.com/\"," "\"selected\":true," "\"index\":2," - "\"windowId\":4}"); + "\"windowId\":4}]"); } TEST_F(ExtensionAPIClientTest, UpdateTab) { @@ -472,10 +471,10 @@ TEST_F(ExtensionAPIClientTest, RemoveTab) { "Expected 'function' but got 'integer'."); ExpectJsPass("chrome.tabs.remove(2, function(){})", - "tabs.remove", "2"); + "tabs.remove", "[2]"); ExpectJsPass("chrome.tabs.remove(2)", - "tabs.remove", "2"); + "tabs.remove", "[2]"); } TEST_F(ExtensionAPIClientTest, CaptureVisibleTab) { @@ -556,16 +555,16 @@ TEST_F(ExtensionAPIClientTest, CreateBookmark) { ExpectJsPass( "chrome.bookmarks.create({parentId:'0', title:'x'}, function(){})", "bookmarks.create", - "{\"parentId\":\"0\",\"title\":\"x\"}"); + "[{\"parentId\":\"0\",\"title\":\"x\"}]"); } TEST_F(ExtensionAPIClientTest, GetBookmarks) { ExpectJsPass("chrome.bookmarks.get('0', function(){});", "bookmarks.get", - "\"0\""); + "[\"0\"]"); ExpectJsPass("chrome.bookmarks.get(['0','1','2','3'], function(){});", "bookmarks.get", - "[\"0\",\"1\",\"2\",\"3\"]"); + "[[\"0\",\"1\",\"2\",\"3\"]]"); ExpectJsFail("chrome.bookmarks.get(null, function(){});", "Uncaught Error: Parameter 0 is required."); // TODO(erikkay) This is succeeding, when it should fail. @@ -580,37 +579,37 @@ TEST_F(ExtensionAPIClientTest, GetBookmarks) { TEST_F(ExtensionAPIClientTest, GetBookmarkChildren) { ExpectJsPass("chrome.bookmarks.getChildren('42', function(){});", "bookmarks.getChildren", - "\"42\""); + "[\"42\"]"); } TEST_F(ExtensionAPIClientTest, GetBookmarkRecent) { ExpectJsPass("chrome.bookmarks.getRecent(5, function(){});", "bookmarks.getRecent", - "5"); + "[5]"); } TEST_F(ExtensionAPIClientTest, GetBookmarkTree) { ExpectJsPass("chrome.bookmarks.getTree(function(){});", "bookmarks.getTree", - "null"); + "[]"); } TEST_F(ExtensionAPIClientTest, SearchBookmarks) { ExpectJsPass("chrome.bookmarks.search('hello',function(){});", "bookmarks.search", - "\"hello\""); + "[\"hello\"]"); } TEST_F(ExtensionAPIClientTest, RemoveBookmark) { ExpectJsPass("chrome.bookmarks.remove('42');", "bookmarks.remove", - "\"42\""); + "[\"42\"]"); } TEST_F(ExtensionAPIClientTest, RemoveBookmarkTree) { ExpectJsPass("chrome.bookmarks.removeTree('42');", "bookmarks.removeTree", - "\"42\""); + "[\"42\"]"); } TEST_F(ExtensionAPIClientTest, MoveBookmark) { @@ -649,14 +648,14 @@ TEST_F(ExtensionAPIClientTest, EnablePageAction) { TEST_F(ExtensionAPIClientTest, ExpandToolstrip) { ExpectJsPass("chrome.toolstrip.expand({height:100, url:'http://foo/'})", "toolstrip.expand", - "{\"height\":100,\"url\":\"http://foo/\"}"); + "[{\"height\":100,\"url\":\"http://foo/\"}]"); ExpectJsPass("chrome.toolstrip.expand({height:100}, null)", "toolstrip.expand", - "{\"height\":100}"); + "[{\"height\":100}]"); ExpectJsPass("chrome.toolstrip.expand({height:100,url:'http://foo/'}, " "function(){})", "toolstrip.expand", - "{\"height\":100,\"url\":\"http://foo/\"}"); + "[{\"height\":100,\"url\":\"http://foo/\"}]"); ExpectJsFail("chrome.toolstrip.expand()", @@ -679,13 +678,13 @@ TEST_F(ExtensionAPIClientTest, ExpandToolstrip) { TEST_F(ExtensionAPIClientTest, CollapseToolstrip) { ExpectJsPass("chrome.toolstrip.collapse({url:'http://foo/'})", "toolstrip.collapse", - "{\"url\":\"http://foo/\"}"); + "[{\"url\":\"http://foo/\"}]"); ExpectJsPass("chrome.toolstrip.collapse(null)", "toolstrip.collapse", - "null"); + "[null]"); ExpectJsPass("chrome.toolstrip.collapse({url:'http://foo/'}, function(){})", "toolstrip.collapse", - "{\"url\":\"http://foo/\"}"); + "[{\"url\":\"http://foo/\"}]"); ExpectJsFail("chrome.toolstrip.collapse(1)", "Uncaught Error: Invalid value for argument 0. " @@ -711,7 +710,7 @@ TEST_F(ExtensionAPIClientTest, GetAcceptLanguages) { "Expected 'function' but got 'string'."); ExpectJsPass("chrome.i18n.getAcceptLanguages(function(){})", - "i18n.getAcceptLanguages", "null"); + "i18n.getAcceptLanguages", "[]"); } // TODO(cira): re-enable when we get validation going for diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc index b9f4e29..1ba0808 100644 --- a/chrome/renderer/extensions/extension_process_bindings.cc +++ b/chrome/renderer/extensions/extension_process_bindings.cc @@ -409,7 +409,7 @@ class ExtensionImpl : public ExtensionBase { // Common code for starting an API request to the browser. |value_args| // contains the request's arguments. static v8::Handle<v8::Value> StartRequestCommon( - const v8::Arguments& args, Value* value_args) { + const v8::Arguments& args, ListValue* value_args) { // Get the current RenderView so that we can send a routed IPC message from // the correct source. RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); @@ -434,18 +434,13 @@ class ExtensionImpl : public ExtensionBase { int request_id = args[2]->Int32Value(); bool has_callback = args[3]->BooleanValue(); - // Put the args in a 1-element list for easier serialization. Maybe all - // requests should have a list of args? - ListValue args_holder; - args_holder.Append(value_args); - v8::Persistent<v8::Context> current_context = v8::Persistent<v8::Context>::New(v8::Context::GetCurrent()); DCHECK(!current_context.IsEmpty()); GetPendingRequestMap()[request_id].reset(new PendingRequest( current_context, name)); - renderview->SendExtensionRequest(name, args_holder, source_url, + renderview->SendExtensionRequest(name, *value_args, source_url, request_id, has_callback); return v8::Undefined(); @@ -460,12 +455,12 @@ class ExtensionImpl : public ExtensionBase { // Since we do the serialization in the v8 extension, we should always get // valid JSON. - if (!value_args) { + if (!value_args || !value_args->IsType(Value::TYPE_LIST)) { NOTREACHED() << "Invalid JSON passed to StartRequest."; return v8::Undefined(); } - return StartRequestCommon(args, value_args); + return StartRequestCommon(args, static_cast<ListValue*>(value_args)); } // A special request for setting the extension action icon. This function @@ -473,7 +468,9 @@ class ExtensionImpl : public ExtensionBase { // before sending the request to the browser. static v8::Handle<v8::Value> SetExtensionActionIcon( const v8::Arguments& args) { - v8::Local<v8::Object> details = args[1]->ToObject(); + v8::Local<v8::Object> extension_args = args[1]->ToObject(); + v8::Local<v8::Object> details = + extension_args->Get(v8::String::New("0"))->ToObject(); v8::Local<v8::Object> image_data = details->Get(v8::String::New("imageData"))->ToObject(); v8::Local<v8::Object> data = @@ -516,7 +513,10 @@ class ExtensionImpl : public ExtensionBase { details->Get(v8::String::New("tabId"))->Int32Value()); } - return StartRequestCommon(args, dict); + ListValue* list_value = new ListValue(); + list_value->Append(dict); + + return StartRequestCommon(args, list_value); } static v8::Handle<v8::Value> GetRenderViewId(const v8::Arguments& args) { diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js index c19872c..c3d6a33 100644 --- a/chrome/renderer/resources/extension_process_bindings.js +++ b/chrome/renderer/resources/extension_process_bindings.js @@ -159,16 +159,9 @@ var chrome = chrome || {}; --argCount; } - // Calls with one argument expect singular argument. Calls with multiple - // expect a list. - if (argCount == 1) { - request.args = args[0]; - } - if (argCount > 1) { - request.args = []; - for (var k = 0; k < argCount; k++) { - request.args[k] = args[k]; - } + request.args = []; + for (var k = 0; k < argCount; k++) { + request.args[k] = args[k]; } return request; |