cms/drupal/modules/translation/translation.test
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * @file
       
     5  * Tests for the Translation module.
       
     6  */
       
     7 
       
     8 /**
       
     9  * Functional tests for the Translation module.
       
    10  */
       
    11 class TranslationTestCase extends DrupalWebTestCase {
       
    12   protected $book;
       
    13 
       
    14   public static function getInfo() {
       
    15     return array(
       
    16       'name' => 'Translation functionality',
       
    17       'description' => 'Create a basic page with translation, modify the page outdating translation, and update translation.',
       
    18       'group' => 'Translation'
       
    19     );
       
    20   }
       
    21 
       
    22   function setUp() {
       
    23     parent::setUp('locale', 'translation', 'translation_test');
       
    24 
       
    25     // Setup users.
       
    26     $this->admin_user = $this->drupalCreateUser(array('bypass node access', 'administer nodes', 'administer languages', 'administer content types', 'administer blocks', 'access administration pages', 'translate content'));
       
    27     $this->translator = $this->drupalCreateUser(array('create page content', 'edit own page content', 'translate content'));
       
    28 
       
    29     $this->drupalLogin($this->admin_user);
       
    30 
       
    31     // Add languages.
       
    32     $this->addLanguage('en');
       
    33     $this->addLanguage('es');
       
    34     $this->addLanguage('it');
       
    35 
       
    36     // Disable Italian to test the translation behavior with disabled languages.
       
    37     $edit = array('enabled[it]' => FALSE);
       
    38     $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
       
    39 
       
    40     // Set "Basic page" content type to use multilingual support with
       
    41     // translation.
       
    42     $this->drupalGet('admin/structure/types/manage/page');
       
    43     $edit = array();
       
    44     $edit['language_content_type'] = 2;
       
    45     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
       
    46     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
       
    47 
       
    48     // Enable the language switcher block.
       
    49     $language_type = LANGUAGE_TYPE_INTERFACE;
       
    50     $edit = array("blocks[locale_$language_type][region]" => 'sidebar_first');
       
    51     $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
       
    52 
       
    53     // Enable URL language detection and selection to make the language switcher
       
    54     // block appear.
       
    55     $edit = array('language[enabled][locale-url]' => TRUE);
       
    56     $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
       
    57     $this->assertRaw(t('Language negotiation configuration saved.'), 'URL language detection enabled.');
       
    58     $this->resetCaches();
       
    59 
       
    60     $this->drupalLogin($this->translator);
       
    61   }
       
    62 
       
    63   /**
       
    64    * Creates, modifies, and updates a basic page with a translation.
       
    65    */
       
    66   function testContentTranslation() {
       
    67     // Create Basic page in English.
       
    68     $node_title = $this->randomName();
       
    69     $node_body =  $this->randomName();
       
    70     $node = $this->createPage($node_title, $node_body, 'en');
       
    71 
       
    72     // Unpublish the original node to check that this has no impact on the
       
    73     // translation overview page, publish it again afterwards.
       
    74     $this->drupalLogin($this->admin_user);
       
    75     $this->drupalPost('node/' . $node->nid . '/edit', array('status' => FALSE), t('Save'));
       
    76     $this->drupalGet('node/' . $node->nid . '/translate');
       
    77     $this->drupalPost('node/' . $node->nid . '/edit', array('status' => NODE_PUBLISHED), t('Save'));
       
    78     $this->drupalLogin($this->translator);
       
    79 
       
    80     // Check that the "add translation" link uses a localized path.
       
    81     $languages = language_list();
       
    82     $this->drupalGet('node/' . $node->nid . '/translate');
       
    83     $this->assertLinkByHref($languages['es']->prefix . '/node/add/' . str_replace('_', '-', $node->type), 0, format_string('The "add translation" link for %language points to the localized path of the target language.', array('%language' => $languages['es']->name)));
       
    84 
       
    85     // Submit translation in Spanish.
       
    86     $node_translation_title = $this->randomName();
       
    87     $node_translation_body = $this->randomName();
       
    88     $node_translation = $this->createTranslation($node, $node_translation_title, $node_translation_body, 'es');
       
    89 
       
    90     // Check that the "edit translation" and "view node" links use localized
       
    91     // paths.
       
    92     $this->drupalGet('node/' . $node->nid . '/translate');
       
    93     $this->assertLinkByHref($languages['es']->prefix . '/node/' . $node_translation->nid . '/edit', 0, format_string('The "edit" link for the translation in %language points to the localized path of the translation language.', array('%language' => $languages['es']->name)));
       
    94     $this->assertLinkByHref($languages['es']->prefix . '/node/' . $node_translation->nid, 0, format_string('The "view" link for the translation in %language points to the localized path of the translation language.', array('%language' => $languages['es']->name)));
       
    95 
       
    96     // Attempt to submit a duplicate translation by visiting the node/add page
       
    97     // with identical query string.
       
    98     $this->drupalGet('node/add/page', array('query' => array('translation' => $node->nid, 'target' => 'es')));
       
    99     $this->assertRaw(t('A translation of %title in %language already exists', array('%title' => $node_title, '%language' => $languages['es']->name)), 'Message regarding attempted duplicate translation is displayed.');
       
   100 
       
   101     // Attempt a resubmission of the form - this emulates using the back button
       
   102     // to return to the page then resubmitting the form without a refresh.
       
   103     $edit = array();
       
   104     $langcode = LANGUAGE_NONE;
       
   105     $edit["title"] = $this->randomName();
       
   106     $edit["body[$langcode][0][value]"] = $this->randomName();
       
   107     $this->drupalPost('node/add/page', $edit, t('Save'), array('query' => array('translation' => $node->nid, 'language' => 'es')));
       
   108     $duplicate = $this->drupalGetNodeByTitle($edit["title"]);
       
   109     $this->assertEqual($duplicate->tnid, 0, 'The node does not have a tnid.');
       
   110 
       
   111     // Update original and mark translation as outdated.
       
   112     $node_body = $this->randomName();
       
   113     $node->body[LANGUAGE_NONE][0]['value'] = $node_body;
       
   114     $edit = array();
       
   115     $edit["body[$langcode][0][value]"] = $node_body;
       
   116     $edit['translation[retranslate]'] = TRUE;
       
   117     $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
       
   118     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_title)), 'Original node updated.');
       
   119 
       
   120     // Check to make sure that interface shows translation as outdated.
       
   121     $this->drupalGet('node/' . $node->nid . '/translate');
       
   122     $this->assertRaw('<span class="marker">' . t('outdated') . '</span>', 'Translation marked as outdated.');
       
   123 
       
   124     // Update translation and mark as updated.
       
   125     $edit = array();
       
   126     $edit["body[$langcode][0][value]"] = $this->randomName();
       
   127     $edit['translation[status]'] = FALSE;
       
   128     $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Save'));
       
   129     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_translation_title)), 'Translated node updated.');
       
   130 
       
   131     // Confirm that disabled languages are an option for translators when
       
   132     // creating nodes.
       
   133     $this->drupalGet('node/add/page');
       
   134     $this->assertFieldByXPath('//select[@name="language"]//option', 'it', 'Italian (disabled) is available in language selection.');
       
   135     $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
       
   136     $this->assertRaw($translation_it->body[LANGUAGE_NONE][0]['value'], 'Content created in Italian (disabled).');
       
   137 
       
   138     // Confirm that language neutral is an option for translators when there are
       
   139     // disabled languages.
       
   140     $this->drupalGet('node/add/page');
       
   141     $this->assertFieldByXPath('//select[@name="language"]//option', LANGUAGE_NONE, 'Language neutral is available in language selection with disabled languages.');
       
   142     $node2 = $this->createPage($this->randomName(), $this->randomName(), LANGUAGE_NONE);
       
   143     $this->assertRaw($node2->body[LANGUAGE_NONE][0]['value'], 'Language neutral content created with disabled languages available.');
       
   144 
       
   145     // Leave just one language enabled and check that the translation overview
       
   146     // page is still accessible.
       
   147     $this->drupalLogin($this->admin_user);
       
   148     $edit = array('enabled[es]' => FALSE);
       
   149     $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
       
   150     $this->drupalLogin($this->translator);
       
   151     $this->drupalGet('node/' . $node->nid . '/translate');
       
   152     $this->assertRaw(t('Translations of %title', array('%title' => $node->title)), 'Translation overview page available with only one language enabled.');
       
   153   }
       
   154 
       
   155   /**
       
   156    * Checks that the language switch links behave properly.
       
   157    */
       
   158   function testLanguageSwitchLinks() {
       
   159     // Create a Basic page in English and its translations in Spanish and
       
   160     // Italian.
       
   161     $node = $this->createPage($this->randomName(), $this->randomName(), 'en');
       
   162     $translation_es = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'es');
       
   163     $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
       
   164 
       
   165     // Check that language switch links are correctly shown only for enabled
       
   166     // languages.
       
   167     $this->assertLanguageSwitchLinks($node, $translation_es);
       
   168     $this->assertLanguageSwitchLinks($translation_es, $node);
       
   169     $this->assertLanguageSwitchLinks($node, $translation_it, FALSE);
       
   170 
       
   171     // Check that links to the displayed translation appear only in the language
       
   172     // switcher block.
       
   173     $this->assertLanguageSwitchLinks($node, $node, FALSE, 'node');
       
   174     $this->assertLanguageSwitchLinks($node, $node, TRUE, 'block-locale');
       
   175 
       
   176     // Unpublish the Spanish translation to check that the related language
       
   177     // switch link is not shown.
       
   178     $this->drupalLogin($this->admin_user);
       
   179     $edit = array('status' => FALSE);
       
   180     $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
       
   181     $this->drupalLogin($this->translator);
       
   182     $this->assertLanguageSwitchLinks($node, $translation_es, FALSE);
       
   183 
       
   184     // Check that content translation links are shown even when no language
       
   185     // negotiation is configured.
       
   186     $this->drupalLogin($this->admin_user);
       
   187     $edit = array('language[enabled][locale-url]' => FALSE);
       
   188     $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
       
   189     $this->resetCaches();
       
   190     $edit = array('status' => TRUE);
       
   191     $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
       
   192     $this->drupalLogin($this->translator);
       
   193     $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, 'node');
       
   194   }
       
   195 
       
   196   /**
       
   197    * Tests that the language switcher block alterations work as intended.
       
   198    */
       
   199   function testLanguageSwitcherBlockIntegration() {
       
   200     // Enable Italian to have three items in the language switcher block.
       
   201     $this->drupalLogin($this->admin_user);
       
   202     $edit = array('enabled[it]' => TRUE);
       
   203     $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
       
   204     $this->drupalLogin($this->translator);
       
   205 
       
   206     // Create a Basic page in English.
       
   207     $type = 'block-locale';
       
   208     $node = $this->createPage($this->randomName(), $this->randomName(), 'en');
       
   209     $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
       
   210     $this->assertLanguageSwitchLinks($node, $this->emptyNode('es'), TRUE, $type);
       
   211     $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
       
   212 
       
   213     // Create the Spanish translation.
       
   214     $translation_es = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'es');
       
   215     $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
       
   216     $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
       
   217     $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
       
   218 
       
   219     // Create the Italian translation.
       
   220     $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
       
   221     $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
       
   222     $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
       
   223     $this->assertLanguageSwitchLinks($node, $translation_it, TRUE, $type);
       
   224 
       
   225     // Create a language neutral node and check that the language switcher is
       
   226     // left untouched.
       
   227     $node2 = $this->createPage($this->randomName(), $this->randomName(), LANGUAGE_NONE);
       
   228     $node2_en = (object) array('nid' => $node2->nid, 'language' => 'en');
       
   229     $node2_es = (object) array('nid' => $node2->nid, 'language' => 'es');
       
   230     $node2_it = (object) array('nid' => $node2->nid, 'language' => 'it');
       
   231     $this->assertLanguageSwitchLinks($node2_en, $node2_en, TRUE, $type);
       
   232     $this->assertLanguageSwitchLinks($node2_en, $node2_es, TRUE, $type);
       
   233     $this->assertLanguageSwitchLinks($node2_en, $node2_it, TRUE, $type);
       
   234 
       
   235     // Disable translation support to check that the language switcher is left
       
   236     // untouched only for new nodes.
       
   237     $this->drupalLogin($this->admin_user);
       
   238     $edit = array('language_content_type' => 0);
       
   239     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
       
   240     $this->drupalLogin($this->translator);
       
   241 
       
   242     // Existing translations trigger alterations even if translation support is
       
   243     // disabled.
       
   244     $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
       
   245     $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
       
   246     $this->assertLanguageSwitchLinks($node, $translation_it, TRUE, $type);
       
   247 
       
   248     // Check that new nodes with a language assigned do not trigger language
       
   249     // switcher alterations when translation support is disabled.
       
   250     $node = $this->createPage($this->randomName(), $this->randomName());
       
   251     $node_es = (object) array('nid' => $node->nid, 'language' => 'es');
       
   252     $node_it = (object) array('nid' => $node->nid, 'language' => 'it');
       
   253     $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
       
   254     $this->assertLanguageSwitchLinks($node, $node_es, TRUE, $type);
       
   255     $this->assertLanguageSwitchLinks($node, $node_it, TRUE, $type);
       
   256   }
       
   257 
       
   258   /**
       
   259    * Resets static caches to make the test code match the client-side behavior.
       
   260    */
       
   261   function resetCaches() {
       
   262     drupal_static_reset('locale_url_outbound_alter');
       
   263   }
       
   264 
       
   265   /**
       
   266    * Returns an empty node data structure.
       
   267    *
       
   268    * @param $langcode
       
   269    *   The language code.
       
   270    *
       
   271    * @return
       
   272    *   An empty node data structure.
       
   273    */
       
   274   function emptyNode($langcode) {
       
   275     return (object) array('nid' => NULL, 'language' => $langcode);
       
   276   }
       
   277 
       
   278   /**
       
   279    * Installs the specified language, or enables it if it is already installed.
       
   280    *
       
   281    * @param $language_code
       
   282    *   The language code to check.
       
   283    */
       
   284   function addLanguage($language_code) {
       
   285     // Check to make sure that language has not already been installed.
       
   286     $this->drupalGet('admin/config/regional/language');
       
   287 
       
   288     if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
       
   289       // Doesn't have language installed so add it.
       
   290       $edit = array();
       
   291       $edit['langcode'] = $language_code;
       
   292       $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
       
   293 
       
   294       // Make sure we are not using a stale list.
       
   295       drupal_static_reset('language_list');
       
   296       $languages = language_list('language');
       
   297       $this->assertTrue(array_key_exists($language_code, $languages), 'Language was installed successfully.');
       
   298 
       
   299       if (array_key_exists($language_code, $languages)) {
       
   300         $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), 'Language has been created.');
       
   301       }
       
   302     }
       
   303     elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
       
   304       // It's installed and enabled. No need to do anything.
       
   305       $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
       
   306     }
       
   307     else {
       
   308       // It's installed but not enabled. Enable it.
       
   309       $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
       
   310       $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
       
   311       $this->assertRaw(t('Configuration saved.'), 'Language successfully enabled.');
       
   312     }
       
   313   }
       
   314 
       
   315   /**
       
   316    * Creates a "Basic page" in the specified language.
       
   317    *
       
   318    * @param $title
       
   319    *   The title of a basic page in the specified language.
       
   320    * @param $body
       
   321    *   The body of a basic page in the specified language.
       
   322    * @param $language
       
   323    *   (optional) Language code.
       
   324    *
       
   325    * @return
       
   326    *   A node object.
       
   327    */
       
   328   function createPage($title, $body, $language = NULL) {
       
   329     $edit = array();
       
   330     $langcode = LANGUAGE_NONE;
       
   331     $edit["title"] = $title;
       
   332     $edit["body[$langcode][0][value]"] = $body;
       
   333     if (!empty($language)) {
       
   334       $edit['language'] = $language;
       
   335     }
       
   336     $this->drupalPost('node/add/page', $edit, t('Save'));
       
   337     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Basic page created.');
       
   338 
       
   339     // Check to make sure the node was created.
       
   340     $node = $this->drupalGetNodeByTitle($title);
       
   341     $this->assertTrue($node, 'Node found in database.');
       
   342 
       
   343     return $node;
       
   344   }
       
   345 
       
   346   /**
       
   347    * Creates a translation for a basic page in the specified language.
       
   348    *
       
   349    * @param $node
       
   350    *   The basic page to create the translation for.
       
   351    * @param $title
       
   352    *   The title of a basic page in the specified language.
       
   353    * @param $body
       
   354    *   The body of a basic page in the specified language.
       
   355    * @param $language
       
   356    *   Language code.
       
   357    *
       
   358    * @return
       
   359    *   Translation object.
       
   360    */
       
   361   function createTranslation($node, $title, $body, $language) {
       
   362     $this->drupalGet('node/add/page', array('query' => array('translation' => $node->nid, 'target' => $language)));
       
   363 
       
   364     $langcode = LANGUAGE_NONE;
       
   365     $body_key = "body[$langcode][0][value]";
       
   366     $this->assertFieldByXPath('//input[@id="edit-title"]', $node->title, "Original title value correctly populated.");
       
   367     $this->assertFieldByXPath("//textarea[@name='$body_key']", $node->body[LANGUAGE_NONE][0]['value'], "Original body value correctly populated.");
       
   368 
       
   369     $edit = array();
       
   370     $edit["title"] = $title;
       
   371     $edit[$body_key] = $body;
       
   372     $this->drupalPost(NULL, $edit, t('Save'));
       
   373     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Translation created.');
       
   374 
       
   375     // Check to make sure that translation was successful.
       
   376     $translation = $this->drupalGetNodeByTitle($title);
       
   377     $this->assertTrue($translation, 'Node found in database.');
       
   378     $this->assertTrue($translation->tnid == $node->nid, 'Translation set id correctly stored.');
       
   379 
       
   380     return $translation;
       
   381   }
       
   382 
       
   383   /**
       
   384    * Asserts an element identified by the given XPath has the given content.
       
   385    *
       
   386    * @param $xpath
       
   387    *   The XPath used to find the element.
       
   388    * @param array $arguments
       
   389    *   An array of arguments with keys in the form ':name' matching the
       
   390    *   placeholders in the query. The values may be either strings or numeric
       
   391    *   values.
       
   392    * @param $value
       
   393    *   The text content of the matched element to assert.
       
   394    * @param $message
       
   395    *   The message to display.
       
   396    * @param $group
       
   397    *   The group this message belongs to.
       
   398    *
       
   399    * @return
       
   400    *   TRUE on pass, FALSE on fail.
       
   401    */
       
   402   function assertContentByXPath($xpath, array $arguments = array(), $value = NULL, $message = '', $group = 'Other') {
       
   403     $found = $this->findContentByXPath($xpath, $arguments, $value);
       
   404     return $this->assertTrue($found, $message, $group);
       
   405   }
       
   406 
       
   407   /**
       
   408    * Tests whether the specified language switch links are found.
       
   409    *
       
   410    * @param $node
       
   411    *   The node to display.
       
   412    * @param $translation
       
   413    *   The translation whose link has to be checked.
       
   414    * @param $find
       
   415    *   TRUE if the link must be present in the node page.
       
   416    * @param $types
       
   417    *   The page areas to be checked.
       
   418    *
       
   419    * @return
       
   420    *   TRUE if the language switch links are found, FALSE if not.
       
   421    */
       
   422   function assertLanguageSwitchLinks($node, $translation, $find = TRUE, $types = NULL) {
       
   423     if (empty($types)) {
       
   424       $types = array('node', 'block-locale');
       
   425     }
       
   426     elseif (is_string($types)) {
       
   427       $types = array($types);
       
   428     }
       
   429 
       
   430     $result = TRUE;
       
   431     $languages = language_list();
       
   432     $page_language = $languages[entity_language('node', $node)];
       
   433     $translation_language = $languages[$translation->language];
       
   434     $url = url("node/$translation->nid", array('language' => $translation_language));
       
   435 
       
   436     $this->drupalGet("node/$node->nid", array('language' => $page_language));
       
   437 
       
   438     foreach ($types as $type) {
       
   439       $args = array('%translation_language' => $translation_language->native, '%page_language' => $page_language->native, '%type' => $type);
       
   440       if ($find) {
       
   441         $message = format_string('[%page_language] Language switch item found for %translation_language language in the %type page area.', $args);
       
   442       }
       
   443       else {
       
   444         $message = format_string('[%page_language] Language switch item not found for %translation_language language in the %type page area.', $args);
       
   445       }
       
   446 
       
   447       if (!empty($translation->nid)) {
       
   448         $xpath = '//div[contains(@class, :type)]//a[@href=:url]';
       
   449       }
       
   450       else {
       
   451         $xpath = '//div[contains(@class, :type)]//span[contains(@class, "locale-untranslated")]';
       
   452       }
       
   453 
       
   454       $found = $this->findContentByXPath($xpath, array(':type' => $type, ':url' => $url), $translation_language->native);
       
   455       $result = $this->assertTrue($found == $find, $message) && $result;
       
   456     }
       
   457 
       
   458     return $result;
       
   459   }
       
   460 
       
   461   /**
       
   462    * Searches for elements matching the given xpath and value.
       
   463    *
       
   464    * @param $xpath
       
   465    *   The XPath used to find the element.
       
   466    * @param array $arguments
       
   467    *   An array of arguments with keys in the form ':name' matching the
       
   468    *   placeholders in the query. The values may be either strings or numeric
       
   469    *   values.
       
   470    * @param $value
       
   471    *   The text content of the matched element to assert.
       
   472    *
       
   473    * @return
       
   474    *   TRUE if found, otherwise FALSE.
       
   475    */
       
   476   function findContentByXPath($xpath, array $arguments = array(), $value = NULL) {
       
   477     $elements = $this->xpath($xpath, $arguments);
       
   478 
       
   479     $found = TRUE;
       
   480     if ($value && $elements) {
       
   481       $found = FALSE;
       
   482       foreach ($elements as $element) {
       
   483         if ((string) $element == $value) {
       
   484           $found = TRUE;
       
   485           break;
       
   486         }
       
   487       }
       
   488     }
       
   489 
       
   490     return $elements && $found;
       
   491   }
       
   492 }