extension_function_test_utils.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_constants.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_dispatcher.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace keys = extensions::tabs_constants; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestFunctionDispatcherDelegate 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ExtensionFunctionDispatcher::Delegate { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestFunctionDispatcherDelegate(Browser* browser) : 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_(browser) {} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestFunctionDispatcherDelegate() {} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual extensions::WindowController* GetExtensionWindowController() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OVERRIDE { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_->extension_window_controller(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebContents* GetAssociatedWebContents() const OVERRIDE { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_function_test_utils { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* ParseJSON(const std::string& data) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::JSONReader::Read(data); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* ParseList(const std::string& data) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(ParseJSON(data)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.get() && result->IsType(base::Value::TYPE_LIST)) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<base::ListValue*>(result.release()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::DictionaryValue* ParseDictionary( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(ParseJSON(data)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.get() && result->IsType(base::Value::TYPE_DICTIONARY)) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<base::DictionaryValue*>(result.release()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetBoolean(base::DictionaryValue* val, const std::string& key) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!val->GetBoolean(key, &result)) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << key << " does not exist or is not a boolean."; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetInteger(base::DictionaryValue* val, const std::string& key) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!val->GetInteger(key, &result)) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << key << " does not exist or is not an integer."; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetString(base::DictionaryValue* val, const std::string& key) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!val->GetString(key, &result)) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << key << " does not exist or is not a string."; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::DictionaryValue* ToDictionary(base::Value* val) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(val); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::Value::TYPE_DICTIONARY, val->GetType()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<base::DictionaryValue*>(val); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* ToList(base::Value* val) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(val); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::Value::TYPE_LIST, val->GetType()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<base::ListValue*>(val); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateEmptyExtension() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateEmptyExtensionWithLocation(Extension::INTERNAL); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateEmptyExtensionWithLocation( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::Location location) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> test_extension_value( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseDictionary("{\"name\": \"Test\", \"version\": \"1.0\"}")); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateExtension(location, test_extension_value.get(), std::string()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateEmptyExtension( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id_input) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> test_extension_value( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseDictionary("{\"name\": \"Test\", \"version\": \"1.0\"}")); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateExtension(Extension::INTERNAL, test_extension_value.get(), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_input); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateExtension( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* test_extension_value) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateExtension(Extension::INTERNAL, test_extension_value, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateExtension( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::Location location, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* test_extension_value, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id_input) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath test_extension_path; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!id_input.empty()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(Extension::GenerateId(id_input, &id)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension(Extension::Create( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_extension_path, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *test_extension_value, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()) << "Could not parse test extension " << error; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasPrivacySensitiveFields(base::DictionaryValue* val) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val->GetString(keys::kUrlKey, &result) || 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val->GetString(keys::kTitleKey, &result) || 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val->GetString(keys::kFaviconUrlKey, &result)) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunFunctionAndReturnError(function, args, browser, NONE); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionFlags flags) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ExtensionFunction> function_owner(function); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Without a callback the function will not generate a result. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_has_callback(true); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunction(function, args, browser, flags); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(function->GetResultList()) << "Did not expect a result"; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function->GetError(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* RunFunctionAndReturnSingleResult( 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UIThreadExtensionFunction* function, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunFunctionAndReturnSingleResult(function, args, browser, NONE); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* RunFunctionAndReturnSingleResult( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UIThreadExtensionFunction* function, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionFlags flags) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ExtensionFunction> function_owner(function); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Without a callback the function will not generate a result. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_has_callback(true); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunction(function, args, browser, flags); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: " 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << function->GetError(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* single_result = NULL; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (function->GetResultList() != NULL && 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->GetResultList()->Get(0, &single_result)) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return single_result->DeepCopy(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This helps us be able to wait until an AsyncExtensionFunction calls 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SendResponse. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SendResponseDelegate 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public UIThreadExtensionFunction::DelegateForTests { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponseDelegate() : should_post_quit_(false) {} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SendResponseDelegate() {} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_post_quit(bool should_quit) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_post_quit_ = should_quit; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasResponse() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return response_.get() != NULL; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetResponse() { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(HasResponse()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *response_.get(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSendResponse(UIThreadExtensionFunction* function, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool bad_message) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(bad_message); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(HasResponse()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_.reset(new bool); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *response_ = success; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_post_quit_) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoopForUI::current()->Quit(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<bool> response_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_post_quit_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RunFunction(UIThreadExtensionFunction* function, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionFlags flags) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponseDelegate response_delegate; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_test_delegate(&response_delegate); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> parsed_args(ParseList(args)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parsed_args.get()) << 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not parse extension function arguments: " << args; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->SetArgs(parsed_args.get()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFunctionDispatcherDelegate dispatcher_delegate(browser); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionFunctionDispatcher dispatcher( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->profile(), &dispatcher_delegate); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_dispatcher(dispatcher.AsWeakPtr()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_profile(browser->profile()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_include_incognito(flags & INCLUDE_INCOGNITO); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->Run(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the RunImpl of |function| didn't already call SendResponse, run the 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop until they do. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response_delegate.HasResponse()) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_delegate.set_should_post_quit(true); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(response_delegate.HasResponse()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return response_delegate.GetResponse(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extension_function_test_utils 271