Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / streams_private / streams_private_api.cc
index 2d69b27..a47b544 100644 (file)
@@ -4,40 +4,55 @@
 
 #include "chrome/browser/extensions/api/streams_private/streams_private_api.h"
 
-#include "base/json/json_writer.h"
 #include "base/lazy_instance.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
 #include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/extensions/extension_function_registry.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
-#include "chrome/browser/profiles/profile.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_source.h"
+#include "chrome/common/extensions/api/streams_private.h"
 #include "content/public/browser/stream_handle.h"
+#include "content/public/browser/stream_info.h"
 #include "extensions/browser/event_router.h"
-#include "extensions/browser/extension_system.h"
-
-namespace events {
-
-const char kOnExecuteMimeTypeHandler[] =
-    "streamsPrivate.onExecuteMimeTypeHandler";
+#include "extensions/browser/extension_function_registry.h"
+#include "extensions/browser/extension_registry.h"
+#include "net/http/http_response_headers.h"
+
+namespace {
+
+void CreateResponseHeadersDictionary(const net::HttpResponseHeaders* headers,
+                                     base::DictionaryValue* result) {
+  if (!headers)
+    return;
+
+  void* iter = NULL;
+  std::string header_name;
+  std::string header_value;
+  while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
+    base::Value* existing_value = NULL;
+    if (result->Get(header_name, &existing_value)) {
+      base::StringValue* existing_string_value =
+          static_cast<base::StringValue*>(existing_value);
+      existing_string_value->GetString()->append(", ").append(header_value);
+    } else {
+      result->SetString(header_name, header_value);
+    }
+  }
+}
 
-}  // namespace events
+}  // namespace
 
 namespace extensions {
 
+namespace streams_private = api::streams_private;
+
 // static
-StreamsPrivateAPI* StreamsPrivateAPI::Get(Profile* profile) {
-  return GetFactoryInstance()->GetForProfile(profile);
+StreamsPrivateAPI* StreamsPrivateAPI::Get(content::BrowserContext* context) {
+  return GetFactoryInstance()->Get(context);
 }
 
-StreamsPrivateAPI::StreamsPrivateAPI(Profile* profile)
-    : profile_(profile),
+StreamsPrivateAPI::StreamsPrivateAPI(content::BrowserContext* context)
+    : browser_context_(context),
+      extension_registry_observer_(this),
       weak_ptr_factory_(this) {
-  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
-                 content::Source<Profile>(profile));
+  extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
 }
 
 StreamsPrivateAPI::~StreamsPrivateAPI() {
@@ -45,48 +60,91 @@ StreamsPrivateAPI::~StreamsPrivateAPI() {
 
 void StreamsPrivateAPI::ExecuteMimeTypeHandler(
     const std::string& extension_id,
-    const content::WebContents* web_contents,
-    scoped_ptr<content::StreamHandle> stream,
+    content::WebContents* web_contents,
+    scoped_ptr<content::StreamInfo> stream,
+    const std::string& view_id,
     int64 expected_content_size) {
   // Create the event's arguments value.
-  scoped_ptr<base::ListValue> event_args(new base::ListValue());
-  event_args->Append(new base::StringValue(stream->GetMimeType()));
-  event_args->Append(new base::StringValue(stream->GetOriginalURL().spec()));
-  event_args->Append(new base::StringValue(stream->GetURL().spec()));
-  event_args->Append(
-      new base::FundamentalValue(ExtensionTabUtil::GetTabId(web_contents)));
+  streams_private::StreamInfo info;
+  info.mime_type = stream->mime_type;
+  info.original_url = stream->original_url.spec();
+  info.stream_url = stream->handle->GetURL().spec();
+  info.tab_id = ExtensionTabUtil::GetTabId(web_contents);
+
+  if (!view_id.empty()) {
+    info.view_id.reset(new std::string(view_id));
+  }
 
   int size = -1;
   if (expected_content_size <= INT_MAX)
     size = expected_content_size;
-  event_args->Append(new base::FundamentalValue(size));
+  info.expected_content_size = size;
 
-  scoped_ptr<Event> event(new Event(events::kOnExecuteMimeTypeHandler,
-                                    event_args.Pass()));
+  CreateResponseHeadersDictionary(stream->response_headers.get(),
+                                  &info.response_headers.additional_properties);
 
-  ExtensionSystem::Get(profile_)->event_router()->DispatchEventToExtension(
-      extension_id, event.Pass());
+  scoped_ptr<Event> event(
+      new Event(streams_private::OnExecuteMimeTypeHandler::kEventName,
+                streams_private::OnExecuteMimeTypeHandler::Create(info)));
 
-  GURL url = stream->GetURL();
-  streams_[extension_id][url] = make_linked_ptr(stream.release());
+  EventRouter::Get(browser_context_)
+      ->DispatchEventToExtension(extension_id, event.Pass());
+
+  GURL url = stream->handle->GetURL();
+  streams_[extension_id][url] = make_linked_ptr(stream->handle.release());
 }
 
-static base::LazyInstance<ProfileKeyedAPIFactory<StreamsPrivateAPI> >
+void StreamsPrivateAPI::AbortStream(const std::string& extension_id,
+                                    const GURL& stream_url,
+                                    const base::Closure& callback) {
+  StreamMap::iterator extension_it = streams_.find(extension_id);
+  if (extension_it == streams_.end()) {
+    callback.Run();
+    return;
+  }
+
+  StreamMap::mapped_type* url_map = &extension_it->second;
+  StreamMap::mapped_type::iterator url_it = url_map->find(stream_url);
+  if (url_it == url_map->end()) {
+    callback.Run();
+    return;
+  }
+
+  url_it->second->AddCloseListener(callback);
+  url_map->erase(url_it);
+}
+
+void StreamsPrivateAPI::OnExtensionUnloaded(
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
+  streams_.erase(extension->id());
+}
+
+StreamsPrivateAbortFunction::StreamsPrivateAbortFunction() {
+}
+
+ExtensionFunction::ResponseAction StreamsPrivateAbortFunction::Run() {
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &stream_url_));
+  StreamsPrivateAPI::Get(browser_context())->AbortStream(
+      extension_id(), GURL(stream_url_), base::Bind(
+          &StreamsPrivateAbortFunction::OnClose, this));
+  return RespondLater();
+}
+
+void StreamsPrivateAbortFunction::OnClose() {
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+  Respond(NoArguments());
+}
+
+static base::LazyInstance<BrowserContextKeyedAPIFactory<StreamsPrivateAPI> >
     g_factory = LAZY_INSTANCE_INITIALIZER;
 
 // static
-ProfileKeyedAPIFactory<StreamsPrivateAPI>*
-    StreamsPrivateAPI::GetFactoryInstance() {
+BrowserContextKeyedAPIFactory<StreamsPrivateAPI>*
+StreamsPrivateAPI::GetFactoryInstance() {
   return g_factory.Pointer();
 }
 
-void StreamsPrivateAPI::Observe(int type,
-                                const content::NotificationSource& source,
-                                const content::NotificationDetails& details) {
-  if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) {
-    const Extension* extension =
-        content::Details<const UnloadedExtensionInfo>(details)->extension;
-    streams_.erase(extension->id());
-  }
-}
 }  // namespace extensions