For example it can be added as `Application.get().getHeaderContributorListeners()`
On Tue, 14 Jan 2020 at 16:03, Maxim Solodovnik <solomax...@gmail.com> wrote: > `!important` is not the silver bullet (as well as inline style) > > `renderHead` is not as important as `onConfigure`, so I believe it > shouldn't be made mandatory > Maybe there is some `hackish` way to inject this css only once for any > component hierarchy? > > On Tue, 14 Jan 2020 at 15:55, Emond Papegaaij <emond.papega...@gmail.com> > wrote: > >> Rendering components without a page will indeed require you to include >> the core css file yourself. I think that's better than adding the css >> file with every component, as that will impose a massive overhead. >> I've renamed the css file to wicket-core.css as suggested by Martin. >> The idea is to collect all styling used with wicket-core in this css >> file. I do not like the idea to use a behavior for adding the >> stylesheet, as that will increase the size of every page. Maybe a >> temporary behavior can be used, but that will need to be re-added on >> every render then. Maybe, we can add a check to super.renderHead, like >> we do with onConfgure and onInitialize? >> >> Using the hidden attribute is not a good idea, for the same reason as >> I chose to use !important in the css file: any matching css rule that >> is more specify will otherwise override the visibility and cause the >> component to be visible anyway (like display: flex). >> >> Best regards, >> Emond >> >> On Tue, Jan 14, 2020 at 9:10 AM Maxim Solodovnik <solomax...@gmail.com> >> wrote: >> > >> > The problem as I see it >> > The component will be rendered without page (and without CSS file >> itself) >> > so element with this class will actually be visible .... >> > >> > On Tue, 14 Jan 2020 at 15:08, Martin Grigorov <mgrigo...@apache.org> >> wrote: >> > >> > > On Tue, Jan 14, 2020 at 10:01 AM Maxim Solodovnik < >> solomax...@gmail.com> >> > > wrote: >> > > >> > > > An related question: >> > > > Will this code >> > > > >> > > > >> > > >> `org.apache.wicket.core.util.string.ComponentRenderer.renderComponent(Component)` >> > > > work as expected? >> > > > >> > > >> > > This method will render the component with class="wicket--hidden" on >> its >> > > HTML element. With TagTester you can verify >> > > CSP checks are done only by the browsers. >> > > >> > > >> > > > >> > > > >> > > > On Tue, 14 Jan 2020 at 14:15, Maxim Solodovnik < >> solomax...@gmail.com> >> > > > wrote: >> > > > >> > > > > Is this comment make sense: >> > > > > >> > > > >> > > >> https://github.com/apache/wicket/commit/6d91a6a9e5c1d955a53571f9fb0f76262ac5c5d2#r36784645 >> > > > > ? >> > > > > >> > > > > On Tue, 14 Jan 2020 at 14:13, Martin Grigorov < >> mgrigo...@apache.org> >> > > > > wrote: >> > > > > >> > > > >> On Tue, Jan 14, 2020 at 9:05 AM Maxim Solodovnik < >> > > solomax...@gmail.com> >> > > > >> wrote: >> > > > >> >> > > > >> > Wasn't aware of `hidden` attribute >> > > > >> > (and it seems to be widely supported >> > > > >> > >> > > > >> >> > > > >> > > >> https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden >> > > > >> > ) >> > > > >> > >> > > > >> >> > > > >> Thanks for the reference, Maxim! >> > > > >> >> > > > >> It says "elements that are descendants of a hidden element are >> still >> > > > >> active, which means that script elements can still execute and >> form >> > > > >> elements can still submit" and this is different than display: >> none. >> > > > >> So we should stick with CSS display! >> > > > >> >> > > > >> >> > > > >> > Thanks :) >> > > > >> > >> > > > >> > On Tue, 14 Jan 2020 at 14:01, Martin Grigorov < >> mgrigo...@apache.org >> > > > >> > > > >> > wrote: >> > > > >> > >> > > > >> > > Hi, >> > > > >> > > >> > > > >> > > 1) I see that such CSS resource might be used for other >> needs, not >> > > > >> just >> > > > >> > > this particular case but would it be an option to use >> "hidden" >> > > > >> attribute >> > > > >> > in >> > > > >> > > this case instead of CSS "display" ? >> > > > >> > > >> > > > >> > > 2) wicket-core.css instead of wicket-base.css ? >> > > > >> > > >> > > > >> > > On Mon, Jan 13, 2020 at 9:43 PM <papega...@apache.org> >> wrote: >> > > > >> > > >> > > > >> > > > This is an automated email from the ASF dual-hosted git >> > > > repository. >> > > > >> > > > >> > > > >> > > > papegaaij pushed a commit to branch csp >> > > > >> > > > in repository >> https://gitbox.apache.org/repos/asf/wicket.git >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > The following commit(s) were added to refs/heads/csp by >> this >> > > push: >> > > > >> > > > new 6d91a6a WICKET-6725: replace display:none by >> > > > >> wicket--hidden >> > > > >> > css >> > > > >> > > > class >> > > > >> > > > 6d91a6a is described below >> > > > >> > > > >> > > > >> > > > commit 6d91a6a9e5c1d955a53571f9fb0f76262ac5c5d2 >> > > > >> > > > Author: Emond Papegaaij <emond.papega...@topicus.nl> >> > > > >> > > > AuthorDate: Mon Jan 13 20:43:01 2020 +0100 >> > > > >> > > > >> > > > >> > > > WICKET-6725: replace display:none by wicket--hidden css >> > > class >> > > > >> > > > --- >> > > > >> > > > .../src/main/java/org/apache/wicket/Component.java | 2 +- >> > > > >> > > > .../src/main/java/org/apache/wicket/Page.java | 11 >> +++++++ >> > > > >> > > > .../wicket/css/WicketBaseCSSResourceReference.java | 36 >> > > > >> > > > ++++++++++++++++++++++ >> > > > >> > > > .../java/org/apache/wicket/css/wicket-base.css | 3 ++ >> > > > >> > > > .../apache/wicket/settings/ResourceSettings.java | 31 >> > > > >> > > > +++++++++++++++++++ >> > > > >> > > > .../ajax/markup/html/AjaxIndicatorAppender.java | 2 +- >> > > > >> > > > 6 files changed, 83 insertions(+), 2 deletions(-) >> > > > >> > > > >> > > > >> > > > diff --git >> > > > >> a/wicket-core/src/main/java/org/apache/wicket/Component.java >> > > > >> > > > >> b/wicket-core/src/main/java/org/apache/wicket/Component.java >> > > > >> > > > index 9da8ec5..d2da23b 100644 >> > > > >> > > > --- >> a/wicket-core/src/main/java/org/apache/wicket/Component.java >> > > > >> > > > +++ >> b/wicket-core/src/main/java/org/apache/wicket/Component.java >> > > > >> > > > @@ -2367,7 +2367,7 @@ public abstract class Component >> > > > >> > > > response.write(name); >> > > > >> > > > response.write(" id=\""); >> > > > >> > > > response.write(getAjaxRegionMarkupId()); >> > > > >> > > > - response.write("\" style=\"display:none\" >> > > > >> > > > data-wicket-placeholder=\"\"></"); >> > > > >> > > > + response.write("\" class=\"wicket--hidden\" >> > > > >> > > > data-wicket-placeholder=\"\"></"); >> > > > >> > > > response.write(name); >> > > > >> > > > response.write(">"); >> > > > >> > > > } >> > > > >> > > > diff --git >> > > a/wicket-core/src/main/java/org/apache/wicket/Page.java >> > > > >> > > > b/wicket-core/src/main/java/org/apache/wicket/Page.java >> > > > >> > > > index 3f0f5b5..3d70ad8 100644 >> > > > >> > > > --- a/wicket-core/src/main/java/org/apache/wicket/Page.java >> > > > >> > > > +++ b/wicket-core/src/main/java/org/apache/wicket/Page.java >> > > > >> > > > @@ -24,10 +24,13 @@ import java.util.Set; >> > > > >> > > > >> > > > >> > > > import >> > > > org.apache.wicket.authorization.UnauthorizedActionException; >> > > > >> > > > import org.apache.wicket.core.util.lang.WicketObjects; >> > > > >> > > > +import >> org.apache.wicket.css.WicketBaseCSSResourceReference; >> > > > >> > > > import org.apache.wicket.feedback.FeedbackDelay; >> > > > >> > > > import org.apache.wicket.markup.MarkupException; >> > > > >> > > > import org.apache.wicket.markup.MarkupStream; >> > > > >> > > > import org.apache.wicket.markup.MarkupType; >> > > > >> > > > +import org.apache.wicket.markup.head.CssHeaderItem; >> > > > >> > > > +import org.apache.wicket.markup.head.IHeaderResponse; >> > > > >> > > > import org.apache.wicket.markup.html.WebPage; >> > > > >> > > > import >> org.apache.wicket.markup.resolver.IComponentResolver; >> > > > >> > > > import org.apache.wicket.model.IModel; >> > > > >> > > > @@ -1003,6 +1006,14 @@ public abstract class Page extends >> > > > >> > MarkupContainer >> > > > >> > > > } >> > > > >> > > > } >> > > > >> > > > >> > > > >> > > > + @Override >> > > > >> > > > + public void renderHead(IHeaderResponse response) >> > > > >> > > > + { >> > > > >> > > > + super.renderHead(response); >> > > > >> > > > + response.render( >> > > > >> > > > + >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> CssHeaderItem.forReference(getApplication().getResourceSettings().getWicketBaseCSS())); >> > > > >> > > > + } >> > > > >> > > > + >> > > > >> > > > /** >> > > > >> > > > * THIS METHOD IS NOT PART OF THE WICKET PUBLIC >> API. DO >> > > > NOT >> > > > >> > CALL. >> > > > >> > > > * >> > > > >> > > > diff --git >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> a/wicket-core/src/main/java/org/apache/wicket/css/WicketBaseCSSResourceReference.java >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-core/src/main/java/org/apache/wicket/css/WicketBaseCSSResourceReference.java >> > > > >> > > > new file mode 100644 >> > > > >> > > > index 0000000..9247216 >> > > > >> > > > --- /dev/null >> > > > >> > > > +++ >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-core/src/main/java/org/apache/wicket/css/WicketBaseCSSResourceReference.java >> > > > >> > > > @@ -0,0 +1,36 @@ >> > > > >> > > > +/* >> > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under >> one >> > > or >> > > > >> more >> > > > >> > > > + * contributor license agreements. See the NOTICE file >> > > > distributed >> > > > >> > with >> > > > >> > > > + * this work for additional information regarding >> copyright >> > > > >> ownership. >> > > > >> > > > + * The ASF licenses this file to You 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. >> > > > >> > > > + */ >> > > > >> > > > +package org.apache.wicket.css; >> > > > >> > > > + >> > > > >> > > > +import >> org.apache.wicket.request.resource.CssResourceReference; >> > > > >> > > > + >> > > > >> > > > +public final class WicketBaseCSSResourceReference extends >> > > > >> > > > CssResourceReference >> > > > >> > > > +{ >> > > > >> > > > + private static final long serialVersionUID = >> > > > >> > > 6795863553105608280L; >> > > > >> > > > + >> > > > >> > > > + private static final WicketBaseCSSResourceReference >> > > > >> INSTANCE = >> > > > >> > > new >> > > > >> > > > WicketBaseCSSResourceReference(); >> > > > >> > > > + >> > > > >> > > > + public static WicketBaseCSSResourceReference get() >> > > > >> > > > + { >> > > > >> > > > + return INSTANCE; >> > > > >> > > > + } >> > > > >> > > > + >> > > > >> > > > + private WicketBaseCSSResourceReference() >> > > > >> > > > + { >> > > > >> > > > + super(WicketBaseCSSResourceReference.class, >> > > > >> > > > "wicket-base.css"); >> > > > >> > > > + } >> > > > >> > > > +} >> > > > >> > > > diff --git >> > > > >> > > > >> > > a/wicket-core/src/main/java/org/apache/wicket/css/wicket-base.css >> > > > >> > > > >> > > b/wicket-core/src/main/java/org/apache/wicket/css/wicket-base.css >> > > > >> > > > new file mode 100644 >> > > > >> > > > index 0000000..9bbdd63 >> > > > >> > > > --- /dev/null >> > > > >> > > > +++ >> > > > >> b/wicket-core/src/main/java/org/apache/wicket/css/wicket-base.css >> > > > >> > > > @@ -0,0 +1,3 @@ >> > > > >> > > > +.wicket--hidden { >> > > > >> > > > + display: none!important; >> > > > >> > > > +} >> > > > >> > > > \ No newline at end of file >> > > > >> > > > diff --git >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> a/wicket-core/src/main/java/org/apache/wicket/settings/ResourceSettings.java >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-core/src/main/java/org/apache/wicket/settings/ResourceSettings.java >> > > > >> > > > index b76fbcd..68317f4 100644 >> > > > >> > > > --- >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> a/wicket-core/src/main/java/org/apache/wicket/settings/ResourceSettings.java >> > > > >> > > > +++ >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-core/src/main/java/org/apache/wicket/settings/ResourceSettings.java >> > > > >> > > > @@ -29,12 +29,14 @@ import >> > > > >> > > > >> > > > org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; >> > > > >> > > > import >> > > > >> > > >> > > org.apache.wicket.core.util.resource.locator.ResourceStreamLocator; >> > > > >> > > > import >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> org.apache.wicket.core.util.resource.locator.caching.CachingResourceStreamLocator; >> > > > >> > > > import org.apache.wicket.css.ICssCompressor; >> > > > >> > > > +import >> org.apache.wicket.css.WicketBaseCSSResourceReference; >> > > > >> > > > import org.apache.wicket.javascript.IJavaScriptCompressor; >> > > > >> > > > import >> org.apache.wicket.markup.head.PriorityFirstComparator; >> > > > >> > > > import >> > > > >> > > > >> > > > org.apache.wicket.markup.head.ResourceAggregator.RecordedHeaderItem; >> > > > >> > > > import >> org.apache.wicket.markup.html.IPackageResourceGuard; >> > > > >> > > > import >> > > org.apache.wicket.markup.html.SecurePackageResourceGuard; >> > > > >> > > > import org.apache.wicket.request.http.WebResponse; >> > > > >> > > > +import >> org.apache.wicket.request.resource.CssResourceReference; >> > > > >> > > > import >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> org.apache.wicket.request.resource.caching.FilenameWithVersionResourceCachingStrategy; >> > > > >> > > > import >> > > > >> > > > >> > > > org.apache.wicket.request.resource.caching.IResourceCachingStrategy; >> > > > >> > > > import >> > > > >> > > > >> > > > >> >> > > >> org.apache.wicket.request.resource.caching.NoOpResourceCachingStrategy; >> > > > >> > > > @@ -172,6 +174,8 @@ public class ResourceSettings >> implements >> > > > >> > > > IPropertiesFactoryContext >> > > > >> > > > false); >> > > > >> > > > >> > > > >> > > > private boolean encodeJSessionId = false; >> > > > >> > > > + >> > > > >> > > > + private CssResourceReference wicketBaseCSS = >> > > > >> > > > WicketBaseCSSResourceReference.get(); >> > > > >> > > > >> > > > >> > > > /** >> > > > >> > > > * Configures Wicket's default ResourceLoaders.<br> >> > > > >> > > > @@ -770,4 +774,31 @@ public class ResourceSettings >> implements >> > > > >> > > > IPropertiesFactoryContext >> > > > >> > > > this.encodeJSessionId = encodeJSessionId; >> > > > >> > > > return this; >> > > > >> > > > } >> > > > >> > > > + >> > > > >> > > > + /** >> > > > >> > > > + * Returns the resource reference of the base >> stylesheet >> > > > for >> > > > >> > > > Wicket. This stylesheet contains >> > > > >> > > > + * some lowlevel styling used by Wicket. >> > > > >> > > > + * >> > > > >> > > > + * @return The resource reference of the base >> stylesheet >> > > > for >> > > > >> > > > Wicket. >> > > > >> > > > + */ >> > > > >> > > > + public CssResourceReference getWicketBaseCSS() >> > > > >> > > > + { >> > > > >> > > > + return wicketBaseCSS; >> > > > >> > > > + } >> > > > >> > > > + >> > > > >> > > > + /** >> > > > >> > > > + * Replaces the base stylesheet for Wicket. >> Changes made >> > > > to >> > > > >> the >> > > > >> > > > styling can break functionality >> > > > >> > > > + * like {@link >> > > > >> > Component#setOutputMarkupPlaceholderTag(boolean)}, >> > > > >> > > > causing components that should >> > > > >> > > > + * not be visible to be displayed. Make sure the >> > > > replacement >> > > > >> > > > stylesheet has matching definitions >> > > > >> > > > + * for the corresponding sections in the Wicket >> version. >> > > > >> > > > + * >> > > > >> > > > + * @param wicketBaseCSS >> > > > >> > > > + * The replacement styleheet. >> > > > >> > > > + * @return {@code this} object for chaining >> > > > >> > > > + */ >> > > > >> > > > + public ResourceSettings >> > > > >> setWicketBaseCSS(CssResourceReference >> > > > >> > > > wicketBaseCSS) >> > > > >> > > > + { >> > > > >> > > > + this.wicketBaseCSS = wicketBaseCSS; >> > > > >> > > > + return this; >> > > > >> > > > + } >> > > > >> > > > } >> > > > >> > > > diff --git >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java >> > > > >> > > > index d0fee97..ab1c0a1 100644 >> > > > >> > > > --- >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java >> > > > >> > > > +++ >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> >> > > > >> > > >> b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java >> > > > >> > > > @@ -95,7 +95,7 @@ public class AjaxIndicatorAppender >> extends >> > > > >> Behavior >> > > > >> > > > super.afterRender(component); >> > > > >> > > > final Response r = component.getResponse(); >> > > > >> > > > >> > > > >> > > > - r.write("<span style=\"display:none;\" >> > > class=\""); >> > > > >> > > > + r.write("<span class=\"wicket--hidden\" >> > > > class=\""); >> > > > >> > > > r.write(getSpanClass()); >> > > > >> > > > r.write("\" "); >> > > > >> > > > r.write("id=\""); >> > > > >> > > > >> > > > >> > > > >> > > > >> > > >> > > > >> > >> > > > >> > >> > > > >> > -- >> > > > >> > WBR >> > > > >> > Maxim aka solomax >> > > > >> > >> > > > >> >> > > > > >> > > > > >> > > > > -- >> > > > > WBR >> > > > > Maxim aka solomax >> > > > > >> > > > >> > > > >> > > > -- >> > > > WBR >> > > > Maxim aka solomax >> > > > >> > > >> > >> > >> > -- >> > WBR >> > Maxim aka solomax >> > > > -- > WBR > Maxim aka solomax > -- WBR Maxim aka solomax