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