content_renderer_client.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/public/renderer/content_renderer_client.h"
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace content {
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SkBitmap* ContentRendererClient::GetSadPluginBitmap() {
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SkBitmap* ContentRendererClient::GetSadWebViewBitmap() {
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)std::string ContentRendererClient::GetDefaultEncoding() {
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return std::string();
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::OverrideCreatePlugin(
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFrame* render_frame,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebLocalFrame* frame,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const blink::WebPluginParams& params,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebPlugin** plugin) {
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebPlugin* ContentRendererClient::CreatePluginReplacement(
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFrame* render_frame,
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const base::FilePath& plugin_path) {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::HasErrorPage(int http_status_code,
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                                         std::string* error_domain) {
37591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  return false;
388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::ShouldSuppressErrorPage(RenderFrame* render_frame,
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                    const GURL& url) {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContentRendererClient::DeferMediaLoad(RenderFrame* render_frame,
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const base::Closure& closure) {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  closure.Run();
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebMediaStreamCenter*
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::OverrideCreateWebMediaStreamCenter(
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebMediaStreamCenterClient* client) {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebRTCPeerConnectionHandler*
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::OverrideCreateWebRTCPeerConnectionHandler(
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebRTCPeerConnectionHandlerClient* client) {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebMIDIAccessor*
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::OverrideCreateMIDIAccessor(
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebMIDIAccessorClient* client) {
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebAudioDevice*
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::OverrideCreateAudioDevice(
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double sample_rate) {
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebClipboard* ContentRendererClient::OverrideWebClipboard() {
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebThemeEngine* ContentRendererClient::OverrideThemeEngine() {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)blink::WebSpeechSynthesizer* ContentRendererClient::OverrideSpeechSynthesizer(
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebSpeechSynthesizerClient* client) {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool ContentRendererClient::RunIdleHandlerWhenWidgetsHidden() {
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return true;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::AllowPopup() {
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef OS_ANDROID
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::HandleNavigation(
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFrame* render_frame,
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentState* document_state,
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int opener_id,
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebFrame* frame,
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const blink::WebURLRequest& request,
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebNavigationType type,
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebNavigationPolicy default_policy,
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is_redirect) {
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool ContentRendererClient::ShouldFork(blink::WebFrame* frame,
1109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                                       const GURL& url,
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       const std::string& http_method,
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       bool is_initial_navigation,
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       bool is_server_redirect,
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       bool* send_referrer) {
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::WillSendRequest(
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebFrame* frame,
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ui::PageTransition transition_type,
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GURL& url,
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GURL& first_party_for_cookies,
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GURL* new_url) {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned long long ContentRendererClient::VisitedLinkHash(
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* canonical_url, size_t length) {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return 0LL;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::IsLinkVisited(unsigned long long link_hash) {
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebPrescientNetworking*
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::GetPrescientNetworking() {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::ShouldOverridePageVisibilityState(
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderFrame* render_frame,
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blink::WebPageVisibilityState* override_state) {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const void* ContentRendererClient::CreatePPAPIInterface(
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const std::string& interface_name) {
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::IsExternalPepperPlugin(
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const std::string& module_name) {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::AllowPepperMediaStreamAPI(const GURL& url) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContentRendererClient::AddKeySystems(
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    std::vector<KeySystemInfo>* key_systems) {
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::ShouldReportDetailedMessageForSource(
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const base::string16& source) const {
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::ShouldEnableSiteIsolationPolicy() const {
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return true;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)blink::WebWorkerPermissionClientProxy*
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContentRendererClient::CreateWorkerPermissionClientProxy(
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFrame* render_frame, blink::WebFrame* frame) {
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::IsPluginAllowedToUseCompositorAPI(const GURL& url) {
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI(
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GURL& url) {
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BrowserPluginDelegate* ContentRendererClient::CreateBrowserPluginDelegate(
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFrame* render_frame,
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const std::string& mime_type) {
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}  // namespace content
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)