WebGeolocationManager.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
  14. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  15. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
  17. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  18. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  19. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  21. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  22. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  23. * THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "config.h"
  26. #include "WebGeolocationManager.h"
  27. #include "WebGeolocationManagerMessages.h"
  28. #include "WebGeolocationManagerProxyMessages.h"
  29. #include "WebPage.h"
  30. #include "WebProcess.h"
  31. #include <WebCore/Geolocation.h>
  32. #include <WebCore/GeolocationController.h>
  33. #include <WebCore/GeolocationError.h>
  34. #include <WebCore/GeolocationPosition.h>
  35. #include <WebCore/Page.h>
  36. using namespace WebCore;
  37. namespace WebKit {
  38. const char* WebGeolocationManager::supplementName()
  39. {
  40. return "WebGeolocationManager";
  41. }
  42. WebGeolocationManager::WebGeolocationManager(WebProcess* process)
  43. : m_process(process)
  44. {
  45. m_process->addMessageReceiver(Messages::WebGeolocationManager::messageReceiverName(), this);
  46. }
  47. WebGeolocationManager::~WebGeolocationManager()
  48. {
  49. }
  50. void WebGeolocationManager::registerWebPage(WebPage* page)
  51. {
  52. bool wasEmpty = m_pageSet.isEmpty();
  53. m_pageSet.add(page);
  54. if (wasEmpty)
  55. m_process->parentProcessConnection()->send(Messages::WebGeolocationManagerProxy::StartUpdating(), 0);
  56. }
  57. void WebGeolocationManager::unregisterWebPage(WebPage* page)
  58. {
  59. m_pageSet.remove(page);
  60. if (m_pageSet.isEmpty())
  61. m_process->parentProcessConnection()->send(Messages::WebGeolocationManagerProxy::StopUpdating(), 0);
  62. }
  63. void WebGeolocationManager::didChangePosition(const WebGeolocationPosition::Data& data)
  64. {
  65. #if ENABLE(GEOLOCATION)
  66. RefPtr<GeolocationPosition> position = GeolocationPosition::create(data.timestamp, data.latitude, data.longitude, data.accuracy, data.canProvideAltitude, data.altitude, data.canProvideAltitudeAccuracy, data.altitudeAccuracy, data.canProvideHeading, data.heading, data.canProvideSpeed, data.speed);
  67. Vector<RefPtr<WebPage>> webPageCopy;
  68. copyToVector(m_pageSet, webPageCopy);
  69. for (size_t i = 0; i < webPageCopy.size(); ++i) {
  70. WebPage* page = webPageCopy[i].get();
  71. if (page->corePage())
  72. GeolocationController::from(page->corePage())->positionChanged(position.get());
  73. }
  74. #else
  75. UNUSED_PARAM(data);
  76. #endif // ENABLE(GEOLOCATION)
  77. }
  78. void WebGeolocationManager::didFailToDeterminePosition(const String& errorMessage)
  79. {
  80. #if ENABLE(GEOLOCATION)
  81. // FIXME: Add localized error string.
  82. RefPtr<GeolocationError> error = GeolocationError::create(GeolocationError::PositionUnavailable, errorMessage);
  83. Vector<RefPtr<WebPage>> webPageCopy;
  84. copyToVector(m_pageSet, webPageCopy);
  85. for (size_t i = 0; i < webPageCopy.size(); ++i) {
  86. WebPage* page = webPageCopy[i].get();
  87. if (page->corePage())
  88. GeolocationController::from(page->corePage())->errorOccurred(error.get());
  89. }
  90. #else
  91. UNUSED_PARAM(errorMessage);
  92. #endif // ENABLE(GEOLOCATION)
  93. }
  94. } // namespace WebKit