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