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#ifndef CHROME_BROWSER_EXTENSIONS_API_STREAMS_PRIVATE_STREAMS_PRIVATE_API_H_ 6#define CHROME_BROWSER_EXTENSIONS_API_STREAMS_PRIVATE_STREAMS_PRIVATE_API_H_ 7 8#include <map> 9#include <string> 10 11#include "base/scoped_observer.h" 12#include "extensions/browser/browser_context_keyed_api_factory.h" 13#include "extensions/browser/extension_function.h" 14#include "extensions/browser/extension_registry_observer.h" 15 16namespace content { 17class BrowserContext; 18class StreamHandle; 19} 20 21namespace extensions { 22class ExtensionRegistry; 23 24class StreamsPrivateAPI : public BrowserContextKeyedAPI, 25 public ExtensionRegistryObserver { 26 public: 27 // Convenience method to get the StreamsPrivateAPI for a BrowserContext. 28 static StreamsPrivateAPI* Get(content::BrowserContext* context); 29 30 explicit StreamsPrivateAPI(content::BrowserContext* context); 31 virtual ~StreamsPrivateAPI(); 32 33 // Send the onExecuteMimeTypeHandler event to |extension_id|. 34 // |web_contents| is used to determine the tabId where the document is being 35 // opened. The data for the document will be readable from |stream|, and 36 // should be |expected_content_size| bytes long. If the viewer is being opened 37 // in a BrowserPlugin, specify a non-empty |view_id| of the plugin. 38 void ExecuteMimeTypeHandler(const std::string& extension_id, 39 content::WebContents* web_contents, 40 scoped_ptr<content::StreamHandle> stream, 41 const std::string& view_id, 42 int64 expected_content_size); 43 44 void AbortStream(const std::string& extension_id, 45 const GURL& stream_url, 46 const base::Closure& callback); 47 48 // BrowserContextKeyedAPI implementation. 49 static BrowserContextKeyedAPIFactory<StreamsPrivateAPI>* GetFactoryInstance(); 50 51 private: 52 friend class BrowserContextKeyedAPIFactory<StreamsPrivateAPI>; 53 typedef std::map<std::string, 54 std::map<GURL, 55 linked_ptr<content::StreamHandle> > > StreamMap; 56 57 // ExtensionRegistryObserver implementation. 58 virtual void OnExtensionUnloaded( 59 content::BrowserContext* browser_context, 60 const Extension* extension, 61 UnloadedExtensionInfo::Reason reason) OVERRIDE; 62 63 // BrowserContextKeyedAPI implementation. 64 static const char* service_name() { 65 return "StreamsPrivateAPI"; 66 } 67 static const bool kServiceIsNULLWhileTesting = true; 68 static const bool kServiceRedirectedInIncognito = true; 69 70 content::BrowserContext* const browser_context_; 71 StreamMap streams_; 72 73 // Listen to extension unloaded notifications. 74 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 75 extension_registry_observer_; 76 77 base::WeakPtrFactory<StreamsPrivateAPI> weak_ptr_factory_; 78 79}; 80 81class StreamsPrivateAbortFunction : public UIThreadExtensionFunction { 82 public: 83 StreamsPrivateAbortFunction(); 84 DECLARE_EXTENSION_FUNCTION("streamsPrivate.abort", STREAMSPRIVATE_ABORT) 85 86 protected: 87 virtual ~StreamsPrivateAbortFunction() {} 88 89 // ExtensionFunction: 90 virtual ExtensionFunction::ResponseAction Run() OVERRIDE; 91 92 private: 93 void OnClose(); 94 95 std::string stream_url_; 96}; 97 98} // namespace extensions 99 100#endif // CHROME_BROWSER_EXTENSIONS_API_STREAMS_PRIVATE_STREAMS_PRIVATE_API_H_ 101