run_loop 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/run_loop.rb +1 -0
- data/lib/run_loop/core.rb +22 -18
- data/lib/run_loop/environment.rb +15 -6
- data/lib/run_loop/template.rb +22 -0
- data/lib/run_loop/version.rb +1 -1
- data/lib/run_loop/xcode.rb +15 -0
- data/scripts/{json2-min.js → lib/json2.min.js} +0 -0
- data/scripts/lib/log.js +26 -0
- data/scripts/lib/on_alert.js +103 -0
- data/scripts/run_dismiss_location.js +1 -37
- data/scripts/run_loop_basic.js +9 -223
- data/scripts/run_loop_fast_uia.js +9 -238
- data/scripts/run_loop_host.js +7 -242
- data/scripts/run_loop_shared_element.js +9 -238
- metadata +6 -4
- data/scripts/json2.js +0 -486
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 555d66495497677e02f04d4636929bb5eaf0915d
|
4
|
+
data.tar.gz: 731b06dbc736209fd00ca51fe9baf5a18a354e95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8415189c600977b255ee274e6cdd9f123fcdf8df8dae8aad3adbf1c4d2c23af945cb3b4cc7a36647adcf38a47bc26ecdd866cf2180739ef0882409d280ef2285
|
7
|
+
data.tar.gz: ccf930290492ddee04e8372f5bf5e25c7f1101c40821b0c227bf8fd624186f8f3f6ce98509d92bffe3845ce7360f43314e9fe797d7df0985a2512cfcd8234e4c
|
data/lib/run_loop.rb
CHANGED
data/lib/run_loop/core.rb
CHANGED
@@ -15,15 +15,15 @@ module RunLoop
|
|
15
15
|
START_DELIMITER = "OUTPUT_JSON:\n"
|
16
16
|
END_DELIMITER="\nEND_OUTPUT"
|
17
17
|
|
18
|
-
SCRIPTS_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'scripts'))
|
19
18
|
SCRIPTS = {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
:dismiss => 'run_dismiss_location.js',
|
20
|
+
:run_loop_host => 'run_loop_host.js',
|
21
|
+
:run_loop_fast_uia => 'run_loop_fast_uia.js',
|
22
|
+
:run_loop_shared_element => 'run_loop_shared_element.js',
|
23
|
+
:run_loop_basic => 'run_loop_basic.js'
|
25
24
|
}
|
26
25
|
|
26
|
+
SCRIPTS_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'scripts'))
|
27
27
|
READ_SCRIPT_PATH = File.join(SCRIPTS_PATH, 'read-cmd.sh')
|
28
28
|
TIMEOUT_SCRIPT_PATH = File.join(SCRIPTS_PATH, 'timeout3')
|
29
29
|
|
@@ -54,7 +54,7 @@ module RunLoop
|
|
54
54
|
if SCRIPTS[key].nil?
|
55
55
|
return nil
|
56
56
|
end
|
57
|
-
|
57
|
+
SCRIPTS[key]
|
58
58
|
end
|
59
59
|
|
60
60
|
def self.detect_connected_device
|
@@ -244,7 +244,7 @@ module RunLoop
|
|
244
244
|
|
245
245
|
script = File.join(results_dir, '_run_loop.js')
|
246
246
|
|
247
|
-
code =
|
247
|
+
code = UIAScriptTemplate.new(SCRIPTS_PATH, options[:script]).result
|
248
248
|
code = code.gsub(/\$PATH/, results_dir)
|
249
249
|
code = code.gsub(/\$READ_SCRIPT_PATH/, READ_SCRIPT_PATH)
|
250
250
|
code = code.gsub(/\$TIMEOUT_SCRIPT_PATH/, TIMEOUT_SCRIPT_PATH)
|
@@ -254,13 +254,15 @@ module RunLoop
|
|
254
254
|
FileUtils.rm_f(repl_path)
|
255
255
|
|
256
256
|
uia_strategy = options[:uia_strategy]
|
257
|
+
|
257
258
|
if uia_strategy == :host
|
258
259
|
create_uia_pipe(repl_path)
|
259
|
-
RunLoop::HostCache.default.clear unless RunLoop::Environment.xtc?
|
260
260
|
else
|
261
261
|
FileUtils.touch repl_path
|
262
262
|
end
|
263
263
|
|
264
|
+
RunLoop::HostCache.default.clear unless RunLoop::Environment.xtc?
|
265
|
+
|
264
266
|
cal_script = File.join(SCRIPTS_PATH, 'calabash_script_uia.js')
|
265
267
|
File.open(script, 'w') do |file|
|
266
268
|
if include_calabash_script?(options)
|
@@ -472,22 +474,24 @@ Logfile: #{log_file}
|
|
472
474
|
# version.
|
473
475
|
def self.default_simulator(xcode=RunLoop::Xcode.new)
|
474
476
|
|
475
|
-
if xcode.
|
476
|
-
|
477
|
+
if xcode.version_gte_72?
|
478
|
+
"iPhone 6s (9.2)"
|
479
|
+
elsif xcode.version_gte_71?
|
480
|
+
"iPhone 6s (9.1)"
|
477
481
|
elsif xcode.version_gte_7?
|
478
|
-
|
482
|
+
"iPhone 5s (9.0)"
|
479
483
|
elsif xcode.version_gte_64?
|
480
|
-
|
484
|
+
"iPhone 5s (8.4 Simulator)"
|
481
485
|
elsif xcode.version_gte_63?
|
482
|
-
|
486
|
+
"iPhone 5s (8.3 Simulator)"
|
483
487
|
elsif xcode.version_gte_62?
|
484
|
-
|
488
|
+
"iPhone 5s (8.2 Simulator)"
|
485
489
|
elsif xcode.version_gte_61?
|
486
|
-
|
490
|
+
"iPhone 5s (8.1 Simulator)"
|
487
491
|
elsif xcode.version_gte_6?
|
488
|
-
|
492
|
+
"iPhone 5s (8.0 Simulator)"
|
489
493
|
else
|
490
|
-
|
494
|
+
"iPhone Retina (4-inch) - Simulator - iOS 7.1"
|
491
495
|
end
|
492
496
|
end
|
493
497
|
|
data/lib/run_loop/environment.rb
CHANGED
@@ -85,7 +85,7 @@ module RunLoop
|
|
85
85
|
# Checks the value of JENKINS_HOME
|
86
86
|
def self.jenkins?
|
87
87
|
value = ENV["JENKINS_HOME"]
|
88
|
-
|
88
|
+
!!value && value != ''
|
89
89
|
end
|
90
90
|
|
91
91
|
# Returns true if running in Travis CI
|
@@ -93,7 +93,7 @@ module RunLoop
|
|
93
93
|
# Checks the value of TRAVIS
|
94
94
|
def self.travis?
|
95
95
|
value = ENV["TRAVIS"]
|
96
|
-
|
96
|
+
!!value && value != ''
|
97
97
|
end
|
98
98
|
|
99
99
|
# Returns true if running in Circle CI
|
@@ -101,7 +101,7 @@ module RunLoop
|
|
101
101
|
# Checks the value of CIRCLECI
|
102
102
|
def self.circle_ci?
|
103
103
|
value = ENV["CIRCLECI"]
|
104
|
-
|
104
|
+
!!value && value != ''
|
105
105
|
end
|
106
106
|
|
107
107
|
# Returns true if running in Teamcity
|
@@ -109,7 +109,15 @@ module RunLoop
|
|
109
109
|
# Checks the value of TEAMCITY_PROJECT_NAME
|
110
110
|
def self.teamcity?
|
111
111
|
value = ENV["TEAMCITY_PROJECT_NAME"]
|
112
|
-
|
112
|
+
!!value && value != ''
|
113
|
+
end
|
114
|
+
|
115
|
+
# Returns true if running in Teamcity
|
116
|
+
#
|
117
|
+
# Checks the value of GITLAB_CI
|
118
|
+
def self.gitlab?
|
119
|
+
value = ENV["GITLAB_CI"]
|
120
|
+
!!value && value != ''
|
113
121
|
end
|
114
122
|
|
115
123
|
# Returns true if running in a CI environment
|
@@ -119,7 +127,8 @@ module RunLoop
|
|
119
127
|
self.travis?,
|
120
128
|
self.jenkins?,
|
121
129
|
self.circle_ci?,
|
122
|
-
self.teamcity
|
130
|
+
self.teamcity?,
|
131
|
+
self.gitlab?
|
123
132
|
].any?
|
124
133
|
end
|
125
134
|
|
@@ -145,7 +154,7 @@ module RunLoop
|
|
145
154
|
# !@visibility private
|
146
155
|
def self.ci_var_defined?
|
147
156
|
value = ENV["CI"]
|
148
|
-
|
157
|
+
!!value && value != ''
|
149
158
|
end
|
150
159
|
end
|
151
160
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module RunLoop
|
4
|
+
|
5
|
+
# class to break up javascript templates in to reusable chunks
|
6
|
+
class UIAScriptTemplate < ERB
|
7
|
+
def initialize(template_root, template_relative_path)
|
8
|
+
@template_root = template_root
|
9
|
+
@template = File.read(File.join(@template_root, template_relative_path))
|
10
|
+
super(@template)
|
11
|
+
end
|
12
|
+
|
13
|
+
def render_template(template_relative_path)
|
14
|
+
return UIAScriptTemplate.new(@template_root, template_relative_path).result
|
15
|
+
end
|
16
|
+
|
17
|
+
def result
|
18
|
+
super(binding)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/run_loop/version.rb
CHANGED
data/lib/run_loop/xcode.rb
CHANGED
@@ -24,6 +24,14 @@ module RunLoop
|
|
24
24
|
to_s
|
25
25
|
end
|
26
26
|
|
27
|
+
# Returns a version instance for `Xcode 7.1`; used to check for the
|
28
|
+
# availability of features and paths to various items on the filesystem.
|
29
|
+
#
|
30
|
+
# @return [RunLoop::Version] 7.1
|
31
|
+
def v72
|
32
|
+
fetch_version(:v72)
|
33
|
+
end
|
34
|
+
|
27
35
|
# Returns a version instance for `Xcode 7.1`; used to check for the
|
28
36
|
# availability of features and paths to various items on the filesystem.
|
29
37
|
#
|
@@ -96,6 +104,13 @@ module RunLoop
|
|
96
104
|
fetch_version(:v50)
|
97
105
|
end
|
98
106
|
|
107
|
+
# Is the active Xcode version 7.1 or above?
|
108
|
+
#
|
109
|
+
# @return [Boolean] `true` if the current Xcode version is >= 7.1
|
110
|
+
def version_gte_72?
|
111
|
+
version >= v72
|
112
|
+
end
|
113
|
+
|
99
114
|
# Is the active Xcode version 7.1 or above?
|
100
115
|
#
|
101
116
|
# @return [Boolean] `true` if the current Xcode version is >= 7.1
|
File without changes
|
data/scripts/lib/log.js
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
var Log = (function () {
|
2
|
+
var forceFlush = [],
|
3
|
+
N = 16384,
|
4
|
+
i = N;
|
5
|
+
while (i--) {
|
6
|
+
forceFlush[i] = "*";
|
7
|
+
}
|
8
|
+
forceFlush = forceFlush.join('');
|
9
|
+
|
10
|
+
function log_json(object, flush)
|
11
|
+
{
|
12
|
+
UIALogger.logMessage("OUTPUT_JSON:\n"+JSON.stringify(object)+"\nEND_OUTPUT");
|
13
|
+
if (flush) {
|
14
|
+
UIALogger.logMessage(forceFlush);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
return {
|
19
|
+
result: function (status, data, flush) {
|
20
|
+
log_json({"status": status, "value": data, "index":_actualIndex}, flush)
|
21
|
+
},
|
22
|
+
output: function (msg, flush) {
|
23
|
+
log_json({"output": msg,"last_index":_actualIndex}, flush);
|
24
|
+
}
|
25
|
+
};
|
26
|
+
})();
|
@@ -0,0 +1,103 @@
|
|
1
|
+
function findAlertViewText(alert) {
|
2
|
+
if (!alert) {
|
3
|
+
return false;
|
4
|
+
}
|
5
|
+
var txt = alert.name(),
|
6
|
+
txts;
|
7
|
+
if (txt == null) {
|
8
|
+
txts = alert.staticTexts();
|
9
|
+
if (txts != null && txts.length > 0) {
|
10
|
+
|
11
|
+
txt = txts[0].name();
|
12
|
+
}
|
13
|
+
|
14
|
+
}
|
15
|
+
return txt;
|
16
|
+
}
|
17
|
+
|
18
|
+
function englishLocalizations() {
|
19
|
+
return [
|
20
|
+
["OK", /Would Like to Use Your Current Location/],
|
21
|
+
["OK", /Location Accuracy/],
|
22
|
+
["Allow", /access your location/],
|
23
|
+
["OK", /Would Like to Access Your Photos/],
|
24
|
+
["OK", /Would Like to Access Your Contacts/],
|
25
|
+
["OK", /Access the Microphone/],
|
26
|
+
["OK", /Would Like to Access Your Calendar/],
|
27
|
+
["OK", /Would Like to Access Your Reminders/],
|
28
|
+
["OK", /Would Like to Access Your Motion Activity/],
|
29
|
+
["OK", /Would Like to Access the Camera/],
|
30
|
+
["OK", /Would Like to Access Your Motion & Fitness Activity/],
|
31
|
+
["OK", /Would Like Access to Twitter Accounts/],
|
32
|
+
["OK", /data available to nearby bluetooth devices/],
|
33
|
+
["OK", /Would Like to Send You Notifications/],
|
34
|
+
["OK", /would like to send you Push Notifications/]
|
35
|
+
];
|
36
|
+
}
|
37
|
+
|
38
|
+
function danishLocalizations() {
|
39
|
+
return [
|
40
|
+
// Location
|
41
|
+
["Tillad", /bruge din lokalitet, når du bruger appen/],
|
42
|
+
["Tillad", /også når du ikke bruger appen/],
|
43
|
+
["OK", /vil bruge din aktuelle placering/]
|
44
|
+
];
|
45
|
+
}
|
46
|
+
|
47
|
+
function spanishLocalizations() {
|
48
|
+
return [
|
49
|
+
// APNS
|
50
|
+
["OK", /enviarle notificaiones/]
|
51
|
+
];
|
52
|
+
}
|
53
|
+
|
54
|
+
function germanLocalizations() {
|
55
|
+
return [
|
56
|
+
// Location
|
57
|
+
["Ja", /Darf (?:.)+ Ihren aktuellen Ort verwenden/]
|
58
|
+
];
|
59
|
+
}
|
60
|
+
|
61
|
+
function dutchLocalizations() {
|
62
|
+
return [
|
63
|
+
// APNS
|
64
|
+
["OK", /wil u berichten stuern/]
|
65
|
+
];
|
66
|
+
}
|
67
|
+
|
68
|
+
function russianLocalizations() {
|
69
|
+
return [
|
70
|
+
// Location
|
71
|
+
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/]
|
72
|
+
];
|
73
|
+
}
|
74
|
+
|
75
|
+
function localizations() {
|
76
|
+
return [].concat(
|
77
|
+
danishLocalizations(),
|
78
|
+
dutchLocalizations(),
|
79
|
+
englishLocalizations(),
|
80
|
+
germanLocalizations(),
|
81
|
+
russianLocalizations(),
|
82
|
+
spanishLocalizations()
|
83
|
+
);
|
84
|
+
}
|
85
|
+
|
86
|
+
function isPrivacyAlert(alert) {
|
87
|
+
|
88
|
+
var ans, exp, txt;
|
89
|
+
|
90
|
+
var exps = localizations();
|
91
|
+
|
92
|
+
txt = findAlertViewText(alert);
|
93
|
+
Log.output({"output":"alert: "+txt}, true);
|
94
|
+
for (var i = 0; i < exps.length; i++) {
|
95
|
+
ans = exps[i][0];
|
96
|
+
exp = exps[i][1];
|
97
|
+
if (exp.test(txt)) {
|
98
|
+
return ans;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
return false;
|
102
|
+
}
|
103
|
+
|
@@ -1,43 +1,7 @@
|
|
1
1
|
var target = UIATarget.localTarget(),
|
2
2
|
screenshot_count = 0;
|
3
3
|
|
4
|
-
|
5
|
-
if (!alert) {
|
6
|
-
return false;
|
7
|
-
}
|
8
|
-
var txt = alert.name(),
|
9
|
-
txts;
|
10
|
-
if (txt == null) {
|
11
|
-
txts = alert.staticTexts();
|
12
|
-
if (txts != null && txts.length > 0) {
|
13
|
-
|
14
|
-
txt = txts[0].name();
|
15
|
-
}
|
16
|
-
|
17
|
-
}
|
18
|
-
return txt;
|
19
|
-
}
|
20
|
-
|
21
|
-
function isLocationPrompt(alert) {
|
22
|
-
var exps = [
|
23
|
-
["OK", /vil bruge din aktuelle placering/],
|
24
|
-
["OK", /Would Like to Use Your Current Location/],
|
25
|
-
["Ja", /Darf (?:.)+ Ihren aktuellen Ort verwenden/]
|
26
|
-
],
|
27
|
-
ans, exp,
|
28
|
-
txt;
|
29
|
-
|
30
|
-
txt = findAlertViewText(alert);
|
31
|
-
for (var i = 0; i < exps.length; i++) {
|
32
|
-
ans = exps[i][0];
|
33
|
-
exp = exps[i][1];
|
34
|
-
if (exp.test(txt)) {
|
35
|
-
return ans;
|
36
|
-
}
|
37
|
-
}
|
38
|
-
return false;
|
39
|
-
}
|
40
|
-
|
4
|
+
<%= render_template("lib/on_alert.js") %>
|
41
5
|
|
42
6
|
var alertHandlers = [//run in reverse order of this:
|
43
7
|
isLocationPrompt
|
data/scripts/run_loop_basic.js
CHANGED
@@ -1,248 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
(function () {
|
5
|
-
'use strict';
|
6
|
-
function f(n) {
|
7
|
-
return n < 10 ? '0' + n : n;
|
8
|
-
}
|
9
|
-
|
10
|
-
if (typeof Date.prototype.toJSON !== 'function') {
|
11
|
-
Date.prototype.toJSON = function (key) {
|
12
|
-
return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' +
|
13
|
-
f(this.getUTCMonth() + 1) + '-' +
|
14
|
-
f(this.getUTCDate()) + 'T' +
|
15
|
-
f(this.getUTCHours()) + ':' +
|
16
|
-
f(this.getUTCMinutes()) + ':' +
|
17
|
-
f(this.getUTCSeconds()) + 'Z' : null;
|
18
|
-
};
|
19
|
-
String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) {
|
20
|
-
return this.valueOf();
|
21
|
-
};
|
22
|
-
}
|
23
|
-
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\'}, rep;
|
24
|
-
|
25
|
-
function quote(string) {
|
26
|
-
escapable.lastIndex = 0;
|
27
|
-
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
28
|
-
var c = meta[a];
|
29
|
-
return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
30
|
-
}) + '"' : '"' + string + '"';
|
31
|
-
}
|
32
|
-
|
33
|
-
function str(key, holder) {
|
34
|
-
var i, k, v, length, mind = gap, partial, value = holder[key];
|
35
|
-
if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
|
36
|
-
value = value.toJSON(key);
|
37
|
-
}
|
38
|
-
if (typeof rep === 'function') {
|
39
|
-
value = rep.call(holder, key, value);
|
40
|
-
}
|
41
|
-
switch (typeof value) {
|
42
|
-
case'string':
|
43
|
-
return quote(value);
|
44
|
-
case'number':
|
45
|
-
return isFinite(value) ? String(value) : 'null';
|
46
|
-
case'boolean':
|
47
|
-
case'null':
|
48
|
-
return String(value);
|
49
|
-
case'object':
|
50
|
-
if (!value) {
|
51
|
-
return'null';
|
52
|
-
}
|
53
|
-
gap += indent;
|
54
|
-
partial = [];
|
55
|
-
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
56
|
-
length = value.length;
|
57
|
-
for (i = 0; i < length; i += 1) {
|
58
|
-
partial[i] = str(i, value) || 'null';
|
59
|
-
}
|
60
|
-
v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
|
61
|
-
gap = mind;
|
62
|
-
return v;
|
63
|
-
}
|
64
|
-
if (rep && typeof rep === 'object') {
|
65
|
-
length = rep.length;
|
66
|
-
for (i = 0; i < length; i += 1) {
|
67
|
-
if (typeof rep[i] === 'string') {
|
68
|
-
k = rep[i];
|
69
|
-
v = str(k, value);
|
70
|
-
if (v) {
|
71
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
72
|
-
}
|
73
|
-
}
|
74
|
-
}
|
75
|
-
} else {
|
76
|
-
for (k in value) {
|
77
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
78
|
-
v = str(k, value);
|
79
|
-
if (v) {
|
80
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
81
|
-
}
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
|
-
v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
|
86
|
-
gap = mind;
|
87
|
-
return v;
|
88
|
-
}
|
89
|
-
}
|
90
|
-
|
91
|
-
if (typeof JSON.stringify !== 'function') {
|
92
|
-
JSON.stringify = function (value, replacer, space) {
|
93
|
-
var i;
|
94
|
-
gap = '';
|
95
|
-
indent = '';
|
96
|
-
if (typeof space === 'number') {
|
97
|
-
for (i = 0; i < space; i += 1) {
|
98
|
-
indent += ' ';
|
99
|
-
}
|
100
|
-
} else if (typeof space === 'string') {
|
101
|
-
indent = space;
|
102
|
-
}
|
103
|
-
rep = replacer;
|
104
|
-
if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {
|
105
|
-
throw new Error('JSON.stringify');
|
106
|
-
}
|
107
|
-
return str('', {'': value});
|
108
|
-
};
|
109
|
-
}
|
110
|
-
if (typeof JSON.parse !== 'function') {
|
111
|
-
JSON.parse = function (text, reviver) {
|
112
|
-
var j;
|
113
|
-
|
114
|
-
function walk(holder, key) {
|
115
|
-
var k, v, value = holder[key];
|
116
|
-
if (value && typeof value === 'object') {
|
117
|
-
for (k in value) {
|
118
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
119
|
-
v = walk(value, k);
|
120
|
-
if (v !== undefined) {
|
121
|
-
value[k] = v;
|
122
|
-
} else {
|
123
|
-
delete value[k];
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}
|
127
|
-
}
|
128
|
-
return reviver.call(holder, key, value);
|
129
|
-
}
|
130
|
-
|
131
|
-
text = String(text);
|
132
|
-
cx.lastIndex = 0;
|
133
|
-
if (cx.test(text)) {
|
134
|
-
text = text.replace(cx, function (a) {
|
135
|
-
return'\\u' +
|
136
|
-
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
137
|
-
});
|
138
|
-
}
|
139
|
-
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
140
|
-
j = eval('(' + text + ')');
|
141
|
-
return typeof reviver === 'function' ? walk({'': j}, '') : j;
|
142
|
-
}
|
143
|
-
throw new SyntaxError('JSON.parse');
|
144
|
-
};
|
145
|
-
}
|
146
|
-
}());
|
147
|
-
|
148
|
-
|
149
|
-
var Log = (function () {
|
150
|
-
var forceFlush = [],
|
151
|
-
N = 16384,
|
152
|
-
i = N;
|
153
|
-
while (i--) {
|
154
|
-
forceFlush[i] = "*";
|
155
|
-
}
|
156
|
-
forceFlush = forceFlush.join('');
|
157
|
-
|
158
|
-
function log_json(object, flush)
|
159
|
-
{
|
160
|
-
UIALogger.logMessage("OUTPUT_JSON:\n"+JSON.stringify(object)+"\nEND_OUTPUT");
|
161
|
-
if (flush) {
|
162
|
-
UIALogger.logMessage(forceFlush);
|
163
|
-
}
|
164
|
-
}
|
165
|
-
|
166
|
-
return {
|
167
|
-
result: function (status, data, flush) {
|
168
|
-
log_json({"status": status, "value": data, "index":_actualIndex}, flush)
|
169
|
-
},
|
170
|
-
output: function (msg, flush) {
|
171
|
-
log_json({"output": msg,"last_index":_actualIndex}, flush);
|
172
|
-
}
|
173
|
-
};
|
174
|
-
})();
|
175
|
-
|
176
|
-
|
177
|
-
function findAlertViewText(alert) {
|
178
|
-
if (!alert) {
|
179
|
-
return false;
|
180
|
-
}
|
181
|
-
var txt = alert.name(),
|
182
|
-
txts;
|
183
|
-
if (txt == null) {
|
184
|
-
txts = alert.staticTexts();
|
185
|
-
if (txts != null && txts.length > 0) {
|
186
|
-
txt = txts[0].name();
|
187
|
-
}
|
188
|
-
}
|
189
|
-
return txt;
|
190
|
-
}
|
191
|
-
|
192
|
-
function isLocationPrompt(alert) {
|
193
|
-
var exps = [
|
194
|
-
["OK", /vil bruge din aktuelle placering/],
|
195
|
-
["OK", /Would Like to Use Your Current Location/],
|
196
|
-
["OK", /Would Like to Send You Notifications/],
|
197
|
-
["Allow", /access your location/],
|
198
|
-
["Ja", /Darf (?:.)+ Ihren aktuellen Ort verwenden/],
|
199
|
-
["OK", /Would Like to Access Your Photos/],
|
200
|
-
["OK", /Would Like to Access Your Contacts/],
|
201
|
-
["OK", /Location Accuracy/],
|
202
|
-
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/]
|
203
|
-
],
|
204
|
-
ans, exp,
|
205
|
-
txt;
|
206
|
-
|
207
|
-
txt = findAlertViewText(alert);
|
208
|
-
Log.output({"output":"alert: "+txt}, true);
|
209
|
-
for (var i = 0; i < exps.length; i++) {
|
210
|
-
ans = exps[i][0];
|
211
|
-
exp = exps[i][1];
|
212
|
-
if (exp.test(txt)) {
|
213
|
-
return ans;
|
214
|
-
}
|
215
|
-
}
|
216
|
-
return false;
|
217
|
-
}
|
1
|
+
<%= render_template("lib/json2.min.js") %>
|
2
|
+
<%= render_template("lib/log.js"); %>
|
3
|
+
<%= render_template("lib/on_alert.js"); %>
|
218
4
|
|
219
5
|
UIATarget.onAlert = function (alert) {
|
220
6
|
Log.output({"output":"on alert"}, true);
|
221
7
|
var target = UIATarget.localTarget();
|
222
8
|
target.pushTimeout(10);
|
223
|
-
function
|
9
|
+
function dismissPrivacyAlert(retry_count) {
|
224
10
|
retry_count = retry_count || 0;
|
225
11
|
if (retry_count >= 5) {
|
226
|
-
Log.output("Maxed out retry (5) - unable to dismiss
|
12
|
+
Log.output("Maxed out retry (5) - unable to dismiss privacy alert.");
|
227
13
|
return;
|
228
14
|
}
|
229
15
|
try {
|
230
|
-
var answer =
|
16
|
+
var answer = isPrivacyAlert(alert);
|
231
17
|
if (answer) {
|
232
18
|
alert.buttons()[answer].tap();
|
233
19
|
}
|
234
20
|
}
|
235
21
|
catch (e) {
|
236
|
-
Log.output("Exception while trying to touch alert
|
22
|
+
Log.output("Exception while trying to touch alert. Retrying...");
|
237
23
|
if (e && typeof e.toString == 'function') {
|
238
24
|
Log.output(e.toString());
|
239
25
|
}
|
240
26
|
target.delay(1);
|
241
|
-
|
27
|
+
dismissPrivacyAlert(retry_count + 1);
|
242
28
|
}
|
243
29
|
}
|
244
30
|
|
245
|
-
|
31
|
+
dismissPrivacyAlert(0);
|
246
32
|
target.popTimeout();
|
247
33
|
return true;
|
248
34
|
};
|