Skip to content

Commit cdba41f

Browse files
committed
add 'new-win-policy' event
Fix nwjs#1375 nwjs#1290
1 parent 0f51a3f commit cdba41f

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

src/api/dispatcher.cc

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,63 @@ void Dispatcher::documentCallback(const char* ev, WebKit::WebFrame* frame) {
168168
frame->mainWorldScriptContext()->GetIsolate());
169169
}
170170
args->Set(0, element);
171-
v8::Handle<v8::Value> argv[] = {val, v8::String::New(ev), args };
171+
v8::Handle<v8::Value> argv[] = {val, v8_str(ev), args };
172172

173173
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
174174
}
175175

176+
void Dispatcher::willHandleNavigationPolicy(
177+
content::RenderView* rv,
178+
WebKit::WebFrame* frame,
179+
const WebKit::WebURLRequest& request,
180+
WebKit::WebNavigationPolicy* policy) {
181+
182+
WebKit::WebView* web_view = rv->GetWebView();
183+
184+
if (!web_view)
185+
return;
186+
187+
v8::Context::Scope cscope (web_view->mainFrame()->mainWorldScriptContext());
188+
189+
v8::Handle<v8::Value> id_val = nwapi::Dispatcher::GetWindowId(web_view->mainFrame());
190+
if (id_val->IsNull() || id_val->IsUndefined())
191+
return;
192+
193+
v8::Handle<v8::Object> objects_registry = nwapi::Dispatcher::GetObjectRegistry();
194+
if (objects_registry->IsUndefined())
195+
return;
196+
197+
v8::Local<v8::Array> args = v8::Array::New();
198+
v8::Handle<v8::Value> element = v8::Null();
199+
v8::Handle<v8::Object> policy_obj = v8::Object::New();
200+
201+
WebCore::Frame* core_frame = WebKit::toWebFrameImpl(frame)->frame();
202+
if (core_frame->ownerElement()) {
203+
element = WebCore::toV8((WebCore::HTMLElement*)core_frame->ownerElement(),
204+
frame->mainWorldScriptContext()->Global(),
205+
frame->mainWorldScriptContext()->GetIsolate());
206+
}
207+
args->Set(0, element);
208+
args->Set(1, v8_str(request.url().string().utf8().c_str()));
209+
args->Set(2, policy_obj);
210+
211+
v8::Handle<v8::Value> argv[] = {id_val, v8_str("new-win-policy"), args };
212+
213+
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
214+
v8::Local<v8::Value> val = policy_obj->Get(v8_str("val"));
215+
if (!val->IsString())
216+
return;
217+
v8::String::Utf8Value policy_str(val);
218+
if (!strcmp(*policy_str, "ignore"))
219+
*policy = WebKit::WebNavigationPolicyIgnore;
220+
else if (!strcmp(*policy_str, "download"))
221+
*policy = WebKit::WebNavigationPolicyDownload;
222+
else if (!strcmp(*policy_str, "current"))
223+
*policy = WebKit::WebNavigationPolicyCurrentTab;
224+
else if (!strcmp(*policy_str, "new-window"))
225+
*policy = WebKit::WebNavigationPolicyNewWindow;
226+
else if (!strcmp(*policy_str, "new-popup"))
227+
*policy = WebKit::WebNavigationPolicyNewPopup;
228+
}
229+
176230
} // namespace nwapi

src/api/dispatcher.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,20 @@
2323

2424
#include "base/basictypes.h"
2525
#include "content/public/renderer/render_view_observer.h"
26+
#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
2627
#include <v8.h>
2728

2829
namespace base {
2930
class ListValue;
3031
}
3132

33+
namespace content {
34+
class RenderView;
35+
}
36+
3237
namespace WebKit {
3338
class WebFrame;
39+
class WebURLRequest;
3440
}
3541

3642
namespace nwapi {
@@ -42,6 +48,11 @@ class Dispatcher : public content::RenderViewObserver {
4248

4349
static v8::Handle<v8::Object> GetObjectRegistry();
4450
static v8::Handle<v8::Value> GetWindowId(WebKit::WebFrame* frame);
51+
static void willHandleNavigationPolicy(
52+
content::RenderView* rv,
53+
WebKit::WebFrame* frame,
54+
const WebKit::WebURLRequest& request,
55+
WebKit::WebNavigationPolicy* policy);
4556

4657
private:
4758
// RenderViewObserver implementation.

src/renderer/shell_content_renderer_client.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,13 @@ void ShellContentRendererClient::UninstallNodeSymbols(
407407
}
408408
}
409409

410+
void ShellContentRendererClient::willHandleNavigationPolicy(
411+
RenderView* rv,
412+
WebKit::WebFrame* frame,
413+
const WebKit::WebURLRequest& request,
414+
WebKit::WebNavigationPolicy* policy) {
415+
416+
nwapi::Dispatcher::willHandleNavigationPolicy(rv, frame, request, policy);
417+
}
418+
410419
} // namespace content

src/renderer/shell_content_renderer_client.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ class ShellContentRendererClient : public ContentRendererClient {
5151
virtual bool WillSetSecurityToken(WebKit::WebFrame* frame,
5252
v8::Handle<v8::Context>) OVERRIDE;
5353

54+
virtual void willHandleNavigationPolicy(RenderView* rv,
55+
WebKit::WebFrame* frame,
56+
const WebKit::WebURLRequest& request,
57+
WebKit::WebNavigationPolicy* policy) OVERRIDE;
58+
5459
private:
5560
scoped_ptr<ShellRenderProcessObserver> shell_observer_;
5661
scoped_ptr<nwapi::WindowBindings> window_bindings_;

0 commit comments

Comments
 (0)