mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Back out 030744f8ef5a (bug 1127885) for hazard bustage
This commit is contained in:
parent
4bb300070f
commit
f9b8d259fd
@ -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)
|
||||||
|
@ -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]
|
|
||||||
|
@ -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>
|
|
@ -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);
|
|
Loading…
Reference in New Issue
Block a user