10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <algorithm> 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <iterator> 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/bind.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/time/time.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/geoposition.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/url_request/url_request_context_getter.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "url/gurl.h" 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace chromeos { 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultGeolocationProviderUrl[] = 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "https://www.googleapis.com/geolocation/v1/geolocate?"; 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSimpleGeolocationProvider::SimpleGeolocationProvider( 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch net::URLRequestContextGetter* url_context_getter, 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& url) 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : url_context_getter_(url_context_getter), url_(url) { 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSimpleGeolocationProvider::~SimpleGeolocationProvider() { 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SimpleGeolocationProvider::RequestGeolocation( 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::TimeDelta timeout, 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SimpleGeolocationRequest::ResponseCallback callback) { 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SimpleGeolocationRequest* request( 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new SimpleGeolocationRequest(url_context_getter_.get(), url_, timeout)); 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch requests_.push_back(request); 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // SimpleGeolocationProvider owns all requests. It is safe to pass unretained 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // "this" because destruction of SimpleGeolocationProvider cancels all 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // requests. 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SimpleGeolocationRequest::ResponseCallback callback_tmp( 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(&SimpleGeolocationProvider::OnGeolocationResponse, 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Unretained(this), 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch request, 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback)); 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch request->MakeRequest(callback_tmp); 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// static 530529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGURL SimpleGeolocationProvider::DefaultGeolocationProviderURL() { 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return GURL(kDefaultGeolocationProviderUrl); 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SimpleGeolocationProvider::OnGeolocationResponse( 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SimpleGeolocationRequest* request, 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SimpleGeolocationRequest::ResponseCallback callback, 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const Geoposition& geoposition, 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool server_error, 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::TimeDelta elapsed) { 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(geoposition, server_error, elapsed); 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedVector<SimpleGeolocationRequest>::iterator new_end = 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::remove(requests_.begin(), requests_.end(), request); 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK_EQ(std::distance(new_end, requests_.end()), 1); 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch requests_.erase(new_end, requests_.end()); 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace chromeos 74