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