diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-19 12:11:28 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-19 12:11:28 +0000 |
commit | 58c321dd57a1fc00c2c51b0a8b6e547fdf32aa74 (patch) | |
tree | cdd273a38ba1b449952d5701e6ceb6f46142c073 /chrome/renderer/geolocation_dispatcher.cc | |
parent | 2375d294b30e5d0b0bc63d26a417203959ef32af (diff) | |
download | chromium_src-58c321dd57a1fc00c2c51b0a8b6e547fdf32aa74.zip chromium_src-58c321dd57a1fc00c2c51b0a8b6e547fdf32aa74.tar.gz chromium_src-58c321dd57a1fc00c2c51b0a8b6e547fdf32aa74.tar.bz2 |
Second try for:
http://src.chromium.org/viewvc/chrome?view=rev&revision=39374
Initial Geolocation implementation
Adds IPC plumbing.
Adds Infobar buttons for requesting permission
This change specifically:
ui_test_utils::WaitForAppModalDialog registers for listening to notifications too late, i.e., after the dialog had been triggered.
Exposes AppModalDialogObserver so that we can register, trigger the dialog, then wait for it.
Review URL: http://codereview.chromium.org/647048
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39435 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/geolocation_dispatcher.cc')
-rw-r--r-- | chrome/renderer/geolocation_dispatcher.cc | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/chrome/renderer/geolocation_dispatcher.cc b/chrome/renderer/geolocation_dispatcher.cc new file mode 100644 index 0000000..fedad06 --- /dev/null +++ b/chrome/renderer/geolocation_dispatcher.cc @@ -0,0 +1,104 @@ +// Copyright (c) 2010 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 "chrome/renderer/geolocation_dispatcher.h" + +#include "base/command_line.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/renderer/render_view.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebCString.h" + +using WebKit::WebFrame; + +GeolocationDispatcher::GeolocationDispatcher(RenderView* render_view) + : render_view_(render_view) { + render_view_->Send(new ViewHostMsg_Geolocation_RegisterDispatcher( + render_view_->routing_id())); +} + +GeolocationDispatcher::~GeolocationDispatcher() { + render_view_->Send(new ViewHostMsg_Geolocation_UnregisterDispatcher( + render_view_->routing_id())); +} + +bool GeolocationDispatcher::OnMessageReceived(const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(GeolocationDispatcher, message) + IPC_MESSAGE_HANDLER(ViewMsg_Geolocation_PermissionSet, + OnGeolocationPermissionSet) + IPC_MESSAGE_HANDLER(ViewMsg_Geolocation_PositionUpdated, + OnGeolocationPositionUpdated) + IPC_MESSAGE_HANDLER(ViewMsg_Geolocation_Error, OnGeolocationError) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void GeolocationDispatcher::requestPermissionForFrame( + int bridge_id, const WebKit::WebURL& url) { + render_view_->Send(new ViewHostMsg_Geolocation_RequestPermission( + bridge_id, render_view_->routing_id(), GURL(url).GetOrigin())); +} + +void GeolocationDispatcher::startUpdating(int bridge_id, bool hasHighAccuracy) { + render_view_->Send(new ViewHostMsg_Geolocation_StartUpdating( + bridge_id, render_view_->routing_id(), hasHighAccuracy)); +} + +void GeolocationDispatcher::stopUpdating(int bridge_id) { + render_view_->Send(new ViewHostMsg_Geolocation_StopUpdating( + bridge_id, render_view_->routing_id())); +} + +void GeolocationDispatcher::suspend(int bridge_id) { + render_view_->Send(new ViewHostMsg_Geolocation_Suspend( + bridge_id, render_view_->routing_id())); +} + +void GeolocationDispatcher::resume(int bridge_id) { + render_view_->Send(new ViewHostMsg_Geolocation_Resume( + bridge_id, render_view_->routing_id())); +} + +int GeolocationDispatcher::attachBridge( + WebKit::WebGeolocationServiceBridge* bridge) { + return bridges_map_.Add(bridge); +} + +void GeolocationDispatcher::dettachBridge(int bridge_id) { + bridges_map_.Remove(bridge_id); +} + +void GeolocationDispatcher::OnGeolocationPermissionSet(int bridge_id, + bool allowed) { + WebKit::WebGeolocationServiceBridge* bridge = bridges_map_.Lookup(bridge_id); + if (bridge) { + bridge->setIsAllowed(allowed); + } +} + +void GeolocationDispatcher::OnGeolocationPositionUpdated( + const Geoposition& geoposition) { + for (IDMap<WebKit::WebGeolocationServiceBridge>::iterator it(&bridges_map_); + !it.IsAtEnd(); it.Advance()) { + it.GetCurrentValue()->setLastPosition( + geoposition.latitude, geoposition.longitude, + geoposition.is_valid_altitude(), geoposition.altitude, + geoposition.accuracy, + geoposition.is_valid_altitude_accuracy(), geoposition.altitude_accuracy, + geoposition.is_valid_heading(), geoposition.heading, + geoposition.is_valid_speed(), geoposition.speed, + geoposition.timestamp); + } +} + +void GeolocationDispatcher::OnGeolocationError(int code, + const std::string& message) { + for (IDMap<WebKit::WebGeolocationServiceBridge>::iterator it(&bridges_map_); + !it.IsAtEnd(); it.Advance()) { + it.GetCurrentValue()->setLastError( + code, WebKit::WebString::fromUTF8(message)); + } +} |