OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library usage_impl_html; | |
6 | |
7 import 'dart:async'; | 5 import 'dart:async'; |
8 import 'dart:convert' show JSON; | 6 import 'dart:convert' show JSON; |
9 import 'dart:html'; | 7 import 'dart:html'; |
10 | 8 |
11 import 'usage_impl.dart'; | 9 import 'usage_impl.dart'; |
12 | 10 |
| 11 /// An interface to a Google Analytics session, suitable for use in web apps. |
| 12 /// |
| 13 /// [analyticsUrl] is an optional replacement for the default Google Analytics |
| 14 /// URL (`https://www.google-analytics.com/collect`). |
| 15 class AnalyticsHtml extends AnalyticsImpl { |
| 16 AnalyticsHtml( |
| 17 String trackingId, String applicationName, String applicationVersion, |
| 18 {String analyticsUrl}) |
| 19 : super(trackingId, new HtmlPersistentProperties(applicationName), |
| 20 new HtmlPostHandler(), |
| 21 applicationName: applicationName, |
| 22 applicationVersion: applicationVersion, |
| 23 analyticsUrl: analyticsUrl) { |
| 24 int screenWidth = window.screen.width; |
| 25 int screenHeight = window.screen.height; |
| 26 |
| 27 setSessionValue('sr', '${screenWidth}x$screenHeight'); |
| 28 setSessionValue('sd', '${window.screen.pixelDepth}-bits'); |
| 29 setSessionValue('ul', window.navigator.language); |
| 30 } |
| 31 } |
| 32 |
| 33 typedef Future<HttpRequest> HttpRequestor(String url, |
| 34 {String method, sendData}); |
| 35 |
13 class HtmlPostHandler extends PostHandler { | 36 class HtmlPostHandler extends PostHandler { |
14 final Function mockRequestor; | 37 final HttpRequestor mockRequestor; |
15 | 38 |
16 HtmlPostHandler({Function this.mockRequestor}); | 39 HtmlPostHandler({this.mockRequestor}); |
17 | 40 |
| 41 @override |
18 Future sendPost(String url, Map<String, dynamic> parameters) { | 42 Future sendPost(String url, Map<String, dynamic> parameters) { |
19 int viewportWidth = document.documentElement.clientWidth; | 43 int viewportWidth = document.documentElement.clientWidth; |
20 int viewportHeight = document.documentElement.clientHeight; | 44 int viewportHeight = document.documentElement.clientHeight; |
21 | 45 |
22 parameters['vp'] = '${viewportWidth}x$viewportHeight'; | 46 parameters['vp'] = '${viewportWidth}x$viewportHeight'; |
23 | 47 |
24 String data = postEncode(parameters); | 48 String data = postEncode(parameters); |
25 var request = mockRequestor == null ? HttpRequest.request : mockRequestor; | 49 HttpRequestor requestor = |
26 return request(url, method: 'POST', sendData: data).catchError((e) { | 50 mockRequestor == null ? HttpRequest.request : mockRequestor; |
| 51 return requestor(url, method: 'POST', sendData: data).catchError((e) { |
27 // Catch errors that can happen during a request, but that we can't do | 52 // Catch errors that can happen during a request, but that we can't do |
28 // anything about, e.g. a missing internet conenction. | 53 // anything about, e.g. a missing internet connection. |
29 }); | 54 }); |
30 } | 55 } |
| 56 |
| 57 @override |
| 58 void close() {} |
31 } | 59 } |
32 | 60 |
33 class HtmlPersistentProperties extends PersistentProperties { | 61 class HtmlPersistentProperties extends PersistentProperties { |
34 Map _map; | 62 Map _map; |
35 | 63 |
36 HtmlPersistentProperties(String name) : super(name) { | 64 HtmlPersistentProperties(String name) : super(name) { |
37 String str = window.localStorage[name]; | 65 String str = window.localStorage[name]; |
38 if (str == null || str.isEmpty) str = '{}'; | 66 if (str == null || str.isEmpty) str = '{}'; |
39 _map = JSON.decode(str); | 67 _map = JSON.decode(str); |
40 } | 68 } |
41 | 69 |
42 dynamic operator[](String key) => _map[key]; | 70 @override |
| 71 dynamic operator [](String key) => _map[key]; |
43 | 72 |
44 void operator[]=(String key, dynamic value) { | 73 @override |
| 74 void operator []=(String key, dynamic value) { |
45 if (value == null) { | 75 if (value == null) { |
46 _map.remove(key); | 76 _map.remove(key); |
47 } else { | 77 } else { |
48 _map[key] = value; | 78 _map[key] = value; |
49 } | 79 } |
50 | 80 |
51 window.localStorage[name] = JSON.encode(_map); | 81 window.localStorage[name] = JSON.encode(_map); |
52 } | 82 } |
| 83 |
| 84 @override |
| 85 void syncSettings() {} |
53 } | 86 } |
OLD | NEW |