Skip to content
Snippets Groups Projects
Commit 8587f050 authored by Ere Maijala's avatar Ere Maijala Committed by Demian Katz
Browse files

Use correct cookie path for cart. (#876)

- Otherwise server-side functionality such as emptying the cart won’t work since it will push the cookie using a path while the JS functionality uses a path-less cookie.
parent 29851269
No related merge requests found
...@@ -306,6 +306,16 @@ class Cart ...@@ -306,6 +306,16 @@ class Cart
return $this->cookieManager->getDomain(); return $this->cookieManager->getDomain();
} }
/**
* Get cookie path ('/' if unset).
*
* @return string
*/
public function getCookiePath()
{
return $this->cookieManager->getPath();
}
/** /**
* Process parameters and return the cart content. * Process parameters and return the cart content.
* *
......
...@@ -427,6 +427,34 @@ class CartTest extends \VuFindTest\Unit\MinkTestCase ...@@ -427,6 +427,34 @@ class CartTest extends \VuFindTest\Unit\MinkTestCase
$this->assertEquals('0', $this->findCss($page, '#cartItems strong')->getText()); $this->assertEquals('0', $this->findCss($page, '#cartItems strong')->getText());
} }
/**
* Test that we can put items in the cart and then remove them outside of
* the lightbox.
*
* @return void
*/
public function testFillAndEmptyCartWithoutLightbox()
{
// Turn on limit by path setting; there used to be a bug where cookie
// paths were set inconsistently between JS and server-side code. This
// test should catch any regressions in that area.
$page = $this->setUpGenericCartTest(
['config' => ['Cookies' => ['limit_by_path' => 1]]]
);
// Go to the cart page and activate the "empty" control:
$session = $this->getMinkSession();
$session->visit($this->getVuFindUrl() . '/Cart');
$empty = $this->findCss($page, '#cart-empty-label');
$empty->click();
$emptyConfirm = $this->findCss($page, '#cart-confirm-empty');
$emptyConfirm->click();
// Confirm that the cart has truly been emptied:
$this->snooze(); // wait for display to update
$this->assertEquals('0', $this->findCss($page, '#cartItems strong')->getText());
}
/** /**
* Test that the email control works. * Test that the email control works.
* *
......
...@@ -6,11 +6,16 @@ VuFind.register('cart', function Cart() { ...@@ -6,11 +6,16 @@ VuFind.register('cart', function Cart() {
var _COOKIE_SOURCES = 'vufind_cart_src'; var _COOKIE_SOURCES = 'vufind_cart_src';
var _COOKIE_DELIM = "\t"; var _COOKIE_DELIM = "\t";
var _COOKIE_DOMAIN = false; var _COOKIE_DOMAIN = false;
var _COOKIE_PATH = '/';
function setDomain(domain) { function setDomain(domain) {
_COOKIE_DOMAIN = domain; _COOKIE_DOMAIN = domain;
} }
function setCookiePath(path) {
_COOKIE_PATH = path;
}
function _uniqueArray(op) { function _uniqueArray(op) {
var ret = []; var ret = [];
for (var i = 0; i < op.length; i++) { for (var i = 0; i < op.length; i++) {
...@@ -70,11 +75,11 @@ VuFind.register('cart', function Cart() { ...@@ -70,11 +75,11 @@ VuFind.register('cart', function Cart() {
// Add source to source cookie // Add source to source cookie
cartItems[cartItems.length] = String.fromCharCode(65 + cartSources.length) + id; cartItems[cartItems.length] = String.fromCharCode(65 + cartSources.length) + id;
cartSources[cartSources.length] = source; cartSources[cartSources.length] = source;
Cookies.setItem(_COOKIE_SOURCES, cartSources.join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN); Cookies.setItem(_COOKIE_SOURCES, cartSources.join(_COOKIE_DELIM), false, _COOKIE_PATH, _COOKIE_DOMAIN);
} else { } else {
cartItems[cartItems.length] = String.fromCharCode(65 + sIndex) + id; cartItems[cartItems.length] = String.fromCharCode(65 + sIndex) + id;
} }
Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN); Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, _COOKIE_PATH, _COOKIE_DOMAIN);
updateCount(); updateCount();
return true; return true;
} }
...@@ -109,11 +114,11 @@ VuFind.register('cart', function Cart() { ...@@ -109,11 +114,11 @@ VuFind.register('cart', function Cart() {
} }
} }
if (cartItems.length > 0) { if (cartItems.length > 0) {
Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN); Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, _COOKIE_PATH, _COOKIE_DOMAIN);
Cookies.setItem(_COOKIE_SOURCES, _uniqueArray(cartSources).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN); Cookies.setItem(_COOKIE_SOURCES, _uniqueArray(cartSources).join(_COOKIE_DELIM), false, _COOKIE_PATH, _COOKIE_DOMAIN);
} else { } else {
Cookies.removeItem(_COOKIE, '/', _COOKIE_DOMAIN); Cookies.removeItem(_COOKIE, _COOKIE_PATH, _COOKIE_DOMAIN);
Cookies.removeItem(_COOKIE_SOURCES, '/', _COOKIE_DOMAIN); Cookies.removeItem(_COOKIE_SOURCES, _COOKIE_PATH, _COOKIE_DOMAIN);
} }
updateCount(); updateCount();
return true; return true;
...@@ -211,6 +216,7 @@ VuFind.register('cart', function Cart() { ...@@ -211,6 +216,7 @@ VuFind.register('cart', function Cart() {
getFullItems: getFullItems, getFullItems: getFullItems,
updateCount: updateCount, updateCount: updateCount,
setDomain: setDomain, setDomain: setDomain,
setCookiePath: setCookiePath,
// Init // Init
init: init init: init
}; };
......
...@@ -75,6 +75,12 @@ ...@@ -75,6 +75,12 @@
'VuFind.cart.setDomain("' . $domain . '");' 'VuFind.cart.setDomain("' . $domain . '");'
); );
} }
$cookiePath = $cart->getCookiePath();
if (!empty($cookiePath)) {
$this->headScript()->appendScript(
'VuFind.cart.setCookiePath("' . $cookiePath . '");'
);
}
$this->jsTranslations()->addStrings( $this->jsTranslations()->addStrings(
[ [
'addBookBag' => 'Add to Book Bag', 'addBookBag' => 'Add to Book Bag',
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment