|  | // Copyright 2012 The Go Authors.  All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | "fmt" | 
|  | "io/ioutil" | 
|  | "net/http" | 
|  | "net/url" | 
|  | "path/filepath" | 
|  | "runtime" | 
|  | "time" | 
|  |  | 
|  | "golang.org/x/tools/godoc/static" | 
|  | "golang.org/x/tools/playground/socket" | 
|  | "golang.org/x/tools/present" | 
|  |  | 
|  | // This will register handlers at /compile and /share that will proxy to the | 
|  | // respective endpoints at play.golang.org. This allows the frontend to call | 
|  | // these endpoints without needing cross-origin request sharing (CORS). | 
|  | // Note that this is imported regardless of whether the endpoints are used or | 
|  | // not (in the case of a local socket connection, they are not called). | 
|  | _ "golang.org/x/tools/playground" | 
|  | ) | 
|  |  | 
|  | var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"} | 
|  |  | 
|  | // playScript registers an HTTP handler at /play.js that serves all the | 
|  | // scripts specified by the variable above, and appends a line that | 
|  | // initializes the playground with the specified transport. | 
|  | func playScript(root, transport string) { | 
|  | modTime := time.Now() | 
|  | var buf bytes.Buffer | 
|  | for _, p := range scripts { | 
|  | if s, ok := static.Files[p]; ok { | 
|  | buf.WriteString(s) | 
|  | continue | 
|  | } | 
|  | b, err := ioutil.ReadFile(filepath.Join(root, "static", p)) | 
|  | if err != nil { | 
|  | panic(err) | 
|  | } | 
|  | buf.Write(b) | 
|  | } | 
|  | fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport) | 
|  | b := buf.Bytes() | 
|  | http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) { | 
|  | w.Header().Set("Content-type", "application/javascript") | 
|  | http.ServeContent(w, r, "", modTime, bytes.NewReader(b)) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func initPlayground(basepath string, origin *url.URL) { | 
|  | if !present.PlayEnabled { | 
|  | return | 
|  | } | 
|  | if *usePlayground { | 
|  | playScript(basepath, "HTTPTransport") | 
|  | return | 
|  | } | 
|  |  | 
|  | if *nativeClient { | 
|  | // When specifying nativeClient, non-Go code cannot be executed | 
|  | // because the NaCl setup doesn't support doing so. | 
|  | socket.RunScripts = false | 
|  | socket.Environ = func() []string { | 
|  | if runtime.GOARCH == "amd64" { | 
|  | return environ("GOOS=nacl", "GOARCH=amd64p32") | 
|  | } | 
|  | return environ("GOOS=nacl") | 
|  | } | 
|  | } | 
|  | playScript(basepath, "SocketTransport") | 
|  | http.Handle("/socket", socket.NewHandler(origin)) | 
|  | } | 
|  |  | 
|  | func playable(c present.Code) bool { | 
|  | play := present.PlayEnabled && c.Play | 
|  |  | 
|  | // Restrict playable files to only Go source files when using play.golang.org, | 
|  | // since there is no method to execute shell scripts there. | 
|  | if *usePlayground { | 
|  | return play && c.Ext == ".go" | 
|  | } | 
|  | return play | 
|  | } |