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

Side by Side Diff: webkit/chaos/ChaosGeolocation.cpp

Issue 160084: Chaos geolocation demo, non-WebKit part. Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/chaos/ChaosGeolocation.h ('k') | webkit/chaos/ChaosGeolocation.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 #include "config.h"
2
3 #include "ChaosCoordinates.h"
4 #include "ChaosGeolocation.h"
5 #include "ChaosGeoposition.h"
6 #include "ChromeClient.h"
7 #include "DOMWindow.h"
8 #include "Frame.h"
9 #include "GeolocationPowerbox.h"
10 #include "Page.h"
11 #include "V8Proxy.h"
12
13 #undef LOG
14 #include "base/logging.h"
15 //#include "views/controls/button/radio_button.h"
16 //#include "views/view.h"
17 //#include "views/window/dialog_delegate.h"
18
19 #include "webkit/glue/webview_delegate.h"
20
21 #include <math.h>
22
23 namespace WebCore {
24
25 class ChaosGeolocationExact : public ChaosGeolocationImpl {
26 public:
27 ChaosGeolocationExact() {
28 }
29 ChaosCoordinates *coords() const {
30 return new ChaosCoordinates(1.234, 2.345, .00001);
31 }
32 std::string describe() const {
33 return "exact geolocation";
34 }
35 };
36
37 class ChaosGeolocationCity : public ChaosGeolocationImpl {
38 ChaosGeolocationImpl *source_;
39 static const double ACCURACY = .1;
40
41 static double round(double x) {
42 return x - fmod(x, ACCURACY);
43 }
44 public:
45 ChaosGeolocationCity(ChaosGeolocationImpl *source) : source_(source) {
46 }
47 ChaosCoordinates *coords() const {
48 ChaosCoordinates *sc = source_->coords();
49 ChaosCoordinates *mc = new ChaosCoordinates(round(sc->latitude()),
50 round(sc->longitude()),
51 ACCURACY);
52 delete sc;
53 return mc;
54 }
55 std::string describe() const {
56 return "city-level geoloication using " + source_->describe();
57 }
58 };
59
60 class ChooseGeolocationProvider : public ChooseGeolocationProviderCallback {
61 public:
62 ChooseGeolocationProvider(ChaosGeolocation *choosing_for)
63 : choosing_for_(choosing_for) {
64 // V8Proxy* proxy = V8Proxy::retrieve();
65 Frame *frame = V8Proxy::retrieveFrameForCurrentContext();
66 KURL url = frame->document()->url();
67 frame->page()->chrome()->client()->chooseGeolocationProvider(this, url);
68 }
69 void OnProviderChosen(GeolocationPowerbox::ProviderId provider_id) {
70 ChaosGeolocationImpl *impl = NULL;
71
72 /*
73 String urlString = url_.string();
74 LOG(WARNING) << "Choice " << provider_id << " for domain "
75 << url_.string().ascii().data();
76 */
77
78 switch(provider_id) {
79 case GeolocationPowerbox::EXACT:
80 impl = new ChaosGeolocationExact();
81 break;
82 case GeolocationPowerbox::CITY:
83 impl = new ChaosGeolocationCity(new ChaosGeolocationExact());
84 break;
85 }
86 ASSERT(impl);
87 choosing_for_->OnProviderChosen(impl);
88 // I believe this gets deleted by the caller now...
89 }
90
91 private:
92 ChaosGeolocation *choosing_for_;
93 };
94
95 static GeolocationPowerbox powerbox;
96 GeolocationBrowserPowerbox GeolocationBrowserPowerbox::powerbox;
97
98 ChooseGeolocationProvider *GeolocationPowerbox::choose(
99 ChaosGeolocation *geolocation) {
100 ChaosGeolocationImpl *choice;
101
102 ChooseGeolocationProvider *chooser
103 = new ChooseGeolocationProvider(geolocation);
104
105 return chooser;
106 }
107
108 ChaosGeolocation::ChaosGeolocation() : impl_(0) {
109 }
110
111 void ChaosGeolocation::OnProviderChosen(ChaosGeolocationImpl *impl) {
112 // FIXME(benl): refcount this
113 impl_ = impl;
114 LOG(WARNING) << "Wired up " << impl_->describe();
115 }
116
117 ChaosGeoposition *ChaosGeolocation::lastPosition() {
118 return NULL;
119 }
120
121 void ChaosGeolocation::getCurrentPosition(PassRefPtr<ChaosPositionCallback> cb) {
122 oneShots_.add(GeoNotifier::create(this, cb));
123 }
124
125 int ChaosGeolocation::watchPosition(PassRefPtr<ChaosPositionCallback> cb) {
126 static int nextWatchId = 1; // Do not start at zero, can't use it
127 // in a map since it is reserved to
128 // mean "empty".
129
130 LOG(WARNING) << "pid = " << getpid();
131 LOG(WARNING) << "wp2";
132 watchers_.set(nextWatchId, GeoNotifier::create(this, cb));
133 LOG(WARNING) << "wp3";
134
135 powerbox.choose(this);
136
137 return nextWatchId++;
138 }
139
140 void ChaosGeolocation::clearWatch(long watchId) {
141 watchers_.remove(watchId);
142 }
143
144 ChaosGeolocation::GeoNotifier::GeoNotifier(ChaosGeolocation *parent,
145 PassRefPtr<ChaosPositionCallback> successCallback)
146 : successCallback_(successCallback),
147 timer_(this, &ChaosGeolocation::GeoNotifier::timerFired),
148 parent_(parent) {
149 startTimer();
150 }
151
152 void ChaosGeolocation::GeoNotifier::startTimer() {
153 timer_.startRepeating(1);
154 }
155
156 void ChaosGeolocation::GeoNotifier::timerFired(Timer<GeoNotifier> *timer) {
157 if (!parent_->impl_)
158 return;
159
160 DLOG(WARNING) << "tock!";
161 ChaosGeoposition *pos = new ChaosGeoposition(parent_->impl_->coords());
162 successCallback_->handleEvent(pos);
163 }
164
165 } // namespace WebCore
OLDNEW
« no previous file with comments | « webkit/chaos/ChaosGeolocation.h ('k') | webkit/chaos/ChaosGeolocation.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698