forked from ampproject/amphtml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
analytics.js
108 lines (101 loc) · 3.73 KB
/
analytics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* Copyright 2016 The AMP HTML Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
getElementServiceForDoc,
getElementServiceIfAvailableForDoc,
} from './element-service';
import {createElementWithAttributes} from './dom';
import {getAmpdoc} from './service';
import {extensionsFor} from './services';
import {dev} from './log';
import {dict} from './utils/object';
/**
* @param {!Node|!./service/ampdoc-impl.AmpDoc} nodeOrDoc
* @param {boolean=} loadAnalytics
* @return {!Promise<!../extensions/amp-analytics/0.1/instrumentation.InstrumentationService>}
*/
export function analyticsForDoc(nodeOrDoc, loadAnalytics = false) {
if (loadAnalytics) {
// Get Extensions service and force load analytics extension.
const ampdoc = getAmpdoc(nodeOrDoc);
extensionsFor(ampdoc.win)./*OK*/loadExtension('amp-analytics');
}
return (/** @type {!Promise<
!../extensions/amp-analytics/0.1/instrumentation.InstrumentationService
>} */ (getElementServiceForDoc(
nodeOrDoc, 'amp-analytics-instrumentation', 'amp-analytics')));
}
/**
* @param {!Node|!./service/ampdoc-impl.AmpDoc} nodeOrDoc
* @return {!Promise<?../extensions/amp-analytics/0.1/instrumentation.InstrumentationService>}
*/
export function analyticsForDocOrNull(nodeOrDoc) {
return (/** @type {!Promise<
?../extensions/amp-analytics/0.1/instrumentation.InstrumentationService
>} */ (getElementServiceIfAvailableForDoc(
nodeOrDoc, 'amp-analytics-instrumentation', 'amp-analytics')));
}
/**
* Helper method to trigger analytics event if amp-analytics is available.
* @param {!Element} target
* @param {string} eventType
* @param {!Object<string, string>=} opt_vars A map of vars and their values.
*/
export function triggerAnalyticsEvent(target, eventType, opt_vars) {
analyticsForDocOrNull(target).then(analytics => {
if (!analytics) {
return;
}
analytics.triggerEventForTarget(target, eventType, opt_vars);
});
}
/**
* Method to create scoped analytics element for any element.
* @param {!Element} parentElement
* @param {!JsonObject} config
* @param {boolean=} loadAnalytics
* @return {!Element} created analytics element
*/
export function insertAnalyticsElement(
parentElement, config, loadAnalytics = false) {
const doc = /** @type {!Document} */ (parentElement.ownerDocument);
const analyticsElem = createElementWithAttributes(
doc,
'amp-analytics', dict({
'sandbox': 'true',
'trigger': 'immediate',
}));
const scriptElem = createElementWithAttributes(
doc,
'script', dict({
'type': 'application/json',
}));
scriptElem.textContent = JSON.stringify(config);
analyticsElem.appendChild(scriptElem);
analyticsElem.CONFIG = config;
// Force load analytics extension if script not included in page.
if (loadAnalytics) {
// Get Extensions service and force load analytics extension.
const extensions = extensionsFor(parentElement.ownerDocument.defaultView);
extensions./*OK*/loadExtension('amp-analytics');
} else {
analyticsForDocOrNull(parentElement).then(analytics => {
dev().assert(analytics);
});
}
parentElement.appendChild(analyticsElem);
return analyticsElem;
}