}
$post_id = (($a->argc > 1) ? intval($a->argv[1]) : 0);
+ $return_url = (($a->argc > 2) ? base64_decode($a->argv[2]) : '');
if (!$post_id) {
notice(L10n::t('Item not found') . EOL);
return;
}
+ // Fallback to SESSION return_path
+ if (empty($return_url)) {
+ $return_url = $_SESSION['return_url'];
+ }
+
$fields = ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
'type', 'body', 'title', 'file', 'wall', 'post-type'];
$o .= replace_macros($tpl, [
'$is_edit' => true,
- '$return_path' => $_SESSION['return_url'],
+ '$return_path' => $return_url,
'$action' => 'item',
'$share' => L10n::t('Save'),
'$upload' => L10n::t('Upload photo'),
$a->argc = 2;
$a->argv[1] = 'new';
} else {
- goaway($_SESSION['return_url']);
+ goaway($a->cmd . '/' . $ret);
}
}
*/
public function clear($outdated = true)
{
+ // Array doesn't support TTL so just don't delete something
+ if ($outdated) {
+ return true;
+ }
+
$this->cachedData = [];
return true;
}
// Count active workers and compare them with a maximum value that depends on the load
if (self::tooMuchWorkers()) {
logger('Active worker limit reached, quitting.', LOGGER_DEBUG);
+ Lock::release('worker');
return;
}
// Check free memory
if ($a->min_memory_reached()) {
logger('Memory limit reached, quitting.', LOGGER_DEBUG);
+ Lock::release('worker');
return;
}
Lock::release('worker');
} else {
// This shouldn't happen.
logger('Could not insert activity for URI ' . $item['uri'] . ' - should not happen');
+ Lock::release('item_insert_activity');
return false;
}
if ($locked) {
if ($item["event-id"] != 0) {
$edpost = ["events/event/" . $item['event-id'], L10n::t("Edit")];
} else {
- $edpost = ["editpost/" . $item['id'], L10n::t("Edit")];
+ $edpost = ["editpost/" . $item['id'] . "/" . base64_encode($a->cmd), L10n::t("Edit")];
}
$dropping = in_array($item['uid'], [0, local_user()]);
} else {
'3_value1' => $this->instance->get('3_value1'),
]);
+ $this->assertTrue($this->instance->clear());
+
+ $this->assertEquals([
+ '1_value1' => 'ipsum lorum1',
+ '1_value2' => 'ipsum lorum2',
+ '2_value1' => 'ipsum lorum3',
+ '3_value1' => 'ipsum lorum4',
+ ], [
+ '1_value1' => $this->instance->get('1_value1'),
+ '1_value2' => $this->instance->get('1_value2'),
+ '2_value1' => $this->instance->get('2_value1'),
+ '3_value1' => $this->instance->get('3_value1'),
+ ]);
+
$this->assertTrue($this->instance->clear(false));
$this->assertEquals([
'1_value1' => null,
'1_value2' => null,
- '2_value1' => null,
- '3_value1' => null,
+ '2_value3' => null,
+ '3_value4' => null,
], [
'1_value1' => $this->instance->get('1_value1'),
'1_value2' => $this->instance->get('1_value2'),
- '2_value1' => $this->instance->get('2_value1'),
- '3_value1' => $this->instance->get('3_value1'),
+ '2_value3' => $this->instance->get('2_value3'),
+ '3_value4' => $this->instance->get('3_value4'),
]);
}
class ArrayCacheLockDriverTest extends LockTest
{
- /**
- * @var \Friendica\Core\Cache\IMemoryCacheDriver
- */
- private $cache;
-
protected function getInstance()
{
- $this->cache = new ArrayCache();
- return new CacheLockDriver($this->cache);
- }
-
- public function tearDown()
- {
- $this->cache->clear();
- parent::tearDown();
+ return new CacheLockDriver(new ArrayCache());
}
public function testLockTTL()
{
parent::setUp();
$this->instance = $this->getInstance();
+ $this->instance->releaseAll();
// Reusable App object
$this->app = BaseObject::getApp();
Config::set('system', 'theme', 'system_theme');
}
+ protected function tearDown()
+ {
+ parent::tearDown();
+ $this->instance->releaseAll();
+ }
+
/**
* @small
*/
public function testLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
$this->assertFalse($this->instance->isLocked('bar'));
}
* @small
*/
public function testDoubleLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
// We already locked it
$this->assertTrue($this->instance->acquireLock('foo', 1));
* @small
*/
public function testReleaseLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
$this->instance->releaseLock('foo');
$this->assertFalse($this->instance->isLocked('foo'));
* @small
*/
public function testReleaseAll() {
- $this->instance->acquireLock('foo', 1);
- $this->instance->acquireLock('bar', 1);
- $this->instance->acquireLock('nice', 1);
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 1));
+ $this->assertTrue($this->instance->acquireLock('nice', 1));
$this->assertTrue($this->instance->isLocked('foo'));
$this->assertTrue($this->instance->isLocked('bar'));
* @small
*/
public function testReleaseAfterUnlock() {
- $this->instance->acquireLock('foo', 1);
- $this->instance->acquireLock('bar', 1);
- $this->instance->acquireLock('nice', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertFalse($this->instance->isLocked('bar'));
+ $this->assertFalse($this->instance->isLocked('nice'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 1));
+ $this->assertTrue($this->instance->acquireLock('nice', 1));
$this->instance->releaseLock('foo');
* @medium
*/
function testLockTTL() {
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertFalse($this->instance->isLocked('bar'));
// TODO [nupplaphil] - Because of the Datetime-Utils for the database, we have to wait a FULL second between the checks to invalidate the db-locks/cache
- $this->instance->acquireLock('foo', 1, 1);
- $this->instance->acquireLock('bar', 1, 3);
+ $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
$this->assertTrue($this->instance->isLocked('foo'));
$this->assertTrue($this->instance->isLocked('bar'));
namespace Friendica\Test\src\Core\Lock;
-
use Friendica\Core\Cache\CacheDriverFactory;
use Friendica\Core\Lock\CacheLockDriver;
*/
class MemcacheCacheLockDriverTest extends LockTest
{
- /**
- * @var \Friendica\Core\Cache\IMemoryCacheDriver
- */
- private $cache;
-
protected function getInstance()
{
- $this->cache = CacheDriverFactory::create('memcache');
- return new CacheLockDriver($this->cache);
- }
-
- public function tearDown()
- {
- $this->cache->clear();
- parent::tearDown();
+ return new CacheLockDriver(CacheDriverFactory::create('memcache'));
}
}
namespace Friendica\Test\src\Core\Lock;
-
use Friendica\Core\Cache\CacheDriverFactory;
use Friendica\Core\Lock\CacheLockDriver;
*/
class MemcachedCacheLockDriverTest extends LockTest
{
- /**
- * @var \Friendica\Core\Cache\IMemoryCacheDriver
- */
- private $cache;
-
protected function getInstance()
{
- $this->cache = CacheDriverFactory::create('memcached');
- return new CacheLockDriver($this->cache);
- }
-
- public function tearDown()
- {
- $this->cache->clear();
- parent::tearDown();
+ return new CacheLockDriver(CacheDriverFactory::create('memcached'));
}
}
namespace Friendica\Test\src\Core\Lock;
-
use Friendica\Core\Cache\CacheDriverFactory;
use Friendica\Core\Lock\CacheLockDriver;
*/
class RedisCacheLockDriverTest extends LockTest
{
- /**
- * @var \Friendica\Core\Cache\IMemoryCacheDriver
- */
- private $cache;
-
protected function getInstance()
{
- $this->cache = CacheDriverFactory::create('redis');
- return new CacheLockDriver($this->cache);
+ return new CacheLockDriver(CacheDriverFactory::create('redis'));
}
-
- public function tearDown()
- {
- $this->cache->clear();
- parent::tearDown();
- }
}
namespace Friendica\Test\src\Core\Lock;
-
use Friendica\Core\Lock\SemaphoreLockDriver;
class SemaphoreLockDriverTest extends LockTest
{
- /**
- * @var \Friendica\Core\Lock\SemaphoreLockDriver
- */
- private $semaphoreLockDriver;
-
protected function getInstance()
{
- $this->semaphoreLockDriver = new SemaphoreLockDriver();
- return $this->semaphoreLockDriver;
- }
-
- public function tearDown()
- {
- $this->semaphoreLockDriver->releaseAll();
- parent::tearDown();
+ return new SemaphoreLockDriver();
}
function testLockTTL()
// For some some tab panels we need to execute other js functions.
if (tabpanel === "jot-preview-content") {
preview_post();
+ // Make Share button visivle in preview
+ $('#jot-preview-share').removeClass("minimize").attr("aria-hidden" ,"false");
} else if (tabpanel === "jot-fbrowser-wrapper") {
$(function() {
Dialog.showJot();
return true;
}
+function insertFormattingToPost(BBcode) {
+ textarea = document.getElementById("profile-jot-text");
+ if (document.selection) {
+ textarea.focus();
+ selected = document.selection.createRange();
+ selected.text = "[" + BBcode + "]" + selected.text + "[/" + BBcode + "]";
+ } else if (textarea.selectionStart || textarea.selectionStart == "0") {
+ var start = textarea.selectionStart;
+ var end = textarea.selectionEnd;
+ textarea.value = textarea.value.substring(0, start) + "[" + BBcode + "]" + textarea.value.substring(start, end) + "[/" + BBcode + "]" + textarea.value.substring(end, textarea.value.length);
+ }
+
+ $(textarea).trigger('change');
+
+ return true;
+}
function showThread(id) {
$("#collapsed-comments-" + id).show()
</div>
<ul id="profile-jot-submit-wrapper" class="jothidden nav nav-pills">
+ <li role="presentation"><button type="button" class="hidden-xs btn-link icon underline" style="cursor: pointer;" aria-label="{{$eduline}}" title="{{$eduline}}" onclick="insertFormattingToPost('u');"><i class="fa fa-underline"></i></button></li>
+ <li role="presentation"><button type="button" class="hidden-xs btn-link icon italic" style="cursor: pointer;" aria-label="{{$editalic}}" title="{{$editalic}}" onclick="insertFormattingToPost('i');"><i class="fa fa-italic"></i></button></li>
+ <li role="presentation"><button type="button" class="hidden-xs btn-link icon bold" style="cursor: pointer;" aria-label="{{$edbold}}" title="{{$edbold}}" onclick="insertFormattingToPost('b');"><i class="fa fa-bold"></i></button></li>
+ <li role="presentation"><button type="button" class="hidden-xs btn-link icon quote" style="cursor: pointer;" aria-label="{{$edquote}}" title="{{$edquote}}" onclick="insertFormattingToPost('quote');"><i class="fa fa-quote-left"></i></button></li>
<li role="presentation"><button type="button" class="btn-link" id="profile-link" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink();" title="{{$weblink}}"><i class="fa fa-link"></i></button></li>
<li role="presentation"><button type="button" class="btn-link" id="profile-video" onclick="jotVideoURL();" title="{{$video}}"><i class="fa fa-film" aria-hidden="true"></i></button></li>
<li role="presentation"><button type="button" class="btn-link" id="profile-audio" onclick="jotAudioURL();" title="{{$audio}}"><i class="fa fa-music" aria-hidden="true"></i></button></li>
</div>
<div id="jot-preview-content" class="minimize" aria-labelledby="jot-preview-lnk" role="tabpanel" aria-hidden="true"></div>
+
+ <div id="jot-preview-share" class="minimize" aria-labelledby="jot-preview-lnk" role="tabpanel" aria-hidden="true">
+ <ul id="profile-jot-preview-submit-wrapper" class="jothidden nav nav-pills">
+ <li role="presentation" class="pull-right"><button class="btn btn-primary" type="submit" id="profile-jot-peview-submit" name="submit" ><i class="fa fa-slideshare fa-fw" aria-hidden="true"></i> {{$share}}</button></li>
+ </ul>
+ </div>
+
</form>
<div id="jot-fbrowser-wrapper" class="minimize" aria-labelledby="jot-browser-link" role="tabpanel" aria-hidden="true"></div>