Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 cr.define('uber', function() { | 5 cr.define('uber', function() { |
| 6 /** | 6 /** |
| 7 * Options for how web history should be handled. | 7 * Options for how web history should be handled. |
| 8 */ | 8 */ |
| 9 var HISTORY_STATE_OPTION = { | 9 var HISTORY_STATE_OPTION = { |
| 10 PUSH: 1, // Push a new history state. | 10 PUSH: 1, // Push a new history state. |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 * { method : "methodToInvoke", | 142 * { method : "methodToInvoke", |
| 143 * params : {...} | 143 * params : {...} |
| 144 * } | 144 * } |
| 145 * | 145 * |
| 146 * |method| is required, while |params| is optional. Extra parameters required | 146 * |method| is required, while |params| is optional. Extra parameters required |
| 147 * by a method must be specified by that method's documentation. | 147 * by a method must be specified by that method's documentation. |
| 148 * | 148 * |
| 149 * @param {Event} e The posted object. | 149 * @param {Event} e The posted object. |
| 150 */ | 150 */ |
| 151 function handleWindowMessage(e) { | 151 function handleWindowMessage(e) { |
| 152 e = /** @type{!MessageEvent.<!{method: string, params: *}>} */ (e); | |
|
Dan Beam
2014/07/23 22:09:24
we should stay consistent regarding
/** @type {
Vitaly Pavlenko
2014/07/24 01:09:31
Done.
| |
| 152 if (e.data.method === 'beginInterceptingEvents') { | 153 if (e.data.method === 'beginInterceptingEvents') { |
| 153 backgroundNavigation(); | 154 backgroundNavigation(); |
| 154 } else if (e.data.method === 'stopInterceptingEvents') { | 155 } else if (e.data.method === 'stopInterceptingEvents') { |
| 155 foregroundNavigation(); | 156 foregroundNavigation(); |
| 156 } else if (e.data.method === 'ready') { | 157 } else if (e.data.method === 'ready') { |
| 157 pageReady(e.origin); | 158 pageReady(e.origin); |
| 158 } else if (e.data.method === 'updateHistory') { | 159 } else if (e.data.method === 'updateHistory') { |
| 159 updateHistory(e.origin, e.data.params.state, e.data.params.path, | 160 updateHistory(e.origin, e.data.params.state, e.data.params.path, |
| 160 e.data.params.replace); | 161 e.data.params.replace); |
| 161 } else if (e.data.method === 'setTitle') { | 162 } else if (e.data.method === 'setTitle') { |
| 162 setTitle(e.origin, e.data.params.title); | 163 setTitle(e.origin, e.data.params.title); |
| 163 } else if (e.data.method === 'showPage') { | 164 } else if (e.data.method === 'showPage') { |
| 164 showPage(e.data.params.pageId, | 165 showPage(e.data.params.pageId, |
| 165 HISTORY_STATE_OPTION.PUSH, | 166 HISTORY_STATE_OPTION.PUSH, |
| 166 e.data.params.path); | 167 e.data.params.path); |
| 167 } else if (e.data.method === 'navigationControlsLoaded') { | 168 } else if (e.data.method === 'navigationControlsLoaded') { |
| 168 onNavigationControlsLoaded(); | 169 onNavigationControlsLoaded(); |
| 169 } else if (e.data.method === 'adjustToScroll') { | 170 } else if (e.data.method === 'adjustToScroll') { |
| 170 adjustToScroll(e.data.params); | 171 adjustToScroll(/** @type {number} */(e.data.params)); |
| 171 } else if (e.data.method === 'mouseWheel') { | 172 } else if (e.data.method === 'mouseWheel') { |
| 172 forwardMouseWheel(e.data.params); | 173 forwardMouseWheel(/** @type {Object} */(e.data.params)); |
| 173 } else { | 174 } else { |
| 174 console.error('Received unexpected message', e.data); | 175 console.error('Received unexpected message', e.data); |
| 175 } | 176 } |
| 176 } | 177 } |
| 177 | 178 |
| 178 /** | 179 /** |
| 179 * Sends the navigation iframe to the background. | 180 * Sends the navigation iframe to the background. |
| 180 */ | 181 */ |
| 181 function backgroundNavigation() { | 182 function backgroundNavigation() { |
| 182 navFrame.classList.add('background'); | 183 navFrame.classList.add('background'); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 204 if (isRTL()) { | 205 if (isRTL()) { |
| 205 uber.invokeMethodOnWindow(navFrame.firstChild.contentWindow, | 206 uber.invokeMethodOnWindow(navFrame.firstChild.contentWindow, |
| 206 'setContentChanging', | 207 'setContentChanging', |
| 207 enabled); | 208 enabled); |
| 208 } | 209 } |
| 209 } | 210 } |
| 210 | 211 |
| 211 /** | 212 /** |
| 212 * Get an iframe based on the origin of a received post message. | 213 * Get an iframe based on the origin of a received post message. |
| 213 * @param {string} origin The origin of a post message. | 214 * @param {string} origin The origin of a post message. |
| 214 * @return {!HTMLElement} The frame associated to |origin| or null. | 215 * @return {!Element} The frame associated to |origin| or null. |
| 215 */ | 216 */ |
| 216 function getIframeFromOrigin(origin) { | 217 function getIframeFromOrigin(origin) { |
| 217 assert(origin.substr(-1) != '/', 'invalid origin given'); | 218 assert(origin.substr(-1) != '/', 'invalid origin given'); |
| 218 var query = '.iframe-container > iframe[src^="' + origin + '/"]'; | 219 var query = '.iframe-container > iframe[src^="' + origin + '/"]'; |
| 219 return document.querySelector(query); | 220 var element = document.querySelector(query); |
| 221 assert(element, 'expected an element'); | |
| 222 return /** @type {!Element} */ (element); | |
| 220 } | 223 } |
| 221 | 224 |
| 222 /** | 225 /** |
| 223 * Changes the path past the page title (i.e. chrome://chrome/settings/(.*)). | 226 * Changes the path past the page title (i.e. chrome://chrome/settings/(.*)). |
| 224 * @param {Object} state The page's state object for the navigation. | 227 * @param {Object} state The page's state object for the navigation. |
| 225 * @param {string} path The new /path/ to be set after the page name. | 228 * @param {string} path The new /path/ to be set after the page name. |
| 226 * @param {number} historyOption The type of history modification to make. | 229 * @param {number} historyOption The type of history modification to make. |
| 227 */ | 230 */ |
| 228 function changePathTo(state, path, historyOption) { | 231 function changePathTo(state, path, historyOption) { |
| 229 assert(!path || path.substr(-1) != '/', 'invalid path given'); | 232 assert(!path || path.substr(-1) != '/', 'invalid path given'); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 var queue = queuedInvokes[container.id] || []; | 309 var queue = queuedInvokes[container.id] || []; |
| 307 queuedInvokes[container.id] = undefined; | 310 queuedInvokes[container.id] = undefined; |
| 308 for (var i = 0; i < queue.length; i++) { | 311 for (var i = 0; i < queue.length; i++) { |
| 309 uber.invokeMethodOnWindow(frame.contentWindow, queue[i][0], queue[i][1]); | 312 uber.invokeMethodOnWindow(frame.contentWindow, queue[i][0], queue[i][1]); |
| 310 } | 313 } |
| 311 } | 314 } |
| 312 | 315 |
| 313 /** | 316 /** |
| 314 * Selects and navigates a subpage. This is called from uber-frame. | 317 * Selects and navigates a subpage. This is called from uber-frame. |
| 315 * @param {string} pageId Should match an id of one of the iframe containers. | 318 * @param {string} pageId Should match an id of one of the iframe containers. |
| 316 * @param {integer} historyOption Indicates whether we should push or replace | 319 * @param {number} historyOption Indicates whether we should push or replace |
| 317 * browser history. | 320 * browser history. |
| 318 * @param {string} path A sub-page path. | 321 * @param {string} path A sub-page path. |
| 319 */ | 322 */ |
| 320 function showPage(pageId, historyOption, path) { | 323 function showPage(pageId, historyOption, path) { |
| 321 var container = $(pageId); | 324 var container = $(pageId); |
| 322 | 325 |
| 323 // Lazy load of iframe contents. | 326 // Lazy load of iframe contents. |
| 324 var sourceUrl = container.dataset.url + (path || ''); | 327 var sourceUrl = container.dataset.url + (path || ''); |
| 325 var frame = container.querySelector('iframe'); | 328 var frame = container.querySelector('iframe'); |
| 326 if (!frame) { | 329 if (!frame) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 adjustToScroll(0); | 367 adjustToScroll(0); |
| 365 | 368 |
| 366 var selectedFrame = getSelectedIframe().querySelector('iframe'); | 369 var selectedFrame = getSelectedIframe().querySelector('iframe'); |
| 367 uber.invokeMethodOnWindow(selectedFrame.contentWindow, 'frameSelected'); | 370 uber.invokeMethodOnWindow(selectedFrame.contentWindow, 'frameSelected'); |
| 368 | 371 |
| 369 if (historyOption != HISTORY_STATE_OPTION.NONE) | 372 if (historyOption != HISTORY_STATE_OPTION.NONE) |
| 370 changePathTo({}, path, historyOption); | 373 changePathTo({}, path, historyOption); |
| 371 | 374 |
| 372 if (container.dataset.title) | 375 if (container.dataset.title) |
| 373 document.title = container.dataset.title; | 376 document.title = container.dataset.title; |
| 374 $('favicon').href = 'chrome://theme/' + container.dataset.favicon; | 377 assert('favicon' in container.dataset); |
| 375 $('favicon2x').href = 'chrome://theme/' + container.dataset.favicon + '@2x'; | 378 |
| 379 var dataset = /** @type {{favicon: string}} */ (container.dataset); | |
| 380 $('favicon').href = 'chrome://theme/' + dataset.favicon; | |
| 381 $('favicon2x').href = 'chrome://theme/' + dataset.favicon + '@2x'; | |
| 376 | 382 |
| 377 updateNavigationControls(); | 383 updateNavigationControls(); |
| 378 } | 384 } |
| 379 | 385 |
| 380 function onNavigationControlsLoaded() { | 386 function onNavigationControlsLoaded() { |
| 381 updateNavigationControls(); | 387 updateNavigationControls(); |
| 382 } | 388 } |
| 383 | 389 |
| 384 /** | 390 /** |
| 385 * Sends a message to uber-frame to update the appearance of the nav controls. | 391 * Sends a message to uber-frame to update the appearance of the nav controls. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 446 } | 452 } |
| 447 | 453 |
| 448 return { | 454 return { |
| 449 onLoad: onLoad, | 455 onLoad: onLoad, |
| 450 onPopHistoryState: onPopHistoryState | 456 onPopHistoryState: onPopHistoryState |
| 451 }; | 457 }; |
| 452 }); | 458 }); |
| 453 | 459 |
| 454 window.addEventListener('popstate', uber.onPopHistoryState); | 460 window.addEventListener('popstate', uber.onPopHistoryState); |
| 455 document.addEventListener('DOMContentLoaded', uber.onLoad); | 461 document.addEventListener('DOMContentLoaded', uber.onLoad); |
| OLD | NEW |