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 16 namespace content { 17 class BrowserContext; 18 class StreamHandle; 19 } 20 21 namespace extensions { 22 class ExtensionRegistry; 23 24 class 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. service_name()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 base::WeakPtrFactory<StreamsPrivateAPI> weak_ptr_factory_; 73 74 // Listen to extension unloaded notifications. 75 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 76 extension_registry_observer_; 77 }; 78 79 class StreamsPrivateAbortFunction : public UIThreadExtensionFunction { 80 public: 81 StreamsPrivateAbortFunction(); 82 DECLARE_EXTENSION_FUNCTION("streamsPrivate.abort", STREAMSPRIVATE_ABORT) 83 84 protected: ~StreamsPrivateAbortFunction()85 virtual ~StreamsPrivateAbortFunction() {} 86 87 // ExtensionFunction: 88 virtual ExtensionFunction::ResponseAction Run() OVERRIDE; 89 90 private: 91 void OnClose(); 92 93 std::string stream_url_; 94 }; 95 96 } // namespace extensions 97 98 #endif // CHROME_BROWSER_EXTENSIONS_API_STREAMS_PRIVATE_STREAMS_PRIVATE_API_H_ 99