middleman 2.0.9.pre.2 → 2.0.9.pre.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/CHANGELOG +9 -0
  2. data/features/builder.feature +6 -0
  3. data/features/data.feature +16 -1
  4. data/features/fonts.feature +11 -0
  5. data/features/relative_assets.feature +8 -2
  6. data/features/step_definitions/middleman_steps.rb +9 -2
  7. data/fixtures/data-app/config.rb +3 -0
  8. data/fixtures/data-app/data/pages.yml +6 -0
  9. data/fixtures/data-app/source/index.html.haml +1 -0
  10. data/fixtures/data-app/source/layout.haml +3 -0
  11. data/fixtures/fonts-app/config.rb +0 -0
  12. data/fixtures/fonts-app/source/fonts/StMarie-Thin.otf +0 -0
  13. data/fixtures/fonts-app/source/stylesheets/fonts.css.sass +3 -0
  14. data/fixtures/glob-app/config.rb +1 -0
  15. data/fixtures/glob-app/source/index.html.haml +6 -0
  16. data/fixtures/glob-app/source/stylesheets/site.css.sass +1 -0
  17. data/fixtures/test-app/config.rb +1 -0
  18. data/fixtures/test-app/data/test2.json +4 -0
  19. data/fixtures/test-app/source/data3.html.erb +1 -0
  20. data/lib/middleman/base.rb +8 -3
  21. data/lib/middleman/builder.rb +61 -22
  22. data/lib/middleman/cli.rb +2 -1
  23. data/lib/middleman/core_extensions/assets.rb +1 -1
  24. data/lib/middleman/core_extensions/compass.rb +6 -2
  25. data/lib/middleman/core_extensions/data.rb +20 -3
  26. data/lib/middleman/templates/html5.rb +1 -0
  27. data/lib/middleman/templates/mobile.rb +17 -0
  28. data/lib/middleman/templates/mobile/source/404.html +38 -0
  29. data/lib/middleman/templates/mobile/source/README.markdown +64 -0
  30. data/lib/middleman/templates/mobile/source/crossdomain.xml +25 -0
  31. data/lib/middleman/templates/mobile/source/css/style.css +236 -0
  32. data/lib/middleman/templates/mobile/source/default.appcache +17 -0
  33. data/lib/middleman/templates/mobile/source/humans.txt +43 -0
  34. data/lib/middleman/templates/mobile/source/img/h/apple-touch-icon.png +0 -0
  35. data/lib/middleman/templates/mobile/source/img/h/splash.png +0 -0
  36. data/lib/middleman/templates/mobile/source/img/l/apple-touch-icon-precomposed.png +0 -0
  37. data/lib/middleman/templates/mobile/source/img/l/apple-touch-icon.png +0 -0
  38. data/lib/middleman/templates/mobile/source/img/l/splash.png +0 -0
  39. data/lib/middleman/templates/mobile/source/img/m/apple-touch-icon.png +0 -0
  40. data/lib/middleman/templates/mobile/source/index.html +95 -0
  41. data/lib/middleman/templates/mobile/source/js/libs/jquery-1.5.1.js +8316 -0
  42. data/lib/middleman/templates/mobile/source/js/libs/jquery-1.5.1.min.js +16 -0
  43. data/lib/middleman/templates/mobile/source/js/libs/modernizr-custom.js +14 -0
  44. data/lib/middleman/templates/mobile/source/js/libs/respond.min.js +7 -0
  45. data/lib/middleman/templates/mobile/source/js/mylibs/helper.js +147 -0
  46. data/lib/middleman/templates/mobile/source/js/script.js +0 -0
  47. data/lib/middleman/templates/mobile/source/robots.txt +5 -0
  48. data/lib/middleman/templates/mobile/source/sitemap.xml +10 -0
  49. data/lib/middleman/templates/mobile/source/test/index.html +31 -0
  50. data/lib/middleman/templates/mobile/source/test/qunit/qunit.css +148 -0
  51. data/lib/middleman/templates/mobile/source/test/qunit/qunit.js +1265 -0
  52. data/lib/middleman/templates/mobile/source/test/tests.js +26 -0
  53. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/Readme.PDF +0 -0
  54. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/aspx/aspx1.snippet +31 -0
  55. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/aspx/aspx2.snippet +2 -0
  56. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/aspx/ga.aspx +195 -0
  57. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/aspx/sample.aspx +44 -0
  58. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/jsp/ga.jsp +225 -0
  59. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/jsp/jsp1.snippet +35 -0
  60. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/jsp/jsp2.snippet +2 -0
  61. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/jsp/sample.jsp +51 -0
  62. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/php/ga.php +176 -0
  63. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/php/php1.snippet +30 -0
  64. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/php/php2.snippet +4 -0
  65. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/php/sample.php +44 -0
  66. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/pl/ga.pl +195 -0
  67. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/pl/perl1.snippet +27 -0
  68. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/pl/perl2.snippet +1 -0
  69. data/lib/middleman/templates/mobile/source/tools/googleanalyticsformobile/pl/sample.pl +38 -0
  70. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/COPYING +202 -0
  71. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/bookmark_bubble.js +559 -0
  72. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/example/example.html +43 -0
  73. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/example/example.js +57 -0
  74. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/images/arrow.png +0 -0
  75. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/images/close.png +0 -0
  76. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/images/generate_base64_images +33 -0
  77. data/lib/middleman/templates/mobile/source/tools/mobile-bookmark-bubble/images/icon_calendar.png +0 -0
  78. data/lib/middleman/templates/mobile/source/tools/wspl/README +27 -0
  79. data/lib/middleman/templates/mobile/source/tools/wspl/databasefactory.js +45 -0
  80. data/lib/middleman/templates/mobile/source/tools/wspl/dbworker.js +324 -0
  81. data/lib/middleman/templates/mobile/source/tools/wspl/dbworker_test.html +393 -0
  82. data/lib/middleman/templates/mobile/source/tools/wspl/dbworkerstarter.js +32 -0
  83. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapper_gears.js +595 -0
  84. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapper_gears_test.html +404 -0
  85. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapper_html5.js +203 -0
  86. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapper_html5_test.html +468 -0
  87. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapperapi.js +202 -0
  88. data/lib/middleman/templates/mobile/source/tools/wspl/dbwrapperapi_test.html +51 -0
  89. data/lib/middleman/templates/mobile/source/tools/wspl/gears_resultset.js +71 -0
  90. data/lib/middleman/templates/mobile/source/tools/wspl/gears_resultset_test.html +86 -0
  91. data/lib/middleman/templates/mobile/source/tools/wspl/gears_transaction.js +196 -0
  92. data/lib/middleman/templates/mobile/source/tools/wspl/gears_transaction_test.html +221 -0
  93. data/lib/middleman/templates/mobile/source/tools/wspl/gearsutils.js +94 -0
  94. data/lib/middleman/templates/mobile/source/tools/wspl/gearsutils_test.html +84 -0
  95. data/lib/middleman/templates/mobile/source/tools/wspl/global_functions.js +72 -0
  96. data/lib/middleman/templates/mobile/source/tools/wspl/simplenotes/index.html +347 -0
  97. data/lib/middleman/templates/mobile/source/tools/wspl/simplenotes/simplenotes.js +503 -0
  98. data/lib/middleman/templates/mobile/source/tools/wspl/simplenotes/styles.css +66 -0
  99. data/lib/middleman/templates/mobile/source/tools/wspl/simplenotes/template.js +75 -0
  100. data/lib/middleman/version.rb +1 -1
  101. data/middleman-x86-mingw32.gemspec +0 -1
  102. data/middleman.gemspec +3 -2
  103. metadata +116 -51
  104. data/lib/middleman/config.ru +0 -2
  105. data/lib/middleman/features/tiny_src.rb +0 -11
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2
+ "http://www.w3.org/TR/html4/strict.dtd">
3
+
4
+ <!--
5
+ Copyright 2010 Google Inc.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -->
19
+
20
+ <html>
21
+ <head>
22
+ <title>Sample</title>
23
+ <meta name="viewport"
24
+ content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" />
25
+ <meta name="apple-mobile-web-app-capable" content="yes" />
26
+ <link rel="apple-touch-icon-precomposed" href="../images/icon_calendar.png" />
27
+ <script type="text/javascript" src="../bookmark_bubble.js"></script>
28
+ <script type="text/javascript" src="example.js"></script>
29
+ </head>
30
+ <body style="height: 3000px;">
31
+ <p>The bookmark bubble will show after a second, if:</p>
32
+ <ul>
33
+ <li>It has not been previously dismissed too often</li>
34
+ <li>The application is not running in full screen mode</li>
35
+ <li>The bookmark bubble hash token is not present</li>
36
+ </ul>
37
+ <p>Supported browsers:</p>
38
+ <ul>
39
+ <li>iPhone / iPod / iPad Mobile Safari 3.0+</li>
40
+ </ul>
41
+ </body>
42
+ </html>
43
+
@@ -0,0 +1,57 @@
1
+ /*
2
+ Copyright 2010 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ /** @fileoverview Example of how to use the bookmark bubble. */
18
+
19
+ window.addEventListener('load', function() {
20
+ window.setTimeout(function() {
21
+ var bubble = new google.bookmarkbubble.Bubble();
22
+
23
+ var parameter = 'bmb=1';
24
+
25
+ bubble.hasHashParameter = function() {
26
+ return window.location.hash.indexOf(parameter) != -1;
27
+ };
28
+
29
+ bubble.setHashParameter = function() {
30
+ if (!this.hasHashParameter()) {
31
+ window.location.hash += parameter;
32
+ }
33
+ };
34
+
35
+ bubble.getViewportHeight = function() {
36
+ window.console.log('Example of how to override getViewportHeight.');
37
+ return window.innerHeight;
38
+ };
39
+
40
+ bubble.getViewportScrollY = function() {
41
+ window.console.log('Example of how to override getViewportScrollY.');
42
+ return window.pageYOffset;
43
+ };
44
+
45
+ bubble.registerScrollHandler = function(handler) {
46
+ window.console.log('Example of how to override registerScrollHandler.');
47
+ window.addEventListener('scroll', handler, false);
48
+ };
49
+
50
+ bubble.deregisterScrollHandler = function(handler) {
51
+ window.console.log('Example of how to override deregisterScrollHandler.');
52
+ window.removeEventListener('scroll', handler, false);
53
+ };
54
+
55
+ bubble.showIfAllowed();
56
+ }, 1000);
57
+ }, false);
@@ -0,0 +1,33 @@
1
+ #!/bin/bash
2
+
3
+ # Copyright 2010 Google Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ # Generates base64 versions of images so they can be inlined using the 'data:'
18
+ # URI scheme.
19
+
20
+ declare -ra IMAGE_FILES=( close.png arrow.png )
21
+
22
+ for image in ${IMAGE_FILES[@]}; do
23
+ OUT="$image.base64"
24
+ cat "$image" \
25
+ | uuencode -m ignore-this \
26
+ | grep -v begin-base64 \
27
+ | grep -v "====" \
28
+ | xargs echo \
29
+ | sed -e 's/ //g' \
30
+ | xargs echo -n \
31
+ > $OUT
32
+ ls -l $OUT
33
+ done
@@ -0,0 +1,27 @@
1
+ How to run the tests:
2
+
3
+ * The tests themselves assume that jsunit is in a sibling directory
4
+ to the one containing the distrbution. If this is not so, it is sufficient
5
+ to edit the paths in the test files. (On UNIX, symlinks may be your
6
+ friend if this is not convenient.)
7
+
8
+ * jsmock.js (available from http://jsmock.sourceforge.net/) should
9
+ be placed in the distribution directory.
10
+
11
+ * Specify the test files via a URL parameter. (This might be an issue
12
+ with jsunit: http://digitalmihailo.blogspot.com/2008/06/make-jsunit-work-in-firefox-30.html)
13
+
14
+ For example, if the root of your downloaded of the distribution is /mypath:
15
+
16
+ file:///mypath/jsunit/testRunner.html?testpage=mypath/webstorageportabilitylayer/dbwrapper_gears_test.html
17
+ file:///mypath/jsunit/testRunner.html?testpage=mypath/webstorageportabilitylayer/dbwrapper_html5_test.html
18
+ file:///mypath/jsunit/testRunner.html?testpage=mypath/webstorageportabilitylayer/dbwrapperapi_test.html
19
+
20
+ NB: the leading / in a UNIX path is not included in mypath so setting
21
+ it via pwd will not deliver the desired effect.
22
+
23
+
24
+
25
+
26
+
27
+
@@ -0,0 +1,45 @@
1
+ /*
2
+ Copyright 2009 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ // Namespace.
18
+ google.wspl.DatabaseFactory = google.wspl.DatabaseFactory || {};
19
+
20
+ /**
21
+ * Factory function to build databases in a cross-API manner.
22
+ * @param {string} dbName of the database
23
+ * @param {string} dbworkerUrl the URL for Gears worker.
24
+ * @return {google.wspl.Database} The database object.
25
+ */
26
+ google.wspl.DatabaseFactory.createDatabase = function(dbName, dbworkerUrl) {
27
+ var dbms;
28
+ if (window.openDatabase) {
29
+ // We have HTML5 functionality.
30
+ dbms = new google.wspl.html5.Database(dbName);
31
+ } else {
32
+ // Try to use Google Gears.
33
+ var gearsDb = goog.gears.getFactory().create('beta.database');
34
+ var wp = goog.gears.getFactory().create('beta.workerpool');
35
+
36
+ // Note that Gears will not allow file based URLs when creating a worker.
37
+ dbms = new wireless.db.gears.Database();
38
+ dbms.openDatabase('', dbName, gearsDb);
39
+ wp.onmessage = google.bind(dbms.onMessage_, dbms);
40
+
41
+ // Comment this line out to use the synchronous database.
42
+ dbms.startWorker(wp, dbworkerUrl, 0);
43
+ }
44
+ return dbms;
45
+ };
@@ -0,0 +1,324 @@
1
+ /*
2
+ Copyright 2009 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ /**
18
+ * @fileoverview A worker thread that performs synchronous queries against a
19
+ * Gears database on behalf of an asynchronous calling client.
20
+ *
21
+ * The worker replies to the sender with messages to pass results, errors, and
22
+ * notifications about completed transactions. The type field of the message
23
+ * body specifies the message type. For each successful statement, a RESULT
24
+ * message is sent with a result attribute containing the Gears result set. For
25
+ * the first unsuccessful statement, an ERROR message will be sent with details
26
+ * stored in the error field. After the transaction has been committed, a COMMIT
27
+ * message is sent. If the transaction is rolled back, a ROLLBACK message is
28
+ * sent.
29
+ *
30
+ * NB: The worker must be served over http. Further, to operate successfully,
31
+ * it requires the inclusion of global_functions.js and gearsutils.js.
32
+ */
33
+
34
+
35
+ /**
36
+ * Creates a DbWorker to handle incoming messages, execute queries, and return
37
+ * results to the main thread.
38
+ *
39
+ * @param {GearsWorkerPool} wp The gears worker pool.
40
+ * @constructor
41
+ */
42
+ google.wspl.gears.DbWorker = function(wp) {
43
+
44
+ /**
45
+ * An array of transaction ids representing the transactions that are open on
46
+ * the database.
47
+ * @type {Array.<number>}
48
+ * @private
49
+ */
50
+ this.transactions_ = [];
51
+
52
+ /**
53
+ * The gears worker pool.
54
+ * @type {GearsWorkerPool}
55
+ * @private
56
+ */
57
+ this.wp_ = wp;
58
+
59
+ this.wp_.onmessage = google.bind(this.onMessage_, this);
60
+
61
+ this.sendMessageToWorker_({
62
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.STARTED
63
+ });
64
+ };
65
+
66
+ /**
67
+ * The gears database that this worker thread will interact with.
68
+ * @type {GearsDatabase}
69
+ * @private
70
+ */
71
+ google.wspl.gears.DbWorker.prototype.db_;
72
+
73
+ /**
74
+ * A singleton instance of DbWorker.
75
+ * @type {google.wspl.gears.DbWorker?}
76
+ * @private
77
+ */
78
+ google.wspl.gears.DbWorker.instance_;
79
+
80
+ /**
81
+ * The sender ID of the incomming messages. Default to 0 for workerpool ID.
82
+ * @type {number}
83
+ * @private
84
+ */
85
+ google.wspl.gears.DbWorker.prototype.senderId_ = 0;
86
+
87
+ /**
88
+ * Message type constants for worker command messages.
89
+ * @enum {number}
90
+ */
91
+ google.wspl.gears.DbWorker.CommandTypes = {
92
+ OPEN: 1,
93
+ BEGIN: 2,
94
+ EXECUTE: 3,
95
+ COMMIT: 4,
96
+ ROLLBACK: 5
97
+ };
98
+
99
+ /**
100
+ * Message type constants for worker reply messages.
101
+ * @enum {number}
102
+ */
103
+ google.wspl.gears.DbWorker.ReplyTypes = {
104
+ RESULT: 1,
105
+ FAILURE: 2,
106
+ COMMIT: 3,
107
+ ROLLBACK: 4,
108
+ STARTED: 5,
109
+ OPEN_SUCCESSFUL: 6,
110
+ OPEN_FAILED: 7,
111
+ LOG: 8
112
+ };
113
+
114
+ /**
115
+ * Starts the DbWorker.
116
+ */
117
+ google.wspl.gears.DbWorker.start = function() {
118
+ var wp = google.gears.workerPool;
119
+ google.wspl.gears.DbWorker.instance_ = new google.wspl.gears.DbWorker(wp);
120
+ };
121
+
122
+ /**
123
+ * Handles an OPEN command from the main thread.
124
+ *
125
+ * @param {string} userId The user to which the database belongs.
126
+ * @param {string} name The database's name.
127
+ */
128
+ google.wspl.gears.DbWorker.prototype.handleOpen_ = function(userId, name) {
129
+ this.log_('Attempting to create Gears database: userId=' + userId + ', name='
130
+ + name);
131
+ try {
132
+ this.db_ = google.gears.factory.create('beta.database', '1.0');
133
+ google.wspl.GearsUtils.openDatabase(userId, name, this.db_, this.log_);
134
+ this.sendMessageToWorker_({
135
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.OPEN_SUCCESSFUL
136
+ });
137
+ } catch (ex) {
138
+ this.sendMessageToWorker_({
139
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.OPEN_FAILED,
140
+ 'error': ex
141
+ });
142
+ }
143
+ };
144
+
145
+ /**
146
+ * Handles a EXECUTE command from the main thread.
147
+ *
148
+ * @param {!Array.<google.wspl.Statement>} statements The statements to execute.
149
+ * @param {number} callbackId The callback to invoke after each execution.
150
+ * @param {number} transactionId The transaction that the statements belong to.
151
+ * @private
152
+ */
153
+ google.wspl.gears.DbWorker.prototype.handleExecute_ =
154
+ function(statements, callbackId, transactionId) {
155
+ var self = this;
156
+ try {
157
+ this.executeAll_(statements, function(results) {
158
+ self.sendMessageToWorker_(/** @type {string} */({
159
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.RESULT,
160
+ 'results': results,
161
+ 'callbackId': callbackId,
162
+ 'transactionId': transactionId
163
+ }));
164
+ });
165
+ } catch (e) {
166
+ this.sendMessageToWorker_({
167
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.FAILURE,
168
+ 'error': e,
169
+ 'callbackId': callbackId,
170
+ 'transactionId': transactionId
171
+ });
172
+ }
173
+ };
174
+
175
+ /**
176
+ * Executes all of the statements on the Gears database. The callback is
177
+ * invoked with the query results after each successful query execution.
178
+ *
179
+ * @param {!Array.<Object>} statements The statements to execute.
180
+ * @param {Function} callback The callback to invoke with query results.
181
+ * @private
182
+ */
183
+ google.wspl.gears.DbWorker.prototype.executeAll_ =
184
+ function(statements, callback) {
185
+ var results = [];
186
+ for (var i = 0; i < statements.length; i++) {
187
+ var resultset = this.db_.execute(statements[i]['sql'],
188
+ statements[i]['params']);
189
+ var result = google.wspl.GearsUtils.resultSetToObjectArray(resultset);
190
+ results.push(result);
191
+ }
192
+ callback(results);
193
+ };
194
+
195
+ /**
196
+ * Handles a BEGIN command from the main thread.
197
+ *
198
+ * @param {number} transactionId The transaction that the statements belong to.
199
+ * @private
200
+ */
201
+ google.wspl.gears.DbWorker.prototype.handleBegin_ = function(transactionId) {
202
+ this.transactions_.push(transactionId);
203
+ this.db_.execute('BEGIN IMMEDIATE');
204
+ };
205
+
206
+ /**
207
+ * Handles a COMMIT command from the main thread.
208
+ *
209
+ * @param {number} transactionId The transaction that the statements belong to.
210
+ * @private
211
+ */
212
+ google.wspl.gears.DbWorker.prototype.handleCommit_ = function(transactionId) {
213
+ this.db_.execute('COMMIT');
214
+ this.postCommit_();
215
+ };
216
+
217
+ /**
218
+ * Handles a ROLLBACK command from the main thread.
219
+ *
220
+ * @param {number} transactionId The transaction that the statements belong to.
221
+ * @private
222
+ */
223
+ google.wspl.gears.DbWorker.prototype.handleRollback_ = function(transactionId) {
224
+ this.db_.execute('ROLLBACK');
225
+ this.postRollback_();
226
+ };
227
+
228
+ /**
229
+ * Sends a COMMIT reply to the main thread for each transaction that was
230
+ * committed.
231
+ *
232
+ * @private
233
+ */
234
+ google.wspl.gears.DbWorker.prototype.postCommit_ = function() {
235
+ for (var i = this.transactions_.length - 1; i >= 0; i--) {
236
+ this.sendMessageToWorker_({
237
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.COMMIT,
238
+ 'transactionId': this.transactions_[i]
239
+ });
240
+ }
241
+ this.transactions_ = [];
242
+ };
243
+
244
+ /**
245
+ * Sends a ROLLBACK reply to the main thread for each transaction that was
246
+ * rolled back.
247
+ *
248
+ * @private
249
+ */
250
+ google.wspl.gears.DbWorker.prototype.postRollback_ = function() {
251
+ for (var i = this.transactions_.length - 1; i >= 0; i --) {
252
+ this.sendMessageToWorker_({
253
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.ROLLBACK,
254
+ 'transactionId': this.transactions_[i]
255
+ });
256
+ }
257
+ this.transactions_ = [];
258
+ };
259
+
260
+ /**
261
+ * Handles incomming messages.
262
+ * @param {string} a Deprecated.
263
+ * @param {number} b Deprecated.
264
+ * @param {Object} messageObject The message object.
265
+ * @private
266
+ */
267
+ google.wspl.gears.DbWorker.prototype.onMessage_ =
268
+ function(a, b, messageObject) {
269
+ this.senderId_ = messageObject.sender;
270
+ var message = messageObject.body;
271
+ var type = message['type'];
272
+ var name = message['name'];
273
+ var statements = message['statements'];
274
+ var callbackId = message['callbackId'];
275
+ var transactionId = message['transactionId'];
276
+ var userId = message['userId'];
277
+
278
+ try {
279
+ switch(type) {
280
+ case google.wspl.gears.DbWorker.CommandTypes.OPEN:
281
+ this.handleOpen_(userId, name);
282
+ break;
283
+
284
+ case google.wspl.gears.DbWorker.CommandTypes.EXECUTE:
285
+ this.handleExecute_(statements, callbackId, transactionId);
286
+ break;
287
+
288
+ case google.wspl.gears.DbWorker.CommandTypes.BEGIN:
289
+ this.handleBegin_(transactionId);
290
+ break;
291
+
292
+ case google.wspl.gears.DbWorker.CommandTypes.COMMIT:
293
+ this.handleCommit_(transactionId);
294
+ break;
295
+
296
+ case google.wspl.gears.DbWorker.CommandTypes.ROLLBACK:
297
+ this.handleRollback_(transactionId);
298
+ break;
299
+ }
300
+ } catch (ex) {
301
+ this.log_('Database worker failed: ' + ex.message);
302
+ }
303
+ };
304
+
305
+ /**
306
+ * Sends a log message to the main thread to be logged.
307
+ * @param {string} msg The message to log.
308
+ * @private
309
+ */
310
+ google.wspl.gears.DbWorker.prototype.log_ = function(msg) {
311
+ this.sendMessageToWorker_({
312
+ 'type': google.wspl.gears.DbWorker.ReplyTypes.LOG,
313
+ 'msg': msg
314
+ });
315
+ };
316
+
317
+ /**
318
+ * Sends a message to the main worker thread.
319
+ * @param {Object} msg The message object to send.
320
+ * @private
321
+ */
322
+ google.wspl.gears.DbWorker.prototype.sendMessageToWorker_ = function(msg) {
323
+ this.wp_.sendMessage(msg, this.senderId_);
324
+ };