public function testTwoCollectionsHasDifferentCacheKey()
 {
     $aggregateResolver = $this->getMock('AssetManager\\Resolver\\ResolverInterface');
     //assets with same 'last modifled time'.
     $now = time();
     $bacon = new Asset\StringAsset('bacon');
     $bacon->setLastModified($now);
     $bacon->mimetype = 'text/plain';
     $eggs = new Asset\StringAsset('eggs');
     $eggs->setLastModified($now);
     $eggs->mimetype = 'text/plain';
     $assets = array(array('bacon', $bacon), array('eggs', $eggs));
     $aggregateResolver->expects($this->any())->method('resolve')->will($this->returnValueMap($assets));
     $resolver = new CollectionResolver(array('collection1' => array('bacon'), 'collection2' => array('eggs')));
     $mimeResolver = new MimeResolver();
     $assetFilterManager = new \AssetManager\Service\AssetFilterManager();
     $assetFilterManager->setMimeResolver($mimeResolver);
     $resolver->setAggregateResolver($aggregateResolver);
     $resolver->setAssetFilterManager($assetFilterManager);
     $collection1 = $resolver->resolve('collection1');
     $collection2 = $resolver->resolve('collection2');
     $cacheInterface = $this->getMock('Assetic\\Cache\\CacheInterface');
     $cacheKeys = new \ArrayObject();
     $callback = function ($key) use($cacheKeys) {
         $cacheKeys[] = $key;
         return true;
     };
     $cacheInterface->expects($this->exactly(2))->method('has')->will($this->returnCallback($callback));
     $cacheInterface->expects($this->exactly(2))->method('get')->will($this->returnValue('cached content'));
     $cache1 = new AssetCache($collection1, $cacheInterface);
     $cache1->load();
     $cache2 = new AssetCache($collection2, $cacheInterface);
     $cache2->load();
     $this->assertCount(2, $cacheKeys);
     $this->assertNotEquals($cacheKeys[0], $cacheKeys[1]);
 }
Exemplo n.º 2
0
 public function combineThenDump()
 {
     // loop through leaves and add each raw asset
     $parts = array();
     $filtersAdded = $this->filters->all();
     foreach ($this as $asset) {
         if (!$filtersAdded) {
             $this->filters = new FilterCollection($asset->getFilters());
             $filtersAdded = true;
         }
         $parts[] = file_get_contents($asset->getSourceRoot() . '/' . $asset->getSourcePath());
     }
     $combinedAsset = new StringAsset(implode("\n", $parts), $this->filters->all());
     $combinedAsset->setLastModified($this->getLastModified());
     return $combinedAsset->dump();
 }
Exemplo n.º 3
0
 public function testLastModified()
 {
     $asset = new StringAsset('');
     $asset->setLastModified(123);
     $this->assertEquals(123, $asset->getLastModified(), '->getLastModified() return the set last modified value');
 }
Exemplo n.º 4
0
 /**
  * Create a string asset.
  *
  * @param array $filters The filters.
  *
  * @return StringAsset
  */
 private function createStringAsset(array $filters)
 {
     $asset = new StringAsset($this->row['code'], $filters, TL_ROOT, 'string_asset');
     $asset->setLastModified($this->row['tstamp']);
     return $asset;
 }
Exemplo n.º 5
0
 public function run()
 {
     /** @var RenderModeDeterminer $renderModeDeterminer */
     $renderModeDeterminer = $GLOBALS['container']['theme-plus-render-mode-determiner'];
     $renderMode = $renderModeDeterminer->determineMode();
     if (RenderMode::DESIGN == $renderMode) {
         $user = FrontendUser::getInstance();
         $user->authenticate();
         /** @var DeveloperTool $developerTool */
         $developerTool = $GLOBALS['container']['theme-plus-developer-tools'];
         $pathInfo = \Environment::get('pathInfo');
         list($type, $id) = explode('/', substr($pathInfo, 1));
         // output headers
         header("Cache-Control: public");
         switch ($type) {
             case 'css':
                 header('Content-Type: text/css; charset=utf-8');
                 break;
             case 'js':
                 header('Content-Type: text/javascript; charset=utf-8');
                 break;
         }
         if (isset($_SESSION['THEME_PLUS_ASSETS'][$id])) {
             $session = unserialize($_SESSION['THEME_PLUS_ASSETS'][$id]);
             // load asset from session
             /** @var AssetInterface $asset */
             $asset = $session->asset;
             /** @var AssetInterface $cache */
             $cache = $session->cache;
             if (false && $cache && $cache->getLastModified() >= $asset->getLastModified()) {
                 header('X-Theme-Plus-Rendering: cached');
                 echo $cache->getContent();
                 ob_flush();
                 return;
             }
             header('X-Theme-Plus-Rendering: live');
             // load page from session
             $GLOBALS['objPage'] = $page = \PageModel::findWithDetails($session->page);
             /** @var AsseticFactory $asseticFactory */
             $asseticFactory = $GLOBALS['container']['assetic.factory'];
             // default filter
             $defaultFilters = $asseticFactory->createFilterOrChain($page->layout->asseticStylesheetFilter, true);
             // remove css rewrite filter
             foreach ($defaultFilters as $index => $filter) {
                 if ($filter instanceof CssRewriteFilter) {
                     unset($defaultFilters[$index]);
                 }
             }
             // update the target path
             $asset->setTargetPath('assets/theme-plus/proxy.php/:type/:id/:name');
             // create debug informations
             $buffer = '/*' . PHP_EOL;
             $buffer .= ' * DEBUG' . PHP_EOL;
             $buffer .= $developerTool->getAssetDebugString($asset, ' * ') . PHP_EOL;
             $buffer .= ' * END' . PHP_EOL;
             $buffer .= ' */' . PHP_EOL . PHP_EOL;
             // dump the asset
             $buffer .= $asset->dump($defaultFilters);
             $cachedAsset = new StringAsset($buffer, [], $asset->getSourceRoot(), $asset->getSourcePath());
             $cachedAsset->setTargetPath($asset->getTargetPath());
             $cachedAsset->setLastModified($asset->getLastModified());
             $cachedAsset->load();
             $session->cache = $cachedAsset;
             $_SESSION['THEME_PLUS_ASSETS'][$id] = serialize($session);
             // update advanced asset cache meta
             if (!$GLOBALS['TL_CONFIG']['theme_plus_disabled_advanced_asset_caching']) {
                 /** @var Cache $cache */
                 $cache = $GLOBALS['container']['theme-plus-assets-cache'];
                 $latestTimestamp = $cache->fetch(ThemePlus::CACHE_LATEST_ASSET_TIMESTAMP);
                 if (!$latestTimestamp || $latestTimestamp < $asset->getLastModified()) {
                     $cache->save(ThemePlus::CACHE_LATEST_ASSET_TIMESTAMP, $asset->getLastModified());
                 }
             }
             echo $buffer;
             ob_flush();
             return;
         }
     }
     header('HTTP/1.1 403 Forbidden');
     header('Status: 403 Forbidden');
     header('Content-Type: text/plain; charset=UTF-8');
     echo '403 Forbidden';
 }