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