C++程序  |  172行  |  6.21 KB

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_WEBUI_MEDIAPLAYER_UI_H_
#define CHROME_BROWSER_UI_WEBUI_MEDIAPLAYER_UI_H_
#pragma once

#include <set>
#include <vector>

#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "content/browser/webui/web_ui.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
#include "content/common/notification_source.h"
#include "content/common/notification_type.h"
#include "net/base/directory_lister.h"
#include "net/url_request/url_request.h"

template <typename T> struct DefaultSingletonTraits;

class Browser;
class GURL;
class MediaplayerHandler;
class Profile;

class MediaPlayer : public NotificationObserver,
                    public net::URLRequest::Interceptor {
 public:
  ~MediaPlayer();

  // Enqueues this file into the current playlist.  If the mediaplayer is
  // not currently visible, show it, and play the given url.
  void EnqueueMediaFile(Profile* profile, const FilePath& file_path,
                        Browser* creator);

  // Enqueues this fileschema url into the current playlist. If the mediaplayer
  // is not currently visible, show it, and play the given url.
  void EnqueueMediaFileUrl(const GURL& url, Browser* creator);

  // Clears out the current playlist, and start playback of the given
  // |file_path|. If there is no mediaplayer currently, show it, and play the
  // given |file_path|.
  void ForcePlayMediaFile(Profile* profile, const FilePath& file_path,
                          Browser* creator);

  // Clears out the current playlist, and start playback of the given url.
  // If there is no mediaplayer currently, show it, and play the given url.
  void ForcePlayMediaURL(const GURL& url, Browser* creator);

  // Toggle the visibility of the playlist window.
  void TogglePlaylistWindowVisible();

  // Force the playlist window to be shown.
  void ShowPlaylistWindow();

  // Toggle the mediaplayer between fullscreen and windowed.
  void ToggleFullscreen();

  // Force the playlist window to be closed.
  void ClosePlaylistWindow();

  // Sets the currently playing element to the given offset.
  void SetPlaylistOffset(int offset);

  // Set a new playback handler to give events to, along with the
  // tab contents of the page which holds the mediaplayer. it is expected
  // That only one of these will exist at any given time.
  void SetNewHandler(MediaplayerHandler* handler,
                     TabContents* contents);

  // Removes the handler.
  void RemoveHandler(MediaplayerHandler* handler);

  // Registers a new playlist handler which receives events from the
  // mediaplayer, along with the tab contents which has the playlist in it.
  void RegisterNewPlaylistHandler(MediaplayerHandler* handler,
                                  TabContents* contents);

  // Removes the playlist handler.
  void RemovePlaylistHandler(MediaplayerHandler* handler);

  // Notfiys the mediaplayer that the playlist changed. This could be
  // called from the mediaplayer itself for example.
  void NotifyPlaylistChanged();

  // Always returns NULL because we don't want to attempt a redirect
  // before seeing the detected mime type of the request.
  // Implementation of net::URLRequest::Interceptor.
  virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request);

  // Determines if the requested document can be viewed by the
  // MediaPlayer.  If it can, returns a net::URLRequestJob that
  // redirects the browser to the view URL.
  // Implementation of net::URLRequest::Interceptor.
  virtual net::URLRequestJob* MaybeInterceptResponse(net::URLRequest* request);

  // Used to detect when the mediaplayer is closed.
  virtual void Observe(NotificationType type,
                       const NotificationSource& source,
                       const NotificationDetails& details);

  // Getter for the singleton.
  static MediaPlayer* GetInstance();

 private:
  friend struct DefaultSingletonTraits<MediaPlayer>;

  MediaPlayer();

  // Popup the mediaplayer, this shows the browser, and sets up its
  // locations correctly.
  void PopupMediaPlayer(Browser* creator);

  // Popup the playlist.  Shows the browser, sets it up to point at
  // chrome://mediaplayer#playlist
  void PopupPlaylist(Browser* creator);

  // Registers the listeners for the close events on the browser windows.
  void RegisterListeners();

  // Set when the register handler is called.  When the media player is
  // closed, this pointer is set back to NULL.
  MediaplayerHandler* handler_;

  // Set when the register playlist handler is called. When the playlist
  // is closed, this pointer is set back to NULL.
  MediaplayerHandler* playlist_;

  // Browser containing the playlist. Used to force closes. This is created
  // By the PopupPlaylist call, and is NULLed out when the window is closed.
  Browser* playlist_browser_;

  // Browser containing the Mediaplayer.  Used to force closes. This is
  // created by the PopupMediaplayer call, and is NULLed out when the window
  // is closed.
  Browser* mediaplayer_browser_;

  // List of URLs that were enqueued during the time that the mediaplayer
  // had not poped up yet. This is claered out after the mediaplayer pops up.
  std::vector<GURL> unhandled_urls_;

  // Used to register for events on the windows, like to listen for closes.
  NotificationRegistrar registrar_;

  // Tab contents of the mediaplayer.  Used to listen for events
  // which would cause the mediaplayer to be closed.  These are cleared out
  // when the mediaplayer is closed.
  TabContents* mediaplayer_tab_;

  // Tab contents of the playlist tab. used to listen for events which would
  // cause the mediaplayer to be closed.  These are cleared out when the
  // playlist is closed.
  TabContents* playlist_tab_;

  // List of mimetypes that the mediaplayer should listen to.  Used for
  // interceptions of url GETs.
  std::set<std::string> supported_mime_types_;
  DISALLOW_COPY_AND_ASSIGN(MediaPlayer);
};

class MediaplayerUI : public WebUI {
 public:
  explicit MediaplayerUI(TabContents* contents);

 private:
  DISALLOW_COPY_AND_ASSIGN(MediaplayerUI);
};

#endif  // CHROME_BROWSER_UI_WEBUI_MEDIAPLAYER_UI_H_