diff --git a/cake/libs/view/helpers/javascript.php b/cake/libs/view/helpers/javascript.php
index b3baf17d4..688193bd9 100644
--- a/cake/libs/view/helpers/javascript.php
+++ b/cake/libs/view/helpers/javascript.php
@@ -142,7 +142,7 @@ class JavascriptHelper extends AppHelper {
}
switch ($key) {
case 'cache':
-
+
break;
case 'safe':
$this->safe = $val;
@@ -174,7 +174,8 @@ class JavascriptHelper extends AppHelper {
$this->_cachedEvents[] = $script;
} else {
$block = ($script !== null);
- if (($options['safe'] || $this->safe) && !($this->_cacheAll && $options['allowCache'])) {
+ $safe = ($options['safe'] || $this->safe);
+ if ($safe && !($this->_cacheAll && $options['allowCache'])) {
$script = "\n" . '//' . "\n";
@@ -188,13 +189,15 @@ class JavascriptHelper extends AppHelper {
@ob_end_clean();
ob_start();
return null;
+ } else if (!$block) {
+ $this->_blockOptions = $options;
}
if ($options['inline']) {
if ($block) {
return sprintf($this->tags['javascriptblock'], $script);
} else {
- return sprintf($this->tags['javascriptstart']);
+ return sprintf($this->tags['javascriptstart']).ife($safe, "\n" . '//__scriptBuffer;
$this->__scriptBuffer = null;
$options = $this->_blockOptions;
+ $safe = ($options['safe'] || $this->safe);
$this->_blockOptions = array();
$this->inBlock = false;
@@ -226,7 +230,7 @@ class JavascriptHelper extends AppHelper {
$this->_cachedEvents[] = $script;
return null;
}
- return $this->tags['javascriptend'];
+ return ife($safe, "\n" . '//]]>' . "\n", '').$this->tags['javascriptend'];
}
/**
* Returns a JavaScript include tag (SCRIPT element). If the filename is prefixed with "/",
diff --git a/cake/tests/cases/libs/view/helpers/javascript.test.php b/cake/tests/cases/libs/view/helpers/javascript.test.php
index f30bc6f12..4e02db593 100644
--- a/cake/tests/cases/libs/view/helpers/javascript.test.php
+++ b/cake/tests/cases/libs/view/helpers/javascript.test.php
@@ -33,6 +33,15 @@ class TheJsTestController extends Controller {
var $name = 'TheTest';
var $uses = null;
}
+class TheView extends View {
+ function scripts() {
+ return $this->__scripts;
+ }
+}
+class TestJavascriptObject {
+ var $property1 = 'value1';
+ var $property2 = 2;
+}
/**
* Short description for class.
*
@@ -41,13 +50,20 @@ class TheJsTestController extends Controller {
* @since CakePHP Test Suite v 1.0.0.0
*/
class JavascriptTest extends UnitTestCase {
-
function setUp() {
- $this->Javascript = new JavascriptHelper();
- $this->Javascript->Html = new HtmlHelper();
- $this->Javascript->Form = new FormHelper();
- $view =& new View(new TheJsTestController());
- ClassRegistry::addObject('view', $view);
+ $this->Javascript =& new JavascriptHelper();
+ $this->Javascript->Html =& new HtmlHelper();
+ $this->Javascript->Form =& new FormHelper();
+ $this->View =& new TheView(new TheJsTestController());
+ ClassRegistry::addObject('view', $this->View);
+ }
+
+ function tearDown() {
+ unset($this->Javascript->Html);
+ unset($this->Javascript->Form);
+ unset($this->Javascript);
+ ClassRegistry::removeObject('view');
+ unset($this->View);
}
function testLink() {
@@ -86,6 +102,23 @@ class JavascriptTest extends UnitTestCase {
$result = $this->Javascript->link('some_other_path/myfile.1.2.2.min');
$expected = '';
$this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->link('http://example.com/jquery.js');
+ $expected = '';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->link(array('prototype.js', 'scriptaculous.js'));
+ $this->assertPattern('/^\s*';
+ $this->assertNull($result);
+ $this->assertEqual(count($resultScripts), 1);
+ $this->assertEqual(current($resultScripts), $expected);
}
function testFilteringAndTimestamping() {
@@ -99,7 +132,7 @@ class JavascriptTest extends UnitTestCase {
Configure::write('Asset.timestamp', true);
$result = $this->Javascript->link('__cake_js_test');
- $this->assertPattern('/^';
+ $this->assertEqual($result, $expected);
+
+ if ($old === null) {
+ Configure::delete('Asset.filter.js');
+ }
unlink(JS . '__cake_js_test.js');
}
+ function testValue() {
+ $result = $this->Javascript->value(array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8)));
+ $expected = '{"title":"New thing","indexes":[5,6,7,8]}';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->value(null);
+ $this->assertEqual($result, 'null');
+
+ $result = $this->Javascript->value(true);
+ $this->assertEqual($result, 'true');
+
+ $result = $this->Javascript->value(false);
+ $this->assertEqual($result, 'false');
+
+ $result = $this->Javascript->value(5);
+ $this->assertEqual($result, '5');
+
+ $result = $this->Javascript->value(floatval(5.3));
+ $this->assertPattern('/^5.3[0]+$/', $result);
+
+ $result = $this->Javascript->value('');
+ $expected = '""';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->value('CakePHP' . "\n" . 'Rapid Development Framework');
+ $expected = '"CakePHP\\nRapid Development Framework"';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->value('CakePHP' . "\r\n" . 'Rapid Development Framework' . "\r" . 'For PHP');
+ $expected = '"CakePHP\\nRapid Development Framework\\nFor PHP"';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->value('CakePHP: "Rapid Development Framework"');
+ $expected = '"CakePHP: \\"Rapid Development Framework\\""';
+ $this->assertEqual($result, $expected);
+
+ $result = $this->Javascript->value('CakePHP: \'Rapid Development Framework\'');
+ $expected = '"CakePHP: \\\'Rapid Development Framework\\\'"';
+ $this->assertEqual($result, $expected);
+ }
+
function testObjectGeneration() {
$object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8));
-
$result = $this->Javascript->object($object);
$expected = '{"title":"New thing","indexes":[5,6,7,8]}';
$this->assertEqual($result, $expected);
@@ -153,11 +236,27 @@ class JavascriptTest extends UnitTestCase {
$expected = '{"Object":{"1":true,"2":false,"3":-3.14159265359,"4":-10}}';
$this->assertEqual($result, $expected);
- if ($this->Javascript->useNative) {
- $this->Javascript->useNative = false;
- $this->testObjectGeneration();
+ if (function_exists('json_encode')) {
+ $old = $this->Javascript->useNative;
$this->Javascript->useNative = true;
+ $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8));
+ $result = $this->Javascript->object($object);
+ $expected = '{"title":"New thing","indexes":[5,6,7,8]}';
+ $this->assertEqual($result, $expected);
+ $this->Javascript->useNative = $old;
}
+
+ $result = $this->Javascript->object(new TestJavascriptObject());
+ $expected = '{"property1":"value1","property2":2}';
+ $this->assertEqual($result, $expected);
+
+ $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8));
+ $result = $this->Javascript->object($object, array('block' => true));
+ $expected = '{"title":"New thing","indexes":[5,6,7,8]}';
+ $this->assertPattern('/^", $result);
+ $this->assertPattern('/^\s*' . str_replace('/', '\\/', preg_quote('//]]>')) . '\s*<\/script>$/', $result);
$this->Javascript->cacheEvents(false, true);
$this->assertFalse($this->Javascript->inBlock);
@@ -207,8 +337,6 @@ class JavascriptTest extends UnitTestCase {
$this->Javascript->codeBlock(null, array('inline' => false));
echo '$(function(){ /* ... */ });';
$this->Javascript->blockEnd();
-
- $view =& ClassRegistry::getObject('view');
}
function testEvent() {
@@ -223,10 +351,132 @@ class JavascriptTest extends UnitTestCase {
$this->assertPattern('/^