Refactor observables in viewer-impl into a map object#7004
Refactor observables in viewer-impl into a map object#7004muxin merged 4 commits intoampproject:masterfrom
Conversation
src/service/viewer-impl.js
Outdated
| this.paddingTop_ = 0; | ||
|
|
||
| /** @private {!Object<string, !Observable<!JSONType>>} */ | ||
| this.messageObservables_ = []; |
There was a problem hiding this comment.
Is this supposed to be an object, or an array?
There was a problem hiding this comment.
Array it is~ Will fix this.
There was a problem hiding this comment.
Actually I want it to be a map of observables, the index is string. Which type should I annotate here?
There was a problem hiding this comment.
this.messageObservables_ = {}; ?
There was a problem hiding this comment.
Use a prototype-less object:
import {map} from 'src/utils/object.js';
/** @private {!Object<string, !Observable<!JSONType>>} */
this.messageObservables_ = map();There was a problem hiding this comment.
Thanks for the suggestion. Fixed.
| /** @private */ | ||
| listenToBroadcasts_() { | ||
| this.viewer_.onBroadcast(message => { | ||
| this.viewer_.onMessage('broadcast', message => { |
There was a problem hiding this comment.
Broadcast shouldn't change - it should stay as it was onBroadcast. Broadcast is a special type of messaging, thus we want a special API for it.
Probably be the easiest to just revert this file and related other.
src/service/storage-impl.js
Outdated
| /** @private */ | ||
| listenToBroadcasts_() { | ||
| this.viewer_.onBroadcast(message => { | ||
| this.viewer_.onMessage('broadcast', message => { |
| it('should run authorization for broadcast events on same origin', () => { | ||
| let broadcastHandler; | ||
| sandbox.stub(service.viewer_, 'onBroadcast', handler => { | ||
| sandbox.stub(service.viewer_, 'onMessage', (eventType, handler) => { |
| this.historyPoppedObservable_ = new Observable(); | ||
|
|
||
| /** @private {!Observable<!JSONType>} */ | ||
| this.broadcastObservable_ = new Observable(); |
src/service/viewer-impl.js
Outdated
| * @param {function(ViewerHistoryPoppedEventDef)} handler | ||
| * Adds a eventType listener for viewer events. | ||
| * @param {string} eventType | ||
| * @param {function(T)} handler |
There was a problem hiding this comment.
This will always be the ViewerMessage. No need for a template.
| return Promise.resolve(); | ||
| } | ||
| if (eventType == 'broadcast') { | ||
| this.broadcastObservable_.fire( |
| * @param {function(!JSONType)} handler | ||
| * @return {!UnlistenDef} | ||
| */ | ||
| onBroadcast(handler) { |
test/functional/test-runtime.js
Outdated
| const viewer = getServiceForDoc(ampdoc, 'viewer'); | ||
| const broadcastReceived = sandbox.spy(); | ||
| viewer.onBroadcast(broadcastReceived); | ||
| viewer.onMessage('broadcast', broadcastReceived); |
test/functional/test-storage.js
Outdated
| viewerBroadcastHandler = undefined; | ||
| viewer = { | ||
| onBroadcast: handler => { | ||
| onMessage: (eventType, handler) => { |
test/functional/test-viewer.js
Outdated
| it('should receive broadcast event', () => { | ||
| let broadcastMessage = null; | ||
| viewer.onBroadcast(message => { | ||
| viewer.onMessage('broadcast', message => { |
6b668a3 to
e5191c9
Compare
|
@jridgewell @dvoytenko PTAL |
src/service/viewer-impl.js
Outdated
| * @param {function(ViewerHistoryPoppedEventDef)} handler | ||
| * Adds a eventType listener for viewer events. | ||
| * @param {string} eventType | ||
| * @param {!function(!JSONType)} handler |
There was a problem hiding this comment.
functions are already ! by default. remove.
src/service/viewer-impl.js
Outdated
| } | ||
| const observable = this.messageObservables_[eventType]; | ||
| if (observable) { | ||
| observable.fire(/** @type {!JSONType} */ (data)); |
There was a problem hiding this comment.
It's already !JSONType. Why cast it again?
src/service/viewport-impl.js
Outdated
|
|
||
| /** @private {number} */ | ||
| this.paddingTop_ = viewer.getPaddingTop(); | ||
| this.paddingTop_ = viewer.getInitPaddingTop(); |
There was a problem hiding this comment.
Here: this.paddingTop_ = Number(viewer.getParam('paddingTop') || 0). Should work, right?
There was a problem hiding this comment.
Yeah, thanks for the simpler solution
src/service/viewer-impl.js
Outdated
| this.historyPoppedObservable_.fire({ | ||
| newStackIndex: data['newStackIndex'], | ||
| }); | ||
| this.messageObservables_[eventType].fire( |
There was a problem hiding this comment.
Actually, thinking more about it. We can definitely easily add return type to our observable handler so this is already future-proof. So, agree with you, let's skip ViewerMessage.
| const duration = event['duration'] || 0; | ||
| const curve = event['curve']; | ||
| updateOnViewportEvent_(data) { | ||
| const paddingTop = data['paddingTop']; |
There was a problem hiding this comment.
According to old code, it's possible that paddingTop is undefined. I.e. see this old code snippet:
if (eventType == 'viewport') {
if (data['paddingTop'] !== undefined) {
this.paddingTop_ = data['paddingTop'];
this.viewportObservable_.fire(
/** @type {!JSONType} */ (data));
I don't know if it's a real situation here. If it is, we may want to add the following in this method:
const paddingTop = data['paddingTop'];
if (paddingTop == undefined) {
return;
}
Please check.
|
@jridgewell PTAL |
* master: (310 commits) Update csa.md to remove non-required parameters (ampproject#6902) Add notes about requesting ads ATF and link to demo (ampproject#7037) Remove whitelist for lightbox scrollable validator (ampproject#7034) Delegate submit events until amp-form is loaded (ampproject#6929) Moves closure sha384 into a new extension amp-crypto-polyfill for lazy load (ampproject#7006) Refactor observables in viewer-impl into a map object (ampproject#7004) resizing of margins (ampproject#6824) Use URL replacer from embed for pixel (ampproject#7029) adds support for Gemius analytics (ampproject#6558) Avoid duplicating server-layout (ampproject#7021) Laterpay validator config (ampproject#6974) Validator rollup (ampproject#7023) skeleton for amp-tabs (ampproject#7003) Upgrade post-css and related packages to latest (ampproject#7020) handle unload (ampproject#7001) viewer-integr.js -> amp-viewer-integration (ampproject#6989) dev().info()->dev().fine() (ampproject#7017) Turned on experiment flag (ampproject#6774) Unlaunch ios-embed-wrapper for iOS8 to avoid scroll freezing issues (ampproject#7018) Add some A4A ad request parameters (ampproject#6643) ...
Brought up in #6679 (review)