Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1162)

Unified Diff: Source/modules/geolocation/GeoNotifier.cpp

Issue 393793003: Separate GeoNotifier class from Geolocation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/geolocation/GeoNotifier.h ('k') | Source/modules/geolocation/Geolocation.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/geolocation/GeoNotifier.cpp
diff --git a/Source/modules/geolocation/GeoNotifier.cpp b/Source/modules/geolocation/GeoNotifier.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c877287ebb4120959cef04f035ddd49f3c10357d
--- /dev/null
+++ b/Source/modules/geolocation/GeoNotifier.cpp
@@ -0,0 +1,109 @@
+// 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 "config.h"
+#include "modules/geolocation/GeoNotifier.h"
+
+#include "modules/geolocation/Geolocation.h"
+#include "modules/geolocation/PositionCallback.h"
+#include "modules/geolocation/PositionError.h"
+#include "modules/geolocation/PositionErrorCallback.h"
+#include "modules/geolocation/PositionOptions.h"
+
+namespace WebCore {
+
+GeoNotifier::GeoNotifier(Geolocation* geolocation, PassOwnPtr<PositionCallback> successCallback, PassOwnPtr<PositionErrorCallback> errorCallback, PositionOptions* options)
+ // FIXME : m_geolocation should be removed, it makes circular dependancy.
+ : m_geolocation(geolocation)
+ , m_successCallback(successCallback)
+ , m_errorCallback(errorCallback)
+ , m_options(options)
+ , m_timer(this, &GeoNotifier::timerFired)
+ , m_useCachedPosition(false)
+{
+ ASSERT(m_geolocation);
+ ASSERT(m_successCallback);
+ ASSERT(m_options);
+}
+
+void GeoNotifier::trace(Visitor* visitor)
+{
+ visitor->trace(m_geolocation);
+ visitor->trace(m_options);
+ visitor->trace(m_fatalError);
+}
+
+void GeoNotifier::setFatalError(PositionError* error)
+{
+ // If a fatal error has already been set, stick with it. This makes sure that
+ // when permission is denied, this is the error reported, as required by the
+ // spec.
+ if (m_fatalError)
+ return;
+
+ m_fatalError = error;
+ // An existing timer may not have a zero timeout.
+ m_timer.stop();
+ m_timer.startOneShot(0, FROM_HERE);
+}
+
+void GeoNotifier::setUseCachedPosition()
+{
+ m_useCachedPosition = true;
+ m_timer.startOneShot(0, FROM_HERE);
+}
+
+void GeoNotifier::runSuccessCallback(Geoposition* position)
+{
+ // If we are here and the Geolocation permission is not approved, something has
+ // gone horribly wrong.
+ if (!m_geolocation->isAllowed())
+ CRASH();
+
+ m_successCallback->handleEvent(position);
+}
+
+void GeoNotifier::runErrorCallback(PositionError* error)
+{
+ if (m_errorCallback)
+ m_errorCallback->handleEvent(error);
+}
+
+void GeoNotifier::startTimer()
+{
+ m_timer.startOneShot(m_options->timeout() / 1000.0, FROM_HERE);
+}
+
+void GeoNotifier::stopTimer()
+{
+ m_timer.stop();
+}
+
+void GeoNotifier::timerFired(Timer<GeoNotifier>*)
+{
+ m_timer.stop();
+
+ // Test for fatal error first. This is required for the case where the LocalFrame is
+ // disconnected and requests are cancelled.
+ if (m_fatalError) {
+ runErrorCallback(m_fatalError.get());
+ // This will cause this notifier to be deleted.
+ m_geolocation->fatalErrorOccurred(this);
+ return;
+ }
+
+ if (m_useCachedPosition) {
+ // Clear the cached position flag in case this is a watch request, which
+ // will continue to run.
+ m_useCachedPosition = false;
+ m_geolocation->requestUsesCachedPosition(this);
+ return;
+ }
+
+ if (m_errorCallback)
+ m_errorCallback->handleEvent(PositionError::create(PositionError::TIMEOUT, "Timeout expired"));
+ m_geolocation->requestTimedOut(this);
+}
+
+} // namespace WebCore
« no previous file with comments | « Source/modules/geolocation/GeoNotifier.h ('k') | Source/modules/geolocation/Geolocation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698