Index: content/renderer/webplugin_delegate_proxy.cc |
=================================================================== |
--- content/renderer/webplugin_delegate_proxy.cc (revision 186240) |
+++ content/renderer/webplugin_delegate_proxy.cc (working copy) |
@@ -195,6 +195,33 @@ |
bool multibyte_response_expected_; |
}; |
+// Returns true if the given Silverlight 'background' value corresponds to |
+// one that should make the plugin transparent. See: |
+// http://msdn.microsoft.com/en-us/library/cc838148(VS.95).aspx |
+// for possible values. |
+static bool SilverlightColorIsTransparent(const std::string& color) { |
+ if (StartsWithASCII(color, "#", false)) { |
+ // If it's #ARGB or #AARRGGBB check the alpha; if not it's an RGB form and |
+ // it's not transparent. |
+ if ((color.length() == 5 && !StartsWithASCII(color, "#F", false)) || |
+ (color.length() == 9 && !StartsWithASCII(color, "#FF", false))) |
+ return true; |
+ } else if (StartsWithASCII(color, "sc#", false)) { |
+ // It's either sc#A,R,G,B or sc#R,G,B; if the former, check the alpha. |
+ if (color.length() < 4) |
+ return false; |
+ std::string value_string = color.substr(3, std::string::npos); |
+ std::vector<std::string> components; |
+ base::SplitString(value_string, ',', &components); |
+ if (components.size() == 4 && !StartsWithASCII(components[0], "1", false)) |
+ return true; |
+ } else if (LowerCaseEqualsASCII(color, "transparent")) { |
+ return true; |
+ } |
+ // Anything else is a named, opaque color or an RGB form with no alpha. |
+ return false; |
+} |
+ |
} // namespace |
WebPluginDelegateProxy::WebPluginDelegateProxy( |
@@ -214,6 +241,7 @@ |
npobject_(NULL), |
sad_plugin_(NULL), |
invalidate_pending_(false), |
+ transparent_(false), |
front_buffer_index_(0), |
page_url_(render_view_->webview()->mainFrame()->document().url()) { |
} |
@@ -372,6 +400,18 @@ |
plugin_ = plugin; |
+ bool flash = LowerCaseEqualsASCII(mime_type_, kFlashPluginSwfMimeType); |
+ bool silverlight = |
+ StartsWithASCII(mime_type_, "application/x-silverlight", false); |
+ for (size_t i = 0; i < arg_names.size(); ++i) { |
+ if ((flash && LowerCaseEqualsASCII(arg_names[i], "wmode") && |
+ LowerCaseEqualsASCII(arg_values[i], "transparent")) || |
+ (silverlight && LowerCaseEqualsASCII(arg_names[i], "background") && |
+ SilverlightColorIsTransparent(arg_values[i]))) { |
+ transparent_ = true; |
+ } |
+ } |
piman
2013/03/06 00:58:57
Do we really need all that logic? The plugin shoul
jam
2013/03/06 01:58:36
good point, switched to it.
we used to default to
|
+ |
result = false; |
Send(new PluginMsg_Init(instance_id_, params, &result)); |
@@ -725,7 +765,8 @@ |
const SkBitmap& bitmap = |
front_buffer_canvas()->getDevice()->accessBitmap(false); |
SkPaint paint; |
- paint.setXfermodeMode(SkXfermode::kSrcATop_Mode); |
+ paint.setXfermodeMode( |
+ transparent_ ? SkXfermode::kSrcATop_Mode : SkXfermode::kSrc_Mode); |
SkIRect src_rect = gfx::RectToSkIRect(offset_rect); |
canvas->drawBitmapRect(bitmap, |
&src_rect, |