@inboxsdk/core 1.2.5 → 1.2.7

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