Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(549)

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2490443002: Make OffscreenCanvas an EventTarget (Closed)
Patch Set: all tests are fine Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasModules.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index b0926df7214b42806c1b44e89d5a4c4469b3b0b1..4bfb2dba1ad196ebfa5b5b8cefaa73ac2059a199 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -547,7 +547,7 @@ struct ContextProviderCreationInfo {
// Inputs.
Platform::ContextAttributes contextAttributes;
Platform::GraphicsInfo* glInfo;
- ScriptState* scriptState;
+ KURL url;
// Outputs.
std::unique_ptr<WebGraphicsContext3DProvider> createdContextProvider;
};
@@ -558,8 +558,7 @@ static void createContextProviderOnMainThread(
ASSERT(isMainThread());
creationInfo->createdContextProvider =
wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider(
- creationInfo->contextAttributes,
- creationInfo->scriptState->getExecutionContext()->url(), 0,
+ creationInfo->contextAttributes, creationInfo->url, 0,
creationInfo->glInfo));
waitableEvent->signal();
}
@@ -568,12 +567,12 @@ static std::unique_ptr<WebGraphicsContext3DProvider>
createContextProviderOnWorkerThread(
Platform::ContextAttributes contextAttributes,
Platform::GraphicsInfo* glInfo,
- ScriptState* scriptState) {
+ const KURL& url) {
WaitableEvent waitableEvent;
ContextProviderCreationInfo creationInfo;
creationInfo.contextAttributes = contextAttributes;
creationInfo.glInfo = glInfo;
- creationInfo.scriptState = scriptState;
+ creationInfo.url = url;
WebTaskRunner* taskRunner =
Platform::current()->mainThread()->getWebTaskRunner();
taskRunner->postTask(BLINK_FROM_HERE,
@@ -599,15 +598,15 @@ WebGLRenderingContextBase::createContextProviderInternal(
toPlatformContextAttributes(attributes, webGLVersion);
Platform::GraphicsInfo glInfo;
std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
+ const auto& url = canvas ? canvas->document().topDocument().url()
+ : scriptState->getExecutionContext()->url();
if (isMainThread()) {
- const auto& url = canvas ? canvas->document().topDocument().url()
- : scriptState->getExecutionContext()->url();
contextProvider = wrapUnique(
Platform::current()->createOffscreenGraphicsContext3DProvider(
contextAttributes, url, 0, &glInfo));
} else {
- contextProvider = createContextProviderOnWorkerThread(contextAttributes,
- &glInfo, scriptState);
+ contextProvider =
+ createContextProviderOnWorkerThread(contextAttributes, &glInfo, url);
}
if (contextProvider && !contextProvider->bindToCurrentThread()) {
contextProvider = nullptr;
@@ -7297,7 +7296,10 @@ bool WebGLRenderingContextBase::validateDrawElements(const char* functionName,
void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) {
WebGLContextEvent* event = WebGLContextEvent::create(
EventTypeNames::webglcontextlost, false, true, "");
- canvas()->dispatchEvent(event);
+ if (getOffscreenCanvas())
+ getOffscreenCanvas()->dispatchEvent(event);
+ else
+ canvas()->dispatchEvent(event);
m_restoreAllowed = event->defaultPrevented();
if (m_restoreAllowed && !m_isHidden) {
if (m_autoRecoveryMethod == Auto)
@@ -7317,15 +7319,17 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
if (!m_restoreAllowed)
return;
- LocalFrame* frame = canvas()->document().frame();
- if (!frame)
- return;
+ if (canvas()) {
+ LocalFrame* frame = canvas()->document().frame();
+ if (!frame)
+ return;
- Settings* settings = frame->settings();
+ Settings* settings = frame->settings();
- if (!frame->loader().client()->allowWebGL(settings &&
- settings->webGLEnabled()))
- return;
+ if (!frame->loader().client()->allowWebGL(settings &&
+ settings->webGLEnabled()))
+ return;
+ }
// If the context was lost due to RealLostContext, we need to destroy the old
// DrawingBuffer before creating new DrawingBuffer to ensure resource budget
@@ -7338,16 +7342,28 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
Platform::ContextAttributes attributes =
toPlatformContextAttributes(creationAttributes(), version());
Platform::GraphicsInfo glInfo;
- std::unique_ptr<WebGraphicsContext3DProvider> contextProvider =
- wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider(
- attributes, canvas()->document().topDocument().url(), 0, &glInfo));
+ std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
+ const auto& url = canvas()
+ ? canvas()->document().topDocument().url()
+ : getOffscreenCanvas()->getExecutionContext()->url();
+ if (isMainThread()) {
+ contextProvider = wrapUnique(
+ Platform::current()->createOffscreenGraphicsContext3DProvider(
+ attributes, url, 0, &glInfo));
+ } else {
+ contextProvider =
+ createContextProviderOnWorkerThread(attributes, &glInfo, url);
+ }
RefPtr<DrawingBuffer> buffer;
if (contextProvider && contextProvider->bindToCurrentThread()) {
// Construct a new drawing buffer with the new GL context.
- // TODO(xidachen): make sure that the second parameter is correct for
- // OffscreenCanvas.
- buffer = createDrawingBuffer(std::move(contextProvider),
- DrawingBuffer::AllowChromiumImage);
+ if (canvas()) {
+ buffer = createDrawingBuffer(std::move(contextProvider),
+ DrawingBuffer::AllowChromiumImage);
+ } else {
+ buffer = createDrawingBuffer(std::move(contextProvider),
+ DrawingBuffer::DisallowChromiumImage);
Justin Novosad 2016/11/15 19:54:33 Why? Perhaps add a comment.
xidachen 2016/11/15 20:14:18 Comment added in the new patch. Long story short:
+ }
// If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| is
// set to null.
}
@@ -7378,8 +7394,12 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
setupFlags();
initializeNewContext();
markContextChanged(CanvasContextChanged);
- canvas()->dispatchEvent(WebGLContextEvent::create(
- EventTypeNames::webglcontextrestored, false, true, ""));
+ WebGLContextEvent* event = WebGLContextEvent::create(
+ EventTypeNames::webglcontextrestored, false, true, "");
+ if (canvas())
+ canvas()->dispatchEvent(event);
+ else
+ getOffscreenCanvas()->dispatchEvent(event);
}
String WebGLRenderingContextBase::ensureNotNull(const String& text) const {
« no previous file with comments | « third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasModules.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698