1 // Copyright 2014 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 "chrome/renderer/net/net_error_page_controller.h"
6 
7 #include "base/strings/string_piece.h"
8 #include "content/public/renderer/render_frame.h"
9 #include "gin/handle.h"
10 #include "gin/object_template_builder.h"
11 #include "third_party/blink/public/web/blink.h"
12 #include "third_party/blink/public/web/web_local_frame.h"
13 
14 gin::WrapperInfo NetErrorPageController::kWrapperInfo = {
15     gin::kEmbedderNativeGin};
16 
Delegate()17 NetErrorPageController::Delegate::Delegate() {}
~Delegate()18 NetErrorPageController::Delegate::~Delegate() {}
19 
20 // static
Install(content::RenderFrame * render_frame,base::WeakPtr<Delegate> delegate)21 void NetErrorPageController::Install(content::RenderFrame* render_frame,
22                                      base::WeakPtr<Delegate> delegate) {
23   v8::Isolate* isolate = blink::MainThreadIsolate();
24   v8::HandleScope handle_scope(isolate);
25   v8::Local<v8::Context> context =
26       render_frame->GetWebFrame()->MainWorldScriptContext();
27   if (context.IsEmpty())
28     return;
29 
30   v8::Context::Scope context_scope(context);
31 
32   gin::Handle<NetErrorPageController> controller = gin::CreateHandle(
33       isolate, new NetErrorPageController(delegate));
34   if (controller.IsEmpty())
35     return;
36 
37   v8::Local<v8::Object> global = context->Global();
38   global
39       ->Set(context, gin::StringToV8(isolate, "errorPageController"),
40             controller.ToV8())
41       .ToChecked();
42 }
43 
DownloadButtonClick()44 bool NetErrorPageController::DownloadButtonClick() {
45   return ButtonClick(NetErrorHelperCore::DOWNLOAD_BUTTON);
46 }
47 
ReloadButtonClick()48 bool NetErrorPageController::ReloadButtonClick() {
49   return ButtonClick(NetErrorHelperCore::RELOAD_BUTTON);
50 }
51 
DetailsButtonClick()52 bool NetErrorPageController::DetailsButtonClick() {
53   return ButtonClick(NetErrorHelperCore::MORE_BUTTON);
54 }
55 
TrackEasterEgg()56 bool NetErrorPageController::TrackEasterEgg() {
57   return ButtonClick(NetErrorHelperCore::EASTER_EGG);
58 }
59 
UpdateEasterEggHighScore(int high_score)60 bool NetErrorPageController::UpdateEasterEggHighScore(int high_score) {
61   if (delegate_)
62     delegate_->UpdateEasterEggHighScore(high_score);
63   return true;
64 }
65 
ResetEasterEggHighScore()66 bool NetErrorPageController::ResetEasterEggHighScore() {
67   if (delegate_)
68     delegate_->ResetEasterEggHighScore();
69   return true;
70 }
71 
DiagnoseErrorsButtonClick()72 bool NetErrorPageController::DiagnoseErrorsButtonClick() {
73   return ButtonClick(NetErrorHelperCore::DIAGNOSE_ERROR);
74 }
75 
ButtonClick(NetErrorHelperCore::Button button)76 bool NetErrorPageController::ButtonClick(NetErrorHelperCore::Button button) {
77   if (delegate_)
78     delegate_->ButtonPressed(button);
79 
80   return true;
81 }
82 
LaunchOfflineItem(gin::Arguments * args)83 void NetErrorPageController::LaunchOfflineItem(gin::Arguments* args) {
84   if (!delegate_)
85     return;
86   std::string id;
87   std::string name_space;
88   if (args->GetNext(&id) && args->GetNext(&name_space))
89     delegate_->LaunchOfflineItem(id, name_space);
90 }
91 
LaunchDownloadsPage()92 void NetErrorPageController::LaunchDownloadsPage() {
93   if (delegate_)
94     delegate_->LaunchDownloadsPage();
95 }
96 
SavePageForLater()97 void NetErrorPageController::SavePageForLater() {
98   if (delegate_)
99     delegate_->SavePageForLater();
100 }
101 
CancelSavePage()102 void NetErrorPageController::CancelSavePage() {
103   if (delegate_)
104     delegate_->CancelSavePage();
105 }
106 
ListVisibilityChanged(bool is_visible)107 void NetErrorPageController::ListVisibilityChanged(bool is_visible) {
108   if (delegate_)
109     delegate_->ListVisibilityChanged(is_visible);
110 }
111 
NetErrorPageController(base::WeakPtr<Delegate> delegate)112 NetErrorPageController::NetErrorPageController(base::WeakPtr<Delegate> delegate)
113     : delegate_(delegate) {
114 }
115 
~NetErrorPageController()116 NetErrorPageController::~NetErrorPageController() {}
117 
GetObjectTemplateBuilder(v8::Isolate * isolate)118 gin::ObjectTemplateBuilder NetErrorPageController::GetObjectTemplateBuilder(
119     v8::Isolate* isolate) {
120   return gin::Wrappable<NetErrorPageController>::GetObjectTemplateBuilder(
121              isolate)
122       .SetMethod("downloadButtonClick",
123                  &NetErrorPageController::DownloadButtonClick)
124       .SetMethod("reloadButtonClick",
125                  &NetErrorPageController::ReloadButtonClick)
126       .SetMethod("detailsButtonClick",
127                  &NetErrorPageController::DetailsButtonClick)
128       .SetMethod("diagnoseErrorsButtonClick",
129                  &NetErrorPageController::DiagnoseErrorsButtonClick)
130       .SetMethod("trackEasterEgg", &NetErrorPageController::TrackEasterEgg)
131       .SetMethod("updateEasterEggHighScore",
132                  &NetErrorPageController::UpdateEasterEggHighScore)
133       .SetMethod("resetEasterEggHighScore",
134                  &NetErrorPageController::ResetEasterEggHighScore)
135       .SetMethod("launchOfflineItem",
136                  &NetErrorPageController::LaunchOfflineItem)
137       .SetMethod("launchDownloadsPage",
138                  &NetErrorPageController::LaunchDownloadsPage)
139       .SetMethod("savePageForLater", &NetErrorPageController::SavePageForLater)
140       .SetMethod("cancelSavePage", &NetErrorPageController::CancelSavePage)
141       .SetMethod("listVisibilityChanged",
142                  &NetErrorPageController::ListVisibilityChanged);
143 }
144