Back out 030744f8ef5a (bug 1127885) for hazard bustage

This commit is contained in:
Phil Ringnalda 2015-01-31 12:06:40 -08:00
parent 4bb300070f
commit f9b8d259fd
4 changed files with 27 additions and 125 deletions

View File

@ -6,9 +6,7 @@
#include "mozilla/dom/Console.h" #include "mozilla/dom/Console.h"
#include "mozilla/dom/ConsoleBinding.h" #include "mozilla/dom/ConsoleBinding.h"
#include "mozilla/dom/BlobBinding.h"
#include "mozilla/dom/Exceptions.h" #include "mozilla/dom/Exceptions.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/ToJSValue.h" #include "mozilla/dom/ToJSValue.h"
#include "mozilla/Maybe.h" #include "mozilla/Maybe.h"
#include "nsCycleCollectionParticipant.h" #include "nsCycleCollectionParticipant.h"
@ -43,10 +41,9 @@
// console.trace(). // console.trace().
#define DEFAULT_MAX_STACKTRACE_DEPTH 200 #define DEFAULT_MAX_STACKTRACE_DEPTH 200
// This tags are used in the Structured Clone Algorithm to move js values from // This tag is used in the Structured Clone Algorithm to move js values from
// worker thread to main thread // worker thread to main thread
#define CONSOLE_TAG_STRING JS_SCTAG_USER_MIN #define CONSOLE_TAG JS_SCTAG_USER_MIN
#define CONSOLE_TAG_BLOB JS_SCTAG_USER_MIN + 1
using namespace mozilla::dom::exceptions; using namespace mozilla::dom::exceptions;
using namespace mozilla::dom::workers; using namespace mozilla::dom::workers;
@ -54,14 +51,6 @@ using namespace mozilla::dom::workers;
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
struct
ConsoleStructuredCloneData
{
nsCOMPtr<nsISupports> mParent;
nsTArray<nsString> mStrings;
nsTArray<nsRefPtr<FileImpl>> mFiles;
};
/** /**
* Console API in workers uses the Structured Clone Algorithm to move any value * Console API in workers uses the Structured Clone Algorithm to move any value
* from the worker thread to the main-thread. Some object cannot be moved and, * from the worker thread to the main-thread. Some object cannot be moved and,
@ -74,20 +63,20 @@ ConsoleStructuredCloneData
static JSObject* static JSObject*
ConsoleStructuredCloneCallbacksRead(JSContext* aCx, ConsoleStructuredCloneCallbacksRead(JSContext* aCx,
JSStructuredCloneReader* /* unused */, JSStructuredCloneReader* /* unused */,
uint32_t aTag, uint32_t aIndex, uint32_t aTag, uint32_t aData,
void* aClosure) void* aClosure)
{ {
AssertIsOnMainThread(); AssertIsOnMainThread();
ConsoleStructuredCloneData* data =
static_cast<ConsoleStructuredCloneData*>(aClosure);
MOZ_ASSERT(data);
MOZ_ASSERT(data->mParent);
if (aTag == CONSOLE_TAG_STRING) { if (aTag != CONSOLE_TAG) {
MOZ_ASSERT(data->mStrings.Length() > aIndex); return nullptr;
}
nsTArray<nsString>* strings = static_cast<nsTArray<nsString>*>(aClosure);
MOZ_ASSERT(strings->Length() > aData);
JS::Rooted<JS::Value> value(aCx); JS::Rooted<JS::Value> value(aCx);
if (!xpc::StringToJsval(aCx, data->mStrings.ElementAt(aIndex), &value)) { if (!xpc::StringToJsval(aCx, strings->ElementAt(aData), &value)) {
return nullptr; return nullptr;
} }
@ -97,18 +86,6 @@ ConsoleStructuredCloneCallbacksRead(JSContext* aCx,
} }
return obj; return obj;
}
if (aTag == CONSOLE_TAG_BLOB) {
MOZ_ASSERT(data->mFiles.Length() > aIndex);
nsRefPtr<File> file =
new File(data->mParent, data->mFiles.ElementAt(aIndex));
return file->WrapObject(aCx);
}
MOZ_CRASH("No other tags are supported.");
return nullptr;
} }
// This method is called by the Structured Clone Algorithm when some data has // This method is called by the Structured Clone Algorithm when some data has
@ -119,21 +96,6 @@ ConsoleStructuredCloneCallbacksWrite(JSContext* aCx,
JS::Handle<JSObject*> aObj, JS::Handle<JSObject*> aObj,
void* aClosure) void* aClosure)
{ {
ConsoleStructuredCloneData* data =
static_cast<ConsoleStructuredCloneData*>(aClosure);
MOZ_ASSERT(data);
nsRefPtr<File> file;
if (NS_SUCCEEDED(UNWRAP_OBJECT(Blob, aObj, file)) &&
file->Impl()->MayBeClonedToOtherThreads()) {
if (!JS_WriteUint32Pair(aWriter, CONSOLE_TAG_BLOB, data->mFiles.Length())) {
return false;
}
data->mFiles.AppendElement(file->Impl());
return true;
}
JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aObj)); JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aObj));
JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, value)); JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, value));
if (!jsString) { if (!jsString) {
@ -145,12 +107,14 @@ ConsoleStructuredCloneCallbacksWrite(JSContext* aCx,
return false; return false;
} }
if (!JS_WriteUint32Pair(aWriter, CONSOLE_TAG_STRING, nsTArray<nsString>* strings = static_cast<nsTArray<nsString>*>(aClosure);
data->mStrings.Length())) {
if (!JS_WriteUint32Pair(aWriter, CONSOLE_TAG, strings->Length())) {
return false; return false;
} }
data->mStrings.AppendElement(string); strings->AppendElement(string);
return true; return true;
} }
@ -450,7 +414,7 @@ private:
JS::Rooted<JS::Value> value(aCx, JS::ObjectValue(*arguments)); JS::Rooted<JS::Value> value(aCx, JS::ObjectValue(*arguments));
if (!mArguments.write(aCx, value, &gConsoleCallbacks, &mData)) { if (!mArguments.write(aCx, value, &gConsoleCallbacks, &mStrings)) {
return false; return false;
} }
@ -487,13 +451,8 @@ private:
mCallData->SetIDs(id, frame.mFilename); mCallData->SetIDs(id, frame.mFilename);
} }
// Now we could have the correct window (if we are not window-less).
mData.mParent = aInnerWindow;
ProcessCallData(aCx); ProcessCallData(aCx);
mCallData->CleanupJSObjects(); mCallData->CleanupJSObjects();
mData.mParent = nullptr;
} }
private: private:
@ -503,7 +462,7 @@ private:
ClearException ce(aCx); ClearException ce(aCx);
JS::Rooted<JS::Value> argumentsValue(aCx); JS::Rooted<JS::Value> argumentsValue(aCx);
if (!mArguments.read(aCx, &argumentsValue, &gConsoleCallbacks, &mData)) { if (!mArguments.read(aCx, &argumentsValue, &gConsoleCallbacks, &mStrings)) {
return; return;
} }
@ -535,7 +494,7 @@ private:
ConsoleCallData* mCallData; ConsoleCallData* mCallData;
JSAutoStructuredCloneBuffer mArguments; JSAutoStructuredCloneBuffer mArguments;
ConsoleStructuredCloneData mData; nsTArray<nsString> mStrings;
}; };
// This runnable calls ProfileMethod() on the console on the main-thread. // This runnable calls ProfileMethod() on the console on the main-thread.
@ -580,7 +539,7 @@ private:
JS::Rooted<JS::Value> value(aCx, JS::ObjectValue(*arguments)); JS::Rooted<JS::Value> value(aCx, JS::ObjectValue(*arguments));
if (!mBuffer.write(aCx, value, &gConsoleCallbacks, &mData)) { if (!mBuffer.write(aCx, value, &gConsoleCallbacks, &mStrings)) {
return false; return false;
} }
@ -593,14 +552,8 @@ private:
{ {
ClearException ce(aCx); ClearException ce(aCx);
// Now we could have the correct window (if we are not window-less).
mData.mParent = aInnerWindow;
JS::Rooted<JS::Value> argumentsValue(aCx); JS::Rooted<JS::Value> argumentsValue(aCx);
bool ok = mBuffer.read(aCx, &argumentsValue, &gConsoleCallbacks, &mData); if (!mBuffer.read(aCx, &argumentsValue, &gConsoleCallbacks, &mStrings)) {
mData.mParent = nullptr;
if (!ok) {
return; return;
} }
@ -632,7 +585,7 @@ private:
Sequence<JS::Value> mArguments; Sequence<JS::Value> mArguments;
JSAutoStructuredCloneBuffer mBuffer; JSAutoStructuredCloneBuffer mBuffer;
ConsoleStructuredCloneData mData; nsTArray<nsString> mStrings;
}; };
NS_IMPL_CYCLE_COLLECTION_CLASS(Console) NS_IMPL_CYCLE_COLLECTION_CLASS(Console)

View File

@ -97,7 +97,6 @@ support-files =
bug1062920_worker.js bug1062920_worker.js
webSocket_sharedWorker.js webSocket_sharedWorker.js
bug1104064_worker.js bug1104064_worker.js
worker_consoleAndBlobs.js
[test_404.html] [test_404.html]
[test_atob.html] [test_atob.html]
@ -198,4 +197,3 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #bug 982828
skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #bug 982828 skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #bug 982828
[test_websocket_pref.html] [test_websocket_pref.html]
[test_bug1104064.html] [test_bug1104064.html]
[test_consoleAndBlobs.html]

View File

@ -1,41 +0,0 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<head>
<title>Test for console API and blobs</title>
<script src="/tests/SimpleTest/SimpleTest.js">
</script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
</head>
<body>
<script type="text/javascript">
function consoleListener() {
SpecialPowers.addObserver(this, "console-api-log-event", false);
}
var order = 0;
consoleListener.prototype = {
observe: function(aSubject, aTopic, aData) {
ok(true, "Something has been received");
is(aTopic, "console-api-log-event");
SpecialPowers.removeObserver(this, "console-api-log-event");
var obj = aSubject.wrappedJSObject;
is(obj.arguments[0].size, 3, "The size is correct");
is(obj.arguments[0].type, 'foo/bar', "The type is correct");
SimpleTest.finish();
}
}
var cl = new consoleListener();
new Worker('worker_consoleAndBlobs.js');
SimpleTest.waitForExplicitFinish();
</script>
</body>
</html>

View File

@ -1,8 +0,0 @@
/**
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
"use strict";
var b = new Blob(['123'], { type: 'foo/bar'});
console.log(b);