@inboxsdk/core 1.2.4 → 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 (332) hide show
  1. package/inboxsdk.js +4474 -463
  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/common/load-script.d.ts +0 -6
  7. package/src/common/load-script.d.ts.map +1 -1
  8. package/src/inboxsdk-js/loading/platform-implementation-loader.d.ts.map +1 -1
  9. package/src/inboxsdk.d.ts +29 -0
  10. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.d.ts +2 -2
  11. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.d.ts.map +1 -1
  12. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.d.ts +6 -1
  13. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.d.ts.map +1 -1
  14. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.d.ts +2 -2
  15. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.d.ts.map +1 -1
  16. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.d.ts +5 -0
  17. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.d.ts.map +1 -1
  18. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.d.ts +13 -5
  19. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.d.ts.map +1 -1
  20. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.d.ts +1 -1
  21. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.d.ts.map +1 -1
  22. package/src/platform-implementation-js/lib/inject-script-EMBEDDED.d.ts.map +1 -1
  23. package/src/platform-implementation-js/namespaces/conversations.d.ts +7 -0
  24. package/src/platform-implementation-js/namespaces/conversations.d.ts.map +1 -1
  25. package/src/platform-implementation-js/namespaces/nav-menu.d.ts +4 -2
  26. package/src/platform-implementation-js/namespaces/nav-menu.d.ts.map +1 -1
  27. package/src/platform-implementation-js/views/conversations/attachment-card-view.d.ts +12 -5
  28. package/src/platform-implementation-js/views/conversations/attachment-card-view.d.ts.map +1 -1
  29. package/src/platform-implementation-js/views/native-nav-item-view.d.ts +2 -1
  30. package/src/platform-implementation-js/views/native-nav-item-view.d.ts.map +1 -1
  31. package/src/build/exec.js +0 -26
  32. package/src/build/spawn.js +0 -17
  33. package/src/common/ajax.js +0 -90
  34. package/src/common/cachebust-url.js +0 -10
  35. package/src/common/censorHTMLstring.js +0 -37
  36. package/src/common/censorHTMLtree.js +0 -28
  37. package/src/common/censorJSONTree.js +0 -15
  38. package/src/common/connectivity-test.js +0 -21
  39. package/src/common/defer.js +0 -11
  40. package/src/common/find-parent.js +0 -10
  41. package/src/common/get-extension-id.js +0 -7
  42. package/src/common/get-or-fail.js +0 -8
  43. package/src/common/get-session-id.js +0 -14
  44. package/src/common/get-stack-trace.js +0 -6
  45. package/src/common/html-to-text.js +0 -7
  46. package/src/common/isElementVisible.js +0 -6
  47. package/src/common/load-script.js +0 -128
  48. package/src/common/log-error.js +0 -185
  49. package/src/common/quoted-split.js +0 -18
  50. package/src/common/rate-limit-queuer.js +0 -57
  51. package/src/common/rate-limit.js +0 -14
  52. package/src/common/version.js +0 -8
  53. package/src/inboxsdk-js/header.js +0 -19
  54. package/src/inboxsdk-js/inboxsdk-NONREMOTE-INTEGRATED-PAGEWORLD.js +0 -4
  55. package/src/inboxsdk-js/inboxsdk-NONREMOTE.js +0 -4
  56. package/src/inboxsdk-js/inboxsdk-REMOTE.js +0 -2
  57. package/src/inboxsdk-js/inboxsdk-TEST.js +0 -5
  58. package/src/inboxsdk-js/inboxsdk.js +0 -23
  59. package/src/inboxsdk-js/loading/load-platform-implementation-DEV.js +0 -14
  60. package/src/inboxsdk-js/loading/platform-implementation-loader.js +0 -31
  61. package/src/injected-js/gmail/constants.js +0 -2
  62. package/src/injected-js/gmail/modify-suggestions.js +0 -106
  63. package/src/injected-js/gmail/setup-gmail-interceptor.js +0 -936
  64. package/src/injected-js/gmail/setup-gmonkey-handler.js +0 -49
  65. package/src/injected-js/gmail/sync-compose-processor-20220909.js +0 -298
  66. package/src/injected-js/gmail/sync-compose-processor.js +0 -55
  67. package/src/injected-js/gmail/sync-compose-request-processor.js +0 -109
  68. package/src/injected-js/gmail/thread-identifier/click-and-get-popup-url.js +0 -71
  69. package/src/injected-js/gmail/thread-identifier/index.js +0 -133
  70. package/src/injected-js/gmail/thread-identifier/thread-row-parser.js +0 -61
  71. package/src/injected-js/injected-logger.js +0 -50
  72. package/src/injected-js/main.js +0 -49
  73. package/src/injected-js/message-metadata-holder.js +0 -103
  74. package/src/injected-js/setup-data-exposer.js +0 -135
  75. package/src/injected-js/setup-error-silencer.js +0 -15
  76. package/src/injected-js/setup-event-reemitter.js +0 -47
  77. package/src/injected-js/setupCustomViewEventAssassin.js +0 -90
  78. package/src/injected-js/setupInboxCustomViewLinkFixer.js +0 -24
  79. package/src/injected-js/setupPushStateListener.js +0 -14
  80. package/src/injected-js/xhr-helper.js +0 -43
  81. package/src/injected-js/xhr-proxy-factory.js +0 -537
  82. package/src/platform-implementation-js/constants/nav-item-types.js +0 -19
  83. package/src/platform-implementation-js/constants/router.js +0 -60
  84. package/src/platform-implementation-js/constants/toolbars.js +0 -5
  85. package/src/platform-implementation-js/dom-driver/gmail/gmail-butter-bar-driver.js +0 -158
  86. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.js +0 -20
  87. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.js +0 -38
  88. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.js +0 -98
  89. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.js +0 -4
  90. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-toolbar-button-for-app.js +0 -14
  91. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/create-link.js +0 -60
  92. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.js +0 -8
  93. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-draft-id-for-message-id.js +0 -47
  94. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-native-nav-item.js +0 -31
  95. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.js +0 -12
  96. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.js +0 -33
  97. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-url-object.js +0 -22
  98. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadForOldGmailThreadId.js +0 -18
  99. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadFromSyncThreadId.js +0 -57
  100. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/gmail-load-event.js +0 -40
  101. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/goto-view.js +0 -55
  102. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.js +0 -14
  103. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/keyboard-shortcut-help-modifier.js +0 -177
  104. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-compose-window.js +0 -17
  105. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.js +0 -44
  106. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/override-gmail-back-button.js +0 -49
  107. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-query-rewriter.js +0 -18
  108. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-suggestions-provider.js +0 -138
  109. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-compose-view-driver-stream.js +0 -112
  110. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.js +0 -152
  111. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-app-id-warning.js +0 -21
  112. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-route-view.js +0 -48
  113. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.js +0 -357
  114. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-native-route-view.js +0 -19
  115. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/suppressAddon.js +0 -36
  116. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/temporary-track-download-url-validity.js +0 -36
  117. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/thread-row-identifier.js +0 -85
  118. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-events.js +0 -142
  119. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.js +0 -115
  120. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.js +0 -50
  121. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.js +0 -723
  122. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.js +0 -38
  123. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.js +0 -12
  124. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.js +0 -264
  125. package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.js +0 -201
  126. package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.js +0 -532
  127. package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.js +0 -300
  128. package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.js +0 -21
  129. package/src/platform-implementation-js/dom-driver/gmail/make-xhr-interceptor.js +0 -92
  130. package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.js +0 -28
  131. package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.js +0 -19
  132. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.js +0 -129
  133. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.js +0 -80
  134. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-global-icon-area.js +0 -23
  135. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-thread-icon-area.js +0 -26
  136. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-to-icon-area.js +0 -16
  137. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/index.js +0 -723
  138. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view/monitor-top-banner-size-and-react.js +0 -24
  139. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view.js +0 -172
  140. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-area-view.js +0 -106
  141. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.js +0 -328
  142. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-backdrop.js +0 -22
  143. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-collapsible-section-view.js +0 -720
  144. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-button.js +0 -135
  145. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-compose-notice.js +0 -50
  146. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-recipient-row.js +0 -65
  147. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.js +0 -101
  148. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-tooltip-to-button.js +0 -66
  149. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.js +0 -38
  150. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-app-button-toolbars-are-closed.js +0 -10
  151. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-grouping-is-open.js +0 -14
  152. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/focus.js +0 -13
  153. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/from-manager.js +0 -60
  154. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-additional-action-toolbar.js +0 -54
  155. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-changes-stream.js +0 -98
  156. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.js +0 -28
  157. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-body-changes-stream.js +0 -13
  158. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-formatting-area-offset-left.js +0 -18
  159. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-minimized-stream.js +0 -16
  160. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.js +0 -22
  161. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-response-type-changes-stream.js +0 -23
  162. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.js +0 -233
  163. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/insert-link-into-body.js +0 -19
  164. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/manage-button-grouping.js +0 -355
  165. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/monitor-selection-range.js +0 -21
  166. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/override-edit-subject.js +0 -63
  167. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.js +0 -223
  168. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/position-formatting-toolbar.js +0 -19
  169. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.js +0 -157
  170. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.js +0 -109
  171. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/size-fixer.js +0 -123
  172. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/update-insert-more-area-left.js +0 -16
  173. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view.js +0 -1542
  174. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.js +0 -4
  175. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/get-updated-contact.js +0 -75
  176. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view.js +0 -737
  177. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.js +0 -763
  178. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-processor.js +0 -103
  179. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-view.js +0 -508
  180. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-row-list-view.js +0 -236
  181. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.js +0 -84
  182. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-row-view.js +0 -986
  183. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view/width-manager.js +0 -26
  184. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view.js +0 -658
  185. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-toolbar-view.js +0 -459
  186. package/src/platform-implementation-js/dom-driver/gmail/views/native-gmail-nav-item-view.js +0 -265
  187. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.js +0 -33
  188. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.js +0 -325
  189. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.js +0 -61
  190. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.js +0 -58
  191. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/inbox-dropdown-button-view.js +0 -23
  192. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.js +0 -101
  193. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.js +0 -30
  194. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.js +0 -10
  195. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-action-button-view.js +0 -42
  196. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.js +0 -22
  197. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-label-view.js +0 -112
  198. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-modal-view-driver.js +0 -122
  199. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-mole-view-driver.js +0 -194
  200. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-tooltip-view.js +0 -352
  201. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-top-message-bar-driver.js +0 -76
  202. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-backdrop.js +0 -57
  203. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-drawer-view.js +0 -291
  204. package/src/platform-implementation-js/driver-common/compose/getDiscardStream.js +0 -28
  205. package/src/platform-implementation-js/driver-common/compose/getPresendingStream.js +0 -46
  206. package/src/platform-implementation-js/driver-common/getAccountUrlPart.js +0 -17
  207. package/src/platform-implementation-js/driver-common/getGmailMessageIdForSyncMessageId.js +0 -17
  208. package/src/platform-implementation-js/driver-common/getGmailThreadIdForRfcMessageId.js +0 -44
  209. package/src/platform-implementation-js/driver-common/getOriginalMessagePage.js +0 -33
  210. package/src/platform-implementation-js/driver-common/getRfcMessageIdForSyncMessageId.js +0 -18
  211. package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.js +0 -49
  212. package/src/platform-implementation-js/driver-common/getThreadIdFromMessageId.js +0 -13
  213. package/src/platform-implementation-js/driver-common/gmailAjax.js +0 -65
  214. package/src/platform-implementation-js/driver-common/inboxAjax.js +0 -5
  215. package/src/platform-implementation-js/driver-common/render-custom-icon.js +0 -16
  216. package/src/platform-implementation-js/driver-common/requestGmailThread.js +0 -24
  217. package/src/platform-implementation-js/driver-common/sidebar/AppSidebar.js +0 -245
  218. package/src/platform-implementation-js/driver-common/sidebar/ContentPanelViewDriver.js +0 -144
  219. package/src/platform-implementation-js/driver-common/sidebar/constants.js +0 -26
  220. package/src/platform-implementation-js/driver-common/update-icon.js +0 -90
  221. package/src/platform-implementation-js/driver-interfaces/compose-view-driver.js +0 -1
  222. package/src/platform-implementation-js/driver-interfaces/driver.js +0 -1
  223. package/src/platform-implementation-js/driver-interfaces/mole-view-driver.js +0 -1
  224. package/src/platform-implementation-js/driver-interfaces/route-view-driver.js +0 -1
  225. package/src/platform-implementation-js/lib/ErrorCollector.js +0 -47
  226. package/src/platform-implementation-js/lib/Membrane.js +0 -22
  227. package/src/platform-implementation-js/lib/ScrollableContainByScreen.js +0 -30
  228. package/src/platform-implementation-js/lib/attemptWithRetries.js +0 -16
  229. package/src/platform-implementation-js/lib/common-page-communicator.js +0 -137
  230. package/src/platform-implementation-js/lib/copyAndValidateAutocompleteResults.js +0 -35
  231. package/src/platform-implementation-js/lib/css-selector-escape.js +0 -6
  232. package/src/platform-implementation-js/lib/delay-asap.js +0 -10
  233. package/src/platform-implementation-js/lib/delay-idle.js +0 -16
  234. package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.js +0 -36
  235. package/src/platform-implementation-js/lib/dom/custom-events.js +0 -5
  236. package/src/platform-implementation-js/lib/dom/element-view-mapper.js +0 -9
  237. package/src/platform-implementation-js/lib/dom/generic-button-view.js +0 -39
  238. package/src/platform-implementation-js/lib/dom/get-insert-before-element.js +0 -39
  239. package/src/platform-implementation-js/lib/dom/get-selection.js +0 -30
  240. package/src/platform-implementation-js/lib/dom/insert-element-in-order.js +0 -38
  241. package/src/platform-implementation-js/lib/dom/insert-html-at-cursor.js +0 -83
  242. package/src/platform-implementation-js/lib/dom/is-node-in-range.js +0 -12
  243. package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.js +0 -12
  244. package/src/platform-implementation-js/lib/dom/make-element-child-stream.js +0 -79
  245. package/src/platform-implementation-js/lib/dom/make-element-stream-merger.js +0 -27
  246. package/src/platform-implementation-js/lib/dom/make-element-view-stream.js +0 -15
  247. package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.js +0 -15
  248. package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.js +0 -5
  249. package/src/platform-implementation-js/lib/dom/on-mouse-down-and-up.js +0 -8
  250. package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.js +0 -38
  251. package/src/platform-implementation-js/lib/dom/parentNodes.js +0 -8
  252. package/src/platform-implementation-js/lib/dom/querySelectorOrFail.js +0 -6
  253. package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.js +0 -22
  254. package/src/platform-implementation-js/lib/dom/set-css.js +0 -20
  255. package/src/platform-implementation-js/lib/dom/simulate-drag-and-drop.js +0 -88
  256. package/src/platform-implementation-js/lib/dom/simulate-key.js +0 -46
  257. package/src/platform-implementation-js/lib/dom/simulate-mouse-event.js +0 -16
  258. package/src/platform-implementation-js/lib/dom/trigger-relay-event.js +0 -7
  259. package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.js +0 -25
  260. package/src/platform-implementation-js/lib/fake-window-resize.js +0 -5
  261. package/src/platform-implementation-js/lib/from-event-target-capture.js +0 -12
  262. package/src/platform-implementation-js/lib/fromEventsWithOptions.js +0 -10
  263. package/src/platform-implementation-js/lib/handle-compose-link-chips.js +0 -124
  264. package/src/platform-implementation-js/lib/handler-registry.js +0 -67
  265. package/src/platform-implementation-js/lib/idMap.js +0 -40
  266. package/src/platform-implementation-js/lib/imageRequest.js +0 -8
  267. package/src/platform-implementation-js/lib/incrementName.js +0 -7
  268. package/src/platform-implementation-js/lib/inject-script-EMBEDDED.js +0 -8
  269. package/src/platform-implementation-js/lib/inject-script.js +0 -33
  270. package/src/platform-implementation-js/lib/insert-link-chip-into-body.js +0 -44
  271. package/src/platform-implementation-js/lib/is-valid-app-id.js +0 -27
  272. package/src/platform-implementation-js/lib/is-valid-email.js +0 -14
  273. package/src/platform-implementation-js/lib/isNotNil.js +0 -5
  274. package/src/platform-implementation-js/lib/isStreakAppId.js +0 -11
  275. package/src/platform-implementation-js/lib/logger.js +0 -439
  276. package/src/platform-implementation-js/lib/parseParamsFromRouteID.js +0 -10
  277. package/src/platform-implementation-js/lib/persistent-queue.js +0 -107
  278. package/src/platform-implementation-js/lib/populateRouteID.js +0 -17
  279. package/src/platform-implementation-js/lib/react/ElementContainer.js +0 -26
  280. package/src/platform-implementation-js/lib/routeIDmatchesHash.js +0 -8
  281. package/src/platform-implementation-js/lib/safe-event-emitter.js +0 -16
  282. package/src/platform-implementation-js/lib/stopper-pool.js +0 -41
  283. package/src/platform-implementation-js/lib/stream-wait-for.js +0 -30
  284. package/src/platform-implementation-js/lib/toItemWithLifetimeStream.js +0 -12
  285. package/src/platform-implementation-js/lib/toLiveSet.js +0 -22
  286. package/src/platform-implementation-js/lib/wait-for.js +0 -38
  287. package/src/platform-implementation-js/lib/waitForAsync.js +0 -18
  288. package/src/platform-implementation-js/main-INTEGRATED-PAGEWORLD.js +0 -5
  289. package/src/platform-implementation-js/main.js +0 -42
  290. package/src/platform-implementation-js/namespaces/app-menu.js +0 -81
  291. package/src/platform-implementation-js/namespaces/butter-bar.js +0 -163
  292. package/src/platform-implementation-js/namespaces/compose.js +0 -59
  293. package/src/platform-implementation-js/namespaces/conversations.js +0 -83
  294. package/src/platform-implementation-js/namespaces/global.js +0 -30
  295. package/src/platform-implementation-js/namespaces/keyboard.js +0 -30
  296. package/src/platform-implementation-js/namespaces/lists.js +0 -40
  297. package/src/platform-implementation-js/namespaces/modal.js +0 -43
  298. package/src/platform-implementation-js/namespaces/nav-menu.js +0 -33
  299. package/src/platform-implementation-js/namespaces/router.js +0 -139
  300. package/src/platform-implementation-js/namespaces/search.js +0 -29
  301. package/src/platform-implementation-js/namespaces/toolbars.js +0 -147
  302. package/src/platform-implementation-js/namespaces/user.js +0 -57
  303. package/src/platform-implementation-js/namespaces/widgets.js +0 -73
  304. package/src/platform-implementation-js/platform-implementation.js +0 -178
  305. package/src/platform-implementation-js/views/SimpleElementView.js +0 -16
  306. package/src/platform-implementation-js/views/app-menu-item-view.js +0 -442
  307. package/src/platform-implementation-js/views/app-toolbar-button-view.js +0 -43
  308. package/src/platform-implementation-js/views/collapsible-panel-view.js +0 -256
  309. package/src/platform-implementation-js/views/collapsible-section-view.js +0 -63
  310. package/src/platform-implementation-js/views/compose-button-view.js +0 -45
  311. package/src/platform-implementation-js/views/compose-view.js +0 -310
  312. package/src/platform-implementation-js/views/content-panel-view.js +0 -36
  313. package/src/platform-implementation-js/views/conversations/attachment-card-view.js +0 -41
  314. package/src/platform-implementation-js/views/conversations/custom-message-view.js +0 -117
  315. package/src/platform-implementation-js/views/conversations/message-view.js +0 -203
  316. package/src/platform-implementation-js/views/conversations/thread-view.js +0 -97
  317. package/src/platform-implementation-js/views/keyboard-shortcut-handle.js +0 -14
  318. package/src/platform-implementation-js/views/native-nav-item-view.js +0 -60
  319. package/src/platform-implementation-js/views/nav-item-view.js +0 -130
  320. package/src/platform-implementation-js/views/route-view/custom-route-view.js +0 -25
  321. package/src/platform-implementation-js/views/route-view/dummy-route-view-driver.js +0 -29
  322. package/src/platform-implementation-js/views/route-view/list-route-view.js +0 -46
  323. package/src/platform-implementation-js/views/route-view/route-view.js +0 -47
  324. package/src/platform-implementation-js/views/section-view.js +0 -60
  325. package/src/platform-implementation-js/views/thread-row-view.js +0 -90
  326. package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.js +0 -39
  327. package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.js +0 -98
  328. package/src/platform-implementation-js/widgets/buttons/dropdown-view.js +0 -121
  329. package/src/platform-implementation-js/widgets/drawer-view.js +0 -46
  330. package/src/platform-implementation-js/widgets/modal-view.js +0 -108
  331. package/src/platform-implementation-js/widgets/mole-view.js +0 -38
  332. 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;