summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Wehner2017-08-16 17:03:13 (GMT)
committerDaniel Wehner2017-08-16 17:03:13 (GMT)
commit59c2d4137df1bb497ab3b20645706f643e9cd044 (patch)
treef49abbf245293212552307c189ddab5d9094db99
parent026828e172287b69db613f0dfa5f4325a3ee8570 (diff)
Issue by maximpodorov, klausi, dawehner, drumm, mlhess, xjm, Wim Leers, lendude, pwolanin, dsnopek: Ensure we check for ajax to be configured7.x-3.17
-rw-r--r--includes/ajax.inc2
-rw-r--r--tests/views_ajax.test109
-rw-r--r--tests/views_test.views_default.inc53
-rw-r--r--views.info1
4 files changed, 164 insertions, 1 deletions
diff --git a/includes/ajax.inc b/includes/ajax.inc
index 4b8825a..90e4ca9 100644
--- a/includes/ajax.inc
+++ b/includes/ajax.inc
@@ -40,7 +40,7 @@ function views_ajax() {
// Load the view.
$view = views_get_view($name);
- if ($view && $view->access($display_id)) {
+ if ($view && $view->access($display_id) && $view->set_display($display_id) && $view->display_handler->use_ajax()) {
// Fix 'q' for paging.
if (!empty($path)) {
$_GET['q'] = $path;
diff --git a/tests/views_ajax.test b/tests/views_ajax.test
new file mode 100644
index 0000000..3f553db
--- /dev/null
+++ b/tests/views_ajax.test
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * @file
+ * Definition of ViewsAjaxTest.
+ */
+
+/**
+ * Tests views ajax display.
+ */
+class ViewsAjaxTest extends ViewsSqlTest {
+ public static function getInfo() {
+ return array(
+ 'name' => 'Ajax',
+ 'description' => 'Test views with and without ajax enabled.',
+ 'group' => 'Views Handlers',
+ );
+ }
+
+ public function setUp() {
+ parent::setUp('views', 'views_test');
+ // Create a second node.
+ $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_PUBLISHED));
+ }
+
+ /**
+ * Perform a simple AJAX POST HTTP request.
+ *
+ * @param string $path
+ * Drupal path where the request should be POSTed.
+ * @param string $accept
+ * The value for the "Accept" header. Usually either 'application/json' or
+ * 'application/vnd.drupal-ajax'.
+ * @param array $post
+ * The POST data. When making a 'application/vnd.drupal-ajax' request, the
+ * Ajax page state data should be included. Use getAjaxPageStatePostData()
+ * for that.
+ *
+ * @return
+ * The content returned from the call to curl_exec().
+ */
+ public function simpleAjaxPost($path, $accept, $post = array()) {
+ $options['absolute'] = TRUE;
+ foreach ($post as $key => $value) {
+ // Encode according to application/x-www-form-urlencoded
+ // Both names and values needs to be urlencoded, according to
+ // http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
+ $post[$key] = urlencode($key) . '=' . urlencode($value);
+ }
+ $postfields = implode('&', $post);
+ $headers = array(
+ 'Accept: ' . $accept,
+ 'Content-Type: application/x-www-form-urlencoded',
+ );
+ return $this->curlExec(array(
+ CURLOPT_URL => url($path, $options),
+ CURLOPT_POST => TRUE,
+ CURLOPT_POSTFIELDS => $postfields,
+ CURLOPT_HTTPHEADER => $headers,
+ ));
+ }
+
+ /**
+ * Tests an ajax and non-ajax view.
+ */
+ public function testAjaxView() {
+ $this->drupalCreateNode();
+ $this->drupalGet('test_ajax_view');
+ $drupal_settings = $this->drupalGetSettings();
+ $this->assertTrue(isset($drupal_settings['views']['ajax_path']), 'The Ajax callback path is set in drupalSettings.');
+ $this->assertEqual(count($drupal_settings['views']['ajaxViews']), 1);
+ $view_entry = current(array_keys($drupal_settings['views']['ajaxViews']));
+ $this->assertEqual($drupal_settings['views']['ajaxViews'][$view_entry]['view_name'], 'test_ajax_view', 'The view\'s ajaxViews array entry has the correct \'view_name\' key.');
+ $this->assertEqual($drupal_settings['views']['ajaxViews'][$view_entry]['view_display_id'], 'page_1', 'The view\'s ajaxViews array entry has the correct \'view_display_id\' key.');
+
+ $post = [
+ 'view_name' => 'test_ajax_view',
+ 'view_display_id' => 'page_1',
+ ];
+
+ $response = $this->simpleAjaxPost('views/ajax', 'application/json', $post);
+ $data = drupal_json_decode($response);
+
+ $this->assertTrue(isset($data[0]['settings']['views']['ajaxViews']));
+
+ // Ensure that the view insert command is part of the result.
+ $this->assertEqual($data[1]['command'], 'insert');
+ $this->assertTrue(strpos($data[1]['selector'], '.view-dom-id-') === 0);
+
+ $this->drupalSetContent($data[1]['data']);
+ $result = $this->xpath('//div[contains(@class, "views-row")]');
+ $this->assertEqual(count($result), 2, 'Ensure that two items are rendered in the HTML.');
+
+ $post = [
+ 'view_name' => 'test_noajax_view',
+ 'view_display_id' => 'default',
+ ];
+
+ $response = $this->simpleAjaxPost('views/ajax', 'application/json', $post);
+ $data = drupal_json_decode($response);
+ // In Drupal 7 we get an ajax response with no commands instead of a 403 if
+ // the view cannot be accessed.
+ foreach ($data as $item) {
+ $this->assertIdentical('settings', $item['command']);
+ $this->assertTrue(empty($item['data']));
+ }
+ }
+
+}
diff --git a/tests/views_test.views_default.inc b/tests/views_test.views_default.inc
index 8843b26..f19f34a 100644
--- a/tests/views_test.views_default.inc
+++ b/tests/views_test.views_default.inc
@@ -1,3 +1,4 @@
+
<?php
/**
@@ -274,5 +275,57 @@ function views_test_views_default_views() {
$views[$view->name] = $view;
+ $view = new view();
+ $view->name = 'test_ajax_view';
+ $view->description = '';
+ $view->tag = '';
+ $view->base_table = 'node';
+ $view->human_name = '';
+ $view->core = 0;
+ $view->api_version = '3.0';
+ $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+ /* Display: Master */
+ $handler = $view->new_display('default', 'Master', 'default');
+ $handler->display->display_options['use_ajax'] = TRUE;
+ $handler->display->display_options['use_more_always'] = FALSE;
+ $handler->display->display_options['access']['type'] = 'none';
+ $handler->display->display_options['cache']['type'] = 'none';
+ $handler->display->display_options['query']['type'] = 'views_query';
+ $handler->display->display_options['exposed_form']['type'] = 'basic';
+ $handler->display->display_options['pager']['type'] = 'none';
+ $handler->display->display_options['style_plugin'] = 'default';
+ $handler->display->display_options['row_plugin'] = 'node';
+
+ /* Display: Page */
+ $handler = $view->new_display('page', 'Page', 'page_1');
+ $handler->display->display_options['path'] = 'test_ajax_view';
+
+ $views[$view->name] = $view;
+
+ $view = new view();
+ $view->name = 'test_noajax_view';
+ $view->description = '';
+ $view->tag = '';
+ $view->base_table = 'node';
+ $view->human_name = '';
+ $view->core = 0;
+ $view->api_version = '3.0';
+ $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+ /* Display: Master */
+ $handler = $view->new_display('default', 'Master', 'default');
+ $handler->display->display_options['use_ajax'] = FALSE;
+ $handler->display->display_options['use_more_always'] = FALSE;
+ $handler->display->display_options['access']['type'] = 'none';
+ $handler->display->display_options['cache']['type'] = 'none';
+ $handler->display->display_options['query']['type'] = 'views_query';
+ $handler->display->display_options['exposed_form']['type'] = 'basic';
+ $handler->display->display_options['pager']['type'] = 'none';
+ $handler->display->display_options['style_plugin'] = 'default';
+ $handler->display->display_options['row_plugin'] = 'node';
+
+ $views[$view->name] = $view;
+
return $views;
}
diff --git a/views.info b/views.info
index b439b79..8c4cd87 100644
--- a/views.info
+++ b/views.info
@@ -301,6 +301,7 @@ files[] = tests/styles/views_plugin_style_unformatted.test
files[] = tests/views_access.test
files[] = tests/views_analyze.test
files[] = tests/views_basic.test
+files[] = tests/views_ajax.test
files[] = tests/views_argument_default.test
files[] = tests/views_argument_validator.test
files[] = tests/views_exposed_form.test