extension_function.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/metrics/sparse_histogram.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/web_contents.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_dispatcher.h" 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_message_filter.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; 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extensions::ExtensionAPI; 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extensions::Feature; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunctionDeleteTraits::Destruct(const ExtensionFunction* x) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x->Destruct(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper class to track the lifetime of ExtensionFunction's RenderViewHost or 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// RenderFrameHost pointer and NULL it out when it dies. It also allows us to 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// filter IPC messages coming from the RenderViewHost/RenderFrameHost. 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UIThreadExtensionFunction::RenderHostTracker 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : public content::WebContentsObserver { 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit RenderHostTracker(UIThreadExtensionFunction* function) 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : content::WebContentsObserver( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function->render_view_host() ? 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents::FromRenderViewHost(function->render_view_host()) : 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents::FromRenderFrameHost( 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function->render_frame_host())), 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) function_(function) { 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private: 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // content::WebContentsObserver: 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void RenderViewDeleted( 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE { 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (render_view_host != function_->render_view_host()) 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) function_->SetRenderViewHost(NULL); 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RenderFrameDeleted( 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) OVERRIDE { 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_frame_host != function_->render_frame_host()) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function_->SetRenderFrameHost(NULL); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return function_->OnMessageReceived(message); 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) UIThreadExtensionFunction* function_; 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RenderHostTracker); 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionFunction::ExtensionFunction() 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : request_id_(-1), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_id_(NULL), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_callback_(false), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) include_incognito_(false), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture_(false), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bad_message_(false), 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histogram_value_(extensions::functions::UNKNOWN), 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_tab_id_(-1) { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionFunction::~ExtensionFunction() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction* ExtensionFunction::AsUIThreadExtensionFunction() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction* ExtensionFunction::AsIOThreadExtensionFunction() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::HasPermission() { 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Feature::Availability availability = 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExtensionAPI::GetSharedInstance()->IsAvailable( 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) name_, extension_, Feature::BLESSED_EXTENSION_CONTEXT, source_url()); 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return availability.is_available(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::OnQuotaExceeded(const std::string& violation_error) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = violation_error; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(false); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetArgs(const base::ListValue* args) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!args_.get()); // Should only be called once. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.reset(args->DeepCopy()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetResult(base::Value* result) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_.reset(new base::ListValue()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_->Append(result); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::ListValue* ExtensionFunction::GetResultList() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return results_.get(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string ExtensionFunction::GetError() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::SetError(const std::string& error) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionFunction::Run() { 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_SPARSE_SLOWLY("Extensions.FunctionCalls", histogram_value()); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RunImpl()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(false); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::ShouldSkipQuotaLimiting() const { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionFunction::HasOptionalArgument(size_t index) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* value; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ExtensionFunction::SendResponseImpl(bool success) { 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!response_callback_.is_null()); 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResponseType type = success ? SUCCEEDED : FAILED; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bad_message_) { 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) type = BAD_MESSAGE; 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LOG(ERROR) << "Bad extension message " << name_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If results were never set, we send an empty argument list. 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!results_) 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch results_.reset(new base::ListValue()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) response_callback_.Run(type, *results_, GetError()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::UIThreadExtensionFunction() 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : render_view_host_(NULL), 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_(NULL), 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_(NULL), 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_(NULL) { 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::~UIThreadExtensionFunction() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher() && render_view_host()) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher()->OnExtensionFunctionCompleted(GetExtension()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction* 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadExtensionFunction::AsUIThreadExtensionFunction() { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool UIThreadExtensionFunction::OnMessageReceived(const IPC::Message& message) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::Destruct() const { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DeleteOnUIThread::Destruct(this); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::SetRenderViewHost( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!render_frame_host_); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_ = render_view_host; 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tracker_.reset(render_view_host ? new RenderHostTracker(this) : NULL); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UIThreadExtensionFunction::SetRenderFrameHost( 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!render_view_host_); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_ = render_frame_host; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tracker_.reset(render_frame_host ? new RenderHostTracker(this) : NULL); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* UIThreadExtensionFunction::GetAssociatedWebContents() { 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WebContents* web_contents = NULL; 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (dispatcher()) 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents = dispatcher()->delegate()->GetAssociatedWebContents(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return web_contents; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadExtensionFunction::SendResponse(bool success) { 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (delegate_) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnSendResponse(this, success, bad_message_); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendResponseImpl(success); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UIThreadExtensionFunction::WriteToConsole( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ConsoleMessageLevel level, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message) { 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_) { 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->Send(new ExtensionMsg_AddMessageToConsole( 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->GetRoutingID(), level, message)); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_->Send(new ExtensionMsg_AddMessageToConsole( 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host_->GetRoutingID(), level, message)); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IOThreadExtensionFunction::IOThreadExtensionFunction() 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : routing_id_(MSG_ROUTING_NONE) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction::~IOThreadExtensionFunction() { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction* 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThreadExtensionFunction::AsIOThreadExtensionFunction() { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IOThreadExtensionFunction::Destruct() const { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DeleteOnIOThread::Destruct(this); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IOThreadExtensionFunction::SendResponse(bool success) { 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendResponseImpl(success); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncExtensionFunction::AsyncExtensionFunction() { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncExtensionFunction::~AsyncExtensionFunction() { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionFunction::SyncExtensionFunction() { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionFunction::~SyncExtensionFunction() { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionFunction::Run() { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(RunImpl()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncIOThreadExtensionFunction::SyncIOThreadExtensionFunction() { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncIOThreadExtensionFunction::~SyncIOThreadExtensionFunction() { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncIOThreadExtensionFunction::Run() { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(RunImpl()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 271