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