blob: 30fd89c28516e776768bcbf3956e595e776f8f4c [file] [log] [blame]
// Copyright 2014 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.
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/web_contents_observer.h"
#include "third_party/WebKit/public/platform/WebScreenOrientationLockType.h"
namespace content {
class ScreenOrientationDelegate;
class ScreenOrientationDispatcherHost;
class WebContents;
// Handles screen orientation lock/unlock. Platforms which wish to provide
// custom implementations can provide a factory for ScreenOrientationDelegate.
class CONTENT_EXPORT ScreenOrientationProvider : public WebContentsObserver {
ScreenOrientationProvider(ScreenOrientationDispatcherHost* dispatcher_host,
WebContents* web_contents);
~ScreenOrientationProvider() override;
// Lock the screen orientation to |orientations|.
void LockOrientation(int request_id,
blink::WebScreenOrientationLockType lock_orientation);
// Unlock the screen orientation.
void UnlockOrientation();
// Inform about a screen orientation update. It is called to let the provider
// know if a lock has been resolved.
void OnOrientationChange();
// Provide a delegate which creates delegates for platform implementations.
// The delegate is not owned by ScreenOrientationProvider.
static void SetDelegate(ScreenOrientationDelegate* delegate_);
// WebContentsObserver
void DidToggleFullscreenModeForTab(bool entered_fullscreen) override;
struct LockInformation {
LockInformation(int request_id, blink::WebScreenOrientationLockType lock);
int request_id;
blink::WebScreenOrientationLockType lock;
// Returns the lock type that should be associated with 'natural' lock.
// Returns WebScreenOrientationLockDefault if the natural lock type can't be
// found.
blink::WebScreenOrientationLockType GetNaturalLockType() const;
// Whether the passed |lock| matches the current orientation. In other words,
// whether the orientation will need to change to match the |lock|.
bool LockMatchesCurrentOrientation(blink::WebScreenOrientationLockType lock);
// Not owned, responsible for platform implementations.
static ScreenOrientationDelegate* delegate_;
// ScreenOrientationDispatcherHost owns ScreenOrientationProvider.
ScreenOrientationDispatcherHost* dispatcher_;
// Whether the ScreenOrientationProvider currently has a lock applied.
bool lock_applied_;
// Locks that require orientation changes are not completed until
// OnOrientationChange.
scoped_ptr<LockInformation> pending_lock_;
} // namespace content