Adrian Heine has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/281635

Change subject: ""
......................................................................

""

Depends-On: Idbd054880ee70d659ec760aef8fcb38d0704a394
Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
---
M docs/entitytypes.wiki
M lib/includes/EntityTypeDefinitions.php
A repo/includes/Modules/EntityTypesModuleWorker.php
A repo/includes/Modules/MwConfigModule.php
A repo/includes/Modules/MwConfigModuleWorker.php
M repo/includes/WikibaseRepo.php
M repo/resources/Resources.php
M repo/resources/wikibase.EntityInitializer.js
8 files changed, 165 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/35/281635/1

diff --git a/docs/entitytypes.wiki b/docs/entitytypes.wiki
index 697e7b9..80120b3 100644
--- a/docs/entitytypes.wiki
+++ b/docs/entitytypes.wiki
@@ -52,6 +52,8 @@
 : a string representing the id of the content model
 ; content-handler-factory-callback (repo only)
 : a callable that returns an EntityHandler instance supporting this entity type
+; js-deserializer-factory-function (repo only)
+: a string representing a resource loader module that, when `require`d, 
returns a deserializer
 
 Extensions that wish to register an entity type should use the 
WikibaseRepoEntityTypes respectively
 WikibaseClientEntityTypes hooks to provide additional entity type definitions.
diff --git a/lib/includes/EntityTypeDefinitions.php 
b/lib/includes/EntityTypeDefinitions.php
index c2c44cf..d674200 100644
--- a/lib/includes/EntityTypeDefinitions.php
+++ b/lib/includes/EntityTypeDefinitions.php
@@ -109,4 +109,11 @@
                return $this->getMapForDefinitionField( 
'content-handler-factory-callback' );
        }
 
+       /**
+        * @return string[]
+        */
+       public function getJsDeserializerFactoryFunctions() {
+               return $this->getMapForDefinitionField( 
'js-deserializer-factory-function' );
+       }
+
 }
diff --git a/repo/includes/Modules/EntityTypesModuleWorker.php 
b/repo/includes/Modules/EntityTypesModuleWorker.php
new file mode 100644
index 0000000..a8a3bf1
--- /dev/null
+++ b/repo/includes/Modules/EntityTypesModuleWorker.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+use Wikibase\Lib\EntityTypeDefinitions;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class EntityTypesModuleWorker implements MwConfigModuleWorker {
+
+       /**
+        * @var EntityTypeDefinitions
+        */
+       private $entityTypeDefinitions;
+
+       public function __construct( EntityTypeDefinitions 
$entityTypeDefinitions ) {
+               $this->entityTypeDefinitions = $entityTypeDefinitions;
+       }
+
+       /**
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return mixed
+        */
+       public function getValue( ResourceLoaderContext $context ) {
+               return [
+                       "types" => 
$this->entityTypeDefinitions->getEntityTypes(),
+                       "deserializer-factory-functions" => 
$this->entityTypeDefinitions->getJsDeserializerFactoryFunctions()
+               ];
+       }
+
+}
diff --git a/repo/includes/Modules/MwConfigModule.php 
b/repo/includes/Modules/MwConfigModule.php
new file mode 100644
index 0000000..c5a1898
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModule.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoader;
+use ResourceLoaderContext;
+use ResourceLoaderModule;
+use Xml;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class MwConfigModule extends ResourceLoaderModule {
+
+       /**
+        * @var string
+        */
+       private $configName;
+
+       /**
+        * @var callable
+        */
+       private $getWorker;
+
+       public function __construct( $info ) {
+               $this->getWorker = $info['getworker'];
+               $this->configName = $info['name'];
+       }
+
+       /**
+        * @see ResourceLoaderModule::getScript
+        *
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return string
+        */
+       public function getScript( ResourceLoaderContext $context ) {
+               return Xml::encodeJsCall(
+                       'mediaWiki.config.set',
+                       [
+                               $this->configName,
+                               call_user_func( $this->getWorker )->getValue( 
$context )
+                       ],
+                       ResourceLoader::inDebugMode()
+               );
+       }
+
+       /**
+        * @return bool
+        */
+       public function enableModuleContentVersion() {
+               return true;
+       }
+
+}
diff --git a/repo/includes/Modules/MwConfigModuleWorker.php 
b/repo/includes/Modules/MwConfigModuleWorker.php
new file mode 100644
index 0000000..0ec31f3
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModuleWorker.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+interface MwConfigModuleWorker {
+
+       /**
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return mixed
+        */
+       public function getValue( ResourceLoaderContext $context );
+
+}
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 7b0fe68..e2916dd 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -105,6 +105,7 @@
 use Wikibase\Repo\Localizer\MessageExceptionLocalizer;
 use Wikibase\Repo\Localizer\MessageParameterFormatter;
 use Wikibase\Repo\Localizer\ParseExceptionLocalizer;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
 use Wikibase\Repo\Notifications\ChangeNotifier;
 use Wikibase\Repo\Notifications\ChangeTransmitter;
 use Wikibase\Repo\Notifications\DatabaseChangeTransmitter;
@@ -1660,4 +1661,7 @@
                return new WikibaseHtmlSnakFormatterFactory( 
$this->getSnakFormatterFactory() );
        }
 
+       public function getEntityTypesModuleWorker() {
+               return new EntityTypesModuleWorker( 
$this->entityTypeDefinitions );
+       }
 }
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index e935bbb..53c2ada 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -1,6 +1,8 @@
 <?php
 
 use DataTypes\Modules\DataTypesModule;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
+use Wikibase\Repo\Modules\MwConfigModule;
 use Wikibase\Repo\WikibaseRepo;
 
 /**
@@ -48,6 +50,14 @@
                        'datatypesconfigvarname' => 'wbDataTypes',
                ),
 
+               'mw.config.values.wbEntityTypes' => $moduleTemplate + [
+                       'class' => MwConfigModule::class,
+                       'name' => 'wbEntityTypes',
+                       'getworker' => function() {
+                               return 
WikibaseRepo::getDefaultInstance()->getEntityTypesModuleWorker();
+                       }
+               ],
+
                'wikibase.dataTypeStore' => $moduleTemplate + array(
                        'scripts' => array(
                                'dataTypes/wikibase.dataTypeStore.js',
@@ -68,6 +78,7 @@
                        'dependencies' => array(
                                'mediawiki.page.watch.ajax',
                                'mediawiki.user',
+                               'mw.config.values.wbEntityTypes',
                                'mw.config.values.wbRepo',
                                'jquery.wikibase.toolbarcontroller',
                                
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
@@ -99,7 +110,6 @@
                                'wikibase.parsers.getStore',
                                'wikibase.api.RepoApi',
                                'wikibase.RevisionStore',
-                               'wikibase.serialization.EntityDeserializer',
                                'wikibase.serialization.EntityDeserializer',
                                'wikibase.sites',
                                'wikibase.store.ApiEntityStore',
diff --git a/repo/resources/wikibase.EntityInitializer.js 
b/repo/resources/wikibase.EntityInitializer.js
index ca67e69..a11568c 100644
--- a/repo/resources/wikibase.EntityInitializer.js
+++ b/repo/resources/wikibase.EntityInitializer.js
@@ -84,8 +84,24 @@
                                var entityJSON = JSON.parse( serializedEntity ),
                                        entityDeserializer = new 
wb.serialization.EntityDeserializer();
 
-                               deferred.resolve( 
entityDeserializer.deserialize( entityJSON ) );
-                               entityJSON = null;
+                               var entityTypes = 
mw.config.get('wbEntityTypes');
+                               var modules = [];
+                               var typeNames = [];
+                               entityTypes.types.forEach( function( type ) {
+                                       var deserializerFactoryFunction = 
entityTypes[ 'deserializer-factory-functions' ][ type ];
+                                       if( deserializerFactoryFunction ) {
+                                               modules.push( 
deserializerFactoryFunction );
+                                               typeNames.push( type );
+                                       }
+                               } );
+                               mw.loader.using( modules, function() {
+                                       modules.forEach( function( module, 
index ) {
+                                               
entityDeserializer.registerStrategy( mw.loader.require( module ), typeNames[ 
index ] );
+                                       } );
+
+                                       deferred.resolve( 
entityDeserializer.deserialize( entityJSON ) );
+                                       entityJSON = null;
+                               } );
                        } );
 
                        return deferred.promise();

-- 
To view, visit https://gerrit.wikimedia.org/r/281635
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Heine <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to