• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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_UI_WEBUI_MEDIAPLAYER_UI_H_
6 #define CHROME_BROWSER_UI_WEBUI_MEDIAPLAYER_UI_H_
7 #pragma once
8 
9 #include <set>
10 #include <vector>
11 
12 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
13 #include "content/browser/webui/web_ui.h"
14 #include "content/common/notification_observer.h"
15 #include "content/common/notification_registrar.h"
16 #include "content/common/notification_source.h"
17 #include "content/common/notification_type.h"
18 #include "net/base/directory_lister.h"
19 #include "net/url_request/url_request.h"
20 
21 template <typename T> struct DefaultSingletonTraits;
22 
23 class Browser;
24 class GURL;
25 class MediaplayerHandler;
26 class Profile;
27 
28 class MediaPlayer : public NotificationObserver,
29                     public net::URLRequest::Interceptor {
30  public:
31   ~MediaPlayer();
32 
33   // Enqueues this file into the current playlist.  If the mediaplayer is
34   // not currently visible, show it, and play the given url.
35   void EnqueueMediaFile(Profile* profile, const FilePath& file_path,
36                         Browser* creator);
37 
38   // Enqueues this fileschema url into the current playlist. If the mediaplayer
39   // is not currently visible, show it, and play the given url.
40   void EnqueueMediaFileUrl(const GURL& url, Browser* creator);
41 
42   // Clears out the current playlist, and start playback of the given
43   // |file_path|. If there is no mediaplayer currently, show it, and play the
44   // given |file_path|.
45   void ForcePlayMediaFile(Profile* profile, const FilePath& file_path,
46                           Browser* creator);
47 
48   // Clears out the current playlist, and start playback of the given url.
49   // If there is no mediaplayer currently, show it, and play the given url.
50   void ForcePlayMediaURL(const GURL& url, Browser* creator);
51 
52   // Toggle the visibility of the playlist window.
53   void TogglePlaylistWindowVisible();
54 
55   // Force the playlist window to be shown.
56   void ShowPlaylistWindow();
57 
58   // Toggle the mediaplayer between fullscreen and windowed.
59   void ToggleFullscreen();
60 
61   // Force the playlist window to be closed.
62   void ClosePlaylistWindow();
63 
64   // Sets the currently playing element to the given offset.
65   void SetPlaylistOffset(int offset);
66 
67   // Set a new playback handler to give events to, along with the
68   // tab contents of the page which holds the mediaplayer. it is expected
69   // That only one of these will exist at any given time.
70   void SetNewHandler(MediaplayerHandler* handler,
71                      TabContents* contents);
72 
73   // Removes the handler.
74   void RemoveHandler(MediaplayerHandler* handler);
75 
76   // Registers a new playlist handler which receives events from the
77   // mediaplayer, along with the tab contents which has the playlist in it.
78   void RegisterNewPlaylistHandler(MediaplayerHandler* handler,
79                                   TabContents* contents);
80 
81   // Removes the playlist handler.
82   void RemovePlaylistHandler(MediaplayerHandler* handler);
83 
84   // Notfiys the mediaplayer that the playlist changed. This could be
85   // called from the mediaplayer itself for example.
86   void NotifyPlaylistChanged();
87 
88   // Always returns NULL because we don't want to attempt a redirect
89   // before seeing the detected mime type of the request.
90   // Implementation of net::URLRequest::Interceptor.
91   virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request);
92 
93   // Determines if the requested document can be viewed by the
94   // MediaPlayer.  If it can, returns a net::URLRequestJob that
95   // redirects the browser to the view URL.
96   // Implementation of net::URLRequest::Interceptor.
97   virtual net::URLRequestJob* MaybeInterceptResponse(net::URLRequest* request);
98 
99   // Used to detect when the mediaplayer is closed.
100   virtual void Observe(NotificationType type,
101                        const NotificationSource& source,
102                        const NotificationDetails& details);
103 
104   // Getter for the singleton.
105   static MediaPlayer* GetInstance();
106 
107  private:
108   friend struct DefaultSingletonTraits<MediaPlayer>;
109 
110   MediaPlayer();
111 
112   // Popup the mediaplayer, this shows the browser, and sets up its
113   // locations correctly.
114   void PopupMediaPlayer(Browser* creator);
115 
116   // Popup the playlist.  Shows the browser, sets it up to point at
117   // chrome://mediaplayer#playlist
118   void PopupPlaylist(Browser* creator);
119 
120   // Registers the listeners for the close events on the browser windows.
121   void RegisterListeners();
122 
123   // Set when the register handler is called.  When the media player is
124   // closed, this pointer is set back to NULL.
125   MediaplayerHandler* handler_;
126 
127   // Set when the register playlist handler is called. When the playlist
128   // is closed, this pointer is set back to NULL.
129   MediaplayerHandler* playlist_;
130 
131   // Browser containing the playlist. Used to force closes. This is created
132   // By the PopupPlaylist call, and is NULLed out when the window is closed.
133   Browser* playlist_browser_;
134 
135   // Browser containing the Mediaplayer.  Used to force closes. This is
136   // created by the PopupMediaplayer call, and is NULLed out when the window
137   // is closed.
138   Browser* mediaplayer_browser_;
139 
140   // List of URLs that were enqueued during the time that the mediaplayer
141   // had not poped up yet. This is claered out after the mediaplayer pops up.
142   std::vector<GURL> unhandled_urls_;
143 
144   // Used to register for events on the windows, like to listen for closes.
145   NotificationRegistrar registrar_;
146 
147   // Tab contents of the mediaplayer.  Used to listen for events
148   // which would cause the mediaplayer to be closed.  These are cleared out
149   // when the mediaplayer is closed.
150   TabContents* mediaplayer_tab_;
151 
152   // Tab contents of the playlist tab. used to listen for events which would
153   // cause the mediaplayer to be closed.  These are cleared out when the
154   // playlist is closed.
155   TabContents* playlist_tab_;
156 
157   // List of mimetypes that the mediaplayer should listen to.  Used for
158   // interceptions of url GETs.
159   std::set<std::string> supported_mime_types_;
160   DISALLOW_COPY_AND_ASSIGN(MediaPlayer);
161 };
162 
163 class MediaplayerUI : public WebUI {
164  public:
165   explicit MediaplayerUI(TabContents* contents);
166 
167  private:
168   DISALLOW_COPY_AND_ASSIGN(MediaplayerUI);
169 };
170 
171 #endif  // CHROME_BROWSER_UI_WEBUI_MEDIAPLAYER_UI_H_
172