Index: Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp |
=================================================================== |
--- Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp (revision 102380) |
+++ Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp (working copy) |
@@ -286,6 +286,14 @@ |
return v8::Undefined(); |
} |
+static bool isLegacyTargetOriginDesignation(v8::Handle<v8::Value> value) |
+{ |
+ if (value->IsString() || value->IsStringObject()) |
+ return true; |
+ return false; |
+} |
+ |
+ |
static v8::Handle<v8::Value> handlePostMessageCallback(const v8::Arguments& args, bool extendedTransfer) |
{ |
DOMWindow* window = V8DOMWindow::toNative(args.Holder()); |
@@ -293,20 +301,28 @@ |
DOMWindow* source = V8Proxy::retrieveFrameForCallingContext()->domWindow(); |
ASSERT(source->frame()); |
- // This function has variable arguments and can either be: |
- // postMessage(message, port, targetOrigin); |
- // or |
- // postMessage(message, targetOrigin); |
+ // This function has variable arguments and can be: |
+ // Per current spec: |
+ // postMessage(message, targetOrigin) |
+ // postMessage(message, targetOrigin, {sequence of transferrables}) |
+ // Legacy non-standard implementations in webkit allowed: |
+ // postMessage(message, {sequence of transferrables}, targetOrigin); |
MessagePortArray portArray; |
ArrayBufferArray arrayBufferArray; |
String targetOrigin; |
{ |
v8::TryCatch tryCatch; |
+ int targetOriginArgIndex = 1; |
if (args.Length() > 2) { |
- if (!extractTransferables(args[2], portArray, arrayBufferArray)) |
+ int transferablesArgIndex = 2; |
+ if (isLegacyTargetOriginDesignation(args[2])) { |
+ targetOriginArgIndex = 2; |
+ transferablesArgIndex = 1; |
+ } |
+ if (!extractTransferables(args[transferablesArgIndex], portArray, arrayBufferArray)) |
return v8::Undefined(); |
} |
- targetOrigin = toWebCoreStringWithNullOrUndefinedCheck(args[1]); |
+ targetOrigin = toWebCoreStringWithNullOrUndefinedCheck(args[targetOriginArgIndex]); |
if (tryCatch.HasCaught()) |
return v8::Undefined(); |