Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: chrome/browser/extensions/api/tab_capture/tab_capture_api.cc

Issue 11038021: Implement Chrome Extension TabCapture API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments, add command line flag Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 // Implements the Chrome Extensions Tab Capture API.
6
7 #include "chrome/browser/extensions/api/tab_capture/tab_capture_api.h"
8
9 #include "base/stringprintf.h"
10 #include "base/values.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
13 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry_factory .h"
14 #include "chrome/browser/extensions/browser_event_router.h"
15 #include "chrome/browser/extensions/event_names.h"
16 #include "chrome/browser/extensions/extension_tab_id_map.h"
17 #include "chrome/common/extensions/feature_switch.h"
18
19 namespace TabCapture = extensions::api::tab_capture;
20 namespace GetCapturedTabs = TabCapture::GetCapturedTabs;
21
22 namespace extensions {
23
24 namespace {
25
26 const char kPermissionError[] =
27 "Extension does not have permission for tab capture.";
28 const char kErrorTabIdNotFound[] = "Could not find the specified tab.";
29 const char kCapturingSameTab[] = "Cannot capture a tab with an active stream.";
30
31 // Keys/values for media stream constraints.
32 const char kMediaStreamSource[] = "chromeMediaSource";
33 const char kMediaStreamSourceId[] = "chromeMediaSourceId";
34 const char kMediaStreamSourceTab[] = "tab";
35
36 } // namespace
37
38 TabCaptureCaptureFunction::TabCaptureCaptureFunction() { }
39 TabCaptureCaptureFunction::~TabCaptureCaptureFunction() { }
40
41 bool TabCaptureCaptureFunction::Prepare() {
42 if (!GetExtension()->HasAPIPermission(APIPermission::kTabCapture) ||
43 !FeatureSwitch::tab_capture()->IsEnabled()) {
44 error_ = kPermissionError;
45 return false;
46 }
47
48 params_ = TabCapture::Capture::Params::Create(*args_);
49 EXTENSION_FUNCTION_VALIDATE(params_.get());
50 return true;
51 }
52
53 void TabCaptureCaptureFunction::Work() {
54 ExtensionTabIdMap* tab_id_map = ExtensionTabIdMap::GetInstance();
55 int render_process_id = -1;
56 int routing_id = -1;
57 int tab_id = *params_->tab_id.get();
58 if (!tab_id_map ||
59 !tab_id_map->GetProcessAndRoutingId(tab_id,
60 &render_process_id,
61 &routing_id)) {
62 error_ = kErrorTabIdNotFound;
63 SetResult(base::Value::CreateIntegerValue(0));
64 return;
65 }
66
67 std::string device_id = base::StringPrintf("%i:%i", render_process_id,
68 routing_id);
69
70 request_key_ = device_id;
71 request_ = TabCaptureRegistry::TabCaptureRequest(GetExtension()->id(), tab_id,
72 tab_capture::TAB_CAPTURE_TAB_CAPTURE_STATE_NONE);
73
74
75 bool audio = false;
76 bool video = false;
77 if (params_->options.get()) {
78 if (params_->options->audio.get())
79 audio = *params_->options->audio.get();
80 if (params_->options->video.get())
81 video = *params_->options->video.get();
82 }
83
84 base::DictionaryValue* result = new base::DictionaryValue();
85 if (video) {
86 result->SetString(std::string("videoConstraints.mandatory.") +
87 kMediaStreamSource, kMediaStreamSourceTab);
88 result->SetString(std::string("videoConstraints.mandatory.") +
89 kMediaStreamSourceId, device_id);
90 } else {
91 result->SetBoolean(std::string("videoConstraints"), false);
92 }
93
94 if (audio) {
95 result->SetString(std::string("audioConstraints.mandatory.") +
96 kMediaStreamSource, kMediaStreamSourceTab);
97 result->SetString(std::string("audioConstraints.mandatory.") +
98 kMediaStreamSourceId, device_id);
99 } else {
100 result->SetBoolean(std::string("audioConstraints"), false);
101 }
102
103 SetResult(result);
104 }
105
106 bool TabCaptureCaptureFunction::Respond() {
107 extensions::TabCaptureRegistry* registry =
108 extensions::TabCaptureRegistryFactory::GetForProfile(profile());
109 if (!request_key_.empty() && !registry->AddRequest(request_key_, request_)) {
110 error_ = kCapturingSameTab;
111 SetResult(base::Value::CreateIntegerValue(0));
112 }
113
114 return error_.empty();
115 }
116
117 bool TabCaptureGetCapturedTabsFunction::RunImpl() {
118 if (!GetExtension()->HasAPIPermission(APIPermission::kTabCapture) ||
119 !FeatureSwitch::tab_capture()->IsEnabled()) {
120 error_ = kPermissionError;
121 return false;
122 }
123
124 extensions::TabCaptureRegistry* registry =
125 extensions::TabCaptureRegistryFactory::GetForProfile(profile());
126
127 const TabCaptureRegistry::CaptureRequestList& captured_tabs =
128 registry->GetCapturedTabs(GetExtension()->id());
129
130 base::ListValue *list = new base::ListValue();
131 for (TabCaptureRegistry::CaptureRequestList::const_iterator it =
132 captured_tabs.begin(); it != captured_tabs.end(); it++) {
133 scoped_ptr<tab_capture::CaptureInfo> info(new tab_capture::CaptureInfo());
134 info->tab_id = it->tab_id;
135 info->status = it->status;
136 list->Append(info->ToValue().release());
137 }
138
139 SetResult(list);
140 return true;
141 }
142
143 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698