1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_function.h" 6 7 #include "base/json/json_writer.h" 8 #include "base/logging.h" 9 #include "chrome/browser/extensions/extension_function_dispatcher.h" 10 #include "chrome/browser/extensions/extension_service.h" 11 #include "chrome/browser/profiles/profile.h" 12 13 ExtensionFunction::ExtensionFunction() 14 : request_id_(-1), 15 profile_(NULL), 16 has_callback_(false), 17 include_incognito_(false), 18 user_gesture_(false) { 19 } 20 21 ExtensionFunction::~ExtensionFunction() { 22 } 23 24 const Extension* ExtensionFunction::GetExtension() { 25 ExtensionService* service = profile_->GetExtensionService(); 26 DCHECK(service); 27 return service->GetExtensionById(extension_id_, false); 28 } 29 30 Browser* ExtensionFunction::GetCurrentBrowser() { 31 return dispatcher()->GetCurrentBrowser(include_incognito_); 32 } 33 34 AsyncExtensionFunction::AsyncExtensionFunction() 35 : args_(NULL), bad_message_(false) { 36 } 37 38 AsyncExtensionFunction::~AsyncExtensionFunction() { 39 } 40 41 void AsyncExtensionFunction::SetArgs(const ListValue* args) { 42 DCHECK(!args_.get()); // Should only be called once. 43 args_.reset(args->DeepCopy()); 44 } 45 46 const std::string AsyncExtensionFunction::GetResult() { 47 std::string json; 48 // Some functions might not need to return any results. 49 if (result_.get()) 50 base::JSONWriter::Write(result_.get(), false, &json); 51 return json; 52 } 53 54 const std::string AsyncExtensionFunction::GetError() { 55 return error_; 56 } 57 58 void AsyncExtensionFunction::Run() { 59 if (!RunImpl()) 60 SendResponse(false); 61 } 62 63 void AsyncExtensionFunction::SendResponse(bool success) { 64 if (!dispatcher()) 65 return; 66 if (bad_message_) { 67 dispatcher()->HandleBadMessage(this); 68 } else { 69 dispatcher()->SendResponse(this, success); 70 } 71 } 72 73 bool AsyncExtensionFunction::HasOptionalArgument(size_t index) { 74 Value* value; 75 return args_->Get(index, &value) && !value->IsType(Value::TYPE_NULL); 76 } 77 78 SyncExtensionFunction::SyncExtensionFunction() { 79 } 80 81 SyncExtensionFunction::~SyncExtensionFunction() { 82 } 83 84 void SyncExtensionFunction::Run() { 85 SendResponse(RunImpl()); 86 } 87