1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 08:12:40 +01:00

Use <td class="n" data-n="3"> instead of <th>3</th> for line numbers

Summary:
Ref T13161. Ref T12822. See PHI870. Long ago, the web was simple. You could leave your doors unlocked, you knew all your neighbors, crime hadn't been invented yet, and `<th>3</th>` was a perfectly fine way to render a line number cell containing the number "3".

But times have changed!

  - In PHI870, this isn't good for screenreaders. We can't do much about this, so switch to `<td>`.
  - In D19349 / T13105 and elsewhere, this `::after { content: attr(data-n); }` approach seems like the least bad general-purpose approach for preventing line numbers from being copied. Although Differential needs even more magic beyond this in the two-up view, this is likely good enough for the one-up view, and is consistent with other views (paste, harbormaster logs, general source display) where this technique is sufficient on its own.

The chance this breaks //something// is pretty much 100%, but we've got a week to figure out what it breaks. I couldn't find any issues immediately.

Test Plan:
  - Created, edited, deleted inlines in 1-up and 2-up views.
  - Replied, keyboard-navigated, keyboard-replied, drag-selected, poked and prodded everything.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13161, T12822

Differential Revision: https://secure.phabricator.com/D20188
This commit is contained in:
epriestley 2019-02-16 09:50:20 -08:00
parent 3f8eccdaec
commit 98fe8fae4a
7 changed files with 92 additions and 59 deletions

View file

@ -11,8 +11,8 @@ return array(
'conpherence.pkg.js' => '020aebcf', 'conpherence.pkg.js' => '020aebcf',
'core.pkg.css' => '261ee8cf', 'core.pkg.css' => '261ee8cf',
'core.pkg.js' => '5ace8a1e', 'core.pkg.js' => '5ace8a1e',
'differential.pkg.css' => 'c3f15714', 'differential.pkg.css' => '801c5653',
'differential.pkg.js' => 'be031567', 'differential.pkg.js' => '1f211736',
'diffusion.pkg.css' => '42c75c37', 'diffusion.pkg.css' => '42c75c37',
'diffusion.pkg.js' => '91192d85', 'diffusion.pkg.js' => '91192d85',
'maniphest.pkg.css' => '35995d6d', 'maniphest.pkg.css' => '35995d6d',
@ -61,7 +61,7 @@ return array(
'rsrc/css/application/dashboard/dashboard.css' => '4267d6c6', 'rsrc/css/application/dashboard/dashboard.css' => '4267d6c6',
'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d', 'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d',
'rsrc/css/application/differential/add-comment.css' => '7e5900d9', 'rsrc/css/application/differential/add-comment.css' => '7e5900d9',
'rsrc/css/application/differential/changeset-view.css' => '783a9206', 'rsrc/css/application/differential/changeset-view.css' => '8a997ed9',
'rsrc/css/application/differential/core.css' => 'bdb93065', 'rsrc/css/application/differential/core.css' => 'bdb93065',
'rsrc/css/application/differential/phui-inline-comment.css' => '48acce5b', 'rsrc/css/application/differential/phui-inline-comment.css' => '48acce5b',
'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d', 'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d',
@ -375,7 +375,7 @@ return array(
'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '1e413dc9', 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '1e413dc9',
'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => '9b1cbd76', 'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => '9b1cbd76',
'rsrc/js/application/diff/DiffChangeset.js' => 'd0a85a85', 'rsrc/js/application/diff/DiffChangeset.js' => 'd0a85a85',
'rsrc/js/application/diff/DiffChangesetList.js' => 'b91204e9', 'rsrc/js/application/diff/DiffChangesetList.js' => '26fb79ba',
'rsrc/js/application/diff/DiffInline.js' => 'a4a14a94', 'rsrc/js/application/diff/DiffInline.js' => 'a4a14a94',
'rsrc/js/application/diff/behavior-preview-link.js' => 'f51e9c17', 'rsrc/js/application/diff/behavior-preview-link.js' => 'f51e9c17',
'rsrc/js/application/differential/behavior-diff-radios.js' => '925fe8cd', 'rsrc/js/application/differential/behavior-diff-radios.js' => '925fe8cd',
@ -541,7 +541,7 @@ return array(
'conpherence-thread-manager' => 'aec8e38c', 'conpherence-thread-manager' => 'aec8e38c',
'conpherence-transaction-css' => '3a3f5e7e', 'conpherence-transaction-css' => '3a3f5e7e',
'd3' => 'd67475f5', 'd3' => 'd67475f5',
'differential-changeset-view-css' => '783a9206', 'differential-changeset-view-css' => '8a997ed9',
'differential-core-view-css' => 'bdb93065', 'differential-core-view-css' => 'bdb93065',
'differential-revision-add-comment-css' => '7e5900d9', 'differential-revision-add-comment-css' => '7e5900d9',
'differential-revision-comment-css' => '7dbc8d1d', 'differential-revision-comment-css' => '7dbc8d1d',
@ -754,7 +754,7 @@ return array(
'phabricator-darkmessage' => '26cd4b73', 'phabricator-darkmessage' => '26cd4b73',
'phabricator-dashboard-css' => '4267d6c6', 'phabricator-dashboard-css' => '4267d6c6',
'phabricator-diff-changeset' => 'd0a85a85', 'phabricator-diff-changeset' => 'd0a85a85',
'phabricator-diff-changeset-list' => 'b91204e9', 'phabricator-diff-changeset-list' => '26fb79ba',
'phabricator-diff-inline' => 'a4a14a94', 'phabricator-diff-inline' => 'a4a14a94',
'phabricator-drag-and-drop-file-upload' => '4370900d', 'phabricator-drag-and-drop-file-upload' => '4370900d',
'phabricator-draggable-list' => '3c6bd549', 'phabricator-draggable-list' => '3c6bd549',
@ -1087,6 +1087,10 @@ return array(
'javelin-json', 'javelin-json',
'phabricator-draggable-list', 'phabricator-draggable-list',
), ),
'26fb79ba' => array(
'javelin-install',
'phuix-button-view',
),
'27daef73' => array( '27daef73' => array(
'multirow-row-manager', 'multirow-row-manager',
'javelin-install', 'javelin-install',
@ -1513,9 +1517,6 @@ return array(
'javelin-uri', 'javelin-uri',
'javelin-request', 'javelin-request',
), ),
'783a9206' => array(
'phui-inline-comment-view-css',
),
'78bc5d94' => array( '78bc5d94' => array(
'javelin-behavior', 'javelin-behavior',
'javelin-uri', 'javelin-uri',
@ -1586,6 +1587,9 @@ return array(
'8a16f91b' => array( '8a16f91b' => array(
'syntax-default-css', 'syntax-default-css',
), ),
'8a997ed9' => array(
'phui-inline-comment-view-css',
),
'8ac32fd9' => array( '8ac32fd9' => array(
'javelin-behavior', 'javelin-behavior',
'javelin-stratcom', 'javelin-stratcom',
@ -1895,10 +1899,6 @@ return array(
'javelin-uri', 'javelin-uri',
'phabricator-notification', 'phabricator-notification',
), ),
'b91204e9' => array(
'javelin-install',
'phuix-button-view',
),
'bd546a49' => array( 'bd546a49' => array(
'phui-workcard-view-css', 'phui-workcard-view-css',
), ),

View file

@ -92,19 +92,23 @@ final class DifferentialChangesetOneUpRenderer
$line = $p['line']; $line = $p['line'];
$cells[] = phutil_tag( $cells[] = phutil_tag(
'th', 'td',
array( array(
'id' => $left_id, 'id' => $left_id,
'class' => $class, 'class' => $class.' n',
), 'data-n' => $line,
$line); ));
$render = $p['render']; $render = $p['render'];
if ($aural !== null) { if ($aural !== null) {
$render = array($aural, $render); $render = array($aural, $render);
} }
$cells[] = phutil_tag('th', array('class' => $class)); $cells[] = phutil_tag(
'td',
array(
'class' => $class.' n',
));
$cells[] = $no_copy; $cells[] = $no_copy;
$cells[] = phutil_tag('td', array('class' => $class), $render); $cells[] = phutil_tag('td', array('class' => $class), $render);
$cells[] = $no_coverage; $cells[] = $no_coverage;
@ -115,7 +119,11 @@ final class DifferentialChangesetOneUpRenderer
} else { } else {
$class = 'right new'; $class = 'right new';
} }
$cells[] = phutil_tag('th', array('class' => $class)); $cells[] = phutil_tag(
'td',
array(
'class' => $class.' n',
));
$aural = $aural_plus; $aural = $aural_plus;
} else { } else {
$class = 'right'; $class = 'right';
@ -127,7 +135,13 @@ final class DifferentialChangesetOneUpRenderer
$oline = $p['oline']; $oline = $p['oline'];
$cells[] = phutil_tag('th', array('id' => $left_id), $oline); $cells[] = phutil_tag(
'td',
array(
'id' => $left_id,
'class' => 'n',
'data-n' => $oline,
));
$aural = null; $aural = null;
} }
@ -144,12 +158,12 @@ final class DifferentialChangesetOneUpRenderer
$line = $p['line']; $line = $p['line'];
$cells[] = phutil_tag( $cells[] = phutil_tag(
'th', 'td',
array( array(
'id' => $right_id, 'id' => $right_id,
'class' => $class, 'class' => $class.' n',
), 'data-n' => $line,
$line); ));
$render = $p['render']; $render = $p['render'];
if ($aural !== null) { if ($aural !== null) {

View file

@ -306,10 +306,26 @@ final class DifferentialChangesetTwoUpRenderer
// clipboard. See the 'phabricator-oncopy' behavior. // clipboard. See the 'phabricator-oncopy' behavior.
$zero_space = "\xE2\x80\x8B"; $zero_space = "\xE2\x80\x8B";
$old_number = phutil_tag(
'td',
array(
'id' => $o_id,
'class' => $o_classes.' n',
'data-n' => $o_num,
));
$new_number = phutil_tag(
'td',
array(
'id' => $n_id,
'class' => $n_classes.' n',
'data-n' => $n_num,
));
$html[] = phutil_tag('tr', array(), array( $html[] = phutil_tag('tr', array(), array(
phutil_tag('th', array('id' => $o_id, 'class' => $o_classes), $o_num), $old_number,
phutil_tag('td', array('class' => $o_classes), $o_text), phutil_tag('td', array('class' => $o_classes), $o_text),
phutil_tag('th', array('id' => $n_id, 'class' => $n_classes), $n_num), $new_number,
$n_copy, $n_copy,
phutil_tag( phutil_tag(
'td', 'td',

View file

@ -31,8 +31,8 @@ final class PHUIDiffOneUpInlineCommentRowScaffold
} }
$cells = array( $cells = array(
phutil_tag('th', array(), $left_hidden), phutil_tag('td', array('class' => 'n'), $left_hidden),
phutil_tag('th', array(), $right_hidden), phutil_tag('td', array('class' => 'n'), $right_hidden),
phutil_tag('td', $attrs, $inline), phutil_tag('td', $attrs, $inline),
); );

View file

@ -71,9 +71,9 @@ final class PHUIDiffTwoUpInlineCommentRowScaffold
); );
$cells = array( $cells = array(
phutil_tag('th', array(), $left_hidden), phutil_tag('td', array('class' => 'n'), $left_hidden),
phutil_tag('td', $left_attrs, $left_side), phutil_tag('td', $left_attrs, $left_side),
phutil_tag('th', array(), $right_hidden), phutil_tag('td', array('class' => 'n'), $right_hidden),
phutil_tag('td', $right_attrs, $right_side), phutil_tag('td', $right_attrs, $right_side),
); );

View file

@ -72,23 +72,6 @@
width: 0; width: 0;
} }
.differential-diff th {
text-align: right;
padding: 1px 6px 1px 0;
vertical-align: top;
background: {$lightbluebackground};
color: {$bluetext};
cursor: pointer;
border-right: 1px solid {$thinblueborder};
overflow: hidden;
-moz-user-select: -moz-none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.prose-diff { .prose-diff {
padding: 12px 0; padding: 12px 0;
white-space: pre-wrap; white-space: pre-wrap;
@ -182,6 +165,34 @@
background: #dddddd; background: #dddddd;
} }
.differential-diff .inline > td {
padding: 0;
}
/* Specify line number behaviors after other behaviors because line numbers
should always have a boring grey background. */
.differential-diff td.n {
text-align: right;
padding: 1px 6px 1px 0;
vertical-align: top;
background: {$lightbluebackground};
color: {$bluetext};
cursor: pointer;
border-right: 1px solid {$thinblueborder};
overflow: hidden;
-moz-user-select: -moz-none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.differential-diff td.n::before {
content: attr(data-n);
}
.differential-diff td.cov { .differential-diff td.cov {
padding: 0; padding: 0;
} }
@ -316,10 +327,6 @@ td.cov-I {
pointer-events: none; pointer-events: none;
} }
.differential-diff .inline > td {
padding: 0;
}
.differential-loading { .differential-loading {
border-top: 1px solid {$gentle.highlight.border}; border-top: 1px solid {$gentle.highlight.border};
border-bottom: 1px solid {$gentle.highlight.border}; border-bottom: 1px solid {$gentle.highlight.border};

View file

@ -70,13 +70,13 @@ JX.install('DiffChangesetList', {
var onrangedown = JX.bind(this, this._ifawake, this._onrangedown); var onrangedown = JX.bind(this, this._ifawake, this._onrangedown);
JX.Stratcom.listen( JX.Stratcom.listen(
'mousedown', 'mousedown',
['differential-changeset', 'tag:th'], ['differential-changeset', 'tag:td'],
onrangedown); onrangedown);
var onrangemove = JX.bind(this, this._ifawake, this._onrangemove); var onrangemove = JX.bind(this, this._ifawake, this._onrangemove);
JX.Stratcom.listen( JX.Stratcom.listen(
['mouseover', 'mouseout'], ['mouseover', 'mouseout'],
['differential-changeset', 'tag:th'], ['differential-changeset', 'tag:td'],
onrangemove); onrangemove);
var onrangeup = JX.bind(this, this._ifawake, this._onrangeup); var onrangeup = JX.bind(this, this._ifawake, this._onrangeup);
@ -360,7 +360,7 @@ JX.install('DiffChangesetList', {
while (row) { while (row) {
var header = row.firstChild; var header = row.firstChild;
while (header) { while (header) {
if (JX.DOM.isType(header, 'th')) { if (this.getLineNumberFromHeader(header)) {
if (header.className.indexOf('old') !== -1) { if (header.className.indexOf('old') !== -1) {
old_list.push(header); old_list.push(header);
} else if (header.className.indexOf('new') !== -1) { } else if (header.className.indexOf('new') !== -1) {
@ -1247,11 +1247,7 @@ JX.install('DiffChangesetList', {
}, },
getLineNumberFromHeader: function(th) { getLineNumberFromHeader: function(th) {
try { return parseInt(th.getAttribute('data-n'));
return parseInt(th.id.match(/^C\d+[ON]L(\d+)$/)[1], 10);
} catch (x) {
return null;
}
}, },
getDisplaySideFromHeader: function(th) { getDisplaySideFromHeader: function(th) {