// 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.

#include "modules/remoteplayback/HTMLMediaElementRemotePlayback.h"

#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/dom/QualifiedName.h"
#include "core/html/HTMLMediaElement.h"
#include "modules/remoteplayback/RemotePlayback.h"

namespace blink {

// static
bool HTMLMediaElementRemotePlayback::FastHasAttribute(
    const QualifiedName& name,
    const HTMLMediaElement& element) {
  DCHECK(name == HTMLNames::disableremoteplaybackAttr);
  return element.FastHasAttribute(name);
}

// static
void HTMLMediaElementRemotePlayback::SetBooleanAttribute(
    const QualifiedName& name,
    HTMLMediaElement& element,
    bool value) {
  DCHECK(name == HTMLNames::disableremoteplaybackAttr);
  element.SetBooleanAttribute(name, value);

  HTMLMediaElementRemotePlayback& self =
      HTMLMediaElementRemotePlayback::From(element);
  if (self.remote_ && value)
    self.remote_->RemotePlaybackDisabled();
}

// static
HTMLMediaElementRemotePlayback& HTMLMediaElementRemotePlayback::From(
    HTMLMediaElement& element) {
  HTMLMediaElementRemotePlayback* supplement =
      static_cast<HTMLMediaElementRemotePlayback*>(
          Supplement<HTMLMediaElement>::From(element, SupplementName()));
  if (!supplement) {
    supplement = new HTMLMediaElementRemotePlayback();
    ProvideTo(element, SupplementName(), supplement);
  }
  return *supplement;
}

// static
RemotePlayback* HTMLMediaElementRemotePlayback::remote(
    HTMLMediaElement& element) {
  HTMLMediaElementRemotePlayback& self =
      HTMLMediaElementRemotePlayback::From(element);
  Document& document = element.GetDocument();
  if (!document.GetFrame())
    return nullptr;

  if (!self.remote_)
    self.remote_ = RemotePlayback::Create(element);

  return self.remote_;
}

// static
const char* HTMLMediaElementRemotePlayback::SupplementName() {
  return "HTMLMediaElementRemotePlayback";
}

DEFINE_TRACE(HTMLMediaElementRemotePlayback) {
  visitor->Trace(remote_);
  Supplement<HTMLMediaElement>::Trace(visitor);
}

}  // namespace blink
