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

Side by Side Diff: third_party/WebKit/Source/core/html/HTMLObjectElement.cpp

Issue 2933213002: Revert of Move ObjectContentType entirely to HTMLPlugInElement (Closed)
Patch Set: Created 3 years, 6 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights
6 * reserved. 6 * reserved.
7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 141
142 if (src_index == -1 && data_index != -1) { 142 if (src_index == -1 && data_index != -1) {
143 param_names->push_back("src"); 143 param_names->push_back("src");
144 param_values->push_back((*param_values)[data_index]); 144 param_values->push_back((*param_values)[data_index]);
145 } 145 }
146 } 146 }
147 147
148 // TODO(schenney): crbug.com/572908 This function should not deal with url or 148 // TODO(schenney): crbug.com/572908 This function should not deal with url or
149 // serviceType! 149 // serviceType!
150 void HTMLObjectElement::ParametersForPlugin(Vector<String>& param_names, 150 void HTMLObjectElement::ParametersForPlugin(Vector<String>& param_names,
151 Vector<String>& param_values) { 151 Vector<String>& param_values,
152 String& url,
153 String& service_type) {
152 HashSet<StringImpl*, CaseFoldingHash> unique_param_names; 154 HashSet<StringImpl*, CaseFoldingHash> unique_param_names;
155 String url_parameter;
153 156
154 // Scan the PARAM children and store their name/value pairs. 157 // Scan the PARAM children and store their name/value pairs.
155 // Get the URL and type from the params if we don't already have them. 158 // Get the URL and type from the params if we don't already have them.
156 for (HTMLParamElement* p = Traversal<HTMLParamElement>::FirstChild(*this); p; 159 for (HTMLParamElement* p = Traversal<HTMLParamElement>::FirstChild(*this); p;
157 p = Traversal<HTMLParamElement>::NextSibling(*p)) { 160 p = Traversal<HTMLParamElement>::NextSibling(*p)) {
158 String name = p->GetName(); 161 String name = p->GetName();
159 if (name.IsEmpty()) 162 if (name.IsEmpty())
160 continue; 163 continue;
161 164
162 unique_param_names.insert(name.Impl()); 165 unique_param_names.insert(name.Impl());
163 param_names.push_back(p->GetName()); 166 param_names.push_back(p->GetName());
164 param_values.push_back(p->Value()); 167 param_values.push_back(p->Value());
165 168
166 // TODO(schenney): crbug.com/572908 url adjustment does not belong in this 169 // TODO(schenney): crbug.com/572908 url adjustment does not belong in this
167 // function. 170 // function.
168 // HTML5 says that an object resource's URL is specified by the object's 171 if (url.IsEmpty() && url_parameter.IsEmpty() &&
169 // data attribute, not by a param element. However, for compatibility, allow 172 (DeprecatedEqualIgnoringCase(name, "src") ||
170 // the resource's URL to be given by a param named "src", "movie", "code" or 173 DeprecatedEqualIgnoringCase(name, "movie") ||
171 // "url" if we know that resource points to a plugin. 174 DeprecatedEqualIgnoringCase(name, "code") ||
172 if (url_.IsEmpty() && (DeprecatedEqualIgnoringCase(name, "src") || 175 DeprecatedEqualIgnoringCase(name, "url")))
173 DeprecatedEqualIgnoringCase(name, "movie") || 176 url_parameter = StripLeadingAndTrailingHTMLSpaces(p->Value());
174 DeprecatedEqualIgnoringCase(name, "code") ||
175 DeprecatedEqualIgnoringCase(name, "url"))) {
176 url_ = StripLeadingAndTrailingHTMLSpaces(p->Value());
177 }
178 // TODO(schenney): crbug.com/572908 serviceType calculation does not belong 177 // TODO(schenney): crbug.com/572908 serviceType calculation does not belong
179 // in this function. 178 // in this function.
180 if (service_type_.IsEmpty() && DeprecatedEqualIgnoringCase(name, "type")) { 179 if (service_type.IsEmpty() && DeprecatedEqualIgnoringCase(name, "type")) {
181 size_t pos = p->Value().Find(";"); 180 service_type = p->Value();
181 size_t pos = service_type.Find(";");
182 if (pos != kNotFound) 182 if (pos != kNotFound)
183 service_type_ = p->Value().GetString().Left(pos); 183 service_type = service_type.Left(pos);
184 } 184 }
185 } 185 }
186 186
187 // When OBJECT is used for an applet via Sun's Java plugin, the CODEBASE
188 // attribute in the tag points to the Java plugin itself (an ActiveX
189 // component) while the actual applet CODEBASE is in a PARAM tag. See
190 // <http://java.sun.com/products/plugin/1.2/docs/tags.html>. This means we
191 // have to explicitly suppress the tag's CODEBASE attribute if there is none
192 // in a PARAM, else our Java plugin will misinterpret it. [4004531]
193 String codebase;
194 if (MIMETypeRegistry::IsJavaAppletMIMEType(service_type)) {
195 codebase = "codebase";
196 unique_param_names.insert(
197 codebase.Impl()); // pretend we found it in a PARAM already
198 }
199
187 // Turn the attributes of the <object> element into arrays, but don't override 200 // Turn the attributes of the <object> element into arrays, but don't override
188 // <param> values. 201 // <param> values.
189 AttributeCollection attributes = this->Attributes(); 202 AttributeCollection attributes = this->Attributes();
190 for (const Attribute& attribute : attributes) { 203 for (const Attribute& attribute : attributes) {
191 const AtomicString& name = attribute.GetName().LocalName(); 204 const AtomicString& name = attribute.GetName().LocalName();
192 if (!unique_param_names.Contains(name.Impl())) { 205 if (!unique_param_names.Contains(name.Impl())) {
193 param_names.push_back(name.GetString()); 206 param_names.push_back(name.GetString());
194 param_values.push_back(attribute.Value().GetString()); 207 param_values.push_back(attribute.Value().GetString());
195 } 208 }
196 } 209 }
197 210
198 MapDataParamToSrc(&param_names, &param_values); 211 MapDataParamToSrc(&param_names, &param_values);
212
213 // HTML5 says that an object resource's URL is specified by the object's data
214 // attribute, not by a param element. However, for compatibility, allow the
215 // resource's URL to be given by a param named "src", "movie", "code" or "url"
216 // if we know that resource points to a plugin.
217 if (url.IsEmpty() && !url_parameter.IsEmpty()) {
218 KURL completed_url = GetDocument().CompleteURL(url_parameter);
219 bool use_fallback;
220 if (ShouldUsePlugin(completed_url, service_type, false, use_fallback))
221 url = url_parameter;
222 }
199 } 223 }
200 224
201 bool HTMLObjectElement::HasFallbackContent() const { 225 bool HTMLObjectElement::HasFallbackContent() const {
202 for (Node* child = firstChild(); child; child = child->nextSibling()) { 226 for (Node* child = firstChild(); child; child = child->nextSibling()) {
203 // Ignore whitespace-only text, and <param> tags, any other content is 227 // Ignore whitespace-only text, and <param> tags, any other content is
204 // fallback content. 228 // fallback content.
205 if (child->IsTextNode()) { 229 if (child->IsTextNode()) {
206 if (!ToText(child)->ContainsOnlyWhitespace()) 230 if (!ToText(child)->ContainsOnlyWhitespace())
207 return true; 231 return true;
208 } else if (!isHTMLParamElement(*child)) { 232 } else if (!isHTMLParamElement(*child)) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 285 }
262 286
263 // TODO(schenney): crbug.com/572908 I'm not sure it's ever possible to get 287 // TODO(schenney): crbug.com/572908 I'm not sure it's ever possible to get
264 // into updateWidget during a removal, but just in case we should avoid 288 // into updateWidget during a removal, but just in case we should avoid
265 // loading the frame to prevent security bugs. 289 // loading the frame to prevent security bugs.
266 if (!SubframeLoadingDisabler::CanLoadFrame(*this)) { 290 if (!SubframeLoadingDisabler::CanLoadFrame(*this)) {
267 DispatchErrorEvent(); 291 DispatchErrorEvent();
268 return; 292 return;
269 } 293 }
270 294
295 String url = this->Url();
296 String service_type = service_type_;
297
271 // TODO(schenney): crbug.com/572908 These should be joined into a 298 // TODO(schenney): crbug.com/572908 These should be joined into a
272 // PluginParameters class. 299 // PluginParameters class.
273 Vector<String> param_names; 300 Vector<String> param_names;
274 Vector<String> param_values; 301 Vector<String> param_values;
275 ParametersForPlugin(param_names, param_values); 302 ParametersForPlugin(param_names, param_values, url, service_type);
276 303
277 // Note: url is modified above by parametersForPlugin. 304 // Note: url is modified above by parametersForPlugin.
278 if (!AllowedToLoadFrameURL(url_)) { 305 if (!AllowedToLoadFrameURL(url)) {
279 DispatchErrorEvent(); 306 DispatchErrorEvent();
280 return; 307 return;
281 } 308 }
282 309
283 // TODO(schenney): crbug.com/572908 Is it possible to get here without a 310 // TODO(schenney): crbug.com/572908 Is it possible to get here without a
284 // layoutObject now that we don't have beforeload events? 311 // layoutObject now that we don't have beforeload events?
285 if (!GetLayoutObject()) 312 if (!GetLayoutObject())
286 return; 313 return;
287 314
288 // Overwrites the URL and MIME type of a Flash embed to use an HTML5 embed. 315 // Overwrites the URL and MIME type of a Flash embed to use an HTML5 embed.
289 KURL overriden_url = 316 KURL overriden_url =
290 GetDocument().GetFrame()->Loader().Client()->OverrideFlashEmbedWithHTML( 317 GetDocument().GetFrame()->Loader().Client()->OverrideFlashEmbedWithHTML(
291 GetDocument().CompleteURL(url_)); 318 GetDocument().CompleteURL(url_));
292 if (!overriden_url.IsEmpty()) { 319 if (!overriden_url.IsEmpty()) {
293 url_ = overriden_url.GetString(); 320 url = url_ = overriden_url.GetString();
294 service_type_ = "text/html"; 321 service_type = service_type_ = "text/html";
295 } 322 }
296 323
297 if (!HasValidClassId() || !RequestObject(param_names, param_values)) { 324 if (!HasValidClassId() ||
298 if (!url_.IsEmpty()) 325 !RequestObject(url, service_type, param_names, param_values)) {
326 if (!url.IsEmpty())
299 DispatchErrorEvent(); 327 DispatchErrorEvent();
300 if (HasFallbackContent()) 328 if (HasFallbackContent())
301 RenderFallbackContent(); 329 RenderFallbackContent();
302 } else { 330 } else {
303 if (IsErrorplaceholder()) 331 if (IsErrorplaceholder())
304 DispatchErrorEvent(); 332 DispatchErrorEvent();
305 } 333 }
306 } 334 }
307 335
308 Node::InsertionNotificationRequest HTMLObjectElement::InsertedInto( 336 Node::InsertionNotificationRequest HTMLObjectElement::InsertedInto(
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 465
438 bool HTMLObjectElement::WillUseFallbackContentAtLayout() const { 466 bool HTMLObjectElement::WillUseFallbackContentAtLayout() const {
439 return !HasValidClassId() && HasFallbackContent(); 467 return !HasValidClassId() && HasFallbackContent();
440 } 468 }
441 469
442 void HTMLObjectElement::AssociateWith(HTMLFormElement* form) { 470 void HTMLObjectElement::AssociateWith(HTMLFormElement* form) {
443 AssociateByParser(form); 471 AssociateByParser(form);
444 }; 472 };
445 473
446 } // namespace blink 474 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLObjectElement.h ('k') | third_party/WebKit/Source/core/html/HTMLPlugInElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698