/*
 *  Copyright (C) 2000 Harri Porten (porten@kde.org)
 *  Copyright (c) 2000 Daniel Molkentin (molkentin@kde.org)
 *  Copyright (c) 2000 Stefan Schimanski (schimmi@kde.org)
 *  Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
 *  Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *  MA  02110-1301 USA
 */

#include "modules/geolocation/NavigatorGeolocation.h"

#include "core/dom/Document.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Navigator.h"
#include "modules/geolocation/Geolocation.h"

namespace blink {

NavigatorGeolocation::NavigatorGeolocation(LocalFrame* frame)
    : DOMWindowProperty(frame) {}

const char* NavigatorGeolocation::supplementName() {
  return "NavigatorGeolocation";
}

NavigatorGeolocation& NavigatorGeolocation::from(Navigator& navigator) {
  NavigatorGeolocation* supplement = static_cast<NavigatorGeolocation*>(
      Supplement<Navigator>::from(navigator, supplementName()));
  if (!supplement) {
    supplement = new NavigatorGeolocation(navigator.frame());
    provideTo(navigator, supplementName(), supplement);
  }
  return *supplement;
}

Geolocation* NavigatorGeolocation::geolocation(Navigator& navigator) {
  return NavigatorGeolocation::from(navigator).geolocation();
}

Geolocation* NavigatorGeolocation::geolocation() {
  if (!m_geolocation && frame())
    m_geolocation = Geolocation::create(frame()->document());
  return m_geolocation;
}

DEFINE_TRACE(NavigatorGeolocation) {
  visitor->trace(m_geolocation);
  Supplement<Navigator>::trace(visitor);
  DOMWindowProperty::trace(visitor);
}

}  // namespace blink
