@inboxsdk/core 0.2.28-alpha.5 → 0.2.28
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.
- package/inboxsdk.js +28 -62
- package/inboxsdk.js.map +1 -1
- package/package.json +1 -5
- package/pageWorld.js.map +1 -1
- package/src/build/exec.d.ts +0 -1
- package/src/build/spawn.d.ts +0 -1
- package/src/common/ajax.d.ts +0 -1
- package/src/common/cachebust-url.d.ts +0 -1
- package/src/common/censorHTMLstring.d.ts +0 -1
- package/src/common/censorHTMLtree.d.ts +0 -1
- package/src/common/censorJSONTree.d.ts +0 -1
- package/src/common/connectivity-test.d.ts +0 -1
- package/src/common/defer.d.ts +0 -1
- package/src/common/find-parent.d.ts +0 -1
- package/src/common/get-extension-id.d.ts +0 -1
- package/src/common/get-or-fail.d.ts +0 -1
- package/src/common/get-session-id.d.ts +0 -1
- package/src/common/get-stack-trace.d.ts +0 -1
- package/src/common/html-to-text.d.ts +0 -1
- package/src/common/isElementVisible.d.ts +0 -1
- package/src/common/load-script.d.ts +0 -1
- package/src/common/log-error.d.ts +0 -1
- package/src/common/quoted-split.d.ts +0 -1
- package/src/common/rate-limit-queuer.d.ts +0 -1
- package/src/common/rate-limit.d.ts +0 -1
- package/src/common/version.d.ts +0 -1
- package/src/inboxsdk-js/check-requirements.js +3 -7
- package/src/inboxsdk-js/header.js +0 -1
- package/src/inboxsdk-js/inboxsdk-NONREMOTE-INTEGRATED-PAGEWORLD.js +6 -5
- package/src/inboxsdk-js/inboxsdk-NONREMOTE.js +3 -4
- package/src/inboxsdk-js/inboxsdk-REMOTE.js +1 -3
- package/src/inboxsdk-js/inboxsdk-TEST.js +3 -4
- package/src/inboxsdk-js/inboxsdk.js +39 -33
- package/src/inboxsdk-js/loading/load-platform-implementation-DEV.js +18 -15
- package/src/inboxsdk-js/loading/platform-implementation-loader.d.ts +0 -1
- package/src/inboxsdk.d.ts +27 -10
- package/src/injected-js/gmail/constants.d.ts +0 -1
- package/src/injected-js/gmail/modify-suggestions.d.ts +0 -1
- package/src/injected-js/gmail/modify-suggestions.test.js +9 -8
- package/src/injected-js/gmail/setup-gmail-interceptor.js +579 -340
- package/src/injected-js/gmail/setup-gmonkey-handler.d.ts +0 -1
- package/src/injected-js/gmail/sync-compose-processor-20220909.d.ts +0 -1
- package/src/injected-js/gmail/sync-compose-processor.d.ts +0 -1
- package/src/injected-js/gmail/sync-compose-request-processor.d.ts +0 -1
- package/src/injected-js/gmail/sync-compose-request-processor.test.js +49 -39
- package/src/injected-js/gmail/thread-identifier/click-and-get-popup-url.js +33 -20
- package/src/injected-js/gmail/thread-identifier/index.js +93 -57
- package/src/injected-js/gmail/thread-identifier/thread-row-parser.js +31 -22
- package/src/injected-js/gmail/thread-identifier/thread-row-parser.test.js +28 -12
- package/src/injected-js/inbox/setupAjaxInterceptor.js +121 -64
- package/src/injected-js/inbox/setupClickAndGetNewIframeSrc.js +66 -53
- package/src/injected-js/inbox/setupComposeViewDraftIDFinder.js +36 -20
- package/src/injected-js/inbox/setupInboxFakeWindowResizeListener.js +13 -13
- package/src/injected-js/injected-logger.d.ts +0 -1
- package/src/injected-js/main.js +24 -11
- package/src/injected-js/message-metadata-holder.js +82 -52
- package/src/injected-js/setup-data-exposer.js +148 -89
- package/src/injected-js/setup-error-silencer.js +21 -21
- package/src/injected-js/setup-event-reemitter.js +22 -30
- package/src/injected-js/setupCustomViewEventAssassin.d.ts +0 -1
- package/src/injected-js/setupInboxCustomViewLinkFixer.js +29 -24
- package/src/injected-js/setupPushStateListener.js +11 -18
- package/src/injected-js/xhr-helper.js +65 -62
- package/src/injected-js/xhr-proxy-factory.js +445 -195
- package/src/injected-js/xhr-proxy-factory.test.js +991 -824
- package/src/platform-implementation-js/constants/nav-item-types.d.ts +0 -1
- package/src/platform-implementation-js/constants/router.js +9 -17
- package/src/platform-implementation-js/constants/toolbars.js +3 -8
- package/src/platform-implementation-js/dom-driver/gmail/custom-style.js +13 -13
- package/src/platform-implementation-js/dom-driver/gmail/gmail-butter-bar-driver.js +136 -115
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.d.ts +2 -3
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-toolbar-button-for-app.js +14 -13
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/create-link.js +48 -27
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-draft-id-for-message-id.js +42 -31
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-native-nav-item.js +40 -30
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-url-object.js +18 -10
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadForOldGmailThreadId.js +28 -21
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadFromSyncThreadId.js +45 -33
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/gmail-load-event.js +49 -31
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/goto-view.js +65 -58
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/keyboard-shortcut-help-modifier.js +124 -40
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-compose-window.js +22 -17
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.test.js +11 -10
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/override-gmail-back-button.js +80 -44
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-query-rewriter.js +26 -19
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-suggestions-provider.js +147 -71
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-compose-view-driver-stream.js +148 -91
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.js +166 -150
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.test.js +120 -70
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-app-id-warning.js +15 -15
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-route-view.js +67 -44
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.js +379 -230
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.test.js +307 -121
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-native-route-view.js +24 -17
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/suppressAddon.js +49 -41
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/temporary-track-download-url-validity.js +40 -30
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/thread-row-identifier.js +60 -28
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-events.js +133 -61
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.js +110 -83
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.js +42 -30
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.test.js +46 -52
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.d.ts +3 -13
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.js +683 -355
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.d.ts +0 -4
- package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/make-xhr-interceptor.js +93 -77
- package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.js +82 -35
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.test.js +94 -44
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-global-icon-area.js +19 -12
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-thread-icon-area.js +29 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-to-icon-area.js +26 -26
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/index.js +797 -391
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view/monitor-top-banner-size-and-react.js +9 -7
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view.js +109 -60
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-area-view.js +135 -95
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.js +211 -103
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.test.js +61 -61
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-backdrop.js +17 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-collapsible-section-view.js +541 -188
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-button.js +135 -67
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-compose-notice.js +49 -27
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-inner-sidebar.js +13 -7
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-outer-sidebar.js +22 -9
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-recipient-row.js +63 -36
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-tooltip-to-button.js +113 -38
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-app-button-toolbars-are-closed.js +16 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-grouping-is-open.js +17 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/focus.js +11 -8
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/from-manager.js +47 -27
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-additional-action-toolbar.js +24 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-changes-stream.js +111 -59
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-body-changes-stream.js +14 -15
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-formatting-area-offset-left.js +17 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-minimized-stream.js +24 -18
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-response-type-changes-stream.js +23 -19
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/insert-link-into-body.js +19 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/manage-button-grouping.js +376 -141
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/monitor-selection-range.js +28 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/override-edit-subject.js +70 -34
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/position-formatting-toolbar.js +17 -10
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/size-fixer.js +137 -83
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/update-insert-more-area-left.js +19 -10
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view.js +1190 -632
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/get-updated-contact.js +38 -29
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view.js +617 -327
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.d.ts +1 -34
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-processor.js +48 -29
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-view.js +380 -188
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-row-list-view.js +194 -104
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-row-view.js +811 -382
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view/add-icon-area.js +58 -34
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.js +581 -330
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.test.js +277 -123
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view/width-manager.js +35 -15
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view.js +571 -216
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-toolbar-view.js +336 -152
- package/src/platform-implementation-js/dom-driver/gmail/views/native-gmail-nav-item-view.js +211 -87
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/inbox-dropdown-button-view.js +11 -10
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-action-button-view.js +29 -20
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.d.ts +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-label-view.js +76 -41
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-modal-view-driver.js +99 -45
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-mole-view-driver.js +128 -76
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-tooltip-view.js +319 -128
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-top-message-bar-driver.js +78 -45
- package/src/platform-implementation-js/dom-driver/inbox/__mocks__/getSidebarClassnames.js +4 -8
- package/src/platform-implementation-js/dom-driver/inbox/addNavItem.js +54 -36
- package/src/platform-implementation-js/dom-driver/inbox/addRecipientRow.js +53 -35
- package/src/platform-implementation-js/dom-driver/inbox/createLink.js +15 -13
- package/src/platform-implementation-js/dom-driver/inbox/createLink.test.js +18 -15
- package/src/platform-implementation-js/dom-driver/inbox/custom-style.js +13 -14
- package/src/platform-implementation-js/dom-driver/inbox/detection/appToolbarLocation/parser.js +20 -14
- package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentCard/parser.js +13 -14
- package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentOverlay/parser.js +67 -35
- package/src/platform-implementation-js/dom-driver/inbox/detection/chatSidebar/parser.js +18 -16
- package/src/platform-implementation-js/dom-driver/inbox/detection/compose/parser.js +185 -68
- package/src/platform-implementation-js/dom-driver/inbox/detection/message/parser.js +56 -28
- package/src/platform-implementation-js/dom-driver/inbox/detection/nativeDrawer/parser.js +10 -12
- package/src/platform-implementation-js/dom-driver/inbox/detection/searchBar/parser.js +16 -16
- package/src/platform-implementation-js/dom-driver/inbox/detection/thread/parser.js +35 -24
- package/src/platform-implementation-js/dom-driver/inbox/detection/thread-row/parser.js +89 -37
- package/src/platform-implementation-js/dom-driver/inbox/getComposeViewDriverLiveSet.js +78 -56
- package/src/platform-implementation-js/dom-driver/inbox/getInboxMessageIdForInboxThreadId.js +32 -26
- package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.js +109 -52
- package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.test.js +8 -7
- package/src/platform-implementation-js/dom-driver/inbox/gotoView.js +20 -16
- package/src/platform-implementation-js/dom-driver/inbox/gotoView.test.js +16 -15
- package/src/platform-implementation-js/dom-driver/inbox/inbox-butter-bar-driver.js +83 -75
- package/src/platform-implementation-js/dom-driver/inbox/inbox-driver.js +823 -531
- package/src/platform-implementation-js/dom-driver/inbox/inbox-page-communicator.js +61 -48
- package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.js +12 -9
- package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.test.js +19 -12
- package/src/platform-implementation-js/dom-driver/inbox/makePageParserTree.js +33 -24
- package/src/platform-implementation-js/dom-driver/inbox/pageParserOptions.js +388 -201
- package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js +265 -249
- package/src/platform-implementation-js/dom-driver/inbox/setupCustomAutocompleteSelectionHandling.js +152 -84
- package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.js +67 -55
- package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.test.js +65 -43
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxLabelView.js +56 -31
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxMoleViewDriver.js +294 -191
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarButtonView.js +45 -32
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarView.js +39 -21
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-sidebar-view.js +240 -153
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-button-view.js +150 -75
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-tooltip-view.js +37 -20
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-card-view.js +114 -60
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-overlay-view.js +65 -47
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-backdrop.js +52 -41
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-chat-sidebar-view.js +36 -27
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-button-view.js +80 -52
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-view.js +649 -465
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.js +58 -37
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.test.js +26 -14
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-drawer-view.js +235 -118
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dropdown-view.js +11 -10
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dummy-route-view.js +46 -28
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-message-view.js +202 -131
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-modal-view.js +80 -40
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-route-view.js +61 -35
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-row-view.js +221 -124
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.js +213 -125
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.test.js +126 -104
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-tooltip-view.js +51 -36
- package/src/platform-implementation-js/dom-driver/inbox/views/inboxNavItemView.js +297 -158
- package/src/platform-implementation-js/dom-driver/inbox/waitForAnimationClickBlockerGone.js +35 -21
- package/src/platform-implementation-js/driver-common/compose/getDiscardStream.js +43 -24
- package/src/platform-implementation-js/driver-common/compose/getPresendingStream.js +68 -39
- package/src/platform-implementation-js/driver-common/getAccountUrlPart.d.ts +0 -1
- package/src/platform-implementation-js/driver-common/getGmailMessageIdForSyncMessageId.js +19 -14
- package/src/platform-implementation-js/driver-common/getGmailThreadIdForRfcMessageId.js +35 -27
- package/src/platform-implementation-js/driver-common/getOriginalMessagePage.d.ts +0 -1
- package/src/platform-implementation-js/driver-common/getRfcMessageIdForSyncMessageId.js +22 -16
- package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.d.ts +0 -1
- package/src/platform-implementation-js/driver-common/getThreadIdFromMessageId.js +14 -14
- package/src/platform-implementation-js/driver-common/gmailAjax.d.ts +0 -1
- package/src/platform-implementation-js/driver-common/inboxAjax.js +7 -12
- package/src/platform-implementation-js/driver-common/render-custom-icon.d.ts +0 -1
- package/src/platform-implementation-js/driver-common/requestGmailThread.js +20 -19
- package/src/platform-implementation-js/driver-common/sidebar/AppSidebar.js +306 -197
- package/src/platform-implementation-js/driver-common/sidebar/ContentPanelViewDriver.js +161 -113
- package/src/platform-implementation-js/driver-common/update-icon.d.ts +0 -1
- package/src/platform-implementation-js/driver-interfaces/compose-view-driver.js +114 -1
- package/src/platform-implementation-js/driver-interfaces/driver.d.ts +0 -5
- package/src/platform-implementation-js/driver-interfaces/driver.js +126 -1
- package/src/platform-implementation-js/driver-interfaces/message-view-driver.js +48 -4
- package/src/platform-implementation-js/driver-interfaces/mole-view-driver.js +29 -1
- package/src/platform-implementation-js/driver-interfaces/route-view-driver.js +32 -1
- package/src/platform-implementation-js/driver-interfaces/thread-row-view-driver.js +11 -1
- package/src/platform-implementation-js/lib/ErrorCollector.d.ts +0 -1
- package/src/platform-implementation-js/lib/Membrane.d.ts +0 -1
- package/src/platform-implementation-js/lib/ScrollableContainByScreen.d.ts +0 -1
- package/src/platform-implementation-js/lib/array-to-lifetimes.js +41 -43
- package/src/platform-implementation-js/lib/array-to-lifetimes.test.js +155 -139
- package/src/platform-implementation-js/lib/attemptWithRetries.d.ts +0 -1
- package/src/platform-implementation-js/lib/common-page-communicator.d.ts +0 -1
- package/src/platform-implementation-js/lib/copyAndValidateAutocompleteResults.js +38 -19
- package/src/platform-implementation-js/lib/css-selector-escape.js +3 -7
- package/src/platform-implementation-js/lib/delay-asap.d.ts +0 -1
- package/src/platform-implementation-js/lib/delay-idle.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/element-view-mapper.js +11 -8
- package/src/platform-implementation-js/lib/dom/generic-button-view.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/get-insert-before-element.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/get-selection.js +52 -23
- package/src/platform-implementation-js/lib/dom/insert-element-in-order.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/insert-html-at-cursor.js +101 -69
- package/src/platform-implementation-js/lib/dom/is-node-in-range.js +10 -8
- package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-child-stream.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-stream-merger.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-view-stream.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/on-mouse-down-and-up.js +17 -15
- package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/parentNodes.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/querySelectorOne.js +11 -8
- package/src/platform-implementation-js/lib/dom/querySelectorOrFail.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/set-css.js +3 -7
- package/src/platform-implementation-js/lib/dom/set-value-and-dispatch-event.js +11 -9
- package/src/platform-implementation-js/lib/dom/simulate-drag-and-drop.js +33 -32
- package/src/platform-implementation-js/lib/dom/simulate-key.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/simulate-mouse-event.d.ts +0 -1
- package/src/platform-implementation-js/lib/dom/trigger-relay-event.d.ts +0 -1
- package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.d.ts +0 -1
- package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.test.js +26 -23
- package/src/platform-implementation-js/lib/fake-window-resize.d.ts +0 -1
- package/src/platform-implementation-js/lib/from-event-target-capture.d.ts +0 -1
- package/src/platform-implementation-js/lib/fromEventsWithOptions.d.ts +0 -1
- package/src/platform-implementation-js/lib/handle-compose-link-chips.js +149 -86
- package/src/platform-implementation-js/lib/handler-registry.d.ts +0 -1
- package/src/platform-implementation-js/lib/idMap.d.ts +0 -1
- package/src/platform-implementation-js/lib/imageRequest.d.ts +0 -1
- package/src/platform-implementation-js/lib/incrementName.d.ts +0 -1
- package/src/platform-implementation-js/lib/inject-script-EMBEDDED.d.ts +0 -1
- package/src/platform-implementation-js/lib/inject-script.d.ts +0 -1
- package/src/platform-implementation-js/lib/insert-link-chip-into-body.js +57 -42
- package/src/platform-implementation-js/lib/is-valid-app-id.d.ts +0 -1
- package/src/platform-implementation-js/lib/is-valid-email.d.ts +0 -1
- package/src/platform-implementation-js/lib/isNotNil.d.ts +0 -1
- package/src/platform-implementation-js/lib/isStreakAppId.d.ts +0 -1
- package/src/platform-implementation-js/lib/logger.d.ts +0 -1
- package/src/platform-implementation-js/lib/make-revocable-function.js +21 -19
- package/src/platform-implementation-js/lib/make-revocable-function.test.js +22 -20
- package/src/platform-implementation-js/lib/parseParamsFromRouteID.js +17 -15
- package/src/platform-implementation-js/lib/parseParamsFromRouteID.test.js +18 -9
- package/src/platform-implementation-js/lib/persistent-queue.d.ts +0 -1
- package/src/platform-implementation-js/lib/populateRouteID.js +9 -8
- package/src/platform-implementation-js/lib/populateRouteID.test.js +19 -20
- package/src/platform-implementation-js/lib/react/ElementContainer.js +20 -23
- package/src/platform-implementation-js/lib/rewriteCssWithIdMap.js +9 -10
- package/src/platform-implementation-js/lib/rewriteCssWithIdMap.test.js +20 -13
- package/src/platform-implementation-js/lib/routeIDmatchesHash.js +18 -13
- package/src/platform-implementation-js/lib/routeIDmatchesHash.test.js +17 -11
- package/src/platform-implementation-js/lib/safe-event-emitter.d.ts +0 -1
- package/src/platform-implementation-js/lib/shared-style.js +13 -14
- package/src/platform-implementation-js/lib/stopper-pool.d.ts +0 -1
- package/src/platform-implementation-js/lib/stream-wait-for.d.ts +0 -1
- package/src/platform-implementation-js/lib/toItemWithLifetimeStream.js +17 -18
- package/src/platform-implementation-js/lib/toLiveSet.js +15 -17
- package/src/platform-implementation-js/lib/wait-for.d.ts +1 -2
- package/src/platform-implementation-js/lib/waitForAsync.d.ts +0 -1
- package/src/platform-implementation-js/main-INTEGRATED-PAGEWORLD.js +5 -6
- package/src/platform-implementation-js/main.js +24 -9
- package/src/platform-implementation-js/namespaces/butter-bar.d.ts +0 -1
- package/src/platform-implementation-js/namespaces/compose.js +60 -37
- package/src/platform-implementation-js/namespaces/conversations.js +124 -52
- package/src/platform-implementation-js/namespaces/global.js +39 -27
- package/src/platform-implementation-js/namespaces/keyboard.js +33 -29
- package/src/platform-implementation-js/namespaces/lists.js +31 -25
- package/src/platform-implementation-js/namespaces/modal.js +28 -34
- package/src/platform-implementation-js/namespaces/nav-menu.js +45 -30
- package/src/platform-implementation-js/namespaces/router.js +137 -70
- package/src/platform-implementation-js/namespaces/search.js +17 -19
- package/src/platform-implementation-js/namespaces/toolbars.js +117 -71
- package/src/platform-implementation-js/namespaces/user.js +37 -36
- package/src/platform-implementation-js/namespaces/widgets.js +61 -54
- package/src/platform-implementation-js/platform-implementation.d.ts +0 -2
- package/src/platform-implementation-js/platform-implementation.js +226 -98
- package/src/platform-implementation-js/views/SimpleElementView.d.ts +0 -1
- package/src/platform-implementation-js/views/app-toolbar-button-view.js +47 -26
- package/src/platform-implementation-js/views/collapsible-section-view.js +63 -66
- package/src/platform-implementation-js/views/compose-button-view.d.ts +0 -1
- package/src/platform-implementation-js/views/compose-view.d.ts +0 -1
- package/src/platform-implementation-js/views/content-panel-view.js +30 -28
- package/src/platform-implementation-js/views/conversations/attachment-card-view.js +44 -21
- package/src/platform-implementation-js/views/conversations/custom-message-view.js +104 -44
- package/src/platform-implementation-js/views/conversations/message-view.js +202 -131
- package/src/platform-implementation-js/views/conversations/thread-view.js +127 -75
- package/src/platform-implementation-js/views/keyboard-shortcut-handle.d.ts +0 -1
- package/src/platform-implementation-js/views/native-nav-item-view.js +65 -32
- package/src/platform-implementation-js/views/nav-item-view.js +115 -51
- package/src/platform-implementation-js/views/route-view/custom-route-view.js +20 -25
- package/src/platform-implementation-js/views/route-view/dummy-route-view-driver.js +18 -18
- package/src/platform-implementation-js/views/route-view/list-route-view.js +52 -30
- package/src/platform-implementation-js/views/route-view/route-view.js +35 -24
- package/src/platform-implementation-js/views/section-view.js +52 -60
- package/src/platform-implementation-js/views/thread-row-view.js +74 -49
- package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.d.ts +0 -1
- package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.d.ts +0 -1
- package/src/platform-implementation-js/widgets/buttons/dropdown-view.d.ts +0 -1
- package/src/platform-implementation-js/widgets/drawer-view.js +36 -29
- package/src/platform-implementation-js/widgets/modal-view.js +68 -39
- package/src/platform-implementation-js/widgets/mole-view.js +22 -22
- package/src/platform-implementation-js/widgets/top-message-bar-view.js +10 -13
- package/src/build/exec.d.ts.map +0 -1
- package/src/build/exec.js +0 -26
- package/src/build/spawn.d.ts.map +0 -1
- package/src/build/spawn.js +0 -17
- package/src/common/ajax.d.ts.map +0 -1
- package/src/common/ajax.js +0 -90
- package/src/common/cachebust-url.d.ts.map +0 -1
- package/src/common/cachebust-url.js +0 -10
- package/src/common/censorHTMLstring.d.ts.map +0 -1
- package/src/common/censorHTMLstring.js +0 -37
- package/src/common/censorHTMLtree.d.ts.map +0 -1
- package/src/common/censorHTMLtree.js +0 -28
- package/src/common/censorJSONTree.d.ts.map +0 -1
- package/src/common/censorJSONTree.js +0 -15
- package/src/common/connectivity-test.d.ts.map +0 -1
- package/src/common/connectivity-test.js +0 -21
- package/src/common/defer.d.ts.map +0 -1
- package/src/common/defer.js +0 -11
- package/src/common/find-parent.d.ts.map +0 -1
- package/src/common/find-parent.js +0 -10
- package/src/common/get-extension-id.d.ts.map +0 -1
- package/src/common/get-extension-id.js +0 -7
- package/src/common/get-or-fail.d.ts.map +0 -1
- package/src/common/get-or-fail.js +0 -8
- package/src/common/get-session-id.d.ts.map +0 -1
- package/src/common/get-session-id.js +0 -14
- package/src/common/get-stack-trace.d.ts.map +0 -1
- package/src/common/get-stack-trace.js +0 -6
- package/src/common/html-to-text.d.ts.map +0 -1
- package/src/common/html-to-text.js +0 -7
- package/src/common/isElementVisible.d.ts.map +0 -1
- package/src/common/isElementVisible.js +0 -6
- package/src/common/load-script.d.ts.map +0 -1
- package/src/common/load-script.js +0 -127
- package/src/common/log-error.d.ts.map +0 -1
- package/src/common/log-error.js +0 -191
- package/src/common/quoted-split.d.ts.map +0 -1
- package/src/common/quoted-split.js +0 -18
- package/src/common/rate-limit-queuer.d.ts.map +0 -1
- package/src/common/rate-limit-queuer.js +0 -57
- package/src/common/rate-limit.d.ts.map +0 -1
- package/src/common/rate-limit.js +0 -14
- package/src/common/version.d.ts.map +0 -1
- package/src/common/version.js +0 -6
- package/src/inboxsdk-js/loading/platform-implementation-loader.d.ts.map +0 -1
- package/src/inboxsdk-js/loading/platform-implementation-loader.js +0 -27
- package/src/injected-js/gmail/constants.d.ts.map +0 -1
- package/src/injected-js/gmail/constants.js +0 -2
- package/src/injected-js/gmail/modify-suggestions.d.ts.map +0 -1
- package/src/injected-js/gmail/modify-suggestions.js +0 -106
- package/src/injected-js/gmail/setup-gmonkey-handler.d.ts.map +0 -1
- package/src/injected-js/gmail/setup-gmonkey-handler.js +0 -49
- package/src/injected-js/gmail/sync-compose-processor-20220909.d.ts.map +0 -1
- package/src/injected-js/gmail/sync-compose-processor-20220909.js +0 -298
- package/src/injected-js/gmail/sync-compose-processor.d.ts.map +0 -1
- package/src/injected-js/gmail/sync-compose-processor.js +0 -55
- package/src/injected-js/gmail/sync-compose-request-processor.d.ts.map +0 -1
- package/src/injected-js/gmail/sync-compose-request-processor.js +0 -110
- package/src/injected-js/injected-logger.d.ts.map +0 -1
- package/src/injected-js/injected-logger.js +0 -50
- package/src/injected-js/setupCustomViewEventAssassin.d.ts.map +0 -1
- package/src/injected-js/setupCustomViewEventAssassin.js +0 -90
- package/src/platform-implementation-js/constants/nav-item-types.d.ts.map +0 -1
- package/src/platform-implementation-js/constants/nav-item-types.js +0 -19
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.d.ts +0 -5
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.js +0 -21
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.d.ts +0 -5
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.js +0 -28
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.js +0 -98
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.js +0 -4
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.js +0 -8
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.js +0 -12
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.js +0 -33
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.js +0 -4
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.js +0 -44
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.d.ts +0 -2
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.js +0 -38
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.js +0 -12
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.js +0 -253
- package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.js +0 -200
- package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.js +0 -533
- package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.js +0 -289
- package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.js +0 -21
- package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.js +0 -28
- package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.js +0 -19
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.d.ts +0 -43
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.js +0 -126
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.js +0 -101
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.js +0 -38
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.js +0 -28
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.js +0 -22
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.js +0 -233
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.js +0 -223
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.js +0 -157
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.js +0 -109
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.js +0 -5
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.js +0 -759
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.js +0 -84
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.js +0 -33
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.js +0 -325
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.js +0 -58
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.js +0 -55
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.js +0 -96
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.js +0 -30
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.js +0 -10
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.d.ts.map +0 -1
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.js +0 -22
- package/src/platform-implementation-js/driver-common/getAccountUrlPart.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/getAccountUrlPart.js +0 -17
- package/src/platform-implementation-js/driver-common/getOriginalMessagePage.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/getOriginalMessagePage.js +0 -33
- package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.js +0 -49
- package/src/platform-implementation-js/driver-common/gmailAjax.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/gmailAjax.js +0 -65
- package/src/platform-implementation-js/driver-common/render-custom-icon.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/render-custom-icon.js +0 -16
- package/src/platform-implementation-js/driver-common/update-icon.d.ts.map +0 -1
- package/src/platform-implementation-js/driver-common/update-icon.js +0 -90
- package/src/platform-implementation-js/lib/ErrorCollector.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/ErrorCollector.js +0 -47
- package/src/platform-implementation-js/lib/Membrane.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/Membrane.js +0 -22
- package/src/platform-implementation-js/lib/ScrollableContainByScreen.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/ScrollableContainByScreen.js +0 -30
- package/src/platform-implementation-js/lib/attemptWithRetries.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/attemptWithRetries.js +0 -16
- package/src/platform-implementation-js/lib/common-page-communicator.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/common-page-communicator.js +0 -137
- package/src/platform-implementation-js/lib/delay-asap.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/delay-asap.js +0 -12
- package/src/platform-implementation-js/lib/delay-idle.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/delay-idle.js +0 -16
- package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.js +0 -36
- package/src/platform-implementation-js/lib/dom/generic-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/generic-button-view.js +0 -39
- package/src/platform-implementation-js/lib/dom/get-insert-before-element.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/get-insert-before-element.js +0 -39
- package/src/platform-implementation-js/lib/dom/insert-element-in-order.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/insert-element-in-order.js +0 -38
- package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.js +0 -12
- package/src/platform-implementation-js/lib/dom/make-element-child-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-child-stream.js +0 -79
- package/src/platform-implementation-js/lib/dom/make-element-stream-merger.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-stream-merger.js +0 -28
- package/src/platform-implementation-js/lib/dom/make-element-view-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/make-element-view-stream.js +0 -15
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.js +0 -15
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.js +0 -5
- package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.js +0 -39
- package/src/platform-implementation-js/lib/dom/parentNodes.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/parentNodes.js +0 -8
- package/src/platform-implementation-js/lib/dom/querySelectorOrFail.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/querySelectorOrFail.js +0 -6
- package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.js +0 -22
- package/src/platform-implementation-js/lib/dom/simulate-key.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/simulate-key.js +0 -46
- package/src/platform-implementation-js/lib/dom/simulate-mouse-event.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/simulate-mouse-event.js +0 -16
- package/src/platform-implementation-js/lib/dom/trigger-relay-event.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/dom/trigger-relay-event.js +0 -7
- package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.js +0 -25
- package/src/platform-implementation-js/lib/fake-window-resize.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/fake-window-resize.js +0 -5
- package/src/platform-implementation-js/lib/from-event-target-capture.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/from-event-target-capture.js +0 -12
- package/src/platform-implementation-js/lib/fromEventsWithOptions.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/fromEventsWithOptions.js +0 -10
- package/src/platform-implementation-js/lib/handler-registry.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/handler-registry.js +0 -67
- package/src/platform-implementation-js/lib/idMap.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/idMap.js +0 -45
- package/src/platform-implementation-js/lib/imageRequest.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/imageRequest.js +0 -8
- package/src/platform-implementation-js/lib/incrementName.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/incrementName.js +0 -7
- package/src/platform-implementation-js/lib/inject-script-EMBEDDED.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/inject-script-EMBEDDED.js +0 -14
- package/src/platform-implementation-js/lib/inject-script.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/inject-script.js +0 -33
- package/src/platform-implementation-js/lib/is-valid-app-id.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/is-valid-app-id.js +0 -27
- package/src/platform-implementation-js/lib/is-valid-email.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/is-valid-email.js +0 -14
- package/src/platform-implementation-js/lib/isNotNil.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/isNotNil.js +0 -5
- package/src/platform-implementation-js/lib/isStreakAppId.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/isStreakAppId.js +0 -11
- package/src/platform-implementation-js/lib/logger.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/logger.js +0 -441
- package/src/platform-implementation-js/lib/persistent-queue.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/persistent-queue.js +0 -107
- package/src/platform-implementation-js/lib/safe-event-emitter.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/safe-event-emitter.js +0 -17
- package/src/platform-implementation-js/lib/stopper-pool.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/stopper-pool.js +0 -41
- package/src/platform-implementation-js/lib/stream-wait-for.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/stream-wait-for.js +0 -30
- package/src/platform-implementation-js/lib/wait-for.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/wait-for.js +0 -28
- package/src/platform-implementation-js/lib/waitForAsync.d.ts.map +0 -1
- package/src/platform-implementation-js/lib/waitForAsync.js +0 -19
- package/src/platform-implementation-js/namespaces/app-menu.d.ts +0 -38
- package/src/platform-implementation-js/namespaces/app-menu.d.ts.map +0 -1
- package/src/platform-implementation-js/namespaces/app-menu.js +0 -31
- package/src/platform-implementation-js/namespaces/butter-bar.d.ts.map +0 -1
- package/src/platform-implementation-js/namespaces/butter-bar.js +0 -163
- package/src/platform-implementation-js/views/SimpleElementView.d.ts.map +0 -1
- package/src/platform-implementation-js/views/SimpleElementView.js +0 -16
- package/src/platform-implementation-js/views/app-menu-item-view.d.ts +0 -23
- package/src/platform-implementation-js/views/app-menu-item-view.d.ts.map +0 -1
- package/src/platform-implementation-js/views/app-menu-item-view.js +0 -257
- package/src/platform-implementation-js/views/collapsible-panel-view.d.ts +0 -50
- package/src/platform-implementation-js/views/collapsible-panel-view.d.ts.map +0 -1
- package/src/platform-implementation-js/views/collapsible-panel-view.js +0 -222
- package/src/platform-implementation-js/views/compose-button-view.d.ts.map +0 -1
- package/src/platform-implementation-js/views/compose-button-view.js +0 -45
- package/src/platform-implementation-js/views/compose-view.d.ts.map +0 -1
- package/src/platform-implementation-js/views/compose-view.js +0 -312
- package/src/platform-implementation-js/views/keyboard-shortcut-handle.d.ts.map +0 -1
- package/src/platform-implementation-js/views/keyboard-shortcut-handle.js +0 -14
- package/src/platform-implementation-js/views/nav-item-view.d.ts +0 -24
- package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.d.ts.map +0 -1
- package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.js +0 -39
- package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.d.ts.map +0 -1
- package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.js +0 -98
- package/src/platform-implementation-js/widgets/buttons/dropdown-view.d.ts.map +0 -1
- package/src/platform-implementation-js/widgets/buttons/dropdown-view.js +0 -122
|
@@ -1,90 +1,151 @@
|
|
|
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
|
-
var _getSelection = require("../../../lib/dom/get-selection");
|
|
52
|
-
var _getMinimizedStream = _interopRequireDefault(require("./gmail-compose-view/get-minimized-stream"));
|
|
53
|
-
var _censorHTMLstring = _interopRequireDefault(require("../../../../common/censorHTMLstring"));
|
|
54
|
-
var _insertLinkIntoBody = _interopRequireDefault(require("./gmail-compose-view/insert-link-into-body"));
|
|
55
|
-
var _getAddressChangesStream = _interopRequireDefault(require("./gmail-compose-view/get-address-changes-stream"));
|
|
56
|
-
var _getBodyChangesStream = _interopRequireDefault(require("./gmail-compose-view/get-body-changes-stream"));
|
|
57
|
-
var _getRecipients = _interopRequireDefault(require("./gmail-compose-view/get-recipients"));
|
|
58
|
-
var _getResponseTypeChangesStream = _interopRequireDefault(require("./gmail-compose-view/get-response-type-changes-stream"));
|
|
59
|
-
var _getPresendingStream = _interopRequireDefault(require("../../../driver-common/compose/getPresendingStream"));
|
|
60
|
-
var _getDiscardStream = _interopRequireDefault(require("../../../driver-common/compose/getDiscardStream"));
|
|
61
|
-
var _updateInsertMoreAreaLeft = _interopRequireDefault(require("./gmail-compose-view/update-insert-more-area-left"));
|
|
62
|
-
var _setupLinkPopovers = _interopRequireDefault(require("./gmail-compose-view/setupLinkPopovers"));
|
|
63
|
-
var _getFormattingAreaOffsetLeft = _interopRequireDefault(require("./gmail-compose-view/get-formatting-area-offset-left"));
|
|
64
|
-
var _overrideEditSubject = _interopRequireDefault(require("./gmail-compose-view/override-edit-subject"));
|
|
65
|
-
var _detectClassicRecipientsArea = _interopRequireDefault(require("./gmail-compose-view/detectClassicRecipientsArea"));
|
|
66
|
-
var _censorHTMLtree = _interopRequireDefault(require("../../../../common/censorHTMLtree"));
|
|
67
|
-
var _pageParser = require("./gmail-compose-view/page-parser");
|
|
68
|
-
var _pageParserTree = _interopRequireDefault(require("page-parser-tree"));
|
|
69
|
-
var _tagTree = require("tag-tree");
|
|
70
|
-
var fromManager = _interopRequireWildcard(require("./gmail-compose-view/from-manager"));
|
|
71
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
72
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
1
|
+
/* @flow */
|
|
2
|
+
|
|
3
|
+
import autoHtml from 'auto-html';
|
|
4
|
+
import t from 'transducers.js';
|
|
5
|
+
import once from 'lodash/once';
|
|
6
|
+
import escape from 'lodash/escape';
|
|
7
|
+
import includes from 'lodash/includes';
|
|
8
|
+
import constant from 'lodash/constant';
|
|
9
|
+
import find from 'lodash/find';
|
|
10
|
+
import asap from 'asap';
|
|
11
|
+
import delay from 'pdelay';
|
|
12
|
+
import * as Kefir from 'kefir';
|
|
13
|
+
import * as ud from 'ud';
|
|
14
|
+
import closest from 'closest-ng';
|
|
15
|
+
import kefirBus from 'kefir-bus';
|
|
16
|
+
import type { Bus } from 'kefir-bus';
|
|
17
|
+
import kefirStopper from 'kefir-stopper';
|
|
18
|
+
import type { Stopper } from 'kefir-stopper';
|
|
19
|
+
|
|
20
|
+
import delayAsap from '../../../lib/delay-asap';
|
|
21
|
+
import { simulateClick } from '../../../lib/dom/simulate-mouse-event';
|
|
22
|
+
import simulateKey from '../../../lib/dom/simulate-key';
|
|
23
|
+
import querySelector from '../../../lib/dom/querySelectorOrFail';
|
|
24
|
+
import isElementVisible from '../../../../common/isElementVisible';
|
|
25
|
+
import makeElementChildStream from '../../../lib/dom/make-element-child-stream';
|
|
26
|
+
import {
|
|
27
|
+
simulateDragOver,
|
|
28
|
+
simulateDrop,
|
|
29
|
+
simulateDragEnd,
|
|
30
|
+
} from '../../../lib/dom/simulate-drag-and-drop';
|
|
31
|
+
import * as GmailResponseProcessor from '../gmail-response-processor';
|
|
32
|
+
import GmailElementGetter from '../gmail-element-getter';
|
|
33
|
+
import setCss from '../../../lib/dom/set-css';
|
|
34
|
+
|
|
35
|
+
import waitFor from '../../../lib/wait-for';
|
|
36
|
+
import streamWaitFor from '../../../lib/stream-wait-for';
|
|
37
|
+
import makeMutationObserverChunkedStream from '../../../lib/dom/make-mutation-observer-chunked-stream';
|
|
38
|
+
import handleComposeLinkChips from '../../../lib/handle-compose-link-chips';
|
|
39
|
+
import insertLinkChipIntoBody from '../../../lib/insert-link-chip-into-body';
|
|
40
|
+
import addComposeNotice from './gmail-compose-view/add-compose-notice';
|
|
41
|
+
import addStatusBar from './gmail-compose-view/add-status-bar';
|
|
42
|
+
import insertHTMLatCursor from '../../../lib/dom/insert-html-at-cursor';
|
|
43
|
+
import ensureGroupingIsOpen from './gmail-compose-view/ensure-grouping-is-open';
|
|
44
|
+
import ensureAppButtonToolbarsAreClosed from './gmail-compose-view/ensure-app-button-toolbars-are-closed';
|
|
45
|
+
import sizeFixer from './gmail-compose-view/size-fixer';
|
|
46
|
+
import addTooltipToButton from './gmail-compose-view/add-tooltip-to-button';
|
|
47
|
+
import addRecipientRow from './gmail-compose-view/add-recipient-row';
|
|
48
|
+
import addButton from './gmail-compose-view/add-button';
|
|
49
|
+
import setRecipients from './gmail-compose-view/set-recipients';
|
|
50
|
+
import focus from './gmail-compose-view/focus';
|
|
73
51
|
// import addOuterSidebar from './gmail-compose-view/add-outer-sidebar';
|
|
52
|
+
import monitorSelectionRange from './gmail-compose-view/monitor-selection-range';
|
|
53
|
+
import manageButtonGrouping from './gmail-compose-view/manage-button-grouping';
|
|
54
|
+
import type { TooltipDescriptor } from '../../../views/compose-button-view';
|
|
55
|
+
import {
|
|
56
|
+
getSelectedHTMLInElement,
|
|
57
|
+
getSelectedTextInElement,
|
|
58
|
+
} from '../../../lib/dom/get-selection';
|
|
59
|
+
import getMinimizedStream from './gmail-compose-view/get-minimized-stream';
|
|
60
|
+
import censorHTMLstring from '../../../../common/censorHTMLstring';
|
|
61
|
+
|
|
62
|
+
import insertLinkIntoBody from './gmail-compose-view/insert-link-into-body';
|
|
63
|
+
import getAddressChangesStream from './gmail-compose-view/get-address-changes-stream';
|
|
64
|
+
import getBodyChangesStream from './gmail-compose-view/get-body-changes-stream';
|
|
65
|
+
import getRecipients from './gmail-compose-view/get-recipients';
|
|
66
|
+
import getResponseTypeChangesStream from './gmail-compose-view/get-response-type-changes-stream';
|
|
67
|
+
import getPresendingStream from '../../../driver-common/compose/getPresendingStream';
|
|
68
|
+
import getDiscardStream from '../../../driver-common/compose/getDiscardStream';
|
|
69
|
+
import updateInsertMoreAreaLeft from './gmail-compose-view/update-insert-more-area-left';
|
|
70
|
+
import setupLinkPopOvers from './gmail-compose-view/setupLinkPopovers';
|
|
71
|
+
import getFormattingAreaOffsetLeft from './gmail-compose-view/get-formatting-area-offset-left';
|
|
72
|
+
import overrideEditSubject from './gmail-compose-view/override-edit-subject';
|
|
73
|
+
import detectClassicRecipientsArea from './gmail-compose-view/detectClassicRecipientsArea';
|
|
74
|
+
import censorHTMLtree from '../../../../common/censorHTMLtree';
|
|
75
|
+
import {
|
|
76
|
+
makePageParser,
|
|
77
|
+
getRecipientRowElements,
|
|
78
|
+
} from './gmail-compose-view/page-parser';
|
|
79
|
+
import PageParserTree from 'page-parser-tree';
|
|
80
|
+
import { TagTree } from 'tag-tree';
|
|
81
|
+
|
|
82
|
+
import * as fromManager from './gmail-compose-view/from-manager';
|
|
83
|
+
|
|
84
|
+
import type {
|
|
85
|
+
ComposeNotice,
|
|
86
|
+
ComposeViewDriver,
|
|
87
|
+
StatusBar,
|
|
88
|
+
} from '../../../driver-interfaces/compose-view-driver';
|
|
89
|
+
import type Logger from '../../../lib/logger';
|
|
90
|
+
import type GmailDriver from '../gmail-driver';
|
|
91
|
+
|
|
74
92
|
let hasReportedMissingBody = false;
|
|
93
|
+
|
|
75
94
|
class GmailComposeView {
|
|
76
|
-
|
|
95
|
+
_element: HTMLElement;
|
|
96
|
+
_seenBodyElement: HTMLElement;
|
|
97
|
+
_isInlineReplyForm: boolean;
|
|
98
|
+
_isFullscreen: boolean;
|
|
99
|
+
_isStandalone: boolean;
|
|
100
|
+
_emailWasSent: boolean;
|
|
101
|
+
_driver: GmailDriver;
|
|
102
|
+
_managedViewControllers: Array<{ destroy(): void }>;
|
|
103
|
+
_eventStream: Bus<any>;
|
|
104
|
+
_isTriggeringADraftSavePending: boolean;
|
|
105
|
+
_buttonViewControllerTooltipMap: WeakMap<Object, Object>;
|
|
106
|
+
_composeID: string;
|
|
107
|
+
_messageIDElement: HTMLInputElement;
|
|
108
|
+
_messageId: ?string;
|
|
109
|
+
_finalMessageId: ?string; // Set only after the message is sent.
|
|
110
|
+
_initialMessageId: ?string;
|
|
111
|
+
_targetMessageID: ?string;
|
|
112
|
+
_draftSaving: boolean;
|
|
113
|
+
_draftIDpromise: ?Promise<?string>;
|
|
114
|
+
_threadID: ?string;
|
|
115
|
+
_stopper: Stopper;
|
|
116
|
+
_lastSelectionRange: ?Range;
|
|
117
|
+
_requestModifiers: {
|
|
118
|
+
[key: string]: (composeParams: { body: string }) =>
|
|
119
|
+
| { body: string }
|
|
120
|
+
| Promise<{ body: string }>,
|
|
121
|
+
};
|
|
122
|
+
_isListeningToAjaxInterceptStream: boolean;
|
|
123
|
+
_formattingArea: ?HTMLElement;
|
|
124
|
+
_closedProgrammatically: boolean = false;
|
|
125
|
+
_destroyed: boolean = false;
|
|
126
|
+
_removedFromDOMStopper: Stopper;
|
|
127
|
+
_hasSetupLinkPopOvers: boolean = false;
|
|
128
|
+
_page: PageParserTree;
|
|
129
|
+
tagTree: TagTree<HTMLElement>;
|
|
130
|
+
ready: () => Kefir.Observable<GmailComposeView>;
|
|
77
131
|
|
|
78
|
-
constructor(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
132
|
+
constructor(
|
|
133
|
+
element: HTMLElement,
|
|
134
|
+
xhrInterceptorStream: Kefir.Observable<*>,
|
|
135
|
+
driver: GmailDriver,
|
|
136
|
+
options: {
|
|
137
|
+
isInlineReplyForm: boolean,
|
|
138
|
+
isStandalone: boolean,
|
|
139
|
+
}
|
|
140
|
+
) {
|
|
141
|
+
(this: ComposeViewDriver);
|
|
83
142
|
this._element = element;
|
|
84
143
|
this._element.classList.add('inboxsdk__compose');
|
|
144
|
+
|
|
85
145
|
if (options.isInlineReplyForm) {
|
|
86
146
|
this._element.classList.add('inboxsdk__compose_inlineReply');
|
|
87
147
|
}
|
|
148
|
+
|
|
88
149
|
this._isInlineReplyForm = options.isInlineReplyForm;
|
|
89
150
|
this._isStandalone = options.isStandalone;
|
|
90
151
|
this._isFullscreen = false;
|
|
@@ -94,64 +155,69 @@ class GmailComposeView {
|
|
|
94
155
|
this._draftSaving = false;
|
|
95
156
|
this._draftIDpromise = null;
|
|
96
157
|
this._driver = driver;
|
|
97
|
-
this._stopper = (
|
|
158
|
+
this._stopper = kefirStopper();
|
|
98
159
|
this._managedViewControllers = [];
|
|
99
160
|
this._requestModifiers = {};
|
|
100
161
|
this._isListeningToAjaxInterceptStream = false;
|
|
101
|
-
|
|
102
|
-
this.
|
|
162
|
+
|
|
163
|
+
this._eventStream = kefirBus();
|
|
164
|
+
this._removedFromDOMStopper = kefirStopper();
|
|
165
|
+
|
|
103
166
|
this._isTriggeringADraftSavePending = false;
|
|
104
|
-
|
|
167
|
+
|
|
168
|
+
this._page = makePageParser(element, driver.getLogger());
|
|
105
169
|
this.tagTree = this._page.tree;
|
|
170
|
+
|
|
106
171
|
let saveAndSendStream;
|
|
107
172
|
if (this._driver.isUsingSyncAPI()) {
|
|
108
173
|
saveAndSendStream = xhrInterceptorStream
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
{
|
|
115
|
-
return {
|
|
116
|
-
eventName: 'sending'
|
|
117
|
-
};
|
|
174
|
+
// we know _getDraftIDfromForm will work because by the time we're
|
|
175
|
+
// getting an ajax event Gmail's JS has generated an ID and added it to the DOM.
|
|
176
|
+
.filter((event) => event.draftID === this._getDraftIDfromForm())
|
|
177
|
+
.map((event) => {
|
|
178
|
+
switch (event.type) {
|
|
179
|
+
case 'emailSending': {
|
|
180
|
+
return { eventName: 'sending' };
|
|
118
181
|
}
|
|
119
|
-
|
|
120
|
-
{
|
|
182
|
+
case 'emailSent': {
|
|
121
183
|
let syncThreadID = event.threadID;
|
|
122
184
|
let syncMessageID = event.messageID;
|
|
185
|
+
|
|
123
186
|
if (event.oldMessageID) this._messageId = event.oldMessageID;
|
|
124
187
|
if (event.oldThreadID) this._threadID = event.oldThreadID;
|
|
188
|
+
|
|
125
189
|
driver.removeCachedGmailMessageIdForSyncMessageId(syncMessageID);
|
|
126
190
|
driver.removeCachedOldGmailThreadIdFromSyncThreadId(syncThreadID);
|
|
191
|
+
|
|
127
192
|
return {
|
|
128
193
|
eventName: 'sent',
|
|
129
194
|
data: {
|
|
130
|
-
getThreadID: (
|
|
195
|
+
getThreadID: once(async (): Promise<string> => {
|
|
131
196
|
if (event.oldThreadID) {
|
|
132
197
|
return event.oldThreadID;
|
|
133
198
|
}
|
|
134
|
-
return await driver.getOldGmailThreadIdFromSyncThreadId(
|
|
199
|
+
return await driver.getOldGmailThreadIdFromSyncThreadId(
|
|
200
|
+
syncThreadID
|
|
201
|
+
);
|
|
135
202
|
}),
|
|
136
|
-
getMessageID: (
|
|
203
|
+
getMessageID: once(async (): Promise<string> => {
|
|
137
204
|
if (event.oldMessageID) {
|
|
138
205
|
return event.oldMessageID;
|
|
139
206
|
}
|
|
140
|
-
return await driver.getGmailMessageIdForSyncMessageId(
|
|
141
|
-
|
|
142
|
-
|
|
207
|
+
return await driver.getGmailMessageIdForSyncMessageId(
|
|
208
|
+
syncMessageID
|
|
209
|
+
);
|
|
210
|
+
}),
|
|
211
|
+
},
|
|
143
212
|
};
|
|
144
213
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return {
|
|
148
|
-
eventName: 'sendCanceled'
|
|
149
|
-
};
|
|
214
|
+
case 'emailSendFailed': {
|
|
215
|
+
return { eventName: 'sendCanceled' };
|
|
150
216
|
}
|
|
151
|
-
|
|
152
|
-
{
|
|
217
|
+
case 'emailDraftReceived': {
|
|
153
218
|
this._messageId = event.oldMessageID;
|
|
154
219
|
this._threadID = event.oldThreadID;
|
|
220
|
+
|
|
155
221
|
return {
|
|
156
222
|
eventName: 'draftSaved',
|
|
157
223
|
data: {
|
|
@@ -160,32 +226,31 @@ class GmailComposeView {
|
|
|
160
226
|
},
|
|
161
227
|
getMessageID() {
|
|
162
228
|
return Promise.resolve(event.oldMessageID);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
229
|
+
},
|
|
230
|
+
},
|
|
165
231
|
};
|
|
166
232
|
}
|
|
167
|
-
|
|
168
|
-
{
|
|
233
|
+
default: {
|
|
169
234
|
return null;
|
|
170
235
|
}
|
|
171
|
-
|
|
172
|
-
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
.filter(Boolean);
|
|
173
239
|
} else {
|
|
174
|
-
saveAndSendStream = xhrInterceptorStream
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}];
|
|
240
|
+
saveAndSendStream = xhrInterceptorStream
|
|
241
|
+
.filter((event) => event.composeId === this.getComposeID())
|
|
242
|
+
.map((event) => {
|
|
243
|
+
switch (event.type) {
|
|
244
|
+
case 'emailSending': {
|
|
245
|
+
return [{ eventName: 'sending' }];
|
|
181
246
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}];
|
|
247
|
+
case 'emailSent': {
|
|
248
|
+
const response =
|
|
249
|
+
GmailResponseProcessor.interpretSentEmailResponse(
|
|
250
|
+
event.response
|
|
251
|
+
);
|
|
252
|
+
if (includes(['tr', 'eu'], response.messageID)) {
|
|
253
|
+
return [{ eventName: 'sendCanceled' }];
|
|
189
254
|
}
|
|
190
255
|
this._emailWasSent = true;
|
|
191
256
|
if (response.messageID) {
|
|
@@ -193,49 +258,56 @@ class GmailComposeView {
|
|
|
193
258
|
}
|
|
194
259
|
this._messageId = null;
|
|
195
260
|
const data = {
|
|
196
|
-
getThreadID: () =>
|
|
197
|
-
|
|
261
|
+
getThreadID: (): Promise<string> =>
|
|
262
|
+
Promise.resolve(response.threadID),
|
|
263
|
+
getMessageID: (): Promise<string> =>
|
|
264
|
+
Promise.resolve(response.messageID),
|
|
198
265
|
};
|
|
199
|
-
['threadID', 'gmailThreadId'].forEach(prop => {
|
|
266
|
+
['threadID', 'gmailThreadId'].forEach((prop) => {
|
|
200
267
|
// These properties are nonenumerable.
|
|
201
|
-
Object.defineProperty(data, prop, {
|
|
268
|
+
Object.defineProperty((data: any), prop, {
|
|
202
269
|
get: () => {
|
|
203
|
-
this._driver
|
|
270
|
+
this._driver
|
|
271
|
+
.getLogger()
|
|
272
|
+
.deprecationWarning(
|
|
273
|
+
`composeView sent event.${prop}`,
|
|
274
|
+
'composeView sent event.getThreadID()'
|
|
275
|
+
);
|
|
204
276
|
return response.threadID;
|
|
205
|
-
}
|
|
277
|
+
},
|
|
206
278
|
});
|
|
207
279
|
});
|
|
208
|
-
['messageID', 'gmailMessageId'].forEach(prop => {
|
|
209
|
-
Object.defineProperty(data, prop, {
|
|
280
|
+
['messageID', 'gmailMessageId'].forEach((prop) => {
|
|
281
|
+
Object.defineProperty((data: any), prop, {
|
|
210
282
|
get: () => {
|
|
211
|
-
this._driver
|
|
283
|
+
this._driver
|
|
284
|
+
.getLogger()
|
|
285
|
+
.deprecationWarning(
|
|
286
|
+
`composeView sent event.${prop}`,
|
|
287
|
+
'composeView sent event.getMessageID()'
|
|
288
|
+
);
|
|
212
289
|
return response.messageID;
|
|
213
|
-
}
|
|
290
|
+
},
|
|
214
291
|
});
|
|
215
292
|
});
|
|
216
|
-
return [{
|
|
217
|
-
eventName: 'sent',
|
|
218
|
-
data
|
|
219
|
-
}];
|
|
293
|
+
return [{ eventName: 'sent', data }];
|
|
220
294
|
}
|
|
221
|
-
|
|
222
|
-
{
|
|
295
|
+
case 'emailDraftSaveSending': {
|
|
223
296
|
this._draftSaving = true;
|
|
224
|
-
return [{
|
|
225
|
-
eventName: 'draftSaving'
|
|
226
|
-
}];
|
|
297
|
+
return [{ eventName: 'draftSaving' }];
|
|
227
298
|
}
|
|
228
|
-
|
|
229
|
-
{
|
|
299
|
+
case 'emailDraftReceived': {
|
|
230
300
|
this._draftSaving = false;
|
|
231
301
|
let response;
|
|
232
302
|
try {
|
|
233
|
-
response = GmailResponseProcessor.interpretSentEmailResponse(
|
|
303
|
+
response = GmailResponseProcessor.interpretSentEmailResponse(
|
|
304
|
+
event.response
|
|
305
|
+
);
|
|
234
306
|
} catch (err) {
|
|
235
307
|
if (this._driver.getAppId() === 'sdk_streak_21e9788951') {
|
|
236
308
|
this._driver.getLogger().error(err, {
|
|
237
309
|
connectionDetails: event.connectionDetails,
|
|
238
|
-
response: event.response
|
|
310
|
+
response: event.response,
|
|
239
311
|
});
|
|
240
312
|
throw err;
|
|
241
313
|
} else {
|
|
@@ -245,102 +317,158 @@ class GmailComposeView {
|
|
|
245
317
|
if (response.messageID === 'eu') {
|
|
246
318
|
return []; // save was canceled
|
|
247
319
|
}
|
|
248
|
-
|
|
249
|
-
const events = [{
|
|
250
|
-
eventName: 'draftSaved',
|
|
251
|
-
data: response
|
|
252
|
-
}];
|
|
320
|
+
const events = [{ eventName: 'draftSaved', data: response }];
|
|
253
321
|
if (!response.messageID) {
|
|
254
|
-
this._driver
|
|
255
|
-
|
|
322
|
+
this._driver
|
|
323
|
+
.getLogger()
|
|
324
|
+
.error(
|
|
325
|
+
new Error('Missing message id from emailDraftReceived')
|
|
326
|
+
);
|
|
327
|
+
} else if (
|
|
328
|
+
response.messageID &&
|
|
329
|
+
this._messageId !== response.messageID
|
|
330
|
+
) {
|
|
256
331
|
if (/^[0-9a-f]+$/i.test(response.messageID)) {
|
|
257
332
|
this._messageId = response.messageID;
|
|
258
333
|
events.push({
|
|
259
334
|
eventName: 'messageIDChange',
|
|
260
|
-
data: this._messageId
|
|
335
|
+
data: this._messageId,
|
|
261
336
|
});
|
|
262
337
|
} else {
|
|
263
|
-
this._driver
|
|
264
|
-
|
|
265
|
-
|
|
338
|
+
this._driver
|
|
339
|
+
.getLogger()
|
|
340
|
+
.error(
|
|
341
|
+
new Error('Invalid message id from emailDraftReceived'),
|
|
342
|
+
{
|
|
343
|
+
value: response.messageID,
|
|
344
|
+
}
|
|
345
|
+
);
|
|
266
346
|
}
|
|
267
347
|
}
|
|
268
348
|
return events;
|
|
269
349
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
350
|
+
default:
|
|
351
|
+
return [];
|
|
352
|
+
}
|
|
353
|
+
})
|
|
354
|
+
.flatten()
|
|
355
|
+
.map((event) => {
|
|
356
|
+
if (this._driver.getLogger().shouldTrackEverything()) {
|
|
357
|
+
driver
|
|
358
|
+
.getLogger()
|
|
359
|
+
.eventSite('compose.debug.xhr', { eventName: event.eventName });
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return event;
|
|
363
|
+
});
|
|
281
364
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
365
|
+
|
|
366
|
+
this._eventStream.plug(
|
|
367
|
+
Kefir.merge([
|
|
368
|
+
saveAndSendStream,
|
|
369
|
+
|
|
370
|
+
Kefir.fromEvents(this._element, 'buttonAdded').map(() => {
|
|
371
|
+
return {
|
|
372
|
+
eventName: 'buttonAdded',
|
|
373
|
+
};
|
|
374
|
+
}),
|
|
375
|
+
|
|
376
|
+
Kefir.fromEvents(this._element, 'resize').map(() => ({
|
|
377
|
+
eventName: 'resize',
|
|
378
|
+
})),
|
|
379
|
+
|
|
380
|
+
Kefir.fromEvents(this._element, 'composeFullscreenStateChanged').map(
|
|
381
|
+
() => {
|
|
382
|
+
this._updateComposeFullscreenState();
|
|
383
|
+
return {
|
|
384
|
+
eventName: 'fullscreenChanged',
|
|
385
|
+
data: { fullscreen: this._isFullscreen },
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
),
|
|
389
|
+
])
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
Kefir.fromEvents(this._element, 'closedProgrammatically')
|
|
393
|
+
.takeUntilBy(this._stopper)
|
|
394
|
+
.onValue(() => {
|
|
395
|
+
this._closedProgrammatically = true;
|
|
396
|
+
});
|
|
397
|
+
|
|
300
398
|
this._buttonViewControllerTooltipMap = new WeakMap();
|
|
399
|
+
|
|
301
400
|
const initialBodyElement = this.getMaybeBodyElement();
|
|
302
|
-
this.ready =
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
this.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
401
|
+
this.ready = constant(
|
|
402
|
+
(initialBodyElement
|
|
403
|
+
? Kefir.constant(initialBodyElement)
|
|
404
|
+
: streamWaitFor(
|
|
405
|
+
() => this.getMaybeBodyElement(),
|
|
406
|
+
3 * 60 * 1000 //timeout
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
.takeUntilBy(this._stopper)
|
|
410
|
+
.map((bodyElement) => {
|
|
411
|
+
this._seenBodyElement = bodyElement;
|
|
412
|
+
|
|
413
|
+
this._composeID = ((this._element.querySelector(
|
|
414
|
+
'input[name="composeid"]'
|
|
415
|
+
): any): HTMLInputElement).value;
|
|
416
|
+
this._messageIDElement = (this._element.querySelector(
|
|
417
|
+
'input[name="draft"]'
|
|
418
|
+
): any);
|
|
419
|
+
if (!this._messageIDElement) {
|
|
420
|
+
driver
|
|
421
|
+
.getLogger()
|
|
422
|
+
.error(new Error('Could not find compose message id field'));
|
|
423
|
+
// stub so other things don't fail
|
|
424
|
+
this._messageIDElement = document.createElement('input');
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
this._setupIDs();
|
|
428
|
+
this._setupStreams();
|
|
429
|
+
this._setupConsistencyCheckers();
|
|
430
|
+
this._updateComposeFullscreenState();
|
|
431
|
+
|
|
432
|
+
{
|
|
433
|
+
// try and handle the case where the user types in a bad email address
|
|
434
|
+
// we get the presending event but then no other events will pass because
|
|
435
|
+
// a modal comes up informing the user of the bad email address
|
|
436
|
+
this.getEventStream()
|
|
437
|
+
.filter(({ eventName }) => eventName === 'presending')
|
|
438
|
+
.takeUntilBy(this._stopper)
|
|
439
|
+
.onValue(() => {
|
|
440
|
+
makeElementChildStream(((document.body: any): HTMLElement))
|
|
441
|
+
.map((event) => event.el)
|
|
442
|
+
.filter(
|
|
443
|
+
(node) =>
|
|
444
|
+
node.getAttribute &&
|
|
445
|
+
node.getAttribute('role') === 'alertdialog'
|
|
446
|
+
)
|
|
447
|
+
.takeUntilBy(
|
|
448
|
+
Kefir.merge([
|
|
449
|
+
this.getEventStream().filter(
|
|
450
|
+
({ eventName }) =>
|
|
451
|
+
eventName === 'sendCanceled' ||
|
|
452
|
+
eventName === 'sending'
|
|
453
|
+
),
|
|
454
|
+
Kefir.later(15),
|
|
455
|
+
])
|
|
456
|
+
)
|
|
457
|
+
.onValue(() => {
|
|
458
|
+
this._eventStream.emit({ eventName: 'sendCanceled' });
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return this;
|
|
464
|
+
})
|
|
465
|
+
.toProperty()
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
this.ready().onError((errorObject) => {
|
|
341
469
|
driver.getLogger().error(errorObject, {
|
|
342
470
|
hasForm: !!this.getElement().querySelector('form'),
|
|
343
|
-
class: this.getElement().getAttribute('class')
|
|
471
|
+
class: this.getElement().getAttribute('class'),
|
|
344
472
|
});
|
|
345
473
|
});
|
|
346
474
|
|
|
@@ -349,48 +477,52 @@ class GmailComposeView {
|
|
|
349
477
|
// send to come back, so we have to handle that difference
|
|
350
478
|
if (this._driver.isUsingSyncAPI()) {
|
|
351
479
|
Kefir.merge([
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
eventName
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
480
|
+
// if we get a presending then we let the other stream wait for
|
|
481
|
+
// sent. But if we get a sendCanceled, then a regular destroy can
|
|
482
|
+
// pass through
|
|
483
|
+
this._removedFromDOMStopper.filterBy(
|
|
484
|
+
this._eventStream
|
|
485
|
+
.filter(
|
|
486
|
+
({ eventName }) =>
|
|
487
|
+
eventName === 'presending' || eventName === 'sendCanceled'
|
|
488
|
+
)
|
|
489
|
+
.map(({ eventName }) => eventName === 'sendCanceled')
|
|
490
|
+
.toProperty(() => true)
|
|
491
|
+
),
|
|
492
|
+
|
|
493
|
+
Kefir.combine([
|
|
494
|
+
this._removedFromDOMStopper,
|
|
495
|
+
this._eventStream.filter(({ eventName }) => eventName === 'sent'),
|
|
496
|
+
]),
|
|
497
|
+
])
|
|
498
|
+
.take(1)
|
|
499
|
+
// we delay asap here so that the event stream is not destroyed before listeners here the sent event
|
|
500
|
+
.flatMap(() => delayAsap(null))
|
|
501
|
+
.onValue(() => this._destroy());
|
|
373
502
|
} else {
|
|
374
503
|
this._removedFromDOMStopper.onValue(() => this._destroy());
|
|
375
504
|
}
|
|
376
|
-
|
|
505
|
+
|
|
506
|
+
detectClassicRecipientsArea();
|
|
377
507
|
}
|
|
508
|
+
|
|
378
509
|
destroy() {
|
|
379
510
|
// this gets called when the element gets removed from the DOM
|
|
380
511
|
// however we don't want to pass through that destroy event right away
|
|
381
512
|
this._removedFromDOMStopper.destroy();
|
|
382
513
|
this._page.dump();
|
|
383
514
|
}
|
|
515
|
+
|
|
384
516
|
_destroy() {
|
|
385
517
|
this._eventStream.emit({
|
|
386
518
|
eventName: 'destroy',
|
|
387
519
|
data: {
|
|
388
520
|
messageID: this.getMessageID(),
|
|
389
|
-
closedByInboxSDK: this._closedProgrammatically
|
|
390
|
-
}
|
|
521
|
+
closedByInboxSDK: this._closedProgrammatically,
|
|
522
|
+
},
|
|
391
523
|
});
|
|
392
524
|
this._eventStream.end();
|
|
393
|
-
this._managedViewControllers.forEach(vc => {
|
|
525
|
+
this._managedViewControllers.forEach((vc) => {
|
|
394
526
|
vc.destroy();
|
|
395
527
|
});
|
|
396
528
|
this._requestModifiers = {};
|
|
@@ -398,103 +530,155 @@ class GmailComposeView {
|
|
|
398
530
|
this._stopper.destroy();
|
|
399
531
|
this._destroyed = true;
|
|
400
532
|
}
|
|
401
|
-
|
|
533
|
+
|
|
534
|
+
getStopper(): Kefir.Observable<null> {
|
|
402
535
|
return this._stopper;
|
|
403
536
|
}
|
|
404
|
-
|
|
537
|
+
|
|
538
|
+
getEventStream(): Kefir.Observable<Object> {
|
|
405
539
|
return this._eventStream;
|
|
406
540
|
}
|
|
407
|
-
|
|
541
|
+
|
|
542
|
+
getGmailDriver(): GmailDriver {
|
|
408
543
|
return this._driver;
|
|
409
544
|
}
|
|
410
|
-
|
|
545
|
+
|
|
546
|
+
isDestroyed(): boolean {
|
|
411
547
|
return this._destroyed;
|
|
412
548
|
}
|
|
549
|
+
|
|
413
550
|
_setupStreams() {
|
|
414
|
-
this._eventStream.plug((
|
|
415
|
-
this._eventStream.plug((
|
|
416
|
-
this._eventStream.plug((
|
|
417
|
-
this._eventStream.plug(
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
551
|
+
this._eventStream.plug(getAddressChangesStream(this));
|
|
552
|
+
this._eventStream.plug(getBodyChangesStream(this));
|
|
553
|
+
this._eventStream.plug(getResponseTypeChangesStream(this));
|
|
554
|
+
this._eventStream.plug(
|
|
555
|
+
getPresendingStream({
|
|
556
|
+
element: this.getElement(),
|
|
557
|
+
sendButton: this.getSendButton(),
|
|
558
|
+
sendAndArchive: this.getSendAndArchiveButton(),
|
|
559
|
+
})
|
|
560
|
+
);
|
|
561
|
+
|
|
422
562
|
let discardButton;
|
|
423
563
|
try {
|
|
424
564
|
discardButton = this.getDiscardButton();
|
|
425
565
|
} catch (err) {
|
|
426
566
|
// handle failures of this.getDiscardButton()
|
|
427
|
-
this._driver
|
|
428
|
-
|
|
429
|
-
|
|
567
|
+
this._driver
|
|
568
|
+
.getLogger()
|
|
569
|
+
.errorSite(new Error('Failed to find discard button'), {
|
|
570
|
+
html: censorHTMLstring(this._element.outerHTML),
|
|
571
|
+
});
|
|
430
572
|
}
|
|
431
573
|
if (discardButton) {
|
|
432
|
-
this._eventStream.plug(
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
574
|
+
this._eventStream.plug(
|
|
575
|
+
getDiscardStream({
|
|
576
|
+
element: this.getElement(),
|
|
577
|
+
discardButton,
|
|
578
|
+
})
|
|
579
|
+
);
|
|
436
580
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
581
|
+
|
|
582
|
+
this._eventStream.plug(
|
|
583
|
+
Kefir.fromEvents(this.getElement(), 'inboxSDKsendCanceled').map(() => ({
|
|
584
|
+
eventName: 'sendCanceled',
|
|
585
|
+
}))
|
|
586
|
+
);
|
|
587
|
+
|
|
588
|
+
this._eventStream.plug(
|
|
589
|
+
Kefir.fromEvents(this.getElement(), 'inboxSDKdiscardCanceled').map(
|
|
590
|
+
() => ({ eventName: 'discardCanceled' })
|
|
591
|
+
)
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
this._eventStream.plug(
|
|
595
|
+
Kefir.later(10)
|
|
596
|
+
.flatMap(() => getMinimizedStream(this))
|
|
597
|
+
.changes()
|
|
598
|
+
.map((minimized) => ({
|
|
599
|
+
eventName: minimized ? 'minimized' : 'restored',
|
|
600
|
+
}))
|
|
601
|
+
);
|
|
602
|
+
|
|
446
603
|
if (!this._driver.isUsingSyncAPI()) {
|
|
447
|
-
(
|
|
604
|
+
makeMutationObserverChunkedStream(this._messageIDElement, {
|
|
448
605
|
attributes: true,
|
|
449
|
-
attributeFilter: ['value']
|
|
450
|
-
})
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
606
|
+
attributeFilter: ['value'],
|
|
607
|
+
})
|
|
608
|
+
.takeUntilBy(
|
|
609
|
+
this._eventStream.filter(() => false).beforeEnd(() => null)
|
|
610
|
+
)
|
|
611
|
+
.map(() => this._getMessageIDfromForm())
|
|
612
|
+
.filter(
|
|
613
|
+
(messageID) =>
|
|
614
|
+
messageID && !this._emailWasSent && this._messageId !== messageID
|
|
615
|
+
)
|
|
616
|
+
.onValue((messageID) => {
|
|
617
|
+
this._messageId = messageID;
|
|
618
|
+
this._eventStream.emit({
|
|
619
|
+
eventName: 'messageIDChange',
|
|
620
|
+
data: this._messageId,
|
|
621
|
+
});
|
|
455
622
|
});
|
|
456
|
-
});
|
|
457
623
|
}
|
|
458
624
|
}
|
|
625
|
+
|
|
459
626
|
_setupConsistencyCheckers() {
|
|
460
627
|
try {
|
|
461
|
-
(
|
|
462
|
-
(
|
|
463
|
-
(
|
|
464
|
-
(
|
|
628
|
+
handleComposeLinkChips(this);
|
|
629
|
+
monitorSelectionRange(this);
|
|
630
|
+
manageButtonGrouping(this);
|
|
631
|
+
sizeFixer(this._driver, this);
|
|
465
632
|
} catch (err) {
|
|
466
633
|
this._driver.getLogger().error(err);
|
|
467
634
|
}
|
|
468
635
|
}
|
|
636
|
+
|
|
469
637
|
_setupIDs() {
|
|
470
638
|
if (this._driver.isUsingSyncAPI()) {
|
|
471
639
|
const syncTargetMessageID = this._getTargetMessageID();
|
|
472
640
|
if (syncTargetMessageID) {
|
|
473
|
-
this._driver
|
|
641
|
+
this._driver
|
|
642
|
+
.getGmailMessageIdForSyncMessageId(syncTargetMessageID)
|
|
643
|
+
.then((gmailMessageId) => (this._targetMessageID = gmailMessageId));
|
|
474
644
|
}
|
|
645
|
+
|
|
475
646
|
const syncMessageId = this._getMessageIDfromForm();
|
|
476
647
|
if (syncMessageId) {
|
|
477
|
-
this._driver
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
648
|
+
this._driver
|
|
649
|
+
.getGmailMessageIdForSyncDraftId(syncMessageId)
|
|
650
|
+
.then((gmailMessageId) => {
|
|
651
|
+
this._initialMessageId = gmailMessageId;
|
|
652
|
+
this._messageId = gmailMessageId;
|
|
653
|
+
})
|
|
654
|
+
.catch(() => {
|
|
655
|
+
//do nothing because this means the message hasn't been saved yet
|
|
656
|
+
});
|
|
657
|
+
|
|
483
658
|
this._driver.reportRecentSyncDraftId(syncMessageId);
|
|
484
659
|
this._stopper.onValue(() => {
|
|
485
660
|
this._driver.reportDraftClosed(syncMessageId);
|
|
486
661
|
});
|
|
487
662
|
} else {
|
|
488
|
-
this._driver
|
|
663
|
+
this._driver
|
|
664
|
+
.getLogger()
|
|
665
|
+
.error(new Error('Draft is missing sync draft id'));
|
|
489
666
|
}
|
|
490
|
-
|
|
491
|
-
|
|
667
|
+
|
|
668
|
+
const legacyThreadIdElement: ?HTMLInputElement =
|
|
669
|
+
(this._element.querySelector('input[name="lts"]'): any);
|
|
670
|
+
if (
|
|
671
|
+
legacyThreadIdElement &&
|
|
672
|
+
typeof legacyThreadIdElement.value === 'string'
|
|
673
|
+
)
|
|
674
|
+
this._threadID = legacyThreadIdElement.value;
|
|
492
675
|
} else {
|
|
493
676
|
this._targetMessageID = this._getTargetMessageID();
|
|
494
677
|
this._messageId = this._initialMessageId = this._getMessageIDfromForm();
|
|
495
678
|
this._threadID = this._getThreadID();
|
|
496
679
|
}
|
|
497
680
|
}
|
|
681
|
+
|
|
498
682
|
_updateComposeFullscreenState() {
|
|
499
683
|
if (this._isInlineReplyForm) {
|
|
500
684
|
this._isFullscreen = false;
|
|
@@ -502,7 +686,8 @@ class GmailComposeView {
|
|
|
502
686
|
if (this._isStandalone) {
|
|
503
687
|
this._isFullscreen = true;
|
|
504
688
|
} else {
|
|
505
|
-
const fullScreenContainer =
|
|
689
|
+
const fullScreenContainer =
|
|
690
|
+
GmailElementGetter.getFullscreenComposeWindowContainer();
|
|
506
691
|
if (!fullScreenContainer) {
|
|
507
692
|
this._isFullscreen = false;
|
|
508
693
|
} else {
|
|
@@ -511,305 +696,465 @@ class GmailComposeView {
|
|
|
511
696
|
}
|
|
512
697
|
}
|
|
513
698
|
}
|
|
699
|
+
|
|
514
700
|
focus() {
|
|
515
|
-
(
|
|
701
|
+
focus(this);
|
|
516
702
|
}
|
|
517
|
-
|
|
518
|
-
|
|
703
|
+
|
|
704
|
+
insertBodyTextAtCursor(text: string): ?HTMLElement {
|
|
705
|
+
return this.insertBodyHTMLAtCursor(escape(text).replace(/\n/g, '<br>'));
|
|
519
706
|
}
|
|
520
|
-
|
|
521
|
-
|
|
707
|
+
|
|
708
|
+
insertBodyHTMLAtCursor(html: string): ?HTMLElement {
|
|
709
|
+
var retVal = insertHTMLatCursor(
|
|
710
|
+
this.getBodyElement(),
|
|
711
|
+
html,
|
|
712
|
+
this.getLastSelectionRange()
|
|
713
|
+
);
|
|
522
714
|
this._triggerDraftSave();
|
|
523
715
|
|
|
524
716
|
// sometimes the html inserted can be quite large, so we need ot make sure that GMail resizes the compose window
|
|
525
717
|
// triggering an enter press forces Gmail to resize compose
|
|
526
|
-
(
|
|
718
|
+
simulateKey(this.getBodyElement(), 13, 13);
|
|
719
|
+
|
|
527
720
|
return retVal;
|
|
528
721
|
}
|
|
529
|
-
|
|
530
|
-
|
|
722
|
+
|
|
723
|
+
insertLinkIntoBody(text: string, href: string): ?HTMLElement {
|
|
724
|
+
var retVal = insertLinkIntoBody(this, text, href);
|
|
725
|
+
|
|
531
726
|
this._triggerDraftSave();
|
|
532
727
|
return retVal;
|
|
533
728
|
}
|
|
534
|
-
|
|
535
|
-
|
|
729
|
+
|
|
730
|
+
insertLinkChipIntoBody(options: {
|
|
731
|
+
iconUrl?: string,
|
|
732
|
+
url: string,
|
|
733
|
+
text: string,
|
|
734
|
+
}): HTMLElement {
|
|
735
|
+
var retVal = insertLinkChipIntoBody(this, options);
|
|
536
736
|
this._triggerDraftSave();
|
|
537
737
|
return retVal;
|
|
538
738
|
}
|
|
539
|
-
|
|
540
|
-
|
|
739
|
+
|
|
740
|
+
setSubject(text: string) {
|
|
741
|
+
(this._element.querySelector('input[name=subjectbox]'): any).value = text;
|
|
742
|
+
|
|
541
743
|
this._triggerDraftSave();
|
|
542
744
|
}
|
|
543
|
-
|
|
745
|
+
|
|
746
|
+
setBodyHTML(html: string) {
|
|
544
747
|
this.getBodyElement().innerHTML = html;
|
|
748
|
+
|
|
545
749
|
this._triggerDraftSave();
|
|
546
750
|
}
|
|
547
|
-
|
|
751
|
+
|
|
752
|
+
setBodyText(text: string) {
|
|
548
753
|
this.getBodyElement().textContent = text;
|
|
754
|
+
|
|
549
755
|
this._triggerDraftSave();
|
|
550
756
|
}
|
|
551
|
-
|
|
552
|
-
|
|
757
|
+
|
|
758
|
+
setToRecipients(emails: string[]) {
|
|
759
|
+
setRecipients(this, 'to', emails);
|
|
760
|
+
|
|
553
761
|
this._triggerDraftSave();
|
|
554
762
|
}
|
|
555
|
-
|
|
556
|
-
|
|
763
|
+
|
|
764
|
+
setCcRecipients(emails: string[]) {
|
|
765
|
+
setRecipients(this, 'cc', emails);
|
|
766
|
+
|
|
557
767
|
this._triggerDraftSave();
|
|
558
768
|
}
|
|
559
|
-
|
|
560
|
-
|
|
769
|
+
|
|
770
|
+
setBccRecipients(emails: string[]) {
|
|
771
|
+
setRecipients(this, 'bcc', emails);
|
|
772
|
+
|
|
561
773
|
this._triggerDraftSave();
|
|
562
774
|
}
|
|
563
|
-
|
|
564
|
-
|
|
775
|
+
|
|
776
|
+
addRecipientRow(options: Kefir.Observable<?Object>): () => void {
|
|
777
|
+
return addRecipientRow(this, options);
|
|
565
778
|
}
|
|
566
|
-
|
|
779
|
+
|
|
780
|
+
forceRecipientRowsOpen(): () => void {
|
|
567
781
|
this._element.classList.add('inboxsdk__compose_forceRecipientsOpen');
|
|
782
|
+
|
|
568
783
|
return () => {
|
|
569
784
|
this._element.classList.remove('inboxsdk__compose_forceRecipientsOpen');
|
|
570
785
|
};
|
|
571
786
|
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
nativeRecipientRows
|
|
787
|
+
|
|
788
|
+
hideNativeRecipientRows(): () => void {
|
|
789
|
+
const nativeRecipientRows = getRecipientRowElements(this._element);
|
|
790
|
+
|
|
791
|
+
nativeRecipientRows.forEach((row) => {
|
|
575
792
|
row.classList.add('inboxsdk__compose_forceRecipientRowHidden');
|
|
576
793
|
});
|
|
794
|
+
|
|
577
795
|
return () => {
|
|
578
|
-
nativeRecipientRows.forEach(row => {
|
|
796
|
+
nativeRecipientRows.forEach((row) => {
|
|
579
797
|
row.classList.remove('inboxsdk__compose_forceRecipientRowHidden');
|
|
580
798
|
});
|
|
581
799
|
};
|
|
582
800
|
}
|
|
583
|
-
|
|
801
|
+
|
|
802
|
+
hideRecipientArea(): () => void {
|
|
584
803
|
this._element.classList.add('inboxsdk__compose_hideRecipientArea');
|
|
804
|
+
|
|
585
805
|
return () => {
|
|
586
806
|
this._element.classList.remove('inboxsdk__compose_hideRecipientArea');
|
|
587
807
|
};
|
|
588
808
|
}
|
|
809
|
+
|
|
589
810
|
getFromContact() {
|
|
590
811
|
return fromManager.getFromContact(this._driver, this);
|
|
591
812
|
}
|
|
813
|
+
|
|
592
814
|
getFromContactChoices() {
|
|
593
815
|
return fromManager.getFromContactChoices(this._driver, this);
|
|
594
816
|
}
|
|
595
|
-
|
|
817
|
+
|
|
818
|
+
setFromEmail(email: string) {
|
|
596
819
|
fromManager.setFromEmail(this._driver, this, email);
|
|
597
820
|
}
|
|
598
|
-
|
|
599
|
-
|
|
821
|
+
|
|
822
|
+
addButton(
|
|
823
|
+
buttonDescriptor: Kefir.Observable<?Object>,
|
|
824
|
+
groupOrderHint: string,
|
|
825
|
+
extraOnClickOptions: Object
|
|
826
|
+
): Promise<?Object> {
|
|
827
|
+
return addButton(
|
|
828
|
+
this,
|
|
829
|
+
buttonDescriptor,
|
|
830
|
+
groupOrderHint,
|
|
831
|
+
extraOnClickOptions
|
|
832
|
+
);
|
|
600
833
|
}
|
|
601
|
-
|
|
602
|
-
|
|
834
|
+
|
|
835
|
+
addTooltipToButton(
|
|
836
|
+
buttonViewController: Object,
|
|
837
|
+
buttonDescriptor: Object,
|
|
838
|
+
tooltipDescriptor: TooltipDescriptor
|
|
839
|
+
) {
|
|
840
|
+
var tooltip = addTooltipToButton(
|
|
841
|
+
this,
|
|
842
|
+
buttonViewController,
|
|
843
|
+
buttonDescriptor,
|
|
844
|
+
tooltipDescriptor
|
|
845
|
+
);
|
|
603
846
|
this._buttonViewControllerTooltipMap.set(buttonViewController, tooltip);
|
|
604
847
|
}
|
|
605
|
-
|
|
848
|
+
|
|
849
|
+
closeButtonTooltip(buttonViewController: Object) {
|
|
606
850
|
if (!this._buttonViewControllerTooltipMap) {
|
|
607
851
|
return;
|
|
608
852
|
}
|
|
609
|
-
|
|
853
|
+
|
|
854
|
+
var tooltip =
|
|
855
|
+
this._buttonViewControllerTooltipMap.get(buttonViewController);
|
|
610
856
|
if (tooltip) {
|
|
611
857
|
tooltip.destroy();
|
|
612
858
|
this._buttonViewControllerTooltipMap.delete(buttonViewController);
|
|
613
859
|
}
|
|
614
860
|
}
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
861
|
+
|
|
862
|
+
addComposeNotice(
|
|
863
|
+
options: {
|
|
864
|
+
orderHint?: number,
|
|
865
|
+
} = {}
|
|
866
|
+
): ComposeNotice {
|
|
867
|
+
const composeNotice = addComposeNotice(this, options);
|
|
868
|
+
|
|
869
|
+
this._element.dispatchEvent(
|
|
870
|
+
new CustomEvent('resize', {
|
|
625
871
|
bubbles: false,
|
|
626
872
|
cancelable: false,
|
|
627
|
-
detail: null
|
|
628
|
-
})
|
|
629
|
-
|
|
873
|
+
detail: null,
|
|
874
|
+
})
|
|
875
|
+
);
|
|
876
|
+
|
|
877
|
+
Kefir.fromEvents(composeNotice, 'destroy')
|
|
878
|
+
.flatMap(delayAsap)
|
|
879
|
+
.takeUntilBy(this._stopper)
|
|
880
|
+
.onValue(() => {
|
|
881
|
+
this._element.dispatchEvent(
|
|
882
|
+
new CustomEvent('resize', {
|
|
883
|
+
bubbles: false,
|
|
884
|
+
cancelable: false,
|
|
885
|
+
detail: null,
|
|
886
|
+
})
|
|
887
|
+
);
|
|
888
|
+
});
|
|
889
|
+
|
|
630
890
|
return composeNotice;
|
|
631
891
|
}
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
892
|
+
|
|
893
|
+
addStatusBar(
|
|
894
|
+
options: {
|
|
895
|
+
height?: number,
|
|
896
|
+
orderHint?: number,
|
|
897
|
+
addAboveNativeStatusBar?: boolean,
|
|
898
|
+
} = {}
|
|
899
|
+
): StatusBar {
|
|
900
|
+
const statusBar = addStatusBar(this, options);
|
|
901
|
+
|
|
902
|
+
this._element.dispatchEvent(
|
|
903
|
+
new CustomEvent('resize', {
|
|
642
904
|
bubbles: false,
|
|
643
905
|
cancelable: false,
|
|
644
|
-
detail: null
|
|
645
|
-
})
|
|
646
|
-
|
|
906
|
+
detail: null,
|
|
907
|
+
})
|
|
908
|
+
);
|
|
909
|
+
|
|
910
|
+
Kefir.fromEvents(statusBar, 'destroy')
|
|
911
|
+
.flatMap(delayAsap)
|
|
912
|
+
.takeUntilBy(this._stopper)
|
|
913
|
+
.onValue(() => {
|
|
914
|
+
this._element.dispatchEvent(
|
|
915
|
+
new CustomEvent('resize', {
|
|
916
|
+
bubbles: false,
|
|
917
|
+
cancelable: false,
|
|
918
|
+
detail: null,
|
|
919
|
+
})
|
|
920
|
+
);
|
|
921
|
+
});
|
|
922
|
+
|
|
647
923
|
return statusBar;
|
|
648
924
|
}
|
|
649
|
-
|
|
925
|
+
|
|
926
|
+
hideNativeStatusBar(): () => void {
|
|
650
927
|
const statusArea = this.getStatusArea();
|
|
651
|
-
const nativeStatusBar = (
|
|
928
|
+
const nativeStatusBar = querySelector(statusArea, 'table');
|
|
652
929
|
const formattingToolbar = this.getFormattingToolbar();
|
|
653
|
-
const isFormattingToolbarOpen =
|
|
930
|
+
const isFormattingToolbarOpen =
|
|
931
|
+
formattingToolbar && formattingToolbar.style.display !== 'none';
|
|
932
|
+
|
|
654
933
|
nativeStatusBar.style.display = 'none';
|
|
934
|
+
|
|
655
935
|
if (formattingToolbar && isFormattingToolbarOpen) {
|
|
656
936
|
formattingToolbar.style.display = 'none';
|
|
657
937
|
}
|
|
938
|
+
|
|
658
939
|
return () => {
|
|
659
940
|
nativeStatusBar.style.display = '';
|
|
941
|
+
|
|
660
942
|
if (formattingToolbar && isFormattingToolbarOpen) {
|
|
661
943
|
formattingToolbar.style.display = '';
|
|
662
944
|
}
|
|
663
945
|
};
|
|
664
946
|
}
|
|
665
|
-
|
|
947
|
+
|
|
948
|
+
replaceSendButton(el: HTMLElement): () => void {
|
|
666
949
|
const sendButton = this.getSendButtonGroup();
|
|
667
950
|
const sendAndArchive = this.getSendAndArchiveButton();
|
|
951
|
+
|
|
668
952
|
sendButton.style.display = 'none';
|
|
953
|
+
|
|
669
954
|
const sendAndArchiveParent = sendAndArchive && sendAndArchive.parentElement;
|
|
670
955
|
if (sendAndArchiveParent instanceof HTMLElement) {
|
|
671
956
|
sendAndArchiveParent.style.display = 'none';
|
|
672
957
|
}
|
|
958
|
+
|
|
673
959
|
const container = document.createElement('div');
|
|
674
960
|
container.classList.add('inboxsdk__compose_customSendContainer');
|
|
675
961
|
container.appendChild(el);
|
|
962
|
+
|
|
676
963
|
sendButton.insertAdjacentElement('afterend', container);
|
|
677
964
|
this._element.setAttribute('data-inboxsdk-send-replaced', '');
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
965
|
+
|
|
966
|
+
const removalStopper = kefirStopper();
|
|
967
|
+
|
|
968
|
+
Kefir.fromEvents(this.getBodyElement(), 'keydown')
|
|
969
|
+
.takeUntilBy(this._stopper)
|
|
970
|
+
.takeUntilBy(removalStopper)
|
|
971
|
+
.filter(
|
|
972
|
+
(domEvent) =>
|
|
973
|
+
(domEvent.which === 9 || domEvent.keyCode === 9) && !domEvent.shiftKey
|
|
974
|
+
)
|
|
975
|
+
.onValue((domEvent) => {
|
|
976
|
+
// Because of the way the compose DOM is structured, the natural
|
|
977
|
+
// tab order does not flow from the compose body to the status bar.
|
|
978
|
+
// Gmail modifies this flow programatically by focusing the send button,
|
|
979
|
+
// so we have replicate this behavior when the native send button isn't
|
|
980
|
+
// visible.
|
|
981
|
+
const statusArea = this.getStatusArea();
|
|
982
|
+
const focusableEls = statusArea.querySelectorAll('[tabindex]');
|
|
983
|
+
if (focusableEls.length === 0) return;
|
|
984
|
+
|
|
985
|
+
const firstVisibleEl = Array.from(focusableEls).find(
|
|
986
|
+
(el) => el.offsetParent !== null
|
|
987
|
+
);
|
|
988
|
+
if (!firstVisibleEl) return;
|
|
989
|
+
|
|
990
|
+
domEvent.preventDefault();
|
|
991
|
+
domEvent.stopPropagation();
|
|
992
|
+
domEvent.stopImmediatePropagation();
|
|
993
|
+
|
|
994
|
+
firstVisibleEl.focus();
|
|
995
|
+
});
|
|
996
|
+
|
|
695
997
|
return () => {
|
|
696
998
|
removalStopper.destroy();
|
|
697
999
|
container.remove();
|
|
698
1000
|
this._element.removeAttribute('data-inboxsdk-send-replaced');
|
|
1001
|
+
|
|
699
1002
|
sendButton.style.display = '';
|
|
700
1003
|
if (sendAndArchiveParent instanceof HTMLElement) {
|
|
701
1004
|
sendAndArchiveParent.style.display = '';
|
|
702
1005
|
}
|
|
703
1006
|
};
|
|
704
1007
|
}
|
|
705
|
-
|
|
1008
|
+
|
|
1009
|
+
hideDiscardButton(): () => void {
|
|
706
1010
|
const discardBtn = this.getDiscardButton();
|
|
1011
|
+
|
|
707
1012
|
discardBtn.style.display = 'none';
|
|
1013
|
+
|
|
708
1014
|
return () => {
|
|
709
1015
|
discardBtn.style.display = '';
|
|
710
1016
|
};
|
|
711
1017
|
}
|
|
1018
|
+
|
|
712
1019
|
ensureFormattingToolbarIsHidden() {
|
|
713
1020
|
const formattingToggleButton = this.getFormattingToolbarToggleButton();
|
|
714
1021
|
const formattingToolbar = this.getFormattingToolbar();
|
|
715
|
-
|
|
716
|
-
|
|
1022
|
+
|
|
1023
|
+
if (
|
|
1024
|
+
formattingToggleButton &&
|
|
1025
|
+
formattingToolbar &&
|
|
1026
|
+
formattingToolbar.style.display === ''
|
|
1027
|
+
) {
|
|
1028
|
+
simulateClick(formattingToggleButton);
|
|
717
1029
|
}
|
|
718
1030
|
}
|
|
1031
|
+
|
|
719
1032
|
close() {
|
|
720
1033
|
if (this.isInlineReplyForm()) {
|
|
721
1034
|
// eslint-disable-next-line no-console
|
|
722
1035
|
console.warn("Trying to close an inline reply which doesn't work.");
|
|
723
1036
|
return;
|
|
724
1037
|
}
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
1038
|
+
|
|
1039
|
+
this._element.dispatchEvent(
|
|
1040
|
+
new CustomEvent('closedProgrammatically', {
|
|
1041
|
+
bubbles: false,
|
|
1042
|
+
cancelable: false,
|
|
1043
|
+
detail: null,
|
|
1044
|
+
})
|
|
1045
|
+
);
|
|
1046
|
+
|
|
730
1047
|
if (this._isFullscreen) {
|
|
731
|
-
this._eventStream
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
}).onValue(() => (0, _simulateMouseEvent.simulateClick)(this.getCloseButton()));
|
|
737
|
-
(0, _simulateMouseEvent.simulateClick)(this.getMoleSwitchButton());
|
|
1048
|
+
this._eventStream
|
|
1049
|
+
.filter(({ eventName }) => eventName === 'fullscreenChanged')
|
|
1050
|
+
.onValue(() => simulateClick(this.getCloseButton()));
|
|
1051
|
+
|
|
1052
|
+
simulateClick(this.getMoleSwitchButton());
|
|
738
1053
|
} else {
|
|
739
|
-
|
|
1054
|
+
simulateClick(this.getCloseButton());
|
|
740
1055
|
}
|
|
741
1056
|
}
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
sendAndArchive
|
|
745
|
-
} = _ref7;
|
|
1057
|
+
|
|
1058
|
+
send({ sendAndArchive }: { sendAndArchive: boolean }) {
|
|
746
1059
|
// asap necessary so if send() is called after presending event.cancel(), the new presending event
|
|
747
1060
|
// must happen after the sendCanceled event (which is also delayed by asap).
|
|
748
|
-
(
|
|
1061
|
+
asap(() => {
|
|
749
1062
|
const sendAndArchiveButton = this.getSendAndArchiveButton();
|
|
1063
|
+
|
|
750
1064
|
if (sendAndArchive && sendAndArchiveButton) {
|
|
751
|
-
|
|
1065
|
+
simulateClick(sendAndArchiveButton);
|
|
752
1066
|
} else {
|
|
753
|
-
|
|
1067
|
+
simulateClick(this.getSendButton());
|
|
754
1068
|
}
|
|
755
1069
|
});
|
|
756
1070
|
}
|
|
1071
|
+
|
|
757
1072
|
discard() {
|
|
758
|
-
|
|
1073
|
+
simulateClick(this.getDiscardButton());
|
|
759
1074
|
}
|
|
1075
|
+
|
|
760
1076
|
popOut() {
|
|
761
1077
|
if (!this.isInlineReplyForm()) {
|
|
762
1078
|
throw new Error('Can only pop out inline reply compose views');
|
|
763
1079
|
}
|
|
764
|
-
const popOutBtn = (
|
|
765
|
-
|
|
1080
|
+
const popOutBtn = querySelector(
|
|
1081
|
+
this._element,
|
|
1082
|
+
'.M9 > [role=menu]:first-child > .SK > [role=menuitem]:last-child'
|
|
1083
|
+
);
|
|
1084
|
+
simulateClick(popOutBtn);
|
|
766
1085
|
}
|
|
1086
|
+
|
|
767
1087
|
overrideEditSubject() {
|
|
768
|
-
(
|
|
1088
|
+
overrideEditSubject(this._driver, this);
|
|
769
1089
|
}
|
|
1090
|
+
|
|
770
1091
|
_hideDropzones() {
|
|
771
|
-
(
|
|
1092
|
+
setCss('compose dropzone hider', 'body > .aC7 .aC9 {visibility: hidden;}');
|
|
772
1093
|
}
|
|
1094
|
+
|
|
773
1095
|
_reenableDropzones() {
|
|
774
|
-
(
|
|
1096
|
+
setCss('compose dropzone hider', null);
|
|
775
1097
|
}
|
|
776
|
-
|
|
777
|
-
|
|
1098
|
+
|
|
1099
|
+
_dropzonesVisible(): boolean {
|
|
1100
|
+
return (
|
|
1101
|
+
find(
|
|
1102
|
+
document.querySelectorAll('body > .aC7:not(.aWP)'),
|
|
1103
|
+
isElementVisible
|
|
1104
|
+
) != null
|
|
1105
|
+
);
|
|
778
1106
|
}
|
|
779
|
-
|
|
1107
|
+
|
|
1108
|
+
_findDropzoneForThisCompose(inline: boolean): HTMLElement {
|
|
780
1109
|
// Iterate through all the dropzones and find the one visually contained by
|
|
781
1110
|
// this compose.
|
|
782
1111
|
const rect = this._element.getBoundingClientRect();
|
|
783
|
-
const dropzoneSelector = inline
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
1112
|
+
const dropzoneSelector = inline
|
|
1113
|
+
? 'body > .aC7:not(.aWP)'
|
|
1114
|
+
: 'body > .aC7.aWP';
|
|
1115
|
+
const el: ?HTMLElement = t.toArray(
|
|
1116
|
+
Array.prototype.slice.call(document.querySelectorAll(dropzoneSelector)),
|
|
1117
|
+
t.compose(
|
|
1118
|
+
t.filter(isElementVisible),
|
|
1119
|
+
t.filter((dropzone) => {
|
|
1120
|
+
const top = parseInt(dropzone.style.top, 10);
|
|
1121
|
+
const bottom = top + parseInt(dropzone.style.height, 10);
|
|
1122
|
+
const left = parseInt(dropzone.style.left, 10);
|
|
1123
|
+
const right = left + parseInt(dropzone.style.width, 10);
|
|
1124
|
+
return (
|
|
1125
|
+
top >= rect.top &&
|
|
1126
|
+
left >= rect.left &&
|
|
1127
|
+
right <= rect.right &&
|
|
1128
|
+
bottom <= rect.bottom
|
|
1129
|
+
);
|
|
1130
|
+
}),
|
|
1131
|
+
t.take(1)
|
|
1132
|
+
)
|
|
1133
|
+
)[0];
|
|
791
1134
|
if (!el) {
|
|
792
1135
|
throw new Error('Failed to find dropzone');
|
|
793
1136
|
}
|
|
794
1137
|
return el;
|
|
795
1138
|
}
|
|
796
|
-
|
|
1139
|
+
|
|
1140
|
+
async _attachFiles(files: Blob[], inline: boolean): Promise<void> {
|
|
797
1141
|
this._hideDropzones();
|
|
798
|
-
const endDrag = (
|
|
1142
|
+
const endDrag = once(() => simulateDragEnd(this._element, files));
|
|
799
1143
|
try {
|
|
800
1144
|
let firstLoop = true;
|
|
801
|
-
for (let
|
|
1145
|
+
for (let partitionedFiles of t.partition(files, 3)) {
|
|
802
1146
|
if (firstLoop) {
|
|
803
1147
|
firstLoop = false;
|
|
804
1148
|
} else {
|
|
805
|
-
await (
|
|
1149
|
+
await delay(500);
|
|
806
1150
|
}
|
|
807
|
-
|
|
808
|
-
|
|
1151
|
+
|
|
1152
|
+
simulateDragOver(this._element, partitionedFiles);
|
|
1153
|
+
await waitFor(() => this._dropzonesVisible(), 20 * 1000);
|
|
809
1154
|
const dropzone = this._findDropzoneForThisCompose(inline);
|
|
810
|
-
|
|
1155
|
+
simulateDrop(dropzone, partitionedFiles);
|
|
811
1156
|
endDrag();
|
|
812
|
-
await (
|
|
1157
|
+
await waitFor(() => !this._dropzonesVisible(), 20 * 1000);
|
|
813
1158
|
}
|
|
814
1159
|
} catch (err) {
|
|
815
1160
|
this._driver.getLogger().error(err);
|
|
@@ -818,134 +1163,185 @@ class GmailComposeView {
|
|
|
818
1163
|
this._reenableDropzones();
|
|
819
1164
|
}
|
|
820
1165
|
}
|
|
821
|
-
|
|
1166
|
+
|
|
1167
|
+
attachFiles(files: Blob[]): Promise<void> {
|
|
822
1168
|
return this._attachFiles(files, false);
|
|
823
1169
|
}
|
|
824
|
-
|
|
1170
|
+
|
|
1171
|
+
attachInlineFiles(files: Blob[]): Promise<void> {
|
|
825
1172
|
return this._attachFiles(files, true);
|
|
826
1173
|
}
|
|
827
|
-
|
|
1174
|
+
|
|
1175
|
+
isForward(): boolean {
|
|
828
1176
|
return Boolean(this._element.querySelector('.Un.J-JN-M-I .mI'));
|
|
829
1177
|
}
|
|
830
|
-
|
|
1178
|
+
|
|
1179
|
+
isReply(): boolean {
|
|
831
1180
|
return this._isInlineReplyForm || !!this._element.querySelector('.HQ');
|
|
832
1181
|
}
|
|
833
|
-
|
|
1182
|
+
|
|
1183
|
+
isInlineReplyForm(): boolean {
|
|
834
1184
|
return this._isInlineReplyForm;
|
|
835
1185
|
}
|
|
836
|
-
|
|
1186
|
+
|
|
1187
|
+
getBodyElement(): HTMLElement {
|
|
837
1188
|
const el = this.getMaybeBodyElement();
|
|
838
1189
|
if (!el) throw new Error('Could not find body element');
|
|
839
1190
|
return el;
|
|
840
1191
|
}
|
|
841
|
-
|
|
1192
|
+
|
|
1193
|
+
getMaybeBodyElement(): ?HTMLElement {
|
|
842
1194
|
return this._element.querySelector('.Ap [g_editable=true]');
|
|
843
1195
|
}
|
|
844
|
-
|
|
845
|
-
|
|
1196
|
+
|
|
1197
|
+
getTopFormElement(): HTMLElement {
|
|
1198
|
+
return querySelector(this._element, 'td > form');
|
|
846
1199
|
}
|
|
847
|
-
|
|
1200
|
+
|
|
1201
|
+
getHTMLContent(): string {
|
|
848
1202
|
return this.getBodyElement().innerHTML;
|
|
849
1203
|
}
|
|
850
|
-
|
|
1204
|
+
|
|
1205
|
+
getTextContent(): string {
|
|
851
1206
|
return this.getBodyElement().textContent;
|
|
852
1207
|
}
|
|
853
|
-
|
|
854
|
-
|
|
1208
|
+
|
|
1209
|
+
getSelectedBodyHTML(): ?string {
|
|
1210
|
+
return getSelectedHTMLInElement(
|
|
1211
|
+
this.getBodyElement(),
|
|
1212
|
+
this.getLastSelectionRange()
|
|
1213
|
+
);
|
|
855
1214
|
}
|
|
856
|
-
|
|
857
|
-
|
|
1215
|
+
|
|
1216
|
+
getSelectedBodyText(): ?string {
|
|
1217
|
+
return getSelectedTextInElement(
|
|
1218
|
+
this.getBodyElement(),
|
|
1219
|
+
this.getLastSelectionRange()
|
|
1220
|
+
);
|
|
858
1221
|
}
|
|
859
|
-
|
|
1222
|
+
|
|
1223
|
+
getSubject(): string {
|
|
860
1224
|
return this.getSubjectInput().value;
|
|
861
1225
|
}
|
|
862
|
-
|
|
863
|
-
|
|
1226
|
+
|
|
1227
|
+
getSubjectInput(): HTMLInputElement {
|
|
1228
|
+
return (this._element: any).querySelector('input[name=subjectbox]');
|
|
864
1229
|
}
|
|
865
|
-
|
|
1230
|
+
|
|
1231
|
+
getMetadataFormElement(): HTMLElement {
|
|
866
1232
|
const container = this.getBodyElement().closest('.aoP');
|
|
867
1233
|
if (!container) {
|
|
868
1234
|
throw new Error('Could not find compose container');
|
|
869
1235
|
}
|
|
870
|
-
return (
|
|
1236
|
+
return querySelector(container, 'form.bAs');
|
|
871
1237
|
}
|
|
872
|
-
|
|
873
|
-
|
|
1238
|
+
|
|
1239
|
+
getToRecipients(): Contact[] {
|
|
1240
|
+
return getRecipients(this, 'to');
|
|
874
1241
|
}
|
|
875
|
-
|
|
876
|
-
|
|
1242
|
+
|
|
1243
|
+
getCcRecipients(): Contact[] {
|
|
1244
|
+
return getRecipients(this, 'cc');
|
|
877
1245
|
}
|
|
878
|
-
|
|
879
|
-
|
|
1246
|
+
|
|
1247
|
+
getBccRecipients(): Contact[] {
|
|
1248
|
+
return getRecipients(this, 'bcc');
|
|
880
1249
|
}
|
|
881
|
-
|
|
882
|
-
|
|
1250
|
+
|
|
1251
|
+
getAdditionalActionToolbar(): HTMLElement {
|
|
1252
|
+
return require('./gmail-compose-view/get-additional-action-toolbar').default(
|
|
1253
|
+
this
|
|
1254
|
+
);
|
|
883
1255
|
}
|
|
884
|
-
|
|
885
|
-
|
|
1256
|
+
|
|
1257
|
+
updateInsertMoreAreaLeft(oldFormattingAreaOffsetLeft: number) {
|
|
1258
|
+
updateInsertMoreAreaLeft(this, oldFormattingAreaOffsetLeft);
|
|
886
1259
|
}
|
|
887
|
-
|
|
888
|
-
|
|
1260
|
+
|
|
1261
|
+
_getFormattingAreaOffsetLeft(): number {
|
|
1262
|
+
return getFormattingAreaOffsetLeft(this);
|
|
889
1263
|
}
|
|
890
|
-
|
|
1264
|
+
|
|
1265
|
+
getFormattingArea(): ?HTMLElement {
|
|
891
1266
|
let formattingArea = this._formattingArea;
|
|
892
1267
|
if (!formattingArea) {
|
|
893
|
-
formattingArea = this._formattingArea =
|
|
1268
|
+
formattingArea = this._formattingArea =
|
|
1269
|
+
this._element.querySelector('.oc');
|
|
894
1270
|
}
|
|
895
1271
|
return formattingArea;
|
|
896
1272
|
}
|
|
897
|
-
|
|
1273
|
+
|
|
1274
|
+
getFormattingToolbar(): ?HTMLElement {
|
|
898
1275
|
return this._element.querySelector('.aX');
|
|
899
1276
|
}
|
|
900
|
-
|
|
1277
|
+
|
|
1278
|
+
getFormattingToolbarArrow(): HTMLElement {
|
|
901
1279
|
const el = this.getFormattingToolbar();
|
|
902
1280
|
if (!el) throw new Error('Failed to find formatting toolbar');
|
|
903
|
-
return (
|
|
1281
|
+
return querySelector(el, '.aA4');
|
|
904
1282
|
}
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
const
|
|
1283
|
+
|
|
1284
|
+
getFormattingToolbarToggleButton(): HTMLElement {
|
|
1285
|
+
const innerElement = querySelector(this._element, '[role=button] .dv');
|
|
1286
|
+
const btn = closest(innerElement, '[role=button]');
|
|
908
1287
|
if (!btn) throw new Error('failed to find button');
|
|
909
1288
|
return btn;
|
|
910
1289
|
}
|
|
911
|
-
|
|
912
|
-
|
|
1290
|
+
|
|
1291
|
+
getStatusBarPrependContainer(): ?HTMLElement {
|
|
1292
|
+
return this._element.querySelector(
|
|
1293
|
+
'.inboxsdk__compose_statusBarPrependContainer'
|
|
1294
|
+
);
|
|
913
1295
|
}
|
|
914
|
-
|
|
1296
|
+
|
|
1297
|
+
getScrollBody(): HTMLElement {
|
|
915
1298
|
var scrollBody = this._element.querySelector('table .GP');
|
|
916
1299
|
if (!scrollBody) {
|
|
917
1300
|
throw new Error('Failed to find scroll body');
|
|
918
1301
|
}
|
|
919
1302
|
return scrollBody;
|
|
920
1303
|
}
|
|
921
|
-
|
|
1304
|
+
|
|
1305
|
+
getStatusArea(): HTMLElement {
|
|
922
1306
|
let statusArea = this._element.querySelector('.aDg .aDj > .aDh');
|
|
923
1307
|
if (!statusArea) throw new Error('Failed to find status area');
|
|
924
1308
|
return statusArea;
|
|
925
1309
|
}
|
|
926
|
-
|
|
927
|
-
|
|
1310
|
+
|
|
1311
|
+
getInsertMoreArea(): HTMLElement {
|
|
1312
|
+
return querySelector(this._element, '.eq');
|
|
928
1313
|
}
|
|
929
|
-
|
|
930
|
-
|
|
1314
|
+
|
|
1315
|
+
getInsertLinkButton(): HTMLElement {
|
|
1316
|
+
return querySelector(this._element, '.e5.aaA.aMZ');
|
|
931
1317
|
}
|
|
932
|
-
|
|
933
|
-
|
|
1318
|
+
|
|
1319
|
+
getSendButton(): HTMLElement {
|
|
1320
|
+
return querySelector(
|
|
1321
|
+
this._element,
|
|
1322
|
+
'.IZ .Up div > div[role=button]:not(.Uo):not([aria-haspopup=true]):not([class^=inboxsdk_])'
|
|
1323
|
+
);
|
|
934
1324
|
}
|
|
935
1325
|
|
|
936
1326
|
// When schedule send is available, this returns the element that contains both buttons.
|
|
937
|
-
getSendButtonGroup() {
|
|
938
|
-
const scheduleSend = this._element.querySelector(
|
|
1327
|
+
getSendButtonGroup(): HTMLElement {
|
|
1328
|
+
const scheduleSend = this._element.querySelector(
|
|
1329
|
+
'.IZ .Up div > [role=button][aria-haspopup=true]:not([class^=inboxsdk_])'
|
|
1330
|
+
);
|
|
939
1331
|
if (scheduleSend) {
|
|
940
|
-
return scheduleSend.parentElement;
|
|
1332
|
+
return (scheduleSend: any).parentElement;
|
|
941
1333
|
}
|
|
942
1334
|
return this.getSendButton();
|
|
943
1335
|
}
|
|
944
|
-
|
|
1336
|
+
|
|
1337
|
+
getSendAndArchiveButton(): ?HTMLElement {
|
|
945
1338
|
if (!this.isReply()) {
|
|
946
1339
|
return null;
|
|
947
1340
|
}
|
|
948
|
-
|
|
1341
|
+
|
|
1342
|
+
const sendAndArchiveButton = this._element.querySelector(
|
|
1343
|
+
'.IZ .Up div > div[role=button].Uo:not([aria-haspopup=true]):not([class^=inboxsdk_])'
|
|
1344
|
+
);
|
|
949
1345
|
if (sendAndArchiveButton) {
|
|
950
1346
|
return sendAndArchiveButton;
|
|
951
1347
|
}
|
|
@@ -956,83 +1352,125 @@ class GmailComposeView {
|
|
|
956
1352
|
const parent = sendButton.parentElement;
|
|
957
1353
|
if (!(parent instanceof HTMLElement)) throw new Error('should not happen');
|
|
958
1354
|
if (parent.childElementCount <= 1) {
|
|
959
|
-
this._driver
|
|
1355
|
+
this._driver
|
|
1356
|
+
.getLogger()
|
|
1357
|
+
.eventSdkPassive(
|
|
1358
|
+
'getSendAndArchiveButton - old method - failed to find, childElementCount <= 1'
|
|
1359
|
+
);
|
|
960
1360
|
return null;
|
|
961
1361
|
}
|
|
962
|
-
|
|
963
|
-
const
|
|
1362
|
+
|
|
1363
|
+
const firstNotSendElement =
|
|
1364
|
+
parent.children[0] !== sendButton
|
|
1365
|
+
? parent.children[0]
|
|
1366
|
+
: parent.children[1];
|
|
1367
|
+
const result = !firstNotSendElement
|
|
1368
|
+
? null
|
|
1369
|
+
: firstNotSendElement.querySelector('[role=button]');
|
|
964
1370
|
if (result) {
|
|
965
|
-
this._driver
|
|
1371
|
+
this._driver
|
|
1372
|
+
.getLogger()
|
|
1373
|
+
.eventSdkPassive('getSendAndArchiveButton - old method - found');
|
|
966
1374
|
} else {
|
|
967
|
-
this._driver
|
|
1375
|
+
this._driver
|
|
1376
|
+
.getLogger()
|
|
1377
|
+
.eventSdkPassive(
|
|
1378
|
+
'getSendAndArchiveButton - old method - failed to find'
|
|
1379
|
+
);
|
|
968
1380
|
}
|
|
969
1381
|
return result;
|
|
970
1382
|
}
|
|
971
|
-
|
|
1383
|
+
|
|
1384
|
+
getCloseButton(): HTMLElement {
|
|
972
1385
|
return this._element.querySelectorAll('.Hm > img')[2];
|
|
973
1386
|
}
|
|
974
|
-
|
|
1387
|
+
|
|
1388
|
+
getMoleSwitchButton(): HTMLElement {
|
|
975
1389
|
return this._element.querySelectorAll('.Hm > img')[1];
|
|
976
1390
|
}
|
|
977
|
-
|
|
978
|
-
|
|
1391
|
+
|
|
1392
|
+
getBottomBarTable(): HTMLElement {
|
|
1393
|
+
return querySelector(this._element, '.aoP .aDh > table');
|
|
979
1394
|
}
|
|
980
|
-
|
|
981
|
-
|
|
1395
|
+
|
|
1396
|
+
getBottomToolbarContainer(): HTMLElement {
|
|
1397
|
+
return querySelector(this._element, '.aoP .aDj');
|
|
982
1398
|
}
|
|
983
|
-
|
|
984
|
-
|
|
1399
|
+
|
|
1400
|
+
getDiscardButton(): HTMLElement {
|
|
1401
|
+
return querySelector(this._element, '.gU .oh');
|
|
985
1402
|
}
|
|
986
|
-
|
|
1403
|
+
|
|
1404
|
+
getComposeID(): string {
|
|
987
1405
|
return this._composeID;
|
|
988
1406
|
}
|
|
989
|
-
|
|
1407
|
+
|
|
1408
|
+
getInitialMessageID(): ?string {
|
|
990
1409
|
return this._initialMessageId;
|
|
991
1410
|
}
|
|
992
1411
|
|
|
993
1412
|
// For use only when isUsingSyncAPI() is true — gets the draft ID
|
|
994
1413
|
// from the input that used to hold the hex message ID. Still does not
|
|
995
1414
|
// populate until first save.
|
|
996
|
-
_getDraftIDfromForm() {
|
|
997
|
-
const value =
|
|
998
|
-
|
|
1415
|
+
_getDraftIDfromForm(): ?string {
|
|
1416
|
+
const value =
|
|
1417
|
+
(this._messageIDElement && this._messageIDElement.value) || null;
|
|
1418
|
+
if (
|
|
1419
|
+
typeof value === 'string' &&
|
|
1420
|
+
value !== 'undefined' &&
|
|
1421
|
+
value !== 'null'
|
|
1422
|
+
) {
|
|
999
1423
|
if (this._driver.isUsingSyncAPI()) {
|
|
1000
1424
|
return value.replace('#', '').replace('msg-a:', '');
|
|
1001
1425
|
} else {
|
|
1002
|
-
this._driver
|
|
1003
|
-
|
|
1004
|
-
|
|
1426
|
+
this._driver
|
|
1427
|
+
.getLogger()
|
|
1428
|
+
.error(new Error('Invalid draft id in element'), {
|
|
1429
|
+
value,
|
|
1430
|
+
});
|
|
1005
1431
|
}
|
|
1006
1432
|
}
|
|
1007
1433
|
return null;
|
|
1008
1434
|
}
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1435
|
+
|
|
1436
|
+
_getMessageIDfromForm(): ?string {
|
|
1437
|
+
const value =
|
|
1438
|
+
(this._messageIDElement && this._messageIDElement.value) || null;
|
|
1439
|
+
if (
|
|
1440
|
+
typeof value === 'string' &&
|
|
1441
|
+
value !== 'undefined' &&
|
|
1442
|
+
value !== 'null'
|
|
1443
|
+
) {
|
|
1012
1444
|
if (this._driver.isUsingSyncAPI()) {
|
|
1013
1445
|
return value.replace('#', ''); //annoyingly the hash is included
|
|
1014
1446
|
} else {
|
|
1015
1447
|
if (/^[0-9a-f]+$/i.test(value)) {
|
|
1016
1448
|
return value;
|
|
1017
1449
|
} else {
|
|
1018
|
-
this._driver
|
|
1019
|
-
|
|
1020
|
-
|
|
1450
|
+
this._driver
|
|
1451
|
+
.getLogger()
|
|
1452
|
+
.error(new Error('Invalid message id in element'), {
|
|
1453
|
+
value,
|
|
1454
|
+
});
|
|
1021
1455
|
}
|
|
1022
1456
|
}
|
|
1023
1457
|
}
|
|
1024
1458
|
return null;
|
|
1025
1459
|
}
|
|
1026
|
-
|
|
1460
|
+
|
|
1461
|
+
getMessageID(): ?string {
|
|
1027
1462
|
return this._messageId;
|
|
1028
1463
|
}
|
|
1029
|
-
|
|
1464
|
+
|
|
1465
|
+
getTargetMessageID(): ?string {
|
|
1030
1466
|
return this._targetMessageID;
|
|
1031
1467
|
}
|
|
1032
|
-
|
|
1468
|
+
|
|
1469
|
+
getThreadID(): ?string {
|
|
1033
1470
|
return this._threadID;
|
|
1034
1471
|
}
|
|
1035
|
-
|
|
1472
|
+
|
|
1473
|
+
async getCurrentDraftID(): Promise<?string> {
|
|
1036
1474
|
if (this._driver.isUsingSyncAPI()) {
|
|
1037
1475
|
// This function is mostly a mirror of _getDraftIDimplementation, but
|
|
1038
1476
|
// instead of waiting when finding out it's not saved, just returns null.
|
|
@@ -1046,11 +1484,13 @@ class GmailComposeView {
|
|
|
1046
1484
|
try {
|
|
1047
1485
|
// If this succeeds, then the draft must exist on the server and we
|
|
1048
1486
|
// can safely return the draft id we know.
|
|
1049
|
-
const gmailMessageId =
|
|
1487
|
+
const gmailMessageId =
|
|
1488
|
+
await this._driver.getGmailMessageIdForSyncDraftId(syncMessageId);
|
|
1050
1489
|
} catch (e) {
|
|
1051
1490
|
// ignore error, it's probably that the draft isn't saved yet.
|
|
1052
1491
|
return null;
|
|
1053
1492
|
}
|
|
1493
|
+
|
|
1054
1494
|
return draftID;
|
|
1055
1495
|
}
|
|
1056
1496
|
}
|
|
@@ -1062,14 +1502,16 @@ class GmailComposeView {
|
|
|
1062
1502
|
}
|
|
1063
1503
|
}
|
|
1064
1504
|
}
|
|
1065
|
-
|
|
1505
|
+
|
|
1506
|
+
getDraftID(): Promise<?string> {
|
|
1066
1507
|
let draftIDpromise = this._draftIDpromise;
|
|
1067
1508
|
if (!draftIDpromise) {
|
|
1068
1509
|
draftIDpromise = this._draftIDpromise = this._getDraftIDimplementation();
|
|
1069
1510
|
}
|
|
1070
1511
|
return draftIDpromise;
|
|
1071
1512
|
}
|
|
1072
|
-
|
|
1513
|
+
|
|
1514
|
+
async _getDraftIDimplementation(): Promise<?string> {
|
|
1073
1515
|
if (this._driver.isUsingSyncAPI()) {
|
|
1074
1516
|
const draftID = this._getDraftIDfromForm();
|
|
1075
1517
|
// we want to keep the semantics that getDraftID doesn't return until
|
|
@@ -1084,27 +1526,35 @@ class GmailComposeView {
|
|
|
1084
1526
|
try {
|
|
1085
1527
|
// If this succeeds, then the draft must exist on the server and we
|
|
1086
1528
|
// can safely return the draft id we know.
|
|
1087
|
-
const gmailMessageId =
|
|
1529
|
+
const gmailMessageId =
|
|
1530
|
+
await this._driver.getGmailMessageIdForSyncDraftId(syncMessageId);
|
|
1088
1531
|
} catch (e) {
|
|
1089
1532
|
// draft doesn't exist so we wait until it does
|
|
1090
|
-
await this._eventStream
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1533
|
+
await this._eventStream
|
|
1534
|
+
.filter(({ eventName }) => eventName === 'draftSaved')
|
|
1535
|
+
.beforeEnd(() => null)
|
|
1536
|
+
.map(() => this._getDraftIDfromForm())
|
|
1537
|
+
.take(1)
|
|
1538
|
+
.toPromise();
|
|
1096
1539
|
}
|
|
1540
|
+
|
|
1097
1541
|
return draftID;
|
|
1098
1542
|
}
|
|
1099
1543
|
}
|
|
1100
1544
|
} else {
|
|
1101
1545
|
let i = -1;
|
|
1102
1546
|
let lastDebugData = null;
|
|
1547
|
+
|
|
1103
1548
|
try {
|
|
1104
1549
|
// If this compose view doesn't have a message id yet, wait until it gets
|
|
1105
1550
|
// one or it's closed.
|
|
1106
1551
|
if (!this._messageId) {
|
|
1107
|
-
await this._eventStream
|
|
1552
|
+
await this._eventStream
|
|
1553
|
+
.filter((event) => event.eventName === 'messageIDChange')
|
|
1554
|
+
.beforeEnd(() => null)
|
|
1555
|
+
.take(1)
|
|
1556
|
+
.toPromise();
|
|
1557
|
+
|
|
1108
1558
|
if (!this._messageId) {
|
|
1109
1559
|
// The compose was closed before it got an id.
|
|
1110
1560
|
return null;
|
|
@@ -1119,6 +1569,7 @@ class GmailComposeView {
|
|
|
1119
1569
|
// eslint-disable-next-line no-constant-condition
|
|
1120
1570
|
while (true) {
|
|
1121
1571
|
i++;
|
|
1572
|
+
|
|
1122
1573
|
const messageId = this._messageId;
|
|
1123
1574
|
if (!messageId) {
|
|
1124
1575
|
throw new Error('Should not happen');
|
|
@@ -1129,7 +1580,11 @@ class GmailComposeView {
|
|
|
1129
1580
|
// the draft save response yet. Wait for that response to finish and
|
|
1130
1581
|
// keep trying if it looks like that might be the case.
|
|
1131
1582
|
if (this._draftSaving) {
|
|
1132
|
-
await this._eventStream
|
|
1583
|
+
await this._eventStream
|
|
1584
|
+
.filter((event) => event.eventName === 'messageIDChange')
|
|
1585
|
+
.beforeEnd(() => null)
|
|
1586
|
+
.take(1)
|
|
1587
|
+
.toPromise();
|
|
1133
1588
|
continue;
|
|
1134
1589
|
}
|
|
1135
1590
|
|
|
@@ -1140,25 +1595,23 @@ class GmailComposeView {
|
|
|
1140
1595
|
if (!newMessageId) {
|
|
1141
1596
|
throw new Error('Should not happen');
|
|
1142
1597
|
}
|
|
1143
|
-
const {
|
|
1144
|
-
|
|
1145
|
-
debugData
|
|
1146
|
-
} = await this._driver.getDraftIDForMessageID(newMessageId, true);
|
|
1598
|
+
const { draftID, debugData } =
|
|
1599
|
+
await this._driver.getDraftIDForMessageID(newMessageId, true);
|
|
1147
1600
|
const err = new Error('Failed to read draft ID -- after check');
|
|
1148
1601
|
this._driver.getLogger().error(err, {
|
|
1149
1602
|
message: 'getDraftID error -- after check',
|
|
1150
1603
|
messageIdChanged: messageId !== newMessageId,
|
|
1151
1604
|
gotDraftID: draftID != null,
|
|
1152
|
-
debugData: draftID ? null : debugData
|
|
1605
|
+
debugData: draftID ? null : debugData,
|
|
1153
1606
|
});
|
|
1154
1607
|
}, 10 * 1000);
|
|
1608
|
+
|
|
1155
1609
|
throw new Error('Failed to read draft ID');
|
|
1156
1610
|
}
|
|
1157
1611
|
lastMessageId = messageId;
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
} = await this._driver.getDraftIDForMessageID(messageId);
|
|
1612
|
+
|
|
1613
|
+
const { draftID, debugData } =
|
|
1614
|
+
await this._driver.getDraftIDForMessageID(messageId);
|
|
1162
1615
|
lastDebugData = debugData;
|
|
1163
1616
|
if (draftID) {
|
|
1164
1617
|
return draftID;
|
|
@@ -1173,99 +1626,151 @@ class GmailComposeView {
|
|
|
1173
1626
|
isStandalone: this._isStandalone,
|
|
1174
1627
|
emailWasSent: this._emailWasSent,
|
|
1175
1628
|
i,
|
|
1176
|
-
lastDebugData
|
|
1629
|
+
lastDebugData,
|
|
1177
1630
|
});
|
|
1178
1631
|
throw err;
|
|
1179
1632
|
}
|
|
1180
1633
|
}
|
|
1181
1634
|
}
|
|
1182
|
-
|
|
1635
|
+
|
|
1636
|
+
addManagedViewController(viewController: { destroy(): void }) {
|
|
1183
1637
|
this._managedViewControllers.push(viewController);
|
|
1184
1638
|
}
|
|
1185
|
-
|
|
1186
|
-
|
|
1639
|
+
|
|
1640
|
+
ensureGroupingIsOpen(type: string) {
|
|
1641
|
+
ensureGroupingIsOpen(this._element, type);
|
|
1187
1642
|
}
|
|
1188
|
-
|
|
1189
|
-
|
|
1643
|
+
|
|
1644
|
+
ensureAppButtonToolbarsAreClosed(): void {
|
|
1645
|
+
ensureAppButtonToolbarsAreClosed(this._element);
|
|
1190
1646
|
}
|
|
1191
|
-
|
|
1647
|
+
|
|
1648
|
+
isMinimized(): boolean {
|
|
1192
1649
|
const element = this.getElement();
|
|
1193
1650
|
const bodyElement = this.getMaybeBodyElement();
|
|
1194
|
-
const bodyContainer = (
|
|
1651
|
+
const bodyContainer = find(element.children, (child) =>
|
|
1652
|
+
child.contains(bodyElement)
|
|
1653
|
+
);
|
|
1195
1654
|
if (!bodyContainer) {
|
|
1196
1655
|
if (!hasReportedMissingBody) {
|
|
1197
1656
|
hasReportedMissingBody = true;
|
|
1198
|
-
this._driver
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1657
|
+
this._driver
|
|
1658
|
+
.getLogger()
|
|
1659
|
+
.error(new Error('isMinimized failed to find bodyContainer'), {
|
|
1660
|
+
bodyElement: !!bodyElement,
|
|
1661
|
+
hasMessageIDElement: !!this._messageIDElement,
|
|
1662
|
+
ended: (this._eventStream: any).ended,
|
|
1663
|
+
bodyElStillInCompose: this._element.contains(this._seenBodyElement),
|
|
1664
|
+
seenBodyElHtml: censorHTMLstring(this._seenBodyElement.outerHTML),
|
|
1665
|
+
composeHtml: censorHTMLstring(element.outerHTML),
|
|
1666
|
+
});
|
|
1206
1667
|
}
|
|
1207
1668
|
return false;
|
|
1208
1669
|
}
|
|
1670
|
+
|
|
1209
1671
|
return bodyContainer.style.display !== '';
|
|
1210
1672
|
}
|
|
1211
|
-
|
|
1673
|
+
|
|
1674
|
+
setMinimized(minimized: boolean) {
|
|
1212
1675
|
if (minimized !== this.isMinimized()) {
|
|
1213
|
-
if (this._isInlineReplyForm)
|
|
1214
|
-
|
|
1215
|
-
(
|
|
1676
|
+
if (this._isInlineReplyForm)
|
|
1677
|
+
throw new Error('Not implemented for inline compose views');
|
|
1678
|
+
const minimizeButton = querySelector(this._element, '.Hm > img');
|
|
1679
|
+
simulateClick(minimizeButton);
|
|
1216
1680
|
}
|
|
1217
1681
|
}
|
|
1218
|
-
|
|
1682
|
+
|
|
1683
|
+
setFullscreen(fullscreen: boolean) {
|
|
1219
1684
|
if (fullscreen !== this.isFullscreen()) {
|
|
1220
|
-
if (this._isInlineReplyForm)
|
|
1221
|
-
|
|
1222
|
-
|
|
1685
|
+
if (this._isInlineReplyForm)
|
|
1686
|
+
throw new Error('Not implemented for inline compose views');
|
|
1687
|
+
const fullscreenButton = querySelector(
|
|
1688
|
+
this._element,
|
|
1689
|
+
'.Hm > img:nth-of-type(2)'
|
|
1690
|
+
);
|
|
1691
|
+
simulateClick(fullscreenButton);
|
|
1223
1692
|
}
|
|
1224
1693
|
}
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
const
|
|
1694
|
+
|
|
1695
|
+
setTitleBarColor(color: string): () => void {
|
|
1696
|
+
const buttonParent = querySelector(
|
|
1697
|
+
this._element,
|
|
1698
|
+
'.nH.Hy.aXJ table.cf.Ht td.Hm'
|
|
1699
|
+
);
|
|
1700
|
+
const elementsToModify = [
|
|
1701
|
+
querySelector(this._element, '.nH.Hy.aXJ .pi > .l.o'),
|
|
1702
|
+
querySelector(this._element, '.nH.Hy.aXJ .l.m'),
|
|
1703
|
+
querySelector(this._element, '.nH.Hy.aXJ .l.m > .l.n'),
|
|
1704
|
+
];
|
|
1705
|
+
|
|
1228
1706
|
buttonParent.classList.add('inboxsdk__compose_customTitleBarColor');
|
|
1229
|
-
|
|
1707
|
+
|
|
1708
|
+
elementsToModify.forEach((el) => {
|
|
1230
1709
|
el.style.backgroundColor = color;
|
|
1231
1710
|
});
|
|
1711
|
+
|
|
1232
1712
|
return () => {
|
|
1233
1713
|
buttonParent.classList.remove('inboxsdk__compose_customTitleBarColor');
|
|
1234
|
-
|
|
1714
|
+
|
|
1715
|
+
elementsToModify.forEach((el) => {
|
|
1235
1716
|
el.style.backgroundColor = '';
|
|
1236
1717
|
});
|
|
1237
1718
|
};
|
|
1238
1719
|
}
|
|
1239
|
-
|
|
1720
|
+
|
|
1721
|
+
setTitleBarText(text: string): () => void {
|
|
1240
1722
|
if (this.isInlineReplyForm()) {
|
|
1241
|
-
throw new Error(
|
|
1723
|
+
throw new Error(
|
|
1724
|
+
'setTitleBarText() is not supported on inline compose views'
|
|
1725
|
+
);
|
|
1242
1726
|
}
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1727
|
+
|
|
1728
|
+
const titleBarTable = querySelector(
|
|
1729
|
+
this._element,
|
|
1730
|
+
'.nH.Hy.aXJ table.cf.Ht'
|
|
1731
|
+
);
|
|
1732
|
+
|
|
1733
|
+
if (
|
|
1734
|
+
titleBarTable.classList.contains(
|
|
1735
|
+
'inboxsdk__compose_hasCustomTitleBarText'
|
|
1736
|
+
)
|
|
1737
|
+
) {
|
|
1738
|
+
throw new Error(
|
|
1739
|
+
'Custom title bar text is already registered for this compose view'
|
|
1740
|
+
);
|
|
1246
1741
|
}
|
|
1247
|
-
|
|
1742
|
+
|
|
1743
|
+
const titleTextParent = querySelector(
|
|
1744
|
+
titleBarTable,
|
|
1745
|
+
'div.Hp'
|
|
1746
|
+
).parentElement;
|
|
1248
1747
|
if (!(titleTextParent instanceof HTMLElement)) {
|
|
1249
1748
|
throw new Error('Could not locate title bar text parent');
|
|
1250
1749
|
}
|
|
1750
|
+
|
|
1251
1751
|
titleBarTable.classList.add('inboxsdk__compose_hasCustomTitleBarText');
|
|
1252
1752
|
titleTextParent.classList.add('inboxsdk__compose_nativeTitleBarText');
|
|
1753
|
+
|
|
1253
1754
|
const customTitleText = document.createElement('td');
|
|
1254
1755
|
customTitleText.classList.add('inboxsdk__compose_customTitleBarText');
|
|
1255
|
-
customTitleText.innerHTML =
|
|
1756
|
+
customTitleText.innerHTML = autoHtml`
|
|
1256
1757
|
<div class="Hp">
|
|
1257
1758
|
<h2 class="a3E">
|
|
1258
1759
|
<div class="aYF">${text}</div>
|
|
1259
1760
|
</h2>
|
|
1260
1761
|
</div>
|
|
1261
1762
|
`;
|
|
1763
|
+
|
|
1262
1764
|
titleTextParent.insertAdjacentElement('afterend', customTitleText);
|
|
1765
|
+
|
|
1263
1766
|
return () => {
|
|
1264
1767
|
customTitleText.remove();
|
|
1768
|
+
|
|
1265
1769
|
titleBarTable.classList.remove('inboxsdk__compose_hasCustomTitleBarText');
|
|
1266
1770
|
titleTextParent.classList.remove('inboxsdk__compose_nativeTitleBarText');
|
|
1267
1771
|
};
|
|
1268
1772
|
}
|
|
1773
|
+
|
|
1269
1774
|
_triggerDraftSave() {
|
|
1270
1775
|
if (this._isTriggeringADraftSavePending) {
|
|
1271
1776
|
return;
|
|
@@ -1275,28 +1780,40 @@ class GmailComposeView {
|
|
|
1275
1780
|
// Done asynchronously with setTimeout because if it's done synchronously
|
|
1276
1781
|
// or after an asap step after an inline compose view's creation, Gmail
|
|
1277
1782
|
// interprets the fake keypress and decides to add a '¾' character.
|
|
1278
|
-
Kefir.later(0)
|
|
1279
|
-
this.
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1783
|
+
Kefir.later(0)
|
|
1784
|
+
.takeUntilBy(this._stopper)
|
|
1785
|
+
.onValue(() => {
|
|
1786
|
+
this._isTriggeringADraftSavePending = false;
|
|
1787
|
+
|
|
1788
|
+
const body = this.getMaybeBodyElement();
|
|
1789
|
+
if (body) {
|
|
1790
|
+
const unsilence = this._driver
|
|
1791
|
+
.getPageCommunicator()
|
|
1792
|
+
.silenceGmailErrorsForAMoment();
|
|
1793
|
+
try {
|
|
1794
|
+
simulateKey(body, 190, 0);
|
|
1795
|
+
} finally {
|
|
1796
|
+
unsilence();
|
|
1797
|
+
}
|
|
1287
1798
|
}
|
|
1288
|
-
}
|
|
1289
|
-
});
|
|
1799
|
+
});
|
|
1290
1800
|
}
|
|
1291
1801
|
}
|
|
1292
1802
|
|
|
1293
1803
|
// If this compose is a reply, then this gets the message ID of the message
|
|
1294
1804
|
// we're replying to.
|
|
1295
|
-
_getTargetMessageID() {
|
|
1296
|
-
const input = this._element.querySelector(
|
|
1297
|
-
|
|
1805
|
+
_getTargetMessageID(): ?string {
|
|
1806
|
+
const input: ?HTMLInputElement = (this._element.querySelector(
|
|
1807
|
+
'input[name="rm"]'
|
|
1808
|
+
): any);
|
|
1809
|
+
return input &&
|
|
1810
|
+
typeof input.value === 'string' &&
|
|
1811
|
+
input.value != 'undefined'
|
|
1812
|
+
? input.value.replace('#', '')
|
|
1813
|
+
: null;
|
|
1298
1814
|
}
|
|
1299
|
-
|
|
1815
|
+
|
|
1816
|
+
_getThreadID(): ?string {
|
|
1300
1817
|
const targetID = this.getTargetMessageID();
|
|
1301
1818
|
try {
|
|
1302
1819
|
return targetID ? this._driver.getThreadIDForMessageID(targetID) : null;
|
|
@@ -1305,76 +1822,117 @@ class GmailComposeView {
|
|
|
1305
1822
|
return null;
|
|
1306
1823
|
}
|
|
1307
1824
|
}
|
|
1308
|
-
|
|
1825
|
+
|
|
1826
|
+
getElement(): HTMLElement {
|
|
1309
1827
|
return this._element;
|
|
1310
1828
|
}
|
|
1311
|
-
|
|
1829
|
+
|
|
1830
|
+
isFullscreen(): boolean {
|
|
1312
1831
|
return this._isFullscreen;
|
|
1313
1832
|
}
|
|
1314
|
-
|
|
1833
|
+
|
|
1834
|
+
getLastSelectionRange(): ?Range {
|
|
1315
1835
|
// The selection range can become invalid if the compose view has become expanded or
|
|
1316
1836
|
// minimized since the range was set.
|
|
1317
1837
|
const range = this._lastSelectionRange;
|
|
1318
|
-
if (
|
|
1838
|
+
if (
|
|
1839
|
+
range &&
|
|
1840
|
+
!this.getBodyElement().contains(range.commonAncestorContainer)
|
|
1841
|
+
) {
|
|
1319
1842
|
this._lastSelectionRange = undefined;
|
|
1320
1843
|
}
|
|
1321
1844
|
return this._lastSelectionRange;
|
|
1322
1845
|
}
|
|
1323
|
-
|
|
1846
|
+
|
|
1847
|
+
setLastSelectionRange(lastSelectionRange: ?Range) {
|
|
1324
1848
|
this._lastSelectionRange = lastSelectionRange;
|
|
1325
1849
|
}
|
|
1326
|
-
|
|
1327
|
-
|
|
1850
|
+
|
|
1851
|
+
registerRequestModifier(
|
|
1852
|
+
modifier: (composeParams: { body: string }) =>
|
|
1853
|
+
| { body: string }
|
|
1854
|
+
| Promise<{ body: string }>
|
|
1855
|
+
) {
|
|
1856
|
+
const keyId = this._driver.isUsingSyncAPI()
|
|
1857
|
+
? this._getDraftIDfromForm()
|
|
1858
|
+
: this.getComposeID();
|
|
1859
|
+
|
|
1328
1860
|
if (!keyId) throw new Error('keyId should be set here');
|
|
1329
|
-
|
|
1861
|
+
|
|
1862
|
+
const modifierId = this._driver
|
|
1863
|
+
.getPageCommunicator()
|
|
1864
|
+
.registerComposeRequestModifier(keyId, this._driver.getAppId());
|
|
1330
1865
|
this._requestModifiers[modifierId] = modifier;
|
|
1331
1866
|
this._startListeningForModificationRequests();
|
|
1332
1867
|
this._stopper.onValue(() => {
|
|
1333
|
-
this._driver
|
|
1868
|
+
this._driver
|
|
1869
|
+
.getPageCommunicator()
|
|
1870
|
+
.unregisterComposeRequestModifier(keyId, modifierId);
|
|
1334
1871
|
});
|
|
1335
1872
|
}
|
|
1873
|
+
|
|
1336
1874
|
_startListeningForModificationRequests() {
|
|
1337
1875
|
if (this._isListeningToAjaxInterceptStream) {
|
|
1338
1876
|
return;
|
|
1339
1877
|
}
|
|
1340
|
-
|
|
1878
|
+
|
|
1879
|
+
const keyId = this._driver.isUsingSyncAPI()
|
|
1880
|
+
? this._getDraftIDfromForm()
|
|
1881
|
+
: this.getComposeID();
|
|
1882
|
+
|
|
1341
1883
|
if (!keyId) throw new Error('keyId should be set here');
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
draftID,
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
composeParams
|
|
1354
|
-
} = _ref10;
|
|
1355
|
-
if (this._driver.getLogger().shouldTrackEverything()) {
|
|
1356
|
-
this._driver.getLogger().eventSite('inboxSDKmodifyComposeRequest');
|
|
1357
|
-
}
|
|
1358
|
-
const modifier = this._requestModifiers[modifierId];
|
|
1359
|
-
const result = new Promise(resolve => resolve(modifier(composeParams)));
|
|
1360
|
-
result.then(newComposeParams => this._driver.getPageCommunicator().modifyComposeRequest(keyId, modifierId, newComposeParams || composeParams)).then(x => {
|
|
1884
|
+
|
|
1885
|
+
this._driver
|
|
1886
|
+
.getPageCommunicator()
|
|
1887
|
+
.ajaxInterceptStream.filter(
|
|
1888
|
+
({ type, composeid, draftID, modifierId }) =>
|
|
1889
|
+
type === 'inboxSDKmodifyComposeRequest' &&
|
|
1890
|
+
(composeid === keyId || keyId === draftID) &&
|
|
1891
|
+
Boolean(this._requestModifiers[modifierId])
|
|
1892
|
+
)
|
|
1893
|
+
.takeUntilBy(this._stopper)
|
|
1894
|
+
.onValue(({ modifierId, composeParams }) => {
|
|
1361
1895
|
if (this._driver.getLogger().shouldTrackEverything()) {
|
|
1362
|
-
this._driver.getLogger().eventSite('
|
|
1896
|
+
this._driver.getLogger().eventSite('inboxSDKmodifyComposeRequest');
|
|
1363
1897
|
}
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1898
|
+
|
|
1899
|
+
const modifier = this._requestModifiers[modifierId];
|
|
1900
|
+
const result = new Promise((resolve) =>
|
|
1901
|
+
resolve(modifier(composeParams))
|
|
1902
|
+
);
|
|
1903
|
+
|
|
1904
|
+
result
|
|
1905
|
+
.then((newComposeParams) =>
|
|
1906
|
+
this._driver
|
|
1907
|
+
.getPageCommunicator()
|
|
1908
|
+
.modifyComposeRequest(
|
|
1909
|
+
keyId,
|
|
1910
|
+
modifierId,
|
|
1911
|
+
newComposeParams || composeParams
|
|
1912
|
+
)
|
|
1913
|
+
)
|
|
1914
|
+
.then((x) => {
|
|
1915
|
+
if (this._driver.getLogger().shouldTrackEverything()) {
|
|
1916
|
+
this._driver.getLogger().eventSite('composeRequestModified');
|
|
1917
|
+
}
|
|
1918
|
+
return x;
|
|
1919
|
+
})
|
|
1920
|
+
.catch((err) => {
|
|
1921
|
+
this._driver
|
|
1922
|
+
.getPageCommunicator()
|
|
1923
|
+
.modifyComposeRequest(keyId, modifierId, composeParams);
|
|
1924
|
+
this._driver.getLogger().error(err);
|
|
1925
|
+
});
|
|
1368
1926
|
});
|
|
1369
|
-
|
|
1927
|
+
|
|
1370
1928
|
this._isListeningToAjaxInterceptStream = true;
|
|
1371
1929
|
}
|
|
1372
|
-
|
|
1930
|
+
|
|
1931
|
+
setupLinkPopOvers(): void {
|
|
1373
1932
|
if (!this._hasSetupLinkPopOvers) {
|
|
1374
1933
|
this._hasSetupLinkPopOvers = true;
|
|
1375
|
-
this._eventStream.plug((
|
|
1934
|
+
this._eventStream.plug(setupLinkPopOvers(this));
|
|
1376
1935
|
}
|
|
1377
1936
|
}
|
|
1378
1937
|
}
|
|
1379
|
-
|
|
1380
|
-
exports.default = _default;
|
|
1938
|
+
export default ud.defn(module, GmailComposeView);
|