1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 22:10:55 +01:00
phorge-phorge/webroot/rsrc/js/core
epriestley 37f12a05ea Behold! Copy text from either side of a diff!
Summary:
Ref T12822. Ref T13161. By default, when users select text from a diff and copy it to the clipboard, they get both sides of the diff and all the line numbers. This is usually not what they intended to copy.

As of D20188, we use `content: attr(...)` to render line numbers. No browser copies this text, so that fixes line numbers.

We can use "user-select" CSS to visually prevent selection of line numbers and other stuff we don't want to copy. In Firefox and Chrome, "user-select" also applies to copied text, so getting "user-select" on the right nodes is largely good enough to do what we want.

In Safari, "user-select" is only visual, so we always need to crawl the DOM to figure out what text to pull out of it anyway.

In all browsers, we likely want to crawl the DOM anyway because this will let us show one piece of text and copy a different piece of text. We probably want to do this in the future to preserve "\t" tabs, and possibly to let us render certain character codes in one way but copy their original values. For example, we could render "\x07" as "␇".

Finally, we have to figure out which side of the diff we're copying from. The rule here is:

  - If you start the selection by clicking somewhere on the left or right side of the diff, that's what you're copying.
  - Otherwise, use normal document copy rules.

So the overall flow here is:

  - Listen for clicks.
  - When the user clicks the left or right side of the diff, store what they clicked.
  - When a selection starts, and something is actually selected, check if it was initiated by clicking a diff. If it was, apply a visual effect to get "user-select" where it needs to go and show the user what we think they're doing and what we're going to copy.
  - (Then, try to handle a bunch of degenerate cases where you start a selection and then click inside that selection.)
  - When a user clicks elsewhere or ends the selection with nothing selected, clear the selection mode.
  - When a user copies text, if we have an active selection mode, pull all the selected nodes out of the DOM and filter out the ones we don't want to copy, then stitch the text back together. Although I believe this didn't work well in ~2010, it appears to work well today.

Test Plan: This mostly seems to work in Safari, Chrome, and Firefox. T12822 has some errata. I haven't tested touch events but am satisfied if the touch event story is anything better than "permanently destroys data".

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13161, T12822

Differential Revision: https://secure.phabricator.com/D20191
2019-02-19 15:17:07 -08:00
..
darkconsole Fix the DarkConsole inline error log stack trace expansion behavior for Content-Security-Policy 2018-03-13 16:45:20 -07:00
behavior-active-nav.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-audio-source.js Implement macros as audio sources 2013-09-27 16:02:02 -07:00
behavior-autofocus.js Move js/application/core/ one level up 2013-04-23 10:56:46 -07:00
behavior-badge-view.js Links on badge card should be accessible 2016-04-15 07:55:31 -07:00
behavior-bulk-editor.js Organize bulk edit actions into nice groups 2018-01-19 13:22:25 -08:00
behavior-choose-control.js Allow installs to customize project icons 2016-01-08 14:01:53 -08:00
behavior-copy.js Help PROFESSIONAL SOFTWARE ENGINEERS copy text to their clipboard 2017-05-31 10:13:49 -07:00
behavior-detect-timezone.js When the JS "Intl" API is available, use it to guess the timezone 2016-05-22 09:14:02 -07:00
behavior-device.js Fix spelling 2017-10-09 10:48:04 -07:00
behavior-drag-and-drop-textarea.js Provide an <input type="file"> control in Remarkup for mobile and users with esoteric windowing systems 2016-05-20 16:24:22 -07:00
behavior-fancy-datepicker.js Fix a hang in fancy date picker for Ye Olde Time Years 2017-08-10 08:48:44 -07:00
behavior-file-tree.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-form.js Apply some linter auto-fixes 2014-08-02 19:03:02 +10:00
behavior-gesture.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-global-drag-and-drop.js Allow users to drop .ics files on calendar views to import them 2016-10-18 15:26:44 -07:00
behavior-high-security-warning.js Quicksand - make things work properly with high security mode 2015-04-23 16:37:56 -07:00
behavior-history-install.js Move js/application/core/ one level up 2013-04-23 10:56:46 -07:00
behavior-hovercard.js Move PhabricatorHovercard to PHUIHovercard 2016-02-03 16:26:30 +00:00
behavior-keyboard-pager.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-keyboard-shortcuts.js Make "/" focus the search input again 2016-07-08 14:18:35 -07:00
behavior-lightbox-attachments.js Fix image prev/next cycling in lightboxes 2018-03-08 08:28:04 -08:00
behavior-line-linker.js When following a link to a particular line ("/example.txt$12"), scroll to that line 2018-04-11 17:29:22 -07:00
behavior-linked-container.js Replace the "Choose Subtype" radio buttons dialog with a simpler "big stuff you click" sort of UI 2018-12-10 14:59:18 -08:00
behavior-more.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-object-selector.js Fix object selector button color 2017-06-07 13:50:12 -07:00
behavior-oncopy.js Behold! Copy text from either side of a diff! 2019-02-19 15:17:07 -08:00
behavior-phabricator-nav.js Repaint filetree more consistently for mobile/device views 2018-08-27 10:32:47 -07:00
behavior-phabricator-remarkup-assist.js Fix autocomplete/send-on-enter interactions 2017-04-26 08:48:25 -07:00
behavior-read-only-warning.js When Phabricator is in read-only mode, explain why 2016-04-10 12:19:18 -07:00
behavior-redirect.js Perform a client-side redirect after OAuth server authorization 2018-03-06 12:18:27 -08:00
behavior-refresh-csrf.js When logged-out users hit a "Login Required" dialog, try to choose a better "next" URI 2015-12-17 08:30:03 -08:00
behavior-remarkup-load-image.js When proxying an "{image ...}" image fails, show the user an error message 2018-03-08 07:03:26 -08:00
behavior-remarkup-preview.js Support field previews in EditEngine 2015-12-27 08:17:18 -08:00
behavior-reorder-applications.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-reveal-content.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-scrollbar.js Make scrolling happen relative to the main content frame 2015-01-25 08:42:40 -08:00
behavior-search-typeahead.js Add a rough Quick Search datasource for Phriction documents 2018-02-16 09:55:54 -08:00
behavior-select-content.js Clean up display of clone URIs a little bit 2016-05-11 13:14:55 -07:00
behavior-select-on-click.js Remove unused JavaScript variables. 2014-06-24 03:27:47 +10:00
behavior-setup-check-https.js Add client-side check for protocol mismatch 2016-06-07 15:54:48 +00:00
behavior-time-typeahead.js Time controls should format end date value correctly (not 5:0 PM) 2016-04-15 12:18:12 -07:00
behavior-toggle-class.js Links on badge card should be accessible 2016-04-15 07:55:31 -07:00
behavior-tokenizer.js Move js/application/core/ one level up 2013-04-23 10:56:46 -07:00
behavior-tooltip.js Redesign Home/Profile/Projects side navigation 2017-01-31 08:59:01 -08:00
behavior-user-menu.js Make documentation items in user menu update as you navigate in Quicksand 2017-01-17 15:55:52 -08:00
behavior-watch-anchor.js Fix anchor-clicking scroll positions 2015-01-28 08:26:10 -08:00
behavior-workflow.js Provide a global router for Ajax requests 2014-05-05 10:57:42 -07:00
Busy.js Make busy indicator durable column aware 2015-04-01 20:10:32 -07:00
DragAndDropFileUpload.js Provide an <input type="file"> control in Remarkup for mobile and users with esoteric windowing systems 2016-05-20 16:24:22 -07:00
DraggableList.js Allow workboard cards to be dragged again by using a larger value for infinity 2016-11-17 08:01:57 -08:00
Favicon.js JX.Favicon for Conpherence 2016-10-20 12:17:50 -07:00
FileUpload.js Support drag-and-drop to set cover images on workboard cards 2016-02-06 15:58:43 -08:00
Hovercard.js Move PhabricatorHovercard to PHUIHovercard 2016-02-03 16:26:30 +00:00
KeyboardShortcut.js Move js/application/core/ one level up 2013-04-23 10:56:46 -07:00
KeyboardShortcutManager.js Move keyboard focus reticle code to Differential 2017-05-16 08:20:50 -07:00
MultirowRowManager.js Clean up Multirow Manager UI 2014-11-17 14:06:05 -08:00
Notification.js Correct the behavior of "Desktop Only" in Notifications preferences 2018-03-16 15:17:49 -07:00
phtize.js Use JsShrink if jsxmin is not available 2013-05-18 17:04:22 -07:00
Prefab.js Show user availability dots (red = away, orange = busy) in typeaheads, tokenizer tokens, and autocompletes 2019-02-19 10:57:20 -08:00
ShapedRequest.js Provide a global router for Ajax requests 2014-05-05 10:57:42 -07:00
TextAreaUtils.js Provide an <input type="file"> control in Remarkup for mobile and users with esoteric windowing systems 2016-05-20 16:24:22 -07:00
Title.js JX.Favicon for Conpherence 2016-10-20 12:17:50 -07:00
ToolTip.js Make Differential objective markers show a brighter "editing" state 2017-05-20 07:57:38 -07:00