| Index: third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| index ddfbe3e4b08df19c623b43bf266d27d6d38bb9cf..e74ced8e1c9621b12119ea393847c285e2891abe 100644 | 
| --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| @@ -118,23 +118,22 @@ void HTMLPlugInElement::SetFocused(bool focused, WebFocusType focus_type) { | 
| } | 
|  | 
| bool HTMLPlugInElement::RequestObjectInternal( | 
| -    const String& url, | 
| -    const String& mime_type, | 
| const Vector<String>& param_names, | 
| const Vector<String>& param_values) { | 
| -  if (url.IsEmpty() && mime_type.IsEmpty()) | 
| +  if (url_.IsEmpty() && service_type_.IsEmpty()) | 
| return false; | 
|  | 
| -  if (ProtocolIsJavaScript(url)) | 
| +  if (ProtocolIsJavaScript(url_)) | 
| return false; | 
|  | 
| -  KURL completed_url = url.IsEmpty() ? KURL() : GetDocument().CompleteURL(url); | 
| -  if (!AllowedToLoadObject(completed_url, mime_type)) | 
| +  KURL completed_url = | 
| +      url_.IsEmpty() ? KURL() : GetDocument().CompleteURL(url_); | 
| +  if (!AllowedToLoadObject(completed_url, service_type_)) | 
| return false; | 
|  | 
| -  bool use_fallback; | 
| -  if (!ShouldUsePlugin(completed_url, mime_type, HasFallbackContent(), | 
| -                       use_fallback)) { | 
| +  ObjectContentType object_type = GetObjectContentType(); | 
| +  if (object_type == ObjectContentType::kFrame || | 
| +      object_type == ObjectContentType::kImage) { | 
| // If the plugin element already contains a subframe, | 
| // loadOrRedirectSubframe will re-use it. Otherwise, it will create a | 
| // new frame and set it as the LayoutEmbeddedContent's EmbeddedContentView, | 
| @@ -142,7 +141,11 @@ bool HTMLPlugInElement::RequestObjectInternal( | 
| return LoadOrRedirectSubframe(completed_url, GetNameAttribute(), true); | 
| } | 
|  | 
| -  return LoadPlugin(completed_url, mime_type, param_names, param_values, | 
| +  // If an object's content can't be handled and it has no fallback, let | 
| +  // it be handled as a plugin to show the broken plugin icon. | 
| +  bool use_fallback = | 
| +      object_type == ObjectContentType::kNone && HasFallbackContent(); | 
| +  return LoadPlugin(completed_url, service_type_, param_names, param_values, | 
| use_fallback, true); | 
| } | 
|  | 
| @@ -194,7 +197,7 @@ void HTMLPlugInElement::AttachLayoutTree(const AttachContext& context) { | 
| image_loader_->UpdateFromElement(); | 
| } else if (NeedsPluginUpdate() && !GetLayoutEmbeddedItem().IsNull() && | 
| !GetLayoutEmbeddedItem().ShowsUnavailablePluginIndicator() && | 
| -             !WouldLoadAsNetscapePlugin(url_, service_type_) && | 
| +             GetObjectContentType() != ObjectContentType::kPlugin && | 
| !is_delaying_load_event_) { | 
| is_delaying_load_event_ = true; | 
| GetDocument().IncrementLoadEventDelayCount(); | 
| @@ -469,17 +472,46 @@ bool HTMLPlugInElement::LayoutObjectIsFocusable() const { | 
| return plugin_is_available_; | 
| } | 
|  | 
| +HTMLPlugInElement::ObjectContentType HTMLPlugInElement::GetObjectContentType() { | 
| +  String mime_type = service_type_; | 
| +  KURL url = GetDocument().CompleteURL(url_); | 
| +  if (mime_type.IsEmpty()) { | 
| +    // Try to guess the MIME type based off the extension. | 
| +    String filename = url.LastPathComponent(); | 
| +    int extension_pos = filename.ReverseFind('.'); | 
| +    if (extension_pos >= 0) { | 
| +      String extension = filename.Substring(extension_pos + 1); | 
| +      mime_type = MIMETypeRegistry::GetWellKnownMIMETypeForExtension(extension); | 
| +    } | 
| + | 
| +    if (mime_type.IsEmpty()) | 
| +      return ObjectContentType::kFrame; | 
| +  } | 
| + | 
| +  // If Chrome is started with the --disable-plugins switch, pluginData is 0. | 
| +  PluginData* plugin_data = GetDocument().GetFrame()->GetPluginData(); | 
| +  bool plugin_supports_mime_type = | 
| +      plugin_data && plugin_data->SupportsMimeType(mime_type); | 
| + | 
| +  if (MIMETypeRegistry::IsSupportedImageMIMEType(mime_type)) { | 
| +    return should_prefer_plug_ins_for_images_ && plugin_supports_mime_type | 
| +               ? ObjectContentType::kPlugin | 
| +               : ObjectContentType::kImage; | 
| +  } | 
| + | 
| +  if (plugin_supports_mime_type) | 
| +    return ObjectContentType::kPlugin; | 
| +  if (MIMETypeRegistry::IsSupportedNonImageMIMEType(mime_type)) | 
| +    return ObjectContentType::kFrame; | 
| +  return ObjectContentType::kNone; | 
| +} | 
| + | 
| bool HTMLPlugInElement::IsImageType() { | 
| if (service_type_.IsEmpty() && ProtocolIs(url_, "data")) | 
| service_type_ = MimeTypeFromDataURL(url_); | 
|  | 
| -  if (LocalFrame* frame = GetDocument().GetFrame()) { | 
| -    KURL completed_url = GetDocument().CompleteURL(url_); | 
| -    return frame->Loader().Client()->GetObjectContentType( | 
| -               completed_url, service_type_, ShouldPreferPlugInsForImages()) == | 
| -           kObjectContentImage; | 
| -  } | 
| - | 
| +  if (GetDocument().GetFrame()) | 
| +    return GetObjectContentType() == ObjectContentType::kImage; | 
| return Image::SupportsType(service_type_); | 
| } | 
|  | 
| @@ -500,25 +532,9 @@ bool HTMLPlugInElement::AllowedToLoadFrameURL(const String& url) { | 
| ContentFrame()->GetSecurityContext()->GetSecurityOrigin())); | 
| } | 
|  | 
| -// We don't use m_url, or m_serviceType as they may not be the final values | 
| -// that <object> uses depending on <param> values. | 
| -bool HTMLPlugInElement::WouldLoadAsNetscapePlugin(const String& url, | 
| -                                                  const String& service_type) { | 
| -  DCHECK(GetDocument().GetFrame()); | 
| -  KURL completed_url; | 
| -  if (!url.IsEmpty()) | 
| -    completed_url = GetDocument().CompleteURL(url); | 
| -  return GetDocument().GetFrame()->Loader().Client()->GetObjectContentType( | 
| -             completed_url, service_type, ShouldPreferPlugInsForImages()) == | 
| -         kObjectContentNetscapePlugin; | 
| -} | 
| - | 
| -bool HTMLPlugInElement::RequestObject(const String& url, | 
| -                                      const String& mime_type, | 
| -                                      const Vector<String>& param_names, | 
| +bool HTMLPlugInElement::RequestObject(const Vector<String>& param_names, | 
| const Vector<String>& param_values) { | 
| -  bool result = | 
| -      RequestObjectInternal(url, mime_type, param_names, param_values); | 
| +  bool result = RequestObjectInternal(param_names, param_values); | 
|  | 
| DEFINE_STATIC_LOCAL( | 
| EnumerationHistogram, result_histogram, | 
| @@ -593,20 +609,6 @@ bool HTMLPlugInElement::LoadPlugin(const KURL& url, | 
| return true; | 
| } | 
|  | 
| -bool HTMLPlugInElement::ShouldUsePlugin(const KURL& url, | 
| -                                        const String& mime_type, | 
| -                                        bool has_fallback, | 
| -                                        bool& use_fallback) { | 
| -  ObjectContentType object_type = | 
| -      GetDocument().GetFrame()->Loader().Client()->GetObjectContentType( | 
| -          url, mime_type, ShouldPreferPlugInsForImages()); | 
| -  // If an object's content can't be handled and it has no fallback, let | 
| -  // it be handled as a plugin to show the broken plugin icon. | 
| -  use_fallback = object_type == kObjectContentNone && has_fallback; | 
| -  return object_type == kObjectContentNone || | 
| -         object_type == kObjectContentNetscapePlugin; | 
| -} | 
| - | 
| void HTMLPlugInElement::DispatchErrorEvent() { | 
| if (GetDocument().IsPluginDocument() && GetDocument().LocalOwner()) | 
| GetDocument().LocalOwner()->DispatchEvent( | 
|  |