OSDN Git Service

When Geolocation permissions are denied, terminate all watchers as well as one-shots.
authorSteve Block <steveblock@google.com>
Wed, 12 Aug 2009 16:26:45 +0000 (17:26 +0100)
committerSteve Block <steveblock@google.com>
Fri, 14 Aug 2009 14:42:19 +0000 (15:42 +0100)
WebCore/page/Geolocation.cpp
WebCore/page/PositionError.h

index 5421eaa..7fa3a6d 100644 (file)
@@ -190,6 +190,7 @@ void Geolocation::setIsAllowed(bool allowed)
         makeSuccessCallbacks();
     } else {
         WTF::RefPtr<WebCore::PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage);
+        error->setIsFatal(true);
         handleError(error.get());
     }
 }
@@ -291,6 +292,9 @@ void Geolocation::handleError(PositionError* error)
     sendErrorToWatchers(error);
 
     m_oneShots.clear();
+
+    if (error->isFatal())
+        m_watchers.clear();
 }
 
 void Geolocation::requestPermission()
index 1d31f3b..c309061 100644 (file)
@@ -45,16 +45,22 @@ public:
 
     ErrorCode code() const { return m_code; }
     const String& message() const { return m_message; }
+    void setIsFatal(bool isFatal) { m_isFatal = isFatal; }
+    bool isFatal() { return m_isFatal; }
     
 private:
     PositionError(ErrorCode code, const String& message) 
         : m_code(code)
         , m_message(message)
+        , m_isFatal(false)
     {
     }
     
     ErrorCode m_code;
     String m_message;
+    // Whether the error is fatal, such that no request can ever obtain a good
+    // position fix in the future.
+    bool m_isFatal;
 };
     
 } // namespace WebCore