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