Drupal 8.0.0 beta 12. More info: https://www.drupal.org/node/2514176
This commit is contained in:
commit
9921556621
13277 changed files with 1459781 additions and 0 deletions
6
core/modules/breakpoint/breakpoint.info.yml
Normal file
6
core/modules/breakpoint/breakpoint.info.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
name: Breakpoint
|
||||
type: module
|
||||
description: 'Manage breakpoints and breakpoint groups for responsive designs.'
|
||||
package: Core
|
||||
version: VERSION
|
||||
core: 8.x
|
51
core/modules/breakpoint/breakpoint.module
Normal file
51
core/modules/breakpoint/breakpoint.module
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Manage breakpoints and breakpoint groups for responsive designs.
|
||||
*/
|
||||
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
|
||||
/**
|
||||
* Implements hook_help().
|
||||
*/
|
||||
function breakpoint_help($route_name, RouteMatchInterface $route_match) {
|
||||
switch ($route_name) {
|
||||
case 'help.page.breakpoint':
|
||||
$output = '';
|
||||
$output .= '<h3>' . t('About') . '</h3>';
|
||||
$output .= '<p>' . t('The Breakpoint module keeps track of the height, width, and resolution breakpoints where a responsive design needs to change in order to respond to different devices being used to view the site. This module does not have a user interface. For more information, see the <a href="!docs">online documentation for the Breakpoint module</a>.', array('!docs' => 'https://www.drupal.org/documentation/modules/breakpoint')) . '</p>';
|
||||
$output .= '<h4>' . t('Terminology') . '</h4>';
|
||||
$output .= '<dl>';
|
||||
$output .= '<dt>' . t('Breakpoint') . '</dt>';
|
||||
$output .= '<dd>' . t('A breakpoint separates the height or width of viewports (screens, printers, and other media output types) into steps. For instance, a width breakpoint of 40em creates two steps: one for widths up to 40em and one for widths above 40em. Breakpoints can be used to define when layouts should shift from one form to another, when images should be resized, and other changes that need to respond to changes in viewport height or width.') . '</dd>';
|
||||
$output .= '<dt>' . t('Media query') . '</dt>';
|
||||
$output .= '<dd>' . t('<a href="!w3">Media queries</a> are a formal way to encode breakpoints. For instance, a width breakpoint at 40em would be written as the media query "(min-width: 40em)". Breakpoints are really just media queries with some additional meta-data, such as a name and multiplier information.', array('!w3' => 'http://www.w3.org/TR/css3-mediaqueries/')) . '</dd>';
|
||||
$output .= '<dt>' . t('Resolution multiplier') . '</dt>';
|
||||
$output .= '<dd>' . t('Resolution multipliers are a measure of the viewport\'s device resolution, defined to be the ratio between the physical pixel size of the active device and the <a href="http://en.wikipedia.org/wiki/Device_independent_pixel">device-independent pixel</a> size. The Breakpoint module defines multipliers of 1, 1.5, and 2; when defining breakpoints, modules and themes can define which multipliers apply to each breakpoint.') . '</dd>';
|
||||
$output .= '<dt>' . t('Breakpoint group') . '</dt>';
|
||||
$output .= '<dd>' . t('Breakpoints can be organized into groups. Modules and themes should use groups to separate out breakpoints that are meant to be used for different purposes, such as breakpoints for layouts or breakpoints for image sizing.') . '</dd>';
|
||||
$output .= '</dl>';
|
||||
$output .= '<h3>' . t('Uses') . '</h3>';
|
||||
$output .= '<dl>';
|
||||
$output .= '<dt>' . t('Defining breakpoints and breakpoint groups') . '</dt>';
|
||||
$output .= '<dd>' . t('Modules and themes can use the API provided by the Breakpoint module to define breakpoints and breakpoint groups, and to assign resolution multipliers to breakpoints.') . '</dd>';
|
||||
$output .= '</dl>';
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_themes_installed()
|
||||
*/
|
||||
function breakpoint_themes_installed($theme_list) {
|
||||
\Drupal::service('breakpoint.manager')->clearCachedDefinitions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_themes_uninstalled()
|
||||
*/
|
||||
function breakpoint_themes_uninstalled($theme_list) {
|
||||
\Drupal::service('breakpoint.manager')->clearCachedDefinitions();
|
||||
}
|
6
core/modules/breakpoint/breakpoint.services.yml
Normal file
6
core/modules/breakpoint/breakpoint.services.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
services:
|
||||
breakpoint.manager:
|
||||
class: Drupal\breakpoint\BreakpointManager
|
||||
arguments: ['@module_handler', '@theme_handler', '@cache.discovery', '@string_translation']
|
||||
tags:
|
||||
- { name: plugin_manager_cache_clear }
|
62
core/modules/breakpoint/src/Breakpoint.php
Normal file
62
core/modules/breakpoint/src/Breakpoint.php
Normal file
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\breakpoint\Breakpoint.
|
||||
*/
|
||||
|
||||
namespace Drupal\breakpoint;
|
||||
|
||||
use Drupal\Core\Plugin\PluginBase;
|
||||
|
||||
/**
|
||||
* Default object used for breakpoint plugins.
|
||||
*
|
||||
* @see \Drupal\breakpoint\BreakpointManager
|
||||
* @see plugin_api
|
||||
*/
|
||||
class Breakpoint extends PluginBase implements BreakpointInterface {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getLabel() {
|
||||
return $this->t($this->pluginDefinition['label'], array(), array('context' => 'breakpoint'));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getWeight() {
|
||||
return (int) $this->pluginDefinition['weight'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getMediaQuery() {
|
||||
return $this->pluginDefinition['mediaQuery'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getMultipliers() {
|
||||
return $this->pluginDefinition['multipliers'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getProvider() {
|
||||
return $this->pluginDefinition['provider'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getGroup() {
|
||||
return $this->pluginDefinition['group'];
|
||||
}
|
||||
|
||||
}
|
63
core/modules/breakpoint/src/BreakpointInterface.php
Normal file
63
core/modules/breakpoint/src/BreakpointInterface.php
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\breakpoint\BreakpointInterface.
|
||||
*/
|
||||
|
||||
namespace Drupal\breakpoint;
|
||||
|
||||
/**
|
||||
* Interface for Breakpoint plugins.
|
||||
*/
|
||||
interface BreakpointInterface {
|
||||
|
||||
/**
|
||||
* Returns the translated label.
|
||||
*
|
||||
* @return string
|
||||
* The translated label.
|
||||
*/
|
||||
public function getLabel();
|
||||
|
||||
/**
|
||||
* Returns the weight.
|
||||
*
|
||||
* @return int
|
||||
* The weight.
|
||||
*/
|
||||
public function getWeight();
|
||||
|
||||
/**
|
||||
* Returns the media query.
|
||||
*
|
||||
* @return string
|
||||
* The media query.
|
||||
*/
|
||||
public function getMediaQuery();
|
||||
|
||||
/**
|
||||
* Returns the multipliers.
|
||||
*
|
||||
* @return array
|
||||
* The multipliers.
|
||||
*/
|
||||
public function getMultipliers();
|
||||
|
||||
/**
|
||||
* Returns the provider.
|
||||
*
|
||||
* @return string
|
||||
* The provider.
|
||||
*/
|
||||
public function getProvider();
|
||||
|
||||
/**
|
||||
* Returns the breakpoint group.
|
||||
*
|
||||
* @return string
|
||||
* The breakpoint group.
|
||||
*/
|
||||
public function getGroup();
|
||||
|
||||
}
|
263
core/modules/breakpoint/src/BreakpointManager.php
Normal file
263
core/modules/breakpoint/src/BreakpointManager.php
Normal file
|
@ -0,0 +1,263 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\breakpoint\BreakpointManager.
|
||||
*/
|
||||
|
||||
namespace Drupal\breakpoint;
|
||||
|
||||
use Drupal\Core\Cache\Cache;
|
||||
use Drupal\Core\Cache\CacheBackendInterface;
|
||||
use Drupal\Core\Extension\ModuleHandlerInterface;
|
||||
use Drupal\Core\Extension\ThemeHandlerInterface;
|
||||
use Drupal\Core\Plugin\DefaultPluginManager;
|
||||
use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator;
|
||||
use Drupal\Core\Plugin\Discovery\YamlDiscovery;
|
||||
use Drupal\Core\Plugin\Factory\ContainerFactory;
|
||||
use Drupal\Core\StringTranslation\StringTranslationTrait;
|
||||
use Drupal\Core\StringTranslation\TranslationInterface;
|
||||
|
||||
/**
|
||||
* Defines a breakpoint plugin manager to deal with breakpoints.
|
||||
*
|
||||
* Extension can define breakpoints in a EXTENSION_NAME.breakpoints.yml file
|
||||
* contained in the extension's base directory. Each breakpoint has the
|
||||
* following structure:
|
||||
* @code
|
||||
* MACHINE_NAME:
|
||||
* label: STRING
|
||||
* mediaQuery: STRING
|
||||
* weight: INTEGER
|
||||
* multipliers:
|
||||
* - STRING
|
||||
* @endcode
|
||||
* For example:
|
||||
* @code
|
||||
* bartik.mobile:
|
||||
* label: mobile
|
||||
* mediaQuery: '(min-width: 0px)'
|
||||
* weight: 0
|
||||
* multipliers:
|
||||
* - 1x
|
||||
* - 2x
|
||||
* @endcode
|
||||
* Optionally a breakpoint can provide a group key. By default an extensions
|
||||
* breakpoints will be placed in a group labelled with the extension name.
|
||||
*
|
||||
* @see \Drupal\breakpoint\Breakpoint
|
||||
* @see \Drupal\breakpoint\BreakpointInterface
|
||||
* @see plugin_api
|
||||
*/
|
||||
class BreakpointManager extends DefaultPluginManager implements BreakpointManagerInterface {
|
||||
use StringTranslationTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected $defaults = array(
|
||||
// Human readable label for breakpoint.
|
||||
'label' => '',
|
||||
// The media query for the breakpoint.
|
||||
'mediaQuery' => '',
|
||||
// Weight used for ordering breakpoints.
|
||||
'weight' => 0,
|
||||
// Breakpoint multipliers.
|
||||
'multipliers' => array(),
|
||||
// The breakpoint group.
|
||||
'group' => '',
|
||||
// Default class for breakpoint implementations.
|
||||
'class' => 'Drupal\breakpoint\Breakpoint',
|
||||
// The plugin id. Set by the plugin system based on the top-level YAML key.
|
||||
'id' => '',
|
||||
);
|
||||
|
||||
/**
|
||||
* The theme handler.
|
||||
*
|
||||
* @var \Drupal\Core\Extension\ThemeHandlerInterface
|
||||
*/
|
||||
protected $themeHandler;
|
||||
|
||||
/**
|
||||
* Static cache of breakpoints keyed by group.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $breakpointsByGroup;
|
||||
|
||||
/**
|
||||
* The plugin instances.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $instances = array();
|
||||
|
||||
/**
|
||||
* Constructs a new BreakpointManager instance.
|
||||
*
|
||||
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
|
||||
* The module handler.
|
||||
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
|
||||
* The theme handler.
|
||||
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
|
||||
* The cache backend.
|
||||
* @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
|
||||
* The string translation service.
|
||||
*/
|
||||
public function __construct(ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, CacheBackendInterface $cache_backend, TranslationInterface $string_translation) {
|
||||
$this->factory = new ContainerFactory($this);
|
||||
$this->moduleHandler = $module_handler;
|
||||
$this->themeHandler = $theme_handler;
|
||||
$this->setStringTranslation($string_translation);
|
||||
$this->alterInfo('breakpoints');
|
||||
$this->setCacheBackend($cache_backend, 'breakpoints', array('breakpoints'));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getDiscovery() {
|
||||
if (!isset($this->discovery)) {
|
||||
$this->discovery = new YamlDiscovery('breakpoints', $this->moduleHandler->getModuleDirectories() + $this->themeHandler->getThemeDirectories());
|
||||
$this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
|
||||
}
|
||||
return $this->discovery;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processDefinition(&$definition, $plugin_id) {
|
||||
parent::processDefinition($definition, $plugin_id);
|
||||
// Allow custom groups and therefore more than one group per extension.
|
||||
if (empty($definition['group'])) {
|
||||
$definition['group'] = $definition['provider'];
|
||||
}
|
||||
// Ensure a 1x multiplier exists.
|
||||
if (!in_array('1x', $definition['multipliers'])) {
|
||||
$definition['multipliers'][] = '1x';
|
||||
}
|
||||
// Ensure that multipliers are sorted correctly.
|
||||
sort($definition['multipliers']);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function providerExists($provider) {
|
||||
return $this->moduleHandler->moduleExists($provider) || $this->themeHandler->themeExists($provider);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getBreakpointsByGroup($group) {
|
||||
if (!isset($this->breakpointsByGroup[$group])) {
|
||||
if ($cache = $this->cacheBackend->get($this->cacheKey . ':' . $group)) {
|
||||
$this->breakpointsByGroup[$group] = $cache->data;
|
||||
}
|
||||
else {
|
||||
$breakpoints = array();
|
||||
foreach ($this->getDefinitions() as $plugin_id => $plugin_definition) {
|
||||
if ($plugin_definition['group'] == $group) {
|
||||
$breakpoints[$plugin_id] = $plugin_definition;
|
||||
}
|
||||
}
|
||||
uasort($breakpoints, array('Drupal\Component\Utility\SortArray', 'sortByWeightElement'));
|
||||
$this->cacheBackend->set($this->cacheKey . ':' . $group, $breakpoints, Cache::PERMANENT, array('breakpoints'));
|
||||
$this->breakpointsByGroup[$group] = $breakpoints;
|
||||
}
|
||||
}
|
||||
$instances = array();
|
||||
foreach ($this->breakpointsByGroup[$group] as $plugin_id => $definition) {
|
||||
if (!isset($this->instances[$plugin_id])) {
|
||||
$this->instances[$plugin_id] = $this->createInstance($plugin_id);
|
||||
}
|
||||
$instances[$plugin_id] = $this->instances[$plugin_id];
|
||||
}
|
||||
return $instances;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getGroups() {
|
||||
// Use a double colon so as to not clash with the cache for each group.
|
||||
if ($cache = $this->cacheBackend->get($this->cacheKey . '::groups')) {
|
||||
$groups = $cache->data;
|
||||
}
|
||||
else {
|
||||
$groups = array();
|
||||
foreach ($this->getDefinitions() as $plugin_definition) {
|
||||
if (!isset($groups[$plugin_definition['group']])) {
|
||||
$groups[$plugin_definition['group']] = $plugin_definition['group'];
|
||||
}
|
||||
}
|
||||
$this->cacheBackend->set($this->cacheKey . '::groups', $groups, Cache::PERMANENT, array('breakpoints'));
|
||||
}
|
||||
// Get the labels. This is not cacheable due to translation.
|
||||
$group_labels = array();
|
||||
foreach ($groups as $group) {
|
||||
$group_labels[$group] = $this->getGroupLabel($group);
|
||||
}
|
||||
asort($group_labels);
|
||||
return $group_labels;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getGroupProviders($group) {
|
||||
$providers = array();
|
||||
$breakpoints = $this->getBreakpointsByGroup($group);
|
||||
foreach ($breakpoints as $breakpoint) {
|
||||
$provider = $breakpoint->getProvider();
|
||||
$extension = FALSE;
|
||||
if ($this->moduleHandler->moduleExists($provider)) {
|
||||
$extension = $this->moduleHandler->getModule($provider);
|
||||
}
|
||||
elseif ($this->themeHandler->themeExists($provider)) {
|
||||
$extension = $this->themeHandler->getTheme($provider);
|
||||
}
|
||||
if ($extension) {
|
||||
$providers[$extension->getName()] = $extension->getType();
|
||||
}
|
||||
}
|
||||
return $providers;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function clearCachedDefinitions() {
|
||||
parent::clearCachedDefinitions();
|
||||
$this->breakpointsByGroup = NULL;
|
||||
$this->instances = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the label for a breakpoint group.
|
||||
*
|
||||
* @param string $group
|
||||
* The breakpoint group.
|
||||
*
|
||||
* @return string
|
||||
* The label.
|
||||
*/
|
||||
protected function getGroupLabel($group) {
|
||||
// Extension names are not translatable.
|
||||
if ($this->moduleHandler->moduleExists($group)) {
|
||||
$label = $this->moduleHandler->getName($group);
|
||||
}
|
||||
elseif ($this->themeHandler->themeExists($group)) {
|
||||
$label = $this->themeHandler->getName($group);
|
||||
}
|
||||
else {
|
||||
// Custom group label that should be translatable.
|
||||
$label = $this->t($group, array(), array('context' => 'breakpoint'));
|
||||
}
|
||||
return $label;
|
||||
}
|
||||
|
||||
}
|
46
core/modules/breakpoint/src/BreakpointManagerInterface.php
Normal file
46
core/modules/breakpoint/src/BreakpointManagerInterface.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\breakpoint\BreakpointManagerInterface.
|
||||
*/
|
||||
|
||||
namespace Drupal\breakpoint;
|
||||
|
||||
/**
|
||||
* Defines an interface for breakpoint managers.
|
||||
*/
|
||||
interface BreakpointManagerInterface {
|
||||
|
||||
/**
|
||||
* Gets breakpoints for the specified group.
|
||||
*
|
||||
* @param string $group
|
||||
* The breakpoint group to retrieve.
|
||||
*
|
||||
* @return \Drupal\breakpoint\BreakpointInterface[]
|
||||
* Array of breakpoint plugins keyed by machine name.
|
||||
*/
|
||||
public function getBreakpointsByGroup($group);
|
||||
|
||||
/**
|
||||
* Gets all the existing breakpoint groups.
|
||||
*
|
||||
* @return array
|
||||
* Array of breakpoint group labels. Keyed by group name.
|
||||
*/
|
||||
public function getGroups();
|
||||
|
||||
/**
|
||||
* Gets all the providers for the specified breakpoint group.
|
||||
*
|
||||
* @param string $group
|
||||
* The breakpoint group to retrieve.
|
||||
*
|
||||
* @return array
|
||||
* An array keyed by provider name with values of provider type (module or
|
||||
* theme).
|
||||
*/
|
||||
public function getGroupProviders($group);
|
||||
|
||||
}
|
208
core/modules/breakpoint/src/Tests/BreakpointDiscoveryTest.php
Normal file
208
core/modules/breakpoint/src/Tests/BreakpointDiscoveryTest.php
Normal file
|
@ -0,0 +1,208 @@
|
|||
<?php
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\breakpoint\Tests\BreakpointDiscoveryTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\breakpoint\Tests;
|
||||
|
||||
use Drupal\simpletest\KernelTestBase;
|
||||
|
||||
/**
|
||||
* Tests discovery of breakpoints provided by themes and modules.
|
||||
*
|
||||
* @group breakpoint
|
||||
*/
|
||||
class BreakpointDiscoveryTest extends KernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to install.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('system', 'breakpoint', 'breakpoint_module_test');
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->installSchema('system', array('router'));
|
||||
\Drupal::service('theme_handler')->install(array('breakpoint_theme_test'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the breakpoint group created for a theme.
|
||||
*/
|
||||
public function testThemeBreakpoints() {
|
||||
// Verify the breakpoint group for breakpoint_theme_test was created.
|
||||
$expected_breakpoints = array(
|
||||
'breakpoint_theme_test.tv' => array(
|
||||
'label' => 'tv',
|
||||
'mediaQuery' => 'only screen and (min-width: 1220px)',
|
||||
'weight' => 0,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.tv',
|
||||
'group' => 'breakpoint_theme_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_theme_test.wide' => array(
|
||||
'label' => 'wide',
|
||||
'mediaQuery' => '(min-width: 851px)',
|
||||
'weight' => 1,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.wide',
|
||||
'group' => 'breakpoint_theme_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_theme_test.narrow' => array(
|
||||
'label' => 'narrow',
|
||||
'mediaQuery' => '(min-width: 560px)',
|
||||
'weight' => 2,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.narrow',
|
||||
'group' => 'breakpoint_theme_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_theme_test.mobile' => array(
|
||||
'label' => 'mobile',
|
||||
'mediaQuery' => '(min-width: 0px)',
|
||||
'weight' => 3,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.mobile',
|
||||
'group' => 'breakpoint_theme_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
);
|
||||
|
||||
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_theme_test');
|
||||
foreach ($expected_breakpoints as $id => $expected_breakpoint) {
|
||||
$this->assertEqual($expected_breakpoint, $breakpoints[$id]->getPluginDefinition());
|
||||
}
|
||||
|
||||
// Test that the order is as expected.
|
||||
$this->assertIdentical(array_keys($expected_breakpoints), array_keys($breakpoints));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the custom breakpoint group provided by a theme and a module.
|
||||
*/
|
||||
public function testCustomBreakpointGroups () {
|
||||
// Verify the breakpoint group for breakpoint_theme_test.group2 was created.
|
||||
$expected_breakpoints = array(
|
||||
'breakpoint_theme_test.group2.narrow' => array(
|
||||
'label' => 'narrow',
|
||||
'mediaQuery' => '(min-width: 560px)',
|
||||
'weight' => 2,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
'2x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.group2.narrow',
|
||||
'group' => 'breakpoint_theme_test.group2',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_theme_test.group2.wide' => array(
|
||||
'label' => 'wide',
|
||||
'mediaQuery' => '(min-width: 851px)',
|
||||
'weight' => 1,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
'2x',
|
||||
),
|
||||
'provider' => 'breakpoint_theme_test',
|
||||
'id' => 'breakpoint_theme_test.group2.wide',
|
||||
'group' => 'breakpoint_theme_test.group2',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_module_test.breakpoint_theme_test.group2.tv' => array(
|
||||
'label' => 'tv',
|
||||
'mediaQuery' => '(min-width: 6000px)',
|
||||
'weight' => 0,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_module_test',
|
||||
'id' => 'breakpoint_module_test.breakpoint_theme_test.group2.tv',
|
||||
'group' => 'breakpoint_theme_test.group2',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
);
|
||||
|
||||
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_theme_test.group2');
|
||||
foreach ($expected_breakpoints as $id => $expected_breakpoint) {
|
||||
$this->assertEqual($expected_breakpoint, $breakpoints[$id]->getPluginDefinition());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the breakpoint group created for a module.
|
||||
*/
|
||||
public function testModuleBreakpoints() {
|
||||
$expected_breakpoints = array(
|
||||
'breakpoint_module_test.mobile' => array(
|
||||
'label' => 'mobile',
|
||||
'mediaQuery' => '(min-width: 0px)',
|
||||
'weight' => 1,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
),
|
||||
'provider' => 'breakpoint_module_test',
|
||||
'id' => 'breakpoint_module_test.mobile',
|
||||
'group' => 'breakpoint_module_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
'breakpoint_module_test.standard' => array(
|
||||
'label' => 'standard',
|
||||
'mediaQuery' => '(min-width: 560px)',
|
||||
'weight' => 0,
|
||||
'multipliers' => array(
|
||||
'1x',
|
||||
'2x',
|
||||
),
|
||||
'provider' => 'breakpoint_module_test',
|
||||
'id' => 'breakpoint_module_test.standard',
|
||||
'group' => 'breakpoint_module_test',
|
||||
'class' => 'Drupal\\breakpoint\\Breakpoint',
|
||||
),
|
||||
);
|
||||
|
||||
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_module_test');
|
||||
foreach ($expected_breakpoints as $id => $expected_breakpoint) {
|
||||
$this->assertEqual($expected_breakpoint, $breakpoints[$id]->getPluginDefinition());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the collection of breakpoint groups.
|
||||
*/
|
||||
public function testBreakpointGroups() {
|
||||
$expected = array(
|
||||
'bartik' => 'Bartik',
|
||||
'breakpoint_module_test' => 'Breakpoint test module',
|
||||
'breakpoint_theme_test' => 'Breakpoint test theme',
|
||||
'breakpoint_theme_test.group2' => 'breakpoint_theme_test.group2',
|
||||
);
|
||||
$breakpoint_groups = \Drupal::service('breakpoint.manager')->getGroups();
|
||||
// Ensure the order is as expected. Should be sorted by label.
|
||||
$this->assertIdentical($expected, $breakpoint_groups);
|
||||
|
||||
$expected = array(
|
||||
'breakpoint_theme_test' => 'theme',
|
||||
'breakpoint_module_test' => 'module',
|
||||
);
|
||||
$breakpoint_group_providers = \Drupal::service('breakpoint.manager')->getGroupProviders('breakpoint_theme_test.group2');
|
||||
$this->assertEqual($expected, $breakpoint_group_providers);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
breakpoint_module_test.mobile:
|
||||
label: mobile
|
||||
mediaQuery: '(min-width: 0px)'
|
||||
weight: 1
|
||||
# Don't include multipliers. A 1x multiplier this will be enforced by default.
|
||||
breakpoint_module_test.standard:
|
||||
label: standard
|
||||
mediaQuery: '(min-width: 560px)'
|
||||
weight: 0
|
||||
# Don't include a 1x multiplier this will be enforced by default.
|
||||
multipliers:
|
||||
- 2x
|
||||
# Test providing a breakpoint for group matching the group provided by
|
||||
# breakpoint_test_theme.
|
||||
breakpoint_module_test.breakpoint_theme_test.group2.tv:
|
||||
label: tv
|
||||
mediaQuery: '(min-width: 6000px)'
|
||||
weight: 0
|
||||
multipliers:
|
||||
- 1x
|
||||
group: breakpoint_theme_test.group2
|
|
@ -0,0 +1,7 @@
|
|||
name: 'Breakpoint test module'
|
||||
type: module
|
||||
description: 'Test module for breakpoint.'
|
||||
package: Testing
|
||||
version: VERSION
|
||||
core: 8.x
|
||||
|
122
core/modules/breakpoint/tests/src/Unit/BreakpointTest.php
Normal file
122
core/modules/breakpoint/tests/src/Unit/BreakpointTest.php
Normal file
|
@ -0,0 +1,122 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\breakpoint\Unit\BreakpointTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\breakpoint\Unit;
|
||||
|
||||
use Drupal\breakpoint\Breakpoint;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\breakpoint\Breakpoint
|
||||
* @group Breakpoint
|
||||
*/
|
||||
class BreakpointTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The used plugin ID.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $pluginId = 'breakpoint';
|
||||
|
||||
/**
|
||||
* The used plugin definition.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $pluginDefinition = array(
|
||||
'id' => 'breakpoint',
|
||||
);
|
||||
|
||||
/**
|
||||
* The breakpoint under test.
|
||||
*
|
||||
* @var \Drupal\breakpoint\Breakpoint
|
||||
*/
|
||||
protected $breakpoint;
|
||||
|
||||
/**
|
||||
* The mocked translator.
|
||||
*
|
||||
* @var \Drupal\Core\StringTranslation\TranslationInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $stringTranslation;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->stringTranslation = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up the breakpoint defaults.
|
||||
*/
|
||||
protected function setupBreakpoint() {
|
||||
$this->breakpoint = new Breakpoint(array(), $this->pluginId, $this->pluginDefinition);
|
||||
$this->breakpoint->setStringTranslation($this->stringTranslation);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getLabel
|
||||
*/
|
||||
public function testGetLabel() {
|
||||
$this->pluginDefinition['label'] = 'Test label';
|
||||
$this->stringTranslation->expects($this->once())
|
||||
->method('translate')
|
||||
->with($this->pluginDefinition['label'], array(), array('context' => 'breakpoint'))
|
||||
->will($this->returnValue('Test label translated'));
|
||||
$this->setupBreakpoint();
|
||||
$this->assertEquals('Test label translated', $this->breakpoint->getLabel());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getWeight
|
||||
*/
|
||||
public function testGetWeight() {
|
||||
$this->pluginDefinition['weight'] = '4';
|
||||
$this->setupBreakpoint();
|
||||
// Assert that the type returned in an integer.
|
||||
$this->assertSame(4, $this->breakpoint->getWeight());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getMediaQuery
|
||||
*/
|
||||
public function testGetMediaQuery() {
|
||||
$this->pluginDefinition['mediaQuery'] = 'only screen and (min-width: 1220px)';
|
||||
$this->setupBreakpoint();
|
||||
$this->assertEquals('only screen and (min-width: 1220px)', $this->breakpoint->getMediaQuery());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getMultipliers
|
||||
*/
|
||||
public function testGetMultipliers() {
|
||||
$this->pluginDefinition['multipliers'] = array('1x', '2x');
|
||||
$this->setupBreakpoint();
|
||||
$this->assertSame(array('1x', '2x'), $this->breakpoint->getMultipliers());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getProvider
|
||||
*/
|
||||
public function testGetProvider() {
|
||||
$this->pluginDefinition['provider'] = 'Breakpoint';
|
||||
$this->setupBreakpoint();
|
||||
$this->assertEquals('Breakpoint', $this->breakpoint->getProvider());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getGroup
|
||||
*/
|
||||
public function testGetGroup() {
|
||||
$this->pluginDefinition['group'] = 'Breakpoint';
|
||||
$this->setupBreakpoint();
|
||||
$this->assertEquals('Breakpoint', $this->breakpoint->getGroup());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
breakpoint_theme_test.mobile:
|
||||
label: mobile
|
||||
mediaQuery: '(min-width: 0px)'
|
||||
weight: 3
|
||||
multipliers:
|
||||
- 1x
|
||||
breakpoint_theme_test.narrow:
|
||||
label: narrow
|
||||
mediaQuery: '(min-width: 560px)'
|
||||
weight: 2
|
||||
multipliers:
|
||||
- 1x
|
||||
# Out of order breakpoint to test sorting.
|
||||
breakpoint_theme_test.tv:
|
||||
label: tv
|
||||
mediaQuery: 'only screen and (min-width: 1220px)'
|
||||
weight: 0
|
||||
multipliers:
|
||||
- 1x
|
||||
breakpoint_theme_test.wide:
|
||||
label: wide
|
||||
mediaQuery: '(min-width: 851px)'
|
||||
weight: 1
|
||||
multipliers:
|
||||
- 1x
|
||||
breakpoint_theme_test.group2.narrow:
|
||||
label: narrow
|
||||
mediaQuery: '(min-width: 560px)'
|
||||
weight: 2
|
||||
multipliers:
|
||||
- 1x
|
||||
- 2x
|
||||
group: breakpoint_theme_test.group2
|
||||
breakpoint_theme_test.group2.wide:
|
||||
label: wide
|
||||
mediaQuery: '(min-width: 851px)'
|
||||
weight: 1
|
||||
multipliers:
|
||||
- 1x
|
||||
- 2x
|
||||
group: breakpoint_theme_test.group2
|
|
@ -0,0 +1,6 @@
|
|||
name: 'Breakpoint test theme'
|
||||
type: theme
|
||||
description: 'Test theme for breakpoint.'
|
||||
version: VERSION
|
||||
core: 8.x
|
||||
base theme: bartik
|
Reference in a new issue