blob: bf89f27b69cc34b415a431575de77bd33e2081cf [file] [log] [blame]
// Copyright 2015 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_MEDIA_ROUTER_MEDIA_ROUTER_DIALOG_CONTROLLER_H_
#define CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_DIALOG_CONTROLLER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "chrome/browser/media/router/create_presentation_connection_request.h"
#include "content/public/browser/web_contents_observer.h"
namespace content {
class WebContents;
} // namespace content
namespace media_router {
// An abstract base class for Media Router dialog controllers. Tied to a
// WebContents known as the |initiator|, and is lazily created when a Media
// Router dialog needs to be shown. The MediaRouterDialogController allows
// showing and closing a Media Router dialog modal to the initiator WebContents.
// This class is not thread safe and must be called on the UI thread.
class MediaRouterDialogController {
public:
virtual ~MediaRouterDialogController();
// Gets a reference to the MediaRouterDialogController associated with
// |web_contents|, creating one if it does not exist. The returned pointer is
// guaranteed to be non-null.
static MediaRouterDialogController* GetOrCreateForWebContents(
content::WebContents* web_contents);
// Shows the media router dialog modal to |initiator_| and the parameters
// specified in |request|.
// Creates the dialog if it did not exist prior to this call, returns true.
// If the dialog already exists, brings it to the front but doesn't change the
// dialog with |request|, returns false and |request| is deleted.
bool ShowMediaRouterDialogForPresentation(
std::unique_ptr<CreatePresentationConnectionRequest> request);
// Shows the media router dialog modal to |initiator_|.
// Creates the dialog if it did not exist prior to this call, returns true.
// If the dialog already exists, brings it to the front, returns false.
virtual bool ShowMediaRouterDialog();
// Hides the media router dialog.
// It is a no-op to call this function if there is currently no dialog.
void HideMediaRouterDialog();
// Indicates if the media router dialog already exists.
virtual bool IsShowingMediaRouterDialog() const = 0;
protected:
// Use MediaRouterDialogController::GetOrCreateForWebContents() to create an
// instance.
explicit MediaRouterDialogController(content::WebContents* initiator);
// Activates the WebContents that initiated the dialog, e.g. focuses the tab.
void ActivateInitiatorWebContents();
// Passes the ownership of the CreatePresentationConnectionRequest to the
// caller.
std::unique_ptr<CreatePresentationConnectionRequest>
TakeCreateConnectionRequest();
// Returns the CreatePresentationConnectionRequest to the caller but keeps the
// ownership with the MediaRouterDialogController.
const CreatePresentationConnectionRequest* create_connection_request() const {
return create_connection_request_.get();
}
// Returns the WebContents that initiated showing the dialog.
content::WebContents* initiator() const { return initiator_; }
// Resets the state of the controller. Must be called from the overrides.
virtual void Reset();
// Creates a new media router dialog modal to |initiator_|.
virtual void CreateMediaRouterDialog() = 0;
// Closes the media router dialog if it exists.
virtual void CloseMediaRouterDialog() = 0;
private:
class InitiatorWebContentsObserver;
// An observer for the |initiator_| that closes the dialog when |initiator_|
// is destroyed or navigated.
std::unique_ptr<InitiatorWebContentsObserver> initiator_observer_;
content::WebContents* const initiator_;
// Data for dialogs created at the request of the Presentation API.
// Passed from the caller via ShowMediaRouterDialogForPresentation to the
// dialog when it is initialized.
std::unique_ptr<CreatePresentationConnectionRequest>
create_connection_request_;
DISALLOW_COPY_AND_ASSIGN(MediaRouterDialogController);
};
} // namespace media_router
#endif // CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_DIALOG_CONTROLLER_H_