Lynx

CDPEventListener

一个协议(或接口),用于接收 DevTool 发送的 CDP Event 消息。

语法

iOS

LynxBaseInspectorOwner.h
@protocol CDPEventListener <NSObject>

@required
- (void)onEvent:(nonnull NSString *)event;

@end

Android

CDPEventListener.java
public interface CDPEventListener {
  void onEvent(String event);
}

参数说明

  • event: 包含 CDP Event 内容的 JSON 字符串。

数据格式

字段类型说明
methodstringEvent 名称,请参考 CDP
paramsobjectEvent 参数,请参考 CDP

例如,Page.screencastFrame 的数据如下:

{
  "method": "Page.screencastFrame",
  "params": {
    "data": "...",
    "metadata": {
      "deviceHeight": 200.0,
      "deviceWidth": 100.0,
      "offsetTop": 0.0,
      "pageScaleFactor": 1.0,
      "scrollOffsetX": 0.0,
      "scrollOffsetY": 0.0
    }
  }
}

使用示例

使用步骤

  1. 实现 CDPEventListener
  2. 获取 LynxBaseInspectorOwner 实例
  3. 调用 addCDPEventListener 方法,添加消息监听。

代码示例

下列示例代码添加了一个名为 TestListener 的 CDP Event 监听器,并通过 invokeCDPFromSDK 发送一条 Page.startScreencast 消息,开启屏幕截图功能。

最终 TestCDPEventListener 会收到 Page.screencastFrame 消息。

iOS

TestCDPEventListener.h
#import <Lynx/LynxBaseInspectorOwner.h>

@interface TestCDPEventListener : NSObject <CDPEventListener>

@property(nonatomic, readonly, nonnull) NSString *name;

- (instancetype)initWithName:(NSString * _Nonnull )name;

@end
TestCDPEventListener.m
#import "TestCDPEventListener.h"

@implementation TestCDPEventListener

- (instancetype)initWithName:(NSString *)name {
  if (self = [super init]) {
    _name = name;
  }
  return self;
}

- (void)onEvent:(nonnull NSString *)event {
  NSLog(@"onEvent: %@", event);
}

@end
ViewController.m
#import <Lynx/LynxView.h>
#import <Lynx/LynxBaseInspectorOwner.h>

#import "TestCDPEventListener.h"

@interface LynxViewLifecycleClient : NSObject <LynxViewLifecycle>
@property(nonatomic, weak) LynxView* lynxView;
@end

@implementation LynxViewLifecycleClient {
  TestCDPEventListener* _listener;
}

- (void)lynxView:(LynxView *)view didLoadFinishedWithUrl:(NSString *)url {
  [self addCDPEventListener:@"TestListener"];
  __weak __typeof(self) weakSelf = self;
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)),
                 dispatch_get_main_queue(), ^{
                   __strong __typeof(weakSelf) strongSelf = weakSelf;
                   [strongSelf removeCDPEventListener:@"TestListener"];
                 });
}

- (void)addCDPEventListener:(NSString *)name {
  __strong LynxView* view = self.lynxView;
  id<LynxBaseInspectorOwner> owner = [view baseInspectorOwner];
  _listener = [[TestCDPEventListener alloc] initWithName:name];
  [owner addCDPEventListener:name withListener:_listener];
  NSString *method = @"{\"id\":1,\"method\":\"Page.startScreencast\",\"params\":{\"format\":\"jpeg\",\"mode\":\"fullscreen\"}}";
  [owner invokeCDPFromSDK:method withCallback:^(NSString *result){
  }];
}

- (void)removeCDPEventListener:(NSString *)name {
  __strong LynxView* view = self.lynxView;
  id<LynxBaseInspectorOwner> owner = [view baseInspectorOwner];
  [owner removeCDPEventListener:name];
}

@end

@implementation ViewController {
  LynxViewLifecycleClient *_client;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  // ...

  _client = [LynxViewLifecycleClient new];
  _client.lynxView = lynxView;
  [lynxView addLifecycleClient:_client];
}

@end

Android

TestCDPEventListener.java
import android.util.Log;

import com.lynx.devtoolwrapper.CDPEventListener;

public class TestCDPEventListener implements CDPEventListener {
  private final String name;

  public TestCDPEventListener(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  @Override
  public void onEvent(String event) {
    Log.i("TestCDPEventListener", "onEvent: " + event);
  }
}
MainActivity.java
import android.os.Handler;
import android.os.Looper;

import com.lynx.devtoolwrapper.LynxBaseInspectorOwner;
import com.lynx.tasm.LynxView;
import com.lynx.tasm.LynxViewClient;

import java.lang.ref.WeakReference;

public class MainActivity extends Activity {
  private TestCDPEventListener mTestCDPEventListener = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    lynxView.addLynxViewClient(new LynxViewClient() {
      @Override
      public void onLoadSuccess() {
        addCDPEventListener(lynxView, "TestListener");
      }
    });
  }

  private void addCDPEventListener(LynxView lynxView, String name) {
    LynxBaseInspectorOwner owner = lynxView.getBaseInspectorOwner();
    if (owner == null) {
      return;
    }
    mTestCDPEventListener = new TestCDPEventListener(name);
    owner.addCDPEventListener(name, mTestCDPEventListener);

    String method = "{\"id\":1,\"method\":\"Page.startScreencast\",\"params\":{\"format\":\"jpeg\",\"mode\":\"fullscreen\"}}";
    owner.invokeCDPFromSDK(method, result -> {
    });

    Handler mainHandler = new Handler(Looper.getMainLooper());
    WeakReference<LynxBaseInspectorOwner> weakOwner = new WeakReference<>(owner);
    mainHandler.postDelayed(() -> {
      LynxBaseInspectorOwner strongOwner = weakOwner.get();
      strongOwner.removeCDPEventListener(name);
    }, 10000);
  }
}

兼容性

LCD tables only load in the browser

除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。