1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/browser/frame_host/debug_urls.h" 6 7 #include <vector> 8 9 #include "base/strings/utf_string_conversions.h" 10 #include "content/browser/gpu/gpu_process_host_ui_shim.h" 11 #include "content/browser/ppapi_plugin_process_host.h" 12 #include "content/public/browser/browser_thread.h" 13 #include "content/public/common/content_constants.h" 14 #include "content/public/common/url_constants.h" 15 #include "ppapi/proxy/ppapi_messages.h" 16 #include "url/gurl.h" 17 18 namespace content { 19 20 namespace { 21 22 void HandlePpapiFlashDebugURL(const GURL& url) { 23 #if defined(ENABLE_PLUGINS) 24 bool crash = url == GURL(kChromeUIPpapiFlashCrashURL); 25 26 std::vector<PpapiPluginProcessHost*> hosts; 27 PpapiPluginProcessHost::FindByName(UTF8ToUTF16(kFlashPluginName), &hosts); 28 for (std::vector<PpapiPluginProcessHost*>::iterator iter = hosts.begin(); 29 iter != hosts.end(); ++iter) { 30 if (crash) 31 (*iter)->Send(new PpapiMsg_Crash()); 32 else 33 (*iter)->Send(new PpapiMsg_Hang()); 34 } 35 #endif 36 } 37 38 } // namespace 39 40 bool HandleDebugURL(const GURL& url, PageTransition transition) { 41 // Ensure that the user explicitly navigated to this URL. 42 if (!(transition & PAGE_TRANSITION_FROM_ADDRESS_BAR)) 43 return false; 44 45 if (url.host() == kChromeUIBrowserCrashHost) { 46 // Induce an intentional crash in the browser process. 47 CHECK(false); 48 return true; 49 } 50 51 if (url == GURL(kChromeUIGpuCleanURL)) { 52 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::GetOneInstance(); 53 if (shim) 54 shim->SimulateRemoveAllContext(); 55 return true; 56 } 57 58 if (url == GURL(kChromeUIGpuCrashURL)) { 59 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::GetOneInstance(); 60 if (shim) 61 shim->SimulateCrash(); 62 return true; 63 } 64 65 if (url == GURL(kChromeUIGpuHangURL)) { 66 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::GetOneInstance(); 67 if (shim) 68 shim->SimulateHang(); 69 return true; 70 } 71 72 if (url == GURL(kChromeUIPpapiFlashCrashURL) || 73 url == GURL(kChromeUIPpapiFlashHangURL)) { 74 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 75 base::Bind(&HandlePpapiFlashDebugURL, url)); 76 return true; 77 } 78 79 return false; 80 } 81 82 bool IsRendererDebugURL(const GURL& url) { 83 if (!url.is_valid()) 84 return false; 85 86 if (url.SchemeIs(kJavaScriptScheme)) 87 return true; 88 89 return url == GURL(kChromeUICrashURL) || 90 url == GURL(kChromeUIKillURL) || 91 url == GURL(kChromeUIHangURL) || 92 url == GURL(kChromeUIShorthangURL); 93 } 94 95 } // namespace content 96