Plugin endpoint parameters
Enable plugin extension endpoints to accept and pass parameters to plugin-provided web components. Declare a named parameter: ``` html <gr-endpoint-decorator name="some-endpoint"> <gr-endpoint-param name="someParam" value="[[someParam]]"> </gr-endpoint-param> </gr-endpoint-decorator> ``` Register a component and get the parameter in the plugin: ``` js Gerrit.install(plugin => { plugin.registerCustomComponent( 'some-endpoint', 'my-plugin-element'); }); ``` ``` html <dom-module id="my-plugin-element"> <template></template> <script> Polymer({ is: 'my-plugin-element', attached() { // Receive the parameter passed in from endpoint console.log(this.someParam); }, }); </script> </dom-module> ``` Change-Id: Ie6b2d92107f332c74532e4462898ae0d876c4603
This commit is contained in:
@@ -40,20 +40,41 @@
|
|||||||
|
|
||||||
_initDecoration(name, plugin) {
|
_initDecoration(name, plugin) {
|
||||||
const el = document.createElement(name);
|
const el = document.createElement(name);
|
||||||
el.plugin = plugin;
|
this._initProperties(el, plugin, this.getContentChildren().find(
|
||||||
el.content = this.getContentChildren()[0];
|
el => el.nodeName !== 'GR-ENDPOINT-PARAM'));
|
||||||
this._appendChild(el);
|
this._appendChild(el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
_initReplacement(name, plugin) {
|
_initReplacement(name, plugin) {
|
||||||
this.getContentChildren().forEach(node => node.remove());
|
this.getContentChildNodes().forEach(node => node.remove());
|
||||||
const el = document.createElement(name);
|
const el = document.createElement(name);
|
||||||
el.plugin = plugin;
|
this._initProperties(el, plugin);
|
||||||
this._appendChild(el);
|
this._appendChild(el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getEndpointParams() {
|
||||||
|
return Polymer.dom(this).querySelectorAll('gr-endpoint-param').map(el => {
|
||||||
|
return {name: el.getAttribute('name'), value: el.value};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!Element} el
|
||||||
|
* @param {!Object} plugin
|
||||||
|
* @param {!Element=} opt_content
|
||||||
|
*/
|
||||||
|
_initProperties(el, plugin, opt_content) {
|
||||||
|
el.plugin = plugin;
|
||||||
|
if (opt_content) {
|
||||||
|
el.content = opt_content;
|
||||||
|
}
|
||||||
|
for (const {name, value} of this._getEndpointParams()) {
|
||||||
|
el[name] = value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_appendChild(el) {
|
_appendChild(el) {
|
||||||
Polymer.dom(this.root).appendChild(el);
|
Polymer.dom(this.root).appendChild(el);
|
||||||
},
|
},
|
||||||
|
@@ -22,10 +22,13 @@ limitations under the License.
|
|||||||
<script src="../../../bower_components/web-component-tester/browser.js"></script>
|
<script src="../../../bower_components/web-component-tester/browser.js"></script>
|
||||||
<link rel="import" href="../../../test/common-test-setup.html"/>
|
<link rel="import" href="../../../test/common-test-setup.html"/>
|
||||||
<link rel="import" href="gr-endpoint-decorator.html">
|
<link rel="import" href="gr-endpoint-decorator.html">
|
||||||
|
<link rel="import" href="../gr-endpoint-param/gr-endpoint-param.html">
|
||||||
|
|
||||||
<test-fixture id="basic">
|
<test-fixture id="basic">
|
||||||
<template>
|
<template>
|
||||||
<gr-endpoint-decorator name="foo"></gr-endpoint-decorator>
|
<gr-endpoint-decorator name="foo">
|
||||||
|
<gr-endpoint-param name="someparam" value="barbar"></gr-endpoint-param>
|
||||||
|
</gr-endpoint-decorator>
|
||||||
</template>
|
</template>
|
||||||
</test-fixture>
|
</test-fixture>
|
||||||
|
|
||||||
@@ -44,6 +47,7 @@ limitations under the License.
|
|||||||
domHookStub = {
|
domHookStub = {
|
||||||
handleInstanceAttached: sandbox.stub(),
|
handleInstanceAttached: sandbox.stub(),
|
||||||
handleInstanceDetached: sandbox.stub(),
|
handleInstanceDetached: sandbox.stub(),
|
||||||
|
getPublicAPI: () => domHookStub,
|
||||||
};
|
};
|
||||||
sandbox.stub(
|
sandbox.stub(
|
||||||
GrDomHooksManager.prototype, 'getDomHook').returns(domHookStub);
|
GrDomHooksManager.prototype, 'getDomHook').returns(domHookStub);
|
||||||
@@ -53,6 +57,7 @@ limitations under the License.
|
|||||||
plugin = p;
|
plugin = p;
|
||||||
plugin.registerCustomComponent('foo', 'some-module');
|
plugin.registerCustomComponent('foo', 'some-module');
|
||||||
plugin.registerCustomComponent('foo', 'other-module', {replace: true});
|
plugin.registerCustomComponent('foo', 'other-module', {replace: true});
|
||||||
|
plugin.registerCustomComponent('bar', 'some-module');
|
||||||
}, '0.1', 'http://some/plugin/url.html');
|
}, '0.1', 'http://some/plugin/url.html');
|
||||||
|
|
||||||
sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
|
sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
|
||||||
@@ -110,5 +115,11 @@ limitations under the License.
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('params', () => {
|
||||||
|
const instance = document.createElement('foo');
|
||||||
|
element._initProperties(instance, plugin);
|
||||||
|
assert.equal(instance.someparam, 'barbar');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2017 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<link rel="import" href="../../../bower_components/polymer/polymer.html">
|
||||||
|
|
||||||
|
<dom-module id="gr-endpoint-param">
|
||||||
|
<script src="gr-endpoint-param.js"></script>
|
||||||
|
</dom-module>
|
@@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (C) 2017 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
Polymer({
|
||||||
|
is: 'gr-endpoint-param',
|
||||||
|
properties: {
|
||||||
|
name: String,
|
||||||
|
value: Object,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})();
|
@@ -102,6 +102,7 @@ limitations under the License.
|
|||||||
'diff/gr-syntax-layer/gr-syntax-layer_test.html',
|
'diff/gr-syntax-layer/gr-syntax-layer_test.html',
|
||||||
'diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html',
|
'diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html',
|
||||||
'plugins/gr-attribute-helper/gr-attribute-helper_test.html',
|
'plugins/gr-attribute-helper/gr-attribute-helper_test.html',
|
||||||
|
'plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html',
|
||||||
'plugins/gr-event-helper/gr-event-helper_test.html',
|
'plugins/gr-event-helper/gr-event-helper_test.html',
|
||||||
'plugins/gr-external-style/gr-external-style_test.html',
|
'plugins/gr-external-style/gr-external-style_test.html',
|
||||||
'plugins/gr-plugin-host/gr-plugin-host_test.html',
|
'plugins/gr-plugin-host/gr-plugin-host_test.html',
|
||||||
|
Reference in New Issue
Block a user