Home | History | Annotate | Download | only in websockets
      1 /*
      2  * Copyright (C) 2009, 2012 Google Inc.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 
     33 #include "modules/websockets/WebSocketChannel.h"
     34 
     35 #include "bindings/v8/ScriptCallStackFactory.h"
     36 #include "core/dom/Document.h"
     37 #include "core/dom/ExecutionContext.h"
     38 #include "core/inspector/ScriptCallStack.h"
     39 #include "core/frame/Settings.h"
     40 #include "core/workers/WorkerGlobalScope.h"
     41 #include "core/workers/WorkerRunLoop.h"
     42 #include "core/workers/WorkerThread.h"
     43 #include "modules/websockets/MainThreadWebSocketChannel.h"
     44 #include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h"
     45 #include "modules/websockets/WebSocketChannelClient.h"
     46 #include "modules/websockets/WorkerThreadableWebSocketChannel.h"
     47 
     48 namespace WebCore {
     49 
     50 static const char webSocketChannelMode[] = "webSocketChannelMode";
     51 
     52 PassRefPtr<WebSocketChannel> WebSocketChannel::create(ExecutionContext* context, WebSocketChannelClient* client)
     53 {
     54     ASSERT(context);
     55     ASSERT(client);
     56 
     57     String sourceURL;
     58     unsigned lineNumber = 0;
     59     RefPtr<ScriptCallStack> callStack = createScriptCallStack(1, true);
     60     if (callStack && callStack->size()) {
     61         sourceURL = callStack->at(0).sourceURL();
     62         lineNumber = callStack->at(0).lineNumber();
     63     }
     64 
     65     if (context->isWorkerGlobalScope()) {
     66         WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
     67         WorkerRunLoop& runLoop = workerGlobalScope->thread()->runLoop();
     68         String mode = webSocketChannelMode;
     69         mode.append(String::number(runLoop.createUniqueId()));
     70         return WorkerThreadableWebSocketChannel::create(workerGlobalScope, client, mode, sourceURL, lineNumber);
     71     }
     72 
     73     Document* document = toDocument(context);
     74     Settings* settings = document->settings();
     75     if (settings && settings->experimentalWebSocketEnabled()) {
     76         // FIXME: Create and return an "experimental" WebSocketChannel instead of a MainThreadWebSocketChannel.
     77         return MainThreadWebSocketChannel::create(document, client, sourceURL, lineNumber);
     78     }
     79     return MainThreadWebSocketChannel::create(document, client, sourceURL, lineNumber);
     80 }
     81 
     82 } // namespace WebCore
     83