The Gitlab instance will be restarted on Monday April 28th at 2AM. There will be a short interruption of service.

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