1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/extension_function.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/web_contents.h" 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_dispatcher.h" 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_message_filter.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/error_utils.h" 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "extensions/common/extension_api.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension_messages.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using content::WebContents; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using extensions::ErrorUtils; 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extensions::ExtensionAPI; 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extensions::Feature; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace { 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ArgumentListResponseValue 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : public ExtensionFunction::ResponseValueObject { 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ArgumentListResponseValue(const std::string& function_name, 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* title, 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionFunction* function, 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> result) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : function_name_(function_name), title_(title) { 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (function->GetResultList()) { 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(function->GetResultList(), result.get()) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "The result set on this function (" << function_name_ << ") " 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "either by calling SetResult() or directly modifying |result_| is " 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "different to the one passed to " << title_ << "(). " 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "The best way to fix this problem is to exclusively use " << title_ 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "(). SetResult() and |result_| are deprecated."; 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) function->SetResultList(result.Pass()); 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // It would be nice to DCHECK(error.empty()) but some legacy extension 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // function implementations... I'm looking at chrome.input.ime... do this 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // for some reason. 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~ArgumentListResponseValue() {} 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool Apply() OVERRIDE { return true; } 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string function_name_; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* title_; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ErrorResponseValue : public ExtensionFunction::ResponseValueObject { 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ErrorResponseValue(ExtensionFunction* function, const std::string& error) { 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // It would be nice to DCHECK(!error.empty()) but too many legacy extension 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // function implementations don't set error but signal failure. 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu function->SetError(error); 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~ErrorResponseValue() {} 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool Apply() OVERRIDE { return false; } 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BadMessageResponseValue : public ExtensionFunction::ResponseValueObject { 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit BadMessageResponseValue(ExtensionFunction* function) { 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu function->set_bad_message(true); 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NOTREACHED() << function->name() << ": bad message"; 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~BadMessageResponseValue() {} 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool Apply() OVERRIDE { return false; } 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass RespondNowAction : public ExtensionFunction::ResponseActionObject { 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(bool)> SendResponseCallback; 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RespondNowAction(ExtensionFunction::ResponseValue result, 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const SendResponseCallback& send_response) 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : result_(result.Pass()), send_response_(send_response) {} 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~RespondNowAction() {} 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void Execute() OVERRIDE { send_response_.Run(result_->Apply()); } 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ExtensionFunction::ResponseValue result_; 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SendResponseCallback send_response_; 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass RespondLaterAction : public ExtensionFunction::ResponseActionObject { 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~RespondLaterAction() {} 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void Execute() OVERRIDE {} 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunctionDeleteTraits::Destruct(const ExtensionFunction* x) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x->Destruct(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper class to track the lifetime of ExtensionFunction's RenderViewHost or 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// RenderFrameHost pointer and NULL it out when it dies. It also allows us to 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// filter IPC messages coming from the RenderViewHost/RenderFrameHost. 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UIThreadExtensionFunction::RenderHostTracker 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : public content::WebContentsObserver { 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit RenderHostTracker(UIThreadExtensionFunction* function) 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : content::WebContentsObserver( 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function->render_view_host() ? 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents::FromRenderViewHost(function->render_view_host()) : 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents::FromRenderFrameHost( 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function->render_frame_host())), 1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) function_(function) { 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private: 1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // content::WebContentsObserver: 1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void RenderViewDeleted( 1338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE { 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (render_view_host != function_->render_view_host()) 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) function_->SetRenderViewHost(NULL); 1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RenderFrameDeleted( 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) OVERRIDE { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_frame_host != function_->render_frame_host()) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function_->SetRenderFrameHost(NULL); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnMessageReceived( 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const IPC::Message& message, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::RenderFrameHost* render_frame_host) OVERRIDE { 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(render_frame_host); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (render_frame_host == function_->render_frame_host()) 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return function_->OnMessageReceived(message); 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return function_->OnMessageReceived(message); 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) UIThreadExtensionFunction* function_; 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RenderHostTracker); 1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionFunction::ExtensionFunction() 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : request_id_(-1), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_id_(NULL), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_callback_(false), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) include_incognito_(false), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture_(false), 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bad_message_(false), 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histogram_value_(extensions::functions::UNKNOWN), 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_tab_id_(-1), 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_context_type_(Feature::UNSPECIFIED_CONTEXT) { 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionFunction::~ExtensionFunction() { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction* ExtensionFunction::AsUIThreadExtensionFunction() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction* ExtensionFunction::AsIOThreadExtensionFunction() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::HasPermission() { 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Feature::Availability availability = 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExtensionAPI::GetSharedInstance()->IsAvailable( 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name_, extension_.get(), source_context_type_, source_url()); 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return availability.is_available(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::OnQuotaExceeded(const std::string& violation_error) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = violation_error; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(false); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetArgs(const base::ListValue* args) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!args_.get()); // Should only be called once. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.reset(args->DeepCopy()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetResult(base::Value* result) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_.reset(new base::ListValue()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_->Append(result); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ExtensionFunction::SetResultList(scoped_ptr<base::ListValue> results) { 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu results_ = results.Pass(); 2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst base::ListValue* ExtensionFunction::GetResultList() const { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return results_.get(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string ExtensionFunction::GetError() const { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetError(const std::string& error) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuExtensionFunction::ResponseValue ExtensionFunction::NoArguments() { 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue(new ArgumentListResponseValue( 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name(), "NoArguments", this, make_scoped_ptr(new base::ListValue()))); 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::OneArgument( 2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Value* arg) { 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> args(new base::ListValue()); 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu args->Append(arg); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue( 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ArgumentListResponseValue(name(), "OneArgument", this, args.Pass())); 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::TwoArguments( 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Value* arg1, 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Value* arg2) { 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> args(new base::ListValue()); 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) args->Append(arg1); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) args->Append(arg2); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue( 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ArgumentListResponseValue(name(), "TwoArguments", this, args.Pass())); 2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::ArgumentList( 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> args) { 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue( 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ArgumentListResponseValue(name(), "ArgumentList", this, args.Pass())); 2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuExtensionFunction::ResponseValue ExtensionFunction::Error( 2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& error) { 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue(new ErrorResponseValue(this, error)); 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::Error( 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& format, 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s1) { 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue( 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ErrorResponseValue(this, ErrorUtils::FormatErrorMessage(format, s1))); 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::Error( 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& format, 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s1, 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s2) { 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue(new ErrorResponseValue( 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, ErrorUtils::FormatErrorMessage(format, s1, s2))); 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ExtensionFunction::ResponseValue ExtensionFunction::Error( 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& format, 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s1, 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s2, 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& s3) { 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue(new ErrorResponseValue( 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, ErrorUtils::FormatErrorMessage(format, s1, s2, s3))); 2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuExtensionFunction::ResponseValue ExtensionFunction::BadMessage() { 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ResponseValue(new BadMessageResponseValue(this)); 2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuExtensionFunction::ResponseAction ExtensionFunction::RespondNow( 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ResponseValue result) { 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return ResponseAction(new RespondNowAction( 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result.Pass(), base::Bind(&ExtensionFunction::SendResponse, this))); 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuExtensionFunction::ResponseAction ExtensionFunction::RespondLater() { 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return ResponseAction(new RespondLaterAction()); 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ExtensionFunction::ResponseAction ExtensionFunction::ValidationFailure( 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExtensionFunction* function) { 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return function->RespondNow(function->BadMessage()); 3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ExtensionFunction::Respond(ResponseValue result) { 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendResponse(result->Apply()); 3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::ShouldSkipQuotaLimiting() const { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::HasOptionalArgument(size_t index) { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* value; 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ExtensionFunction::SendResponseImpl(bool success) { 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!response_callback_.is_null()); 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResponseType type = success ? SUCCEEDED : FAILED; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bad_message_) { 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) type = BAD_MESSAGE; 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LOG(ERROR) << "Bad extension message " << name_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If results were never set, we send an empty argument list. 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!results_) 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch results_.reset(new base::ListValue()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) response_callback_.Run(type, *results_, GetError()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ExtensionFunction::OnRespondingLater(ResponseValue value) { 335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendResponse(value->Apply()); 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::UIThreadExtensionFunction() 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : render_view_host_(NULL), 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_(NULL), 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_(NULL), 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_(NULL) { 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::~UIThreadExtensionFunction() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher() && render_view_host()) 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dispatcher()->OnExtensionFunctionCompleted(extension()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction* 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::AsUIThreadExtensionFunction() { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool UIThreadExtensionFunction::OnMessageReceived(const IPC::Message& message) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::Destruct() const { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DeleteOnUIThread::Destruct(this); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::SetRenderViewHost( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!render_frame_host_); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_ = render_view_host; 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tracker_.reset(render_view_host ? new RenderHostTracker(this) : NULL); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UIThreadExtensionFunction::SetRenderFrameHost( 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) { 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!render_view_host_); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_ = render_frame_host; 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tracker_.reset(render_frame_host ? new RenderHostTracker(this) : NULL); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* UIThreadExtensionFunction::GetAssociatedWebContents() { 3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WebContents* web_contents = NULL; 3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (dispatcher()) 3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents = dispatcher()->delegate()->GetAssociatedWebContents(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return web_contents; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::SendResponse(bool success) { 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (delegate_) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnSendResponse(this, success, bad_message_); 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendResponseImpl(success); 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!transferred_blob_uuids_.empty()) { 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!delegate_) << "Blob transfer not supported with test delegate."; 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetIPCSender()->Send( 39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new ExtensionMsg_TransferBlobs(transferred_blob_uuids_)); 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void UIThreadExtensionFunction::SetTransferredBlobUUIDs( 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<std::string>& blob_uuids) { 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(transferred_blob_uuids_.empty()); // Should only be called once. 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) transferred_blob_uuids_ = blob_uuids; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UIThreadExtensionFunction::WriteToConsole( 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ConsoleMessageLevel level, 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message) { 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetIPCSender()->Send( 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new ExtensionMsg_AddMessageToConsole(GetRoutingID(), level, message)); 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IPC::Sender* UIThreadExtensionFunction::GetIPCSender() { 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (render_view_host_) 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return render_view_host_; 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return render_frame_host_; 41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int UIThreadExtensionFunction::GetRoutingID() { 41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (render_view_host_) 42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return render_view_host_->GetRoutingID(); 42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else 42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return render_frame_host_->GetRoutingID(); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IOThreadExtensionFunction::IOThreadExtensionFunction() 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : routing_id_(MSG_ROUTING_NONE) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction::~IOThreadExtensionFunction() { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction* 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction::AsIOThreadExtensionFunction() { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IOThreadExtensionFunction::Destruct() const { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DeleteOnIOThread::Destruct(this); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IOThreadExtensionFunction::SendResponse(bool success) { 44290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendResponseImpl(success); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncExtensionFunction::AsyncExtensionFunction() { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncExtensionFunction::~AsyncExtensionFunction() { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ExtensionFunction::ResponseAction AsyncExtensionFunction::Run() { 452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return RunAsync() ? RespondLater() : RespondNow(Error(error_)); 453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool AsyncExtensionFunction::ValidationFailure( 457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AsyncExtensionFunction* function) { 458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionFunction::SyncExtensionFunction() { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionFunction::~SyncExtensionFunction() { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ExtensionFunction::ResponseAction SyncExtensionFunction::Run() { 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return RespondNow(RunSync() ? ArgumentList(results_.Pass()) : Error(error_)); 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool SyncExtensionFunction::ValidationFailure(SyncExtensionFunction* function) { 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncIOThreadExtensionFunction::SyncIOThreadExtensionFunction() { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncIOThreadExtensionFunction::~SyncIOThreadExtensionFunction() { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ExtensionFunction::ResponseAction SyncIOThreadExtensionFunction::Run() { 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return RespondNow(RunSync() ? ArgumentList(results_.Pass()) : Error(error_)); 484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool SyncIOThreadExtensionFunction::ValidationFailure( 488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SyncIOThreadExtensionFunction* function) { 489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 491