Issue #3122056 by Wim Leers, mohit_aghera, Kristen Pol: Do not track viewing history for unsaved entities, nor when previewing existing entities
parent
23dcd9dc41
commit
23d59bba60
|
@ -135,6 +135,9 @@ function history_cron() {
|
||||||
* Implements hook_ENTITY_TYPE_view_alter() for node entities.
|
* Implements hook_ENTITY_TYPE_view_alter() for node entities.
|
||||||
*/
|
*/
|
||||||
function history_node_view_alter(array &$build, EntityInterface $node, EntityViewDisplayInterface $display) {
|
function history_node_view_alter(array &$build, EntityInterface $node, EntityViewDisplayInterface $display) {
|
||||||
|
if ($node->isNew() || isset($node->in_preview)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Update the history table, stating that this user viewed this node.
|
// Update the history table, stating that this user viewed this node.
|
||||||
if ($display->getOriginalMode() === 'full') {
|
if ($display->getOriginalMode() === 'full') {
|
||||||
$build['#cache']['contexts'][] = 'user.roles:authenticated';
|
$build['#cache']['contexts'][] = 'user.roles:authenticated';
|
||||||
|
|
|
@ -49,6 +49,7 @@ class HistoryTest extends BrowserTestBase {
|
||||||
|
|
||||||
$this->user = $this->drupalCreateUser([
|
$this->user = $this->drupalCreateUser([
|
||||||
'create page content',
|
'create page content',
|
||||||
|
'edit own page content',
|
||||||
'access content',
|
'access content',
|
||||||
]);
|
]);
|
||||||
$this->drupalLogin($this->user);
|
$this->drupalLogin($this->user);
|
||||||
|
@ -103,6 +104,11 @@ class HistoryTest extends BrowserTestBase {
|
||||||
public function testHistory() {
|
public function testHistory() {
|
||||||
$nid = $this->testNode->id();
|
$nid = $this->testNode->id();
|
||||||
|
|
||||||
|
// Verify that previews of new entities do not create the history.
|
||||||
|
$this->drupalGet("node/add/page");
|
||||||
|
$this->submitForm(['title[0][value]' => 'Unsaved page'], 'Preview');
|
||||||
|
$this->assertArrayNotHasKey('ajaxPageState', $this->getDrupalSettings());
|
||||||
|
|
||||||
// Retrieve "last read" timestamp for test node, for the current user.
|
// Retrieve "last read" timestamp for test node, for the current user.
|
||||||
$response = $this->getNodeReadTimestamps([$nid]);
|
$response = $this->getNodeReadTimestamps([$nid]);
|
||||||
$this->assertEquals(200, $response->getStatusCode());
|
$this->assertEquals(200, $response->getStatusCode());
|
||||||
|
@ -134,6 +140,11 @@ class HistoryTest extends BrowserTestBase {
|
||||||
$response = $this->getNodeReadTimestamps([]);
|
$response = $this->getNodeReadTimestamps([]);
|
||||||
$this->assertEquals(404, $response->getStatusCode());
|
$this->assertEquals(404, $response->getStatusCode());
|
||||||
|
|
||||||
|
// Verify that previews of existing entities do not update the history.
|
||||||
|
$this->drupalGet("node/$nid/edit");
|
||||||
|
$this->submitForm([], 'Preview');
|
||||||
|
$this->assertArrayNotHasKey('ajaxPageState', $this->getDrupalSettings());
|
||||||
|
|
||||||
// Accessing either endpoint as the anonymous user should return a 403.
|
// Accessing either endpoint as the anonymous user should return a 403.
|
||||||
$this->drupalLogout();
|
$this->drupalLogout();
|
||||||
$response = $this->getNodeReadTimestamps([$nid]);
|
$response = $this->getNodeReadTimestamps([$nid]);
|
||||||
|
@ -142,6 +153,13 @@ class HistoryTest extends BrowserTestBase {
|
||||||
$this->assertEquals(403, $response->getStatusCode());
|
$this->assertEquals(403, $response->getStatusCode());
|
||||||
$response = $this->markNodeAsRead($nid);
|
$response = $this->markNodeAsRead($nid);
|
||||||
$this->assertEquals(403, $response->getStatusCode());
|
$this->assertEquals(403, $response->getStatusCode());
|
||||||
|
|
||||||
|
// Additional check to ensure that we did not forget to verify anything.
|
||||||
|
$rows = \Drupal::database()->query('SELECT * FROM {history}')->fetchAll();
|
||||||
|
$this->assertCount(1, $rows);
|
||||||
|
$this->assertSame($this->user->id(), $rows[0]->uid);
|
||||||
|
$this->assertSame($this->testNode->id(), $rows[0]->nid);
|
||||||
|
$this->assertSame($timestamp, (int) $rows[0]->timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue