Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: Source/core/html/forms/ImageInputType.cpp

Issue 481753002: Use Shadow DOM to display fallback content for images (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved.
3 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * Copyright (C) 2010 Google Inc. All rights reserved.
4 * Copyright (C) 2012 Samsung Electronics. All rights reserved. 4 * Copyright (C) 2012 Samsung Electronics. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
11 * This library is distributed in the hope that it will be useful, 11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details. 14 * Library General Public License for more details.
15 * 15 *
16 * You should have received a copy of the GNU Library General Public License 16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to 17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA. 19 * Boston, MA 02110-1301, USA.
20 * 20 *
21 */ 21 */
22 22
23 #include "config.h" 23 #include "config.h"
24 #include "core/html/forms/ImageInputType.h" 24 #include "core/html/forms/ImageInputType.h"
25 25
26 #include "core/HTMLNames.h" 26 #include "core/HTMLNames.h"
27 #include "core/InputTypeNames.h" 27 #include "core/InputTypeNames.h"
28 #include "core/dom/shadow/ShadowRoot.h"
28 #include "core/events/MouseEvent.h" 29 #include "core/events/MouseEvent.h"
29 #include "core/fetch/ImageResource.h" 30 #include "core/fetch/ImageResource.h"
30 #include "core/html/FormDataList.h" 31 #include "core/html/FormDataList.h"
31 #include "core/html/HTMLFormElement.h" 32 #include "core/html/HTMLFormElement.h"
33 #include "core/html/HTMLImageFallbackHelper.h"
32 #include "core/html/HTMLImageLoader.h" 34 #include "core/html/HTMLImageLoader.h"
33 #include "core/html/HTMLInputElement.h" 35 #include "core/html/HTMLInputElement.h"
34 #include "core/html/parser/HTMLParserIdioms.h" 36 #include "core/html/parser/HTMLParserIdioms.h"
37 #include "core/rendering/RenderBlockFlow.h"
35 #include "core/rendering/RenderImage.h" 38 #include "core/rendering/RenderImage.h"
36 #include "wtf/PassOwnPtr.h" 39 #include "wtf/PassOwnPtr.h"
37 #include "wtf/text/StringBuilder.h" 40 #include "wtf/text/StringBuilder.h"
38 41
39 namespace blink { 42 namespace blink {
40 43
41 using namespace HTMLNames; 44 using namespace HTMLNames;
42 45
43 inline ImageInputType::ImageInputType(HTMLInputElement& element) 46 inline ImageInputType::ImageInputType(HTMLInputElement& element)
44 : BaseButtonInputType(element) 47 : BaseButtonInputType(element)
48 , m_useFallbackContent(false)
49 , m_altTextNode(0)
45 { 50 {
46 } 51 }
47 52
48 PassRefPtrWillBeRawPtr<InputType> ImageInputType::create(HTMLInputElement& eleme nt) 53 PassRefPtrWillBeRawPtr<InputType> ImageInputType::create(HTMLInputElement& eleme nt)
49 { 54 {
50 return adoptRefWillBeNoop(new ImageInputType(element)); 55 return adoptRefWillBeNoop(new ImageInputType(element));
51 } 56 }
52 57
53 const AtomicString& ImageInputType::formControlType() const 58 const AtomicString& ImageInputType::formControlType() const
54 { 59 {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 RefPtrWillBeRawPtr<HTMLInputElement> element(this->element()); 115 RefPtrWillBeRawPtr<HTMLInputElement> element(this->element());
111 if (element->isDisabledFormControl() || !element->form()) 116 if (element->isDisabledFormControl() || !element->form())
112 return; 117 return;
113 element->setActivatedSubmit(true); 118 element->setActivatedSubmit(true);
114 m_clickLocation = extractClickLocation(event); 119 m_clickLocation = extractClickLocation(event);
115 element->form()->prepareForSubmission(event); // Event handlers can run. 120 element->form()->prepareForSubmission(event); // Event handlers can run.
116 element->setActivatedSubmit(false); 121 element->setActivatedSubmit(false);
117 event->setDefaultHandled(); 122 event->setDefaultHandled();
118 } 123 }
119 124
120 RenderObject* ImageInputType::createRenderer(RenderStyle*) const 125 RenderObject* ImageInputType::createRenderer(RenderStyle* style) const
121 { 126 {
127 if (m_useFallbackContent && !element().shadowRoot() && element().userAgentSh adowRoot())
128 return new RenderBlockFlow(&element());
122 RenderImage* image = new RenderImage(&element()); 129 RenderImage* image = new RenderImage(&element());
123 image->setImageResource(RenderImageResource::create()); 130 image->setImageResource(RenderImageResource::create());
124 return image; 131 return image;
125 } 132 }
126 133
127 void ImageInputType::altAttributeChanged() 134 void ImageInputType::altAttributeChanged()
128 { 135 {
129 RenderImage* image = toRenderImage(element().renderer()); 136 if (Text* text = altTextNode()) {
esprehn 2014/09/05 00:47:52 Element* text = element().ensureUserAgentShadowRoo
rhogan 2014/09/08 19:52:42 I don't want to create the UA shadow root for ever
130 if (!image) 137 String alt = element().altText();
131 return; 138 if (text->data() != alt)
132 image->updateAltText(); 139 text->setData(alt);
140 }
133 } 141 }
134 142
135 void ImageInputType::srcAttributeChanged() 143 void ImageInputType::srcAttributeChanged()
136 { 144 {
137 if (!element().renderer()) 145 if (!element().renderer())
138 return; 146 return;
139 element().imageLoader()->updateFromElement(ImageLoader::UpdateIgnorePrevious Error); 147 element().imageLoader()->updateFromElement(ImageLoader::UpdateIgnorePrevious Error);
140 } 148 }
141 149
150 void ImageInputType::valueAttributeChanged()
151 {
152 if (m_useFallbackContent)
153 return;
154 BaseButtonInputType::valueAttributeChanged();
155 }
156
142 void ImageInputType::startResourceLoading() 157 void ImageInputType::startResourceLoading()
143 { 158 {
144 BaseButtonInputType::startResourceLoading(); 159 BaseButtonInputType::startResourceLoading();
145 160
146 HTMLImageLoader* imageLoader = element().imageLoader(); 161 HTMLImageLoader* imageLoader = element().imageLoader();
147 imageLoader->updateFromElement(); 162 imageLoader->updateFromElement();
148 163
149 RenderImage* renderer = toRenderImage(element().renderer()); 164 RenderObject* renderer = element().renderer();
150 if (!renderer) 165 if (!renderer || !renderer->isRenderImage())
151 return; 166 return;
152 167
153 RenderImageResource* imageResource = renderer->imageResource(); 168 RenderImageResource* imageResource = toRenderImage(renderer)->imageResource( );
154 imageResource->setImageResource(imageLoader->image()); 169 imageResource->setImageResource(imageLoader->image());
155
156 // If we have no image at all because we have no src attribute, set
157 // image height and width for the alt text instead.
158 if (!imageLoader->image() && !imageResource->cachedImage())
159 renderer->setImageSizeForAltText();
160 } 170 }
161 171
162 bool ImageInputType::shouldRespectAlignAttribute() 172 bool ImageInputType::shouldRespectAlignAttribute()
163 { 173 {
164 return true; 174 return true;
165 } 175 }
166 176
167 bool ImageInputType::canBeSuccessfulSubmitButton() 177 bool ImageInputType::canBeSuccessfulSubmitButton()
168 { 178 {
169 return true; 179 return true;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 bool ImageInputType::hasLegalLinkAttribute(const QualifiedName& name) const 245 bool ImageInputType::hasLegalLinkAttribute(const QualifiedName& name) const
236 { 246 {
237 return name == srcAttr || BaseButtonInputType::hasLegalLinkAttribute(name); 247 return name == srcAttr || BaseButtonInputType::hasLegalLinkAttribute(name);
238 } 248 }
239 249
240 const QualifiedName& ImageInputType::subResourceAttributeName() const 250 const QualifiedName& ImageInputType::subResourceAttributeName() const
241 { 251 {
242 return srcAttr; 252 return srcAttr;
243 } 253 }
244 254
255 void ImageInputType::ensureFallbackContent()
256 {
257 if (m_useFallbackContent)
258 return;
259 setUseFallbackContent();
260 if (!element().inDocument())
esprehn 2014/09/05 00:47:52 Don't check this, reattach already knows how to do
rhogan 2014/09/08 19:52:42 Done
261 return;
262 reattachFallbackContent();
263 }
264
265 void ImageInputType:: setUseFallbackContent()
esprehn 2014/09/05 00:47:51 extra space
rhogan 2014/09/08 19:52:42 Done
266 {
267 if (m_useFallbackContent)
268 return;
269 m_useFallbackContent = true;
270 if (ShadowRoot* root = element().userAgentShadowRoot())
271 root->removeChildren();
esprehn 2014/09/05 00:47:52 ensureUserAgentShadowRoot().removeChildren();
rhogan 2014/09/08 19:52:42 Done
272 createShadowSubtree();
273 }
274
275 void ImageInputType::ensurePrimaryContent()
276 {
277 if (!m_useFallbackContent || !element().inDocument())
esprehn 2014/09/05 00:47:52 Don't check inDocument()
rhogan 2014/09/08 19:52:42 Done
278 return;
279 m_useFallbackContent = false;
280 reattachFallbackContent();
281 }
282
283 void ImageInputType::reattachFallbackContent()
284 {
285 RefPtrWillBeRawPtr<HTMLInputElement> element(this->element());
esprehn 2014/09/05 00:47:52 you don't need this ref ptr.
rhogan 2014/09/08 19:52:42 Done
286 // This can happen inside of attach() in the middle of a recalcStyle so we n eed to
287 // reattach synchronously here.
288 if (element->document().inStyleRecalc())
289 element->reattach();
290 else
291 element->lazyReattachIfAttached();
292 }
293
294 void ImageInputType::createShadowSubtree()
295 {
296 if (!m_useFallbackContent) {
297 BaseButtonInputType::createShadowSubtree();
298 return;
299 }
300 m_altTextNode = createAltTextShadowTree(&element());
esprehn 2014/09/05 00:47:52 createAltTextShadowTree should take a reference, n
rhogan 2014/09/08 19:52:42 Done
301 }
302
303 PassRefPtr<RenderStyle> ImageInputType::customStyleForRenderer(PassRefPtr<Render Style> newStyle)
304 {
305 if (!m_useFallbackContent)
306 return newStyle;
307
308 return customStyleForAltText(&element(), newStyle);
309 }
310
245 } // namespace blink 311 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698