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/automation/automation_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider_json.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_id.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_id.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_constants.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/existing_user_controller.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display.h" 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/webui_login_display.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 55a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#include "chrome/browser/printing/print_preview_dialog_controller.h" 56a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif 57a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::ExistingUserController; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::User; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::UserManager; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookiesCallback(base::WaitableEvent* event, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* cookies, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cookies = cookie_line; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookiesOnIOThread( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* cookies) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->cookie_store()-> 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCookiesWithOptionsAsync(url, net::CookieOptions(), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetCookiesCallback, event, cookies)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCanonicalCookiesCallback( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieList* cookie_list, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookies) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cookie_list = cookies; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCanonicalCookiesOnIOThread( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieList* cookie_list) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->cookie_store()-> 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCookieMonster()->GetAllCookiesForURLAsync( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetCanonicalCookiesCallback, event, cookie_list)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCookieCallback(base::WaitableEvent* event, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* success, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *success = result; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCookieOnIOThread( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* success) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->cookie_store()-> 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCookieWithOptionsAsync( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, value, net::CookieOptions(), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCookieCallback, event, success)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCookieWithDetailsOnIOThread( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cookie, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_domain, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* success) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieMonster* cookie_monster = 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->cookie_store()-> 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCookieMonster(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->SetCookieWithDetailsAsync( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, cookie.Name(), cookie.Value(), original_domain, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie.Path(), cookie.ExpiryDate(), cookie.IsSecure(), 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie.IsHttpOnly(), cookie.Priority(), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCookieCallback, event, success)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteCookieCallback(base::WaitableEvent* event) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteCookieOnIOThread( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->cookie_store()-> 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteCookieAsync(url, name, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DeleteCookieCallback, event)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace automation_util { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserAt(int index) { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The automation layer doesn't support non-native desktops. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserList* native_list = 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index < 0 || index >= static_cast<int>(native_list->size())) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return native_list->get(index); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* GetWebContentsAt(int browser_index, int tab_index) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_index < 0) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowserAt(browser_index); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser || tab_index >= browser->tab_strip_model()->count()) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser->tab_strip_model()->GetWebContentsAt(tab_index); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* GetCurrentProfileOnChromeOS(std::string* error_message) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UserManager* user_manager = UserManager::Get(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_manager) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *error_message = "No user manager."; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_manager->IsUserLoggedIn()) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExistingUserController* controller = 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExistingUserController::current_controller(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controller) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *error_message = "Cannot get controller though user is not logged in."; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::LoginDisplayHostImpl* webui_host = 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<chromeos::LoginDisplayHostImpl*>( 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller->login_display_host()); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebUI* web_ui = webui_host->GetOobeUI()->web_ui(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_ui) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *error_message = "Unable to get webui from login display host."; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Profile::FromWebUI(web_ui); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shell || !shell->delegate()) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *error_message = "Unable to get shell delegate."; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Profile::FromBrowserContext( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->GetCurrentBrowserContext()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserForTab(WebContents* tab) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = *it; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int tab_index = 0; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_index < browser->tab_strip_model()->count(); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++tab_index) { 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser->tab_strip_model()->GetWebContentsAt(tab_index) == tab) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* GetRequestContext(WebContents* contents) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we may be on the UI thread don't call GetURLRequestContext(). 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the request context specific to the current WebContents and app. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents->GetBrowserContext()->GetRequestContextForRenderProcess( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->GetRenderProcessHost()->GetID()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookies(const GURL& url, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* value_size, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* value) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_size = -1; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid() && contents) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRequestContext(contents); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(BrowserThread::PostTask( 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetCookiesOnIOThread, url, context_getter, &event, value))); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_size = static_cast<int>(value->size()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCookie(const GURL& url, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* response_value) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *response_value = -1; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid() && contents) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRequestContext(contents); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(BrowserThread::PostTask( 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCookieOnIOThread, url, value, context_getter, &event, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &success))); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *response_value = 1; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteCookie(const GURL& url, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_name, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* success) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *success = false; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid() && contents) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRequestContext(contents); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(BrowserThread::PostTask( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DeleteCookieOnIOThread, url, cookie_name, context_getter, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &event))); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *success = true; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookiesJSON(AutomationProvider* provider, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* args, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationJSONReply reply(provider, reply_message); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString("url", &url)) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'url' missing or invalid"); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we may be on the UI thread don't call GetURLRequestContext(). 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->profile()->GetRequestContext(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieList cookie_list; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure task = base::Bind(&GetCanonicalCookiesOnIOThread, GURL(url), 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter, &event, &cookie_list); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("Couldn't post task to get the cookies"); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* list = new ListValue(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < cookie_list.size(); ++i) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cookie = cookie_list[i]; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* cookie_dict = new DictionaryValue(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetString("name", cookie.Name()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetString("value", cookie.Value()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetString("path", cookie.Path()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetString("domain", cookie.Domain()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetBoolean("secure", cookie.IsSecure()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetBoolean("http_only", cookie.IsHttpOnly()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie.IsPersistent()) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_dict->SetDouble("expiry", cookie.ExpiryDate().ToDoubleT()); 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cookie.Priority() != net::COOKIE_PRIORITY_DEFAULT) { 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_dict->SetString("priority", 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::CookiePriorityToString(cookie.Priority())); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list->Append(cookie_dict); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue dict; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict.Set("cookies", list); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendSuccess(&dict); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteCookieJSON(AutomationProvider* provider, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* args, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationJSONReply reply(provider, reply_message); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url, name; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString("url", &url)) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'url' missing or invalid"); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString("name", &name)) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'name' missing or invalid"); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we may be on the UI thread don't call GetURLRequestContext(). 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->profile()->GetRequestContext(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure task = base::Bind(&DeleteCookieOnIOThread, GURL(url), name, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter, &event); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("Couldn't post task to delete the cookie"); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendSuccess(NULL); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCookieJSON(AutomationProvider* provider, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* args, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationJSONReply reply(provider, reply_message); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString("url", &url)) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'url' missing or invalid"); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* cookie_dict; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetDictionary("cookie", &cookie_dict)) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'cookie' missing or invalid"); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, value; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string domain; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path = "/"; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool secure = false; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double expiry = 0; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool http_only = false; 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::CookiePriority priority = net::COOKIE_PRIORITY_DEFAULT; 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cookie_dict->GetString("name", &name)) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'name' missing or invalid"); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cookie_dict->GetString("value", &value)) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("'value' missing or invalid"); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_dict->HasKey("domain") && 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !cookie_dict->GetString("domain", &domain)) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("optional 'domain' invalid"); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_dict->HasKey("path") && 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !cookie_dict->GetString("path", &path)) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("optional 'path' invalid"); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_dict->HasKey("secure") && 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !cookie_dict->GetBoolean("secure", &secure)) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("optional 'secure' invalid"); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_dict->HasKey("expiry")) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cookie_dict->GetDouble("expiry", &expiry)) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("optional 'expiry' invalid"); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_dict->HasKey("http_only") && 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !cookie_dict->GetBoolean("http_only", &http_only)) { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("optional 'http_only' invalid"); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cookie_dict->HasKey("priority")) { 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string priority_string; 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!cookie_dict->GetString("priority", &priority_string)) { 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reply.SendError("optional 'priority' invalid"); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) priority = net::StringToCookiePriority(priority_string); 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::CanonicalCookie> cookie( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CanonicalCookie::Create( 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(url), name, value, domain, path, base::Time(), 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::FromDoubleT(expiry), secure, http_only, priority)); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cookie.get()) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("given 'cookie' parameters are invalid"); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we may be on the UI thread don't call GetURLRequestContext(). 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> context_getter = 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->profile()->GetRequestContext(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(true /* manual reset */, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* not initially signaled */); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure task = base::Bind( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SetCookieWithDetailsOnIOThread, GURL(url), *cookie.get(), domain, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter, &event, &success); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("Couldn't post task to set the cookie"); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Wait(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!success) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendError("Could not set the cookie"); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply.SendSuccess(NULL); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SendErrorIfModalDialogActive(AutomationProvider* provider, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* message) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool active = AppModalDialogQueue::GetInstance()->HasActiveDialog(); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationJSONReply(provider, message).SendErrorCode( 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) automation::kBlockedByModalDialog); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return active; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomationId GetIdForTab(const WebContents* tab) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SessionTabHelper* session_tab_helper = 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SessionTabHelper::FromWebContents(tab); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AutomationId(AutomationId::kTypeTab, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(session_tab_helper->session_id().id())); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationId GetIdForExtensionView( 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::RenderViewHost* render_view_host) { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationId::Type type; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (extensions::GetViewType(web_contents)) { 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case extensions::VIEW_TYPE_EXTENSION_POPUP: 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = AutomationId::kTypeExtensionPopup; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE: 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = AutomationId::kTypeExtensionBgPage; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case extensions::VIEW_TYPE_EXTENSION_INFOBAR: 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = AutomationId::kTypeExtensionInfobar; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case extensions::VIEW_TYPE_APP_SHELL: 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = AutomationId::kTypeAppShell; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = AutomationId::kTypeInvalid; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since these extension views do not permit navigation, using the 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer process and view ID should suffice. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = base::StringPrintf("%d|%d", 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetRoutingID(), 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess()->GetID()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AutomationId(type, id); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationId GetIdForExtension(const extensions::Extension* extension) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AutomationId(AutomationId::kTypeExtension, extension->id()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetTabForId(const AutomationId& id, WebContents** tab) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id.type() != AutomationId::kTypeTab) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController* preview_controller = 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController::GetInstance(); 526a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = *it; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int tab_index = 0; 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_index < browser->tab_strip_model()->count(); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++tab_index) { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetWebContentsAt(tab_index); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SessionTabHelper::FromWebContents(web_contents); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::IntToString( 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->session_id().id()) == id.id()) { 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *tab = web_contents; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 541a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch 542a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (preview_controller) { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* print_preview_contents = 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preview_controller->GetPrintPreviewForContents(web_contents); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (print_preview_contents) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* preview_session_tab_helper = 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SessionTabHelper::FromWebContents(print_preview_contents); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string preview_id = base::IntToString( 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_session_tab_helper->session_id().id()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (preview_id == id.id()) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *tab = print_preview_contents; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 557a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetExtensionRenderViewForId( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutomationId& id, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost** rvh) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* extension_mgr = 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->process_manager(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtensionProcessManager::ViewSet view_set = 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_mgr->GetAllViews(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionProcessManager::ViewSet::const_iterator iter = view_set.begin(); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != view_set.end(); ++iter) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* host = *iter; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationId this_id = GetIdForExtensionView(host); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == this_id) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rvh = host; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetRenderViewForId( 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutomationId& id, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost** rvh) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id.type()) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeTab: { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetTabForId(id, &tab)) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rvh = tab->GetRenderViewHost(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionPopup: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionBgPage: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionInfobar: 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeAppShell: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetExtensionRenderViewForId(id, profile, rvh)) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetExtensionForId( 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutomationId& id, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension** extension) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id.type() != AutomationId::kTypeExtension) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = extensions::ExtensionSystem::Get(profile)-> 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_service(); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* installed_extension = 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->GetInstalledExtension(id.id()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (installed_extension) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *extension = installed_extension; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!installed_extension; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DoesObjectWithIdExist(const AutomationId& id, Profile* profile) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id.type()) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeTab: { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTabForId(id, &tab); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionPopup: 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionBgPage: 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtensionInfobar: 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeAppShell: { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetExtensionRenderViewForId(id, profile, &rvh); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AutomationId::kTypeExtension: { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetExtensionForId(id, profile, &extension); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace automation_util 651