do not merge: cherry-picked 360742dd52ce2e67f08b219c5148577ce2e2b741 from master branch

When Geolocation permissions are denied, terminate all watchers as well as one-shots.
diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp
index 5421eaa..7fa3a6d 100644
--- a/WebCore/page/Geolocation.cpp
+++ b/WebCore/page/Geolocation.cpp
@@ -190,6 +190,7 @@
         makeSuccessCallbacks();
     } else {
         WTF::RefPtr<WebCore::PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage);
+        error->setIsFatal(true);
         handleError(error.get());
     }
 }
@@ -291,6 +292,9 @@
     sendErrorToWatchers(error);
 
     m_oneShots.clear();
+
+    if (error->isFatal())
+        m_watchers.clear();
 }
 
 void Geolocation::requestPermission()
diff --git a/WebCore/page/PositionError.h b/WebCore/page/PositionError.h
index 1d31f3b..c309061 100644
--- a/WebCore/page/PositionError.h
+++ b/WebCore/page/PositionError.h
@@ -45,16 +45,22 @@
 
     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