diff -u b/core/modules/media/src/Access/MediaRevisionAccessCheck.php b/core/modules/media/src/Access/MediaRevisionAccessCheck.php --- b/core/modules/media/src/Access/MediaRevisionAccessCheck.php +++ b/core/modules/media/src/Access/MediaRevisionAccessCheck.php @@ -19,7 +19,7 @@ /** * The media storage. * - * @var \Drupal\media\MediaStorageInterface + * @var \Drupal\Core\Entity\ContentEntityStorageInterface */ protected $mediaStorage; diff -u b/core/modules/media/src/Entity/Media.php b/core/modules/media/src/Entity/Media.php --- b/core/modules/media/src/Entity/Media.php +++ b/core/modules/media/src/Entity/Media.php @@ -29,7 +29,7 @@ * ), * bundle_label = @Translation("Media type"), * handlers = { - * "storage" = "Drupal\media\MediaStorage", + * "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage", * "view_builder" = "Drupal\Core\Entity\EntityViewBuilder", * "list_builder" = "Drupal\Core\Entity\EntityListBuilder", * "access" = "Drupal\media\MediaAccessControlHandler", reverted: --- b/core/modules/media/src/MediaStorage.php +++ /dev/null @@ -1,22 +0,0 @@ -database->query('SELECT COUNT(*) FROM {media_field_revision} WHERE mid = :mid AND default_langcode = 1', [':mid' => $media->id()])->fetchField(); - } - -} reverted: --- b/core/modules/media/src/MediaStorageInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -assertSession(); + + /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */ + $media_storage = $this->container->get('entity.manager')->getStorage('media'); + + // Create a media type and media item. + $media_type = $this->createMediaType(); + $media = $media_storage->create([ + 'bundle' => $media_type->id(), + 'name' => 'Unnamed', + ]); + $media->save(); + + // You can't access the revision page when there is only 1 revision. + $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); + $assert->statusCodeEquals(403); + + // Create some revisions. + $media_revisions = []; + $media_revisions[] = clone $media; + $revision_count = 3; + for ($i = 0; $i < $revision_count; $i++) { + $media->revision_log = $this->randomMachineName(32); + $media = $this->createMediaRevision($media); + $media_revisions[] = clone $media; + } + + // Get the last revision for simple checks. + /** @var \Drupal\media\MediaInterface $media */ + $media = end($media_revisions); + + // Test permissions. + $this->drupalLogin($this->nonAdminUser); + /** @var \Drupal\user\RoleInterface $role */ + $role = Role::load(RoleInterface::AUTHENTICATED_ID); + + // Test 'view all media revisions' permission ('view media' permission is + // needed as well). + user_role_revoke_permissions($role->id(), ['view media', 'view all media revisions']); + $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); + $assert->statusCodeEquals(403); + $this->grantPermissions($role, ['view media', 'view all media revisions']); + $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); + $assert->statusCodeEquals(200); + + // Confirm the revision page shows the correct title. + $assert->pageTextContains($media->label()); + + // Confirm that the last revision is the default revision. + $this->assertTrue($media->isDefaultRevision(), 'Last revision is the default.'); + } + + /** * Tests creating revisions of a File media item. */ public function testFileMediaRevision() { @@ -26,6 +85,7 @@ $page = $this->getSession()->getPage(); $page->fillField('Name', 'Foobar'); $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri)); + $this->getSession()->wait(10000); $page->pressButton('Save and publish'); $assert->addressMatches('/^\/media\/[0-9]+$/'); @@ -73,6 +133,7 @@ $page = $this->getSession()->getPage(); $page->fillField('Name', 'Foobar'); $page->attachFileToField('Image', \Drupal::root() . '/core/modules/media/tests/fixtures/example_1.jpeg'); + $this->getSession()->wait(10000); $page->pressButton('Save and publish'); $assert->addressMatches('/^\/media\/[0-9]+$/'); @@ -99,4 +160,20 @@ $assert->pageTextContains('Foobaz'); } + + /** + * Creates a new revision for a given media item. + * + * @param \Drupal\media\MediaInterface $media + * A media object. + * + * @return \Drupal\media\MediaInterface + * A media object with up to date revision information. + */ + protected function createMediaRevision(MediaInterface $media) { + $media->set('name', $this->randomMachineName()); + $media->setNewRevision(); + $media->save(); + return $media; + } /** only in patch2: unchanged: --- a/core/lib/Drupal/Core/Entity/ContentEntityStorageInterface.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageInterface.php @@ -23,4 +23,15 @@ */ public function createTranslation(ContentEntityInterface $entity, $langcode, array $values = []); + /** + * Counts the number of revisions in the default language. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity for which to to count the revisions. + * + * @return int + * The number of revisions in the default language. + */ + public function countDefaultLanguageRevisions(EntityInterface $entity); + } only in patch2: unchanged: --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -809,6 +809,17 @@ public function save(EntityInterface $entity) { /** * {@inheritdoc} */ + public function countDefaultLanguageRevisions(EntityInterface $entity) { + $query = $this->database->select($this->revisionDataTable); + $query->addExpression('COUNT(*)'); + $query->condition($this->idKey, $entity->id()); + $query->condition('default_langcode', 1); + return $query->execute()->fetchField(); + } + + /** + * {@inheritdoc} + */ protected function doSaveFieldItems(ContentEntityInterface $entity, array $names = []) { $full_save = empty($names); $update = !$full_save || !$entity->isNew(); only in patch2: unchanged: --- a/core/modules/node/src/NodeStorage.php +++ b/core/modules/node/src/NodeStorage.php @@ -2,6 +2,7 @@ namespace Drupal\node; +use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\Sql\SqlContentEntityStorage; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Language\LanguageInterface; @@ -37,8 +38,8 @@ public function userRevisionIds(AccountInterface $account) { /** * {@inheritdoc} */ - public function countDefaultLanguageRevisions(NodeInterface $node) { - return $this->database->query('SELECT COUNT(*) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', [':nid' => $node->id()])->fetchField(); + public function countDefaultLanguageRevisions(EntityInterface $entity) { + return $this->database->query('SELECT COUNT(*) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', [':nid' => $entity->id()])->fetchField(); } /** only in patch2: unchanged: --- a/core/modules/node/src/NodeStorageInterface.php +++ b/core/modules/node/src/NodeStorageInterface.php @@ -34,17 +34,6 @@ public function revisionIds(NodeInterface $node); public function userRevisionIds(AccountInterface $account); /** - * Counts the number of revisions in the default language. - * - * @param \Drupal\node\NodeInterface $node - * The node entity. - * - * @return int - * The number of revisions in the default language. - */ - public function countDefaultLanguageRevisions(NodeInterface $node); - - /** * Updates all nodes of one type to be of another type. * * @param string $old_type