| 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 e74ced8e1c9621b12119ea393847c285e2891abe..ddfbe3e4b08df19c623b43bf266d27d6d38bb9cf 100644 | 
| --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp | 
| @@ -118,22 +118,23 @@ | 
| } | 
|  | 
| bool HTMLPlugInElement::RequestObjectInternal( | 
| +    const String& url, | 
| +    const String& mime_type, | 
| const Vector<String>& param_names, | 
| const Vector<String>& param_values) { | 
| -  if (url_.IsEmpty() && service_type_.IsEmpty()) | 
| -    return false; | 
| - | 
| -  if (ProtocolIsJavaScript(url_)) | 
| -    return false; | 
| - | 
| -  KURL completed_url = | 
| -      url_.IsEmpty() ? KURL() : GetDocument().CompleteURL(url_); | 
| -  if (!AllowedToLoadObject(completed_url, service_type_)) | 
| -    return false; | 
| - | 
| -  ObjectContentType object_type = GetObjectContentType(); | 
| -  if (object_type == ObjectContentType::kFrame || | 
| -      object_type == ObjectContentType::kImage) { | 
| +  if (url.IsEmpty() && mime_type.IsEmpty()) | 
| +    return false; | 
| + | 
| +  if (ProtocolIsJavaScript(url)) | 
| +    return false; | 
| + | 
| +  KURL completed_url = url.IsEmpty() ? KURL() : GetDocument().CompleteURL(url); | 
| +  if (!AllowedToLoadObject(completed_url, mime_type)) | 
| +    return false; | 
| + | 
| +  bool use_fallback; | 
| +  if (!ShouldUsePlugin(completed_url, mime_type, HasFallbackContent(), | 
| +                       use_fallback)) { | 
| // 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, | 
| @@ -141,11 +142,7 @@ | 
| return LoadOrRedirectSubframe(completed_url, GetNameAttribute(), true); | 
| } | 
|  | 
| -  // 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, | 
| +  return LoadPlugin(completed_url, mime_type, param_names, param_values, | 
| use_fallback, true); | 
| } | 
|  | 
| @@ -197,7 +194,7 @@ | 
| image_loader_->UpdateFromElement(); | 
| } else if (NeedsPluginUpdate() && !GetLayoutEmbeddedItem().IsNull() && | 
| !GetLayoutEmbeddedItem().ShowsUnavailablePluginIndicator() && | 
| -             GetObjectContentType() != ObjectContentType::kPlugin && | 
| +             !WouldLoadAsNetscapePlugin(url_, service_type_) && | 
| !is_delaying_load_event_) { | 
| is_delaying_load_event_ = true; | 
| GetDocument().IncrementLoadEventDelayCount(); | 
| @@ -472,46 +469,17 @@ | 
| 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 (GetDocument().GetFrame()) | 
| -    return GetObjectContentType() == ObjectContentType::kImage; | 
| +  if (LocalFrame* frame = GetDocument().GetFrame()) { | 
| +    KURL completed_url = GetDocument().CompleteURL(url_); | 
| +    return frame->Loader().Client()->GetObjectContentType( | 
| +               completed_url, service_type_, ShouldPreferPlugInsForImages()) == | 
| +           kObjectContentImage; | 
| +  } | 
| + | 
| return Image::SupportsType(service_type_); | 
| } | 
|  | 
| @@ -532,9 +500,25 @@ | 
| ContentFrame()->GetSecurityContext()->GetSecurityOrigin())); | 
| } | 
|  | 
| -bool HTMLPlugInElement::RequestObject(const Vector<String>& param_names, | 
| +// 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, | 
| const Vector<String>& param_values) { | 
| -  bool result = RequestObjectInternal(param_names, param_values); | 
| +  bool result = | 
| +      RequestObjectInternal(url, mime_type, param_names, param_values); | 
|  | 
| DEFINE_STATIC_LOCAL( | 
| EnumerationHistogram, result_histogram, | 
| @@ -609,6 +593,20 @@ | 
| 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( | 
|  |